From 27c855149e657cebda863e279c8545f7816e1c18 Mon Sep 17 00:00:00 2001 From: Loren Shih Date: Mon, 23 Aug 2010 13:36:28 -0400 Subject: First pass commit for breast physics. --- indra/llmath/v3math.cpp | 15 + indra/llmath/v3math.h | 1 + indra/newview/character/avatar_lad.xml | 292 ++++++++++++++- indra/newview/llagentcamera.cpp | 1 + indra/newview/llpaneleditwearable.cpp | 19 +- indra/newview/llpaneleditwearable.h | 10 +- indra/newview/llpolymesh.cpp | 6 + indra/newview/llpolymorph.cpp | 16 +- indra/newview/llsidepanelappearance.cpp | 22 +- indra/newview/llsidepanelappearance.h | 5 +- indra/newview/llviewermenu.cpp | 16 + indra/newview/llvoavatar.cpp | 395 ++++++++++++++++++++- indra/newview/llvoavatar.h | 1 + .../skins/default/xui/en/menu_attachment_self.xml | 8 + .../skins/default/xui/en/menu_avatar_self.xml | 8 + .../skins/default/xui/en/panel_edit_shape.xml | 14 + indra/newview/skins/default/xui/en/strings.xml | 14 + 17 files changed, 807 insertions(+), 36 deletions(-) diff --git a/indra/llmath/v3math.cpp b/indra/llmath/v3math.cpp index fd08df02d8..18b15e08c4 100644 --- a/indra/llmath/v3math.cpp +++ b/indra/llmath/v3math.cpp @@ -134,6 +134,21 @@ BOOL LLVector3::clampLength( F32 length_limit ) return changed; } +BOOL LLVector3::clamp(const LLVector3 &min_vec, const LLVector3 &max_vec) +{ + BOOL ret = FALSE; + + if (mV[0] < min_vec[0]) { mV[0] = min_vec[0]; ret = TRUE; } + if (mV[1] < min_vec[1]) { mV[1] = min_vec[1]; ret = TRUE; } + if (mV[2] < min_vec[2]) { mV[2] = min_vec[2]; ret = TRUE; } + + if (mV[0] > max_vec[0]) { mV[0] = max_vec[0]; ret = TRUE; } + if (mV[1] > max_vec[1]) { mV[1] = max_vec[1]; ret = TRUE; } + if (mV[2] > max_vec[2]) { mV[2] = max_vec[2]; ret = TRUE; } + + return ret; +} + // Sets all values to absolute value of their original values // Returns TRUE if data changed diff --git a/indra/llmath/v3math.h b/indra/llmath/v3math.h index dbd38c1c3f..d3fc6fcb2f 100644 --- a/indra/llmath/v3math.h +++ b/indra/llmath/v3math.h @@ -69,6 +69,7 @@ class LLVector3 inline BOOL isFinite() const; // checks to see if all values of LLVector3 are finite BOOL clamp(F32 min, F32 max); // Clamps all values to (min,max), returns TRUE if data changed + BOOL clamp(const LLVector3 &min_vec, const LLVector3 &max_vec); // Scales vector by another vector BOOL clampLength( F32 length_limit ); // Scales vector to limit length to a value void quantize16(F32 lowerxy, F32 upperxy, F32 lowerz, F32 upperz); // changes the vector to reflect quatization diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index a9b4ff02c5..cdb3684034 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -612,7 +612,7 @@ id="36" group="0" name="Shoulders" - label="Shoulders" + label="Shoulders" wearable="shape" edit_group="shape_torso" edit_group_order="4" @@ -4047,11 +4047,10 @@ id="507" group="0" sex="female" - name="Breast_Gravity" + name="Breast_Gravity_Driven" label="Breast Buoyancy" wearable="shape" - edit_group="shape_torso" - edit_group_order="7" + edit_group="driven" label_min="Less Gravity" label_max="More Gravity" value_default="0" @@ -4116,11 +4115,10 @@ id="684" group="0" sex="female" - name="Breast_Female_Cleavage" + name="Breast_Female_Cleavage_Driven" label="Breast Cleavage" wearable="shape" - edit_group="shape_torso" - edit_group_order="8" + edit_group="driven" label_min="Separate" label_max="Join" value_default="0" @@ -9074,12 +9072,290 @@ render_pass="bump"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + wearableUpdated(mWearablePtr->getType(), FALSE); } -void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show) +void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show, BOOL disable_camera_switch) { if (!wearable) { @@ -1146,7 +1148,10 @@ void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show) updateScrollingPanelUI(); } - showDefaultSubpart(); + if (!disable_camera_switch) + { + showDefaultSubpart(); + } updateVerbs(); } @@ -1154,7 +1159,7 @@ void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show) void LLPanelEditWearable::showDefaultSubpart() { - changeCamera(0); + changeCamera(3); } void LLPanelEditWearable::onTabExpandedCollapsed(const LLSD& param, U8 index) diff --git a/indra/newview/llpaneleditwearable.h b/indra/newview/llpaneleditwearable.h index 43513d8ab3..623101d835 100644 --- a/indra/newview/llpaneleditwearable.h +++ b/indra/newview/llpaneleditwearable.h @@ -55,8 +55,11 @@ public: /*virtual*/ BOOL isDirty() const; // LLUICtrl /*virtual*/ void draw(); + // changes camera angle to default for selected subpart + void changeCamera(U8 subpart); + LLWearable* getWearable() { return mWearablePtr; } - void setWearable(LLWearable *wearable); + void setWearable(LLWearable *wearable, BOOL disable_camera_switch = FALSE); void saveChanges(bool force_save_as = false); void revertChanges(); @@ -77,7 +80,7 @@ public: private: typedef std::map value_map_t; - void showWearable(LLWearable* wearable, BOOL show); + void showWearable(LLWearable* wearable, BOOL show, BOOL disable_camera_switch = FALSE); void updateScrollingPanelUI(); LLPanel* getPanel(LLWearableType::EType type); void getSortedParams(value_map_t &sorted_params, const std::string &edit_group); @@ -91,9 +94,6 @@ private: void toggleTypeSpecificControls(LLWearableType::EType type); void updateTypeSpecificControls(LLWearableType::EType type); - // changes camera angle to default for selected subpart - void changeCamera(U8 subpart); - //alpha mask checkboxes void configureAlphaCheckbox(LLVOAvatarDefines::ETextureIndex te, const std::string& name); void onInvisibilityCommit(LLCheckBoxCtrl* checkbox_ctrl, LLVOAvatarDefines::ETextureIndex te); diff --git a/indra/newview/llpolymesh.cpp b/indra/newview/llpolymesh.cpp index 363b0b8e9d..2942f4befb 100644 --- a/indra/newview/llpolymesh.cpp +++ b/indra/newview/llpolymesh.cpp @@ -602,6 +602,12 @@ BOOL LLPolyMeshSharedData::loadMesh( const std::string& fileName ) } mMorphData.insert(morph_data); + /* + if (std::string(morphName) == "Breast_Gravity") + { + LLPolyMorphData *morph_data_clone = new LLPolyMorphData(std::string(morphName)); + } + */ } S32 numRemaps; diff --git a/indra/newview/llpolymorph.cpp b/indra/newview/llpolymorph.cpp index 0ffe1c635f..ec41ef08f5 100644 --- a/indra/newview/llpolymorph.cpp +++ b/indra/newview/llpolymorph.cpp @@ -287,10 +287,22 @@ BOOL LLPolyMorphTarget::setInfo(LLPolyMorphTargetInfo* info) } } - mMorphData = mMesh->getMorphData(getInfo()->mMorphName); + std::string morph_param_name = getInfo()->mMorphName; + + mMorphData = mMesh->getMorphData(morph_param_name); + if (!mMorphData) + { + const std::string driven_tag = "_Driven"; + U32 pos = morph_param_name.find(driven_tag); + if (pos > 0) + { + morph_param_name = morph_param_name.substr(0,pos); + mMorphData = mMesh->getMorphData(morph_param_name); + } + } if (!mMorphData) { - llwarns << "No morph target named " << getInfo()->mMorphName << " found in mesh." << llendl; + llwarns << "No morph target named " << morph_param_name << " found in mesh." << llendl; return FALSE; // Continue, ignoring this tag } return TRUE; diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index 7206e4fcaf..333a463844 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -176,6 +176,11 @@ void LLSidepanelAppearance::onOpen(const LLSD& key) { showWearableEditPanel(); } + else if (type == "edit_physics") + { + showPhysicsEditPanel(); + } + } mOpened = true; @@ -281,7 +286,7 @@ void LLSidepanelAppearance::showOutfitsInventoryPanel() { toggleWearableEditPanel(FALSE); toggleOutfitEditPanel(FALSE); - togglMyOutfitsPanel(TRUE); + toggleMyOutfitsPanel(TRUE); } void LLSidepanelAppearance::showOutfitEditPanel() @@ -295,19 +300,24 @@ void LLSidepanelAppearance::showOutfitEditPanel() mOutfitEdit->resetAccordionState(); } - togglMyOutfitsPanel(FALSE); + toggleMyOutfitsPanel(FALSE); toggleWearableEditPanel(FALSE, NULL, TRUE); // don't switch out of edit appearance mode toggleOutfitEditPanel(TRUE); } -void LLSidepanelAppearance::showWearableEditPanel(LLWearable *wearable /* = NULL*/) +void LLSidepanelAppearance::showWearableEditPanel(LLWearable *wearable /* = NULL*/, BOOL disable_camera_switch) { - togglMyOutfitsPanel(FALSE); + toggleMyOutfitsPanel(FALSE); toggleOutfitEditPanel(FALSE, TRUE); // don't switch out of edit appearance mode - toggleWearableEditPanel(TRUE, wearable); + toggleWearableEditPanel(TRUE, wearable, disable_camera_switch); +} + +void LLSidepanelAppearance::showPhysicsEditPanel(LLWearable *wearable /* = NULL*/) +{ + showWearableEditPanel(wearable, TRUE); } -void LLSidepanelAppearance::togglMyOutfitsPanel(BOOL visible) +void LLSidepanelAppearance::toggleMyOutfitsPanel(BOOL visible) { if (!mPanelOutfitsInventory || mPanelOutfitsInventory->getVisible() == visible) { diff --git a/indra/newview/llsidepanelappearance.h b/indra/newview/llsidepanelappearance.h index f28cdfa49a..022280132e 100644 --- a/indra/newview/llsidepanelappearance.h +++ b/indra/newview/llsidepanelappearance.h @@ -59,7 +59,8 @@ public: void showOutfitsInventoryPanel(); void showOutfitEditPanel(); - void showWearableEditPanel(LLWearable *wearable = NULL); + void showWearableEditPanel(LLWearable *wearable = NULL, BOOL disable_camera_switch = FALSE); + void showPhysicsEditPanel(LLWearable *wearable = NULL); void setWearablesLoading(bool val); void showDefaultSubpart(); void updateScrollingPanelList(); @@ -71,7 +72,7 @@ private: void onOpenOutfitButtonClicked(); void onEditAppearanceButtonClicked(); - void togglMyOutfitsPanel(BOOL visible); + void toggleMyOutfitsPanel(BOOL visible); void toggleOutfitEditPanel(BOOL visible, BOOL disable_camera_switch = FALSE); void toggleWearableEditPanel(BOOL visible, LLWearable* wearable = NULL, BOOL disable_camera_switch = FALSE); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index c275068028..285cc857fb 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -3650,6 +3650,15 @@ class LLEnableEditShape : public view_listener_t } }; +class LLEnableEditPhysics : public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + //return gAgentWearables.isWearableModifiable(LLWearableType::WT_SHAPE, 0); + return TRUE; + } +}; + bool is_object_sittable() { LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); @@ -5608,6 +5617,11 @@ void handle_edit_shape() LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_shape")); } +void handle_edit_physics() +{ + LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_physics")); +} + void handle_report_abuse() { // Prevent menu from appearing in screen shot. @@ -7843,9 +7857,11 @@ void initialize_menus() view_listener_t::addMenu(new LLEditEnableTakeOff(), "Edit.EnableTakeOff"); view_listener_t::addMenu(new LLEditEnableCustomizeAvatar(), "Edit.EnableCustomizeAvatar"); view_listener_t::addMenu(new LLEnableEditShape(), "Edit.EnableEditShape"); + view_listener_t::addMenu(new LLEnableEditPhysics(), "Edit.EnableEditPhysics"); commit.add("CustomizeAvatar", boost::bind(&handle_customize_avatar)); commit.add("EditOutfit", boost::bind(&handle_edit_outfit)); commit.add("EditShape", boost::bind(&handle_edit_shape)); + commit.add("EditPhysics", boost::bind(&handle_edit_physics)); // View menu view_listener_t::addMenu(new LLViewMouselook(), "View.Mouselook"); diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 9af1198df1..f595a05a28 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -103,6 +103,8 @@ extern F32 ANIM_SPEED_MIN; #include +#define OUTPUT_BREAST_DATA + using namespace LLVOAvatarDefines; //----------------------------------------------------------------------------- @@ -118,6 +120,7 @@ const LLUUID ANIM_AGENT_HEAD_ROT = LLUUID("e6e8d1dd-e643-fff7-b238-c6b4b056a68d" const LLUUID ANIM_AGENT_PELVIS_FIX = LLUUID("0c5dd2a2-514d-8893-d44d-05beffad208b"); //"pelvis_fix" const LLUUID ANIM_AGENT_TARGET = LLUUID("0e4896cb-fba4-926c-f355-8720189d5b55"); //"target" const LLUUID ANIM_AGENT_WALK_ADJUST = LLUUID("829bc85b-02fc-ec41-be2e-74cc6dd7215d"); //"walk_adjust" +const LLUUID ANIM_AGENT_BREAST_MOTION = LLUUID("ce52c2b2-b62a-1e90-6152-7cd1efe2fd60"); //"breast_motion" //----------------------------------------------------------------------------- @@ -573,6 +576,387 @@ private: LLCharacter* mCharacter; }; +//----------------------------------------------------------------------------- +// class LLBreatheMotionRot +//----------------------------------------------------------------------------- +class LLBreastMotion : + public LLMotion +{ +public: + // Constructor + LLBreastMotion(const LLUUID &id) : + LLMotion(id), + mCharacter(NULL), + mFileWrite(NULL) + { + mName = "breast_motion"; + mChestState = new LLJointState; + + mBreastMassParam = (F32)1.0; + mBreastDragParam = LLVector3((F32)0.1, (F32)0.1, (F32)0.1); + mBreastSmoothingParam = (U32)2; + mBreastGravityParam = (F32)0.0; + + mBreastSpringParam = LLVector3((F32)3.0, (F32)0.0, (F32)3.0); + mBreastAccelerationParam = LLVector3((F32)50.0, (F32)0.0, (F32)50.0); + mBreastDampingParam = LLVector3((F32)0.3, (F32)0.0, (F32)0.3); + mBreastMaxVelocityParam = LLVector3((F32)10.0, (F32)0.0, (F32)10.0); + + mBreastParamsUser[0] = mBreastParamsUser[1] = mBreastParamsUser[2] = NULL; + mBreastParamsDriven[0] = mBreastParamsDriven[1] = mBreastParamsDriven[2] = NULL; + + mCharLastPosition_world_pt = LLVector3(0,0,0); + mCharLastVelocity_local_vec = LLVector3(0,0,0); + mCharLastAcceleration_local_vec = LLVector3(0,0,0); + mBreastLastPosition_local_pt = LLVector3(0,0,0); + mBreastVelocity_local_vec = LLVector3(0,0,0); + } + + // Destructor + virtual ~LLBreastMotion() {} + +public: + //------------------------------------------------------------------------- + // functions to support MotionController and MotionRegistry + //------------------------------------------------------------------------- + // static constructor + // all subclasses must implement such a function and register it + static LLMotion *create(const LLUUID &id) { return new LLBreastMotion(id); } + +public: + //------------------------------------------------------------------------- + // animation callbacks to be implemented by subclasses + //------------------------------------------------------------------------- + + // motions must specify whether or not they loop + virtual BOOL getLoop() { return TRUE; } + + // motions must report their total duration + virtual F32 getDuration() { return 0.0; } + + // motions must report their "ease in" duration + virtual F32 getEaseInDuration() { return 0.0; } + + // motions must report their "ease out" duration. + virtual F32 getEaseOutDuration() { return 0.0; } + + // motions must report their priority + virtual LLJoint::JointPriority getPriority() { return LLJoint::MEDIUM_PRIORITY; } + + virtual LLMotionBlendType getBlendType() { return ADDITIVE_BLEND; } + + // called to determine when a motion should be activated/deactivated based on avatar pixel coverage + virtual F32 getMinPixelArea() { return MIN_REQUIRED_PIXEL_AREA_BREATHE; } + + // run-time (post constructor) initialization, + // called after parameters have been set + // must return true to indicate success and be available for activation + virtual LLMotionInitStatus onInitialize(LLCharacter *character) + { + mCharacter = character; + BOOL success = true; + + if ( !mChestState->setJoint( character->getJoint( "mChest" ) ) ) { success = false; } + + if (!success) + { + return STATUS_FAILURE; + } + + mChestState->setUsage(LLJointState::ROT); + addJointState( mChestState ); + + // User-set params + static const std::string breast_param_names_user[3] = + { + "Breast_Female_Cleavage", + "", + "Breast_Gravity" + }; + + // Params driven by this algorithm + static const std::string breast_param_names_driven[3] = + { + "Breast_Female_Cleavage_Driven", + "", + "Breast_Gravity_Driven" + }; + + for (U32 i=0; i < 3; i++) + { + mBreastParamsUser[i] = NULL; + mBreastParamsDriven[i] = NULL; + mBreastParamsMin[i] = 0; + mBreastParamsMax[i] = 0; + if (breast_param_names_user[i] != "" && breast_param_names_driven[i] != "") + { + mBreastParamsUser[i] = (LLViewerVisualParam*)mCharacter->getVisualParam(breast_param_names_user[i].c_str()); + mBreastParamsDriven[i] = (LLViewerVisualParam*)mCharacter->getVisualParam(breast_param_names_driven[i].c_str()); + if (mBreastParamsDriven[i]) + { + mBreastParamsMin[i] = mBreastParamsDriven[i]->getMinWeight(); + mBreastParamsMax[i] = mBreastParamsDriven[i]->getMaxWeight(); + } + } + } + +#ifdef OUTPUT_BREAST_DATA + //if (mCharacter->getSex() == SEX_FEMALE) + if (dynamic_cast(mCharacter)) + { + mFileWrite = fopen("c:\\temp\\data.txt","w"); + if (mFileWrite != NULL) + { + fprintf(mFileWrite,"Pos\tParam\tNet\tVel\t\tAccel\tSpring\tDamp\n"); + } + } +#endif + + mTimer.reset(); + return STATUS_SUCCESS; + } + + // called when a motion is activated + // must return TRUE to indicate success, or else + // it will be deactivated + virtual BOOL onActivate() { return TRUE; } + + F32 calculateTimeDelta() + { + const F32 time = mTimer.getElapsedTimeF32(); + const F32 time_delta = time - mLastTime; + + mLastTime = time; + + return time_delta; + } + + LLVector3 toLocal(const LLVector3 &world_vector) + { + LLVector3 local_vec(0,0,0); + + LLJoint *chest_joint = mChestState->getJoint(); + const LLQuaternion world_rot = chest_joint->getWorldRotation(); + + // -1 because cleavage param changes opposite to direction. + LLVector3 breast_dir_world_vec = LLVector3(-1,0,0) * world_rot; + breast_dir_world_vec.normalize(); + local_vec[0] = world_vector * breast_dir_world_vec; + + LLVector3 breast_up_dir_world_vec = LLVector3(0,0,1) * world_rot; + breast_up_dir_world_vec.normalize(); + local_vec[2] = world_vector * breast_up_dir_world_vec; + + /* + { + llinfos << "Dir: " << breast_dir_world_vec << "V: " << world_vector << "DP: " << local_vec[0] << " time: " << llendl; + } + */ + + return local_vec; + } + + LLVector3 calculateVelocity_local(const F32 time_delta) + { + LLJoint *chest_joint = mChestState->getJoint(); + const LLVector3 world_pos_pt = chest_joint->getWorldPosition(); + const LLQuaternion world_rot = chest_joint->getWorldRotation(); + const LLVector3 last_world_pos_pt = mCharLastPosition_world_pt; + const LLVector3 char_velocity_world_vec = (world_pos_pt-last_world_pos_pt) / time_delta; + const LLVector3 char_velocity_local_vec = toLocal(char_velocity_world_vec); + + return char_velocity_local_vec; + } + + LLVector3 calculateAcceleration_local(const LLVector3 &new_char_velocity_local_vec, + const F32 time_delta) + { + LLVector3 char_acceleration_local_vec = new_char_velocity_local_vec - mCharLastVelocity_local_vec; + + char_acceleration_local_vec = + char_acceleration_local_vec * 1.0/mBreastSmoothingParam + + mCharLastAcceleration_local_vec * (mBreastSmoothingParam-1.0)/mBreastSmoothingParam; + + mCharLastAcceleration_local_vec = char_acceleration_local_vec; + + char_acceleration_local_vec *= mBreastAccelerationParam; + return char_acceleration_local_vec; + } + + // called per time step + // must return TRUE while it is active, and + // must return FALSE when the motion is completed. + virtual BOOL onUpdate(F32 time, U8* joint_mask) + { + /* + FILE *fread = fopen("c:\\temp\\breast_data.txt","r"); + if (fread) + { + char dummy_str[255]; + fscanf(fread,"%s %f\n",dummy_str, &mBreastMassParam); + fscanf(fread,"%s %f %f %f\n",dummy_str, &mBreastSpringParam[0],&mBreastSpringParam[1],&mBreastSpringParam[2]); + fscanf(fread,"%s %f %f %f\n",dummy_str, &mBreastAccelerationParam[0],&mBreastAccelerationParam[1],&mBreastAccelerationParam[2]); + fscanf(fread,"%s %f %f %f\n",dummy_str, &mBreastDampingParam[0],&mBreastDampingParam[1],&mBreastDampingParam[2]); + fscanf(fread,"%s %f %f %f\n",dummy_str, &mBreastMaxVelocityParam[0],&mBreastMaxVelocityParam[1],&mBreastMaxVelocityParam[2]); + fscanf(fread,"%s %f %f %f\n",dummy_str, &mBreastDragParam[0], &mBreastDragParam[1], &mBreastDragParam[2]); + fscanf(fread,"%s %d\n",dummy_str, &mBreastSmoothingParam); + } + fclose(fread); + */ + + /* TEST: + 1. Change outfits + 2. FPS effect + 3. Add disable + 4. Disappearing chests + 5. Overwrites breast params + 6. Threshold for not setting param + */ + + mBreastMassParam = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_Mass"))->getWeight(); + mBreastSmoothingParam = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_Smoothing"))->getWeight(); + mBreastGravityParam = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_Gravity"))->getWeight(); + + mBreastSpringParam[0] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_Side_Spring"))->getWeight(); + mBreastAccelerationParam[0] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_Side_Bounce"))->getWeight(); + mBreastDampingParam[0] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_Side_Damping"))->getWeight(); + mBreastMaxVelocityParam[0] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_Side_Range"))->getWeight(); + mBreastDragParam[0] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_Side_Drag"))->getWeight(); + + mBreastSpringParam[2] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_UpDown_Spring"))->getWeight(); + mBreastAccelerationParam[2] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_UpDown_Bounce"))->getWeight(); + mBreastDampingParam[2] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_UpDown_Damping"))->getWeight(); + mBreastMaxVelocityParam[2] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_UpDown_Range"))->getWeight(); + mBreastDragParam[2] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_UpDown_Drag"))->getWeight(); + + if (mCharacter->getSex() != SEX_FEMALE) return TRUE; + const F32 time_delta = calculateTimeDelta(); + if (time_delta < .01 || time_delta > 10.0) return TRUE; + + + LLVector3 breast_user_local_pt(0,0,0); + + for (U32 i=0; i < 3; i++) + { + if (mBreastParamsUser[i] != NULL) + { + breast_user_local_pt[i] = mBreastParamsUser[i]->getWeight(); + } + } + + LLVector3 breast_current_local_pt = mBreastLastPosition_local_pt; + + const LLVector3 char_velocity_local_vec = calculateVelocity_local(time_delta); + const LLVector3 char_acceleration_local_vec = calculateAcceleration_local(char_velocity_local_vec, time_delta); + mCharLastVelocity_local_vec = char_velocity_local_vec; + + LLJoint *chest_joint = mChestState->getJoint(); + mCharLastPosition_world_pt = chest_joint->getWorldPosition(); + + + const LLVector3 spring_length_local = breast_current_local_pt-breast_user_local_pt; + LLVector3 force_spring_local_vec = -spring_length_local; force_spring_local_vec *= mBreastSpringParam; + const LLVector3 force_accel_local_vec = char_acceleration_local_vec * mBreastMassParam; + + const LLVector3 force_gravity_local_vec = toLocal(LLVector3(0,0,1))* mBreastGravityParam * mBreastMassParam; + + LLVector3 force_damping_local_vec = -mBreastDampingParam; force_damping_local_vec *= mBreastVelocity_local_vec; + + LLVector3 force_drag_local_vec = .5*char_velocity_local_vec; // should square char_velocity_vec + force_drag_local_vec[0] *= mBreastDragParam[0]; + force_drag_local_vec[1] *= mBreastDragParam[1]; + force_drag_local_vec[2] *= mBreastDragParam[2]; + + const LLVector3 force_net_local_vec = + force_accel_local_vec + + force_gravity_local_vec + + force_spring_local_vec + + force_damping_local_vec + + force_drag_local_vec; + + LLVector3 acceleration_local_vec = force_net_local_vec / mBreastMassParam; + mBreastVelocity_local_vec += acceleration_local_vec; + mBreastVelocity_local_vec.clamp(-mBreastMaxVelocityParam, mBreastMaxVelocityParam); + + LLVector3 new_local_pt = breast_current_local_pt + mBreastVelocity_local_vec*time_delta; + new_local_pt.clamp(mBreastParamsMin,mBreastParamsMax); + + for (U32 i=0; i < 3; i++) + { + if (mBreastParamsDriven[i]) + { + mCharacter->setVisualParamWeight(mBreastParamsDriven[i], + new_local_pt[i], + FALSE); + } + } + + if (mFileWrite != NULL) + { + fprintf(mFileWrite,"%f\t%f\t%f\t%f\t\t%f\t%f\t%f\t \t%f\t%f\t%f\t%f\t%f\t%f\n", + mCharLastPosition_world_pt[2], + breast_current_local_pt[2], + acceleration_local_vec[2], + mBreastVelocity_local_vec[2], + + force_accel_local_vec[2], + force_spring_local_vec[2], + force_damping_local_vec[2], + + force_accel_local_vec[2], + force_damping_local_vec[2], + force_drag_local_vec[2], + force_net_local_vec[2], + time_delta, + mBreastMassParam + ); + } + + mBreastLastPosition_local_pt = new_local_pt; + mCharacter->updateVisualParams(); + return TRUE; + } + + // called when a motion is deactivated + virtual void onDeactivate() {} + +private: + //------------------------------------------------------------------------- + // joint states to be animated + //------------------------------------------------------------------------- + LLPointer mChestState; + LLCharacter* mCharacter; + + LLViewerVisualParam *mBreastParamsUser[3]; + LLViewerVisualParam *mBreastParamsDriven[3]; + LLVector3 mBreastParamsMin; + LLVector3 mBreastParamsMax; + + LLVector3 mCharLastPosition_world_pt; // Last position of the avatar + LLVector3 mCharLastVelocity_local_vec; // How fast the character is moving + LLVector3 mCharLastAcceleration_local_vec; // Change in character velocity + + LLVector3 mBreastLastPosition_local_pt; // Last parameters for breast + LLVector3 mBreastVelocity_local_vec; // How fast the breast params are moving + + + F32 mBreastMassParam; + F32 mBreastGravityParam; + U32 mBreastSmoothingParam; + + LLVector3 mBreastSpringParam; + LLVector3 mBreastDampingParam; + LLVector3 mBreastAccelerationParam; + LLVector3 mBreastMaxVelocityParam; + LLVector3 mBreastDragParam; + + LLFrameTimer mTimer; + F32 mLastTime; + + FILE *mFileWrite; + U32 mFileTicks; +}; + /** ** ** End LLVOAvatar Support classes @@ -1137,6 +1521,7 @@ void LLVOAvatar::initClass() gAnimLibrary.animStateSetString(ANIM_AGENT_BODY_NOISE,"body_noise"); gAnimLibrary.animStateSetString(ANIM_AGENT_BREATHE_ROT,"breathe_rot"); + gAnimLibrary.animStateSetString(ANIM_AGENT_BREAST_MOTION,"breast_motion"); gAnimLibrary.animStateSetString(ANIM_AGENT_EDITING,"editing"); gAnimLibrary.animStateSetString(ANIM_AGENT_EYE,"eye"); gAnimLibrary.animStateSetString(ANIM_AGENT_FLY_ADJUST,"fly_adjust"); @@ -1275,6 +1660,7 @@ void LLVOAvatar::initInstance(void) // motions without a start/stop bit registerMotion( ANIM_AGENT_BODY_NOISE, LLBodyNoiseMotion::create ); registerMotion( ANIM_AGENT_BREATHE_ROT, LLBreatheMotionRot::create ); + registerMotion( ANIM_AGENT_BREAST_MOTION, LLBreastMotion::create ); registerMotion( ANIM_AGENT_EDITING, LLEditingMotion::create ); registerMotion( ANIM_AGENT_EYE, LLEyeMotion::create ); registerMotion( ANIM_AGENT_FEMALE_WALK, LLKeyframeWalkMotion::create ); @@ -1688,6 +2074,7 @@ void LLVOAvatar::startDefaultMotions() startMotion( ANIM_AGENT_EYE ); startMotion( ANIM_AGENT_BODY_NOISE ); startMotion( ANIM_AGENT_BREATHE_ROT ); + startMotion( ANIM_AGENT_BREAST_MOTION ); startMotion( ANIM_AGENT_HAND_MOTION ); startMotion( ANIM_AGENT_PELVIS_FIX ); @@ -6097,14 +6484,10 @@ void LLVOAvatar::updateMeshTextures() // When an avatar is changing clothes and not in Appearance mode, // use the last-known good baked texture until it finish the first // render of the new layerset. - - const BOOL layerset_invalid = !mBakedTextureDatas[i].mTexLayerSet - || !mBakedTextureDatas[i].mTexLayerSet->getComposite()->isInitialized() - || !mBakedTextureDatas[i].mTexLayerSet->isLocalTextureDataAvailable(); - use_lkg_baked_layer[i] = (!is_layer_baked[i] && (mBakedTextureDatas[i].mLastTextureIndex != IMG_DEFAULT_AVATAR) - && layerset_invalid); + && mBakedTextureDatas[i].mTexLayerSet + && !mBakedTextureDatas[i].mTexLayerSet->getComposite()->isInitialized()); if (use_lkg_baked_layer[i]) { mBakedTextureDatas[i].mTexLayerSet->setUpdatesEnabled(TRUE); diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 6d9424c8be..c522af7d55 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -48,6 +48,7 @@ extern const LLUUID ANIM_AGENT_BODY_NOISE; extern const LLUUID ANIM_AGENT_BREATHE_ROT; +extern const LLUUID ANIM_AGENT_BREAST_MOTION; extern const LLUUID ANIM_AGENT_EDITING; extern const LLUUID ANIM_AGENT_EYE; extern const LLUUID ANIM_AGENT_FLY_ADJUST; diff --git a/indra/newview/skins/default/xui/en/menu_attachment_self.xml b/indra/newview/skins/default/xui/en/menu_attachment_self.xml index e2348375d5..acdecbad31 100644 --- a/indra/newview/skins/default/xui/en/menu_attachment_self.xml +++ b/indra/newview/skins/default/xui/en/menu_attachment_self.xml @@ -80,6 +80,14 @@ name="Edit Outfit"> + + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 676bef2d0b..e16bbfa5a5 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2471,6 +2471,20 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. Bulbous Bulbous Nose +Breast Mass +Breast Smoothing + +Breast Side Spring +Breast Side Bounce +Breast Side Damping +Breast Side Drag +Breast Side Max + +Breast UpDown Spring +Breast UpDown Bounce +Breast UpDown Damping +Breast UpDown Drag +Breast UpDown Range Bushy Eyebrows Bushy Hair -- cgit v1.2.3 From 78538f4f618bebbdb4b441dc2b1e23877c0d3cb9 Mon Sep 17 00:00:00 2001 From: Loren Shih Date: Mon, 23 Aug 2010 14:15:17 -0400 Subject: Changed Acceleration to gain. Changed behavior of gain. Changed names of Driver/Driven params. --- indra/newview/character/avatar_lad.xml | 24 ++++++++++----------- indra/newview/llvoavatar.cpp | 30 +++++++++++++++----------- indra/newview/skins/default/xui/en/strings.xml | 5 +++-- 3 files changed, 32 insertions(+), 27 deletions(-) diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index cdb3684034..4f64d669f5 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -4047,7 +4047,7 @@ id="507" group="0" sex="female" - name="Breast_Gravity_Driven" + name="Breast_Gravity" label="Breast Buoyancy" wearable="shape" edit_group="driven" @@ -4115,7 +4115,7 @@ id="684" group="0" sex="female" - name="Breast_Female_Cleavage_Driven" + name="Breast_Female_Cleavage" label="Breast Cleavage" wearable="shape" edit_group="driven" @@ -9119,9 +9119,9 @@ render_pass="bump"> edit_group="shape_physics" label_min="Less" label_max="More" - value_default="2" + value_default="0" value_min="0" - value_max="10" + value_max="2" camera_elevation=".3" camera_distance=".8"> @@ -9149,14 +9149,14 @@ render_pass="bump"> id="1078" group="0" sex="female" - name="Breast_Physics_Side_Bounce" - label="Breast Physics Side Bounce" + name="Breast_Physics_Side_Gain" + label="Breast Physics Side Gain" wearable="shape" edit_group="shape_physics" label_min="Less" label_max="More" value_default="10" - value_min="0" + value_min="1" value_max="100" camera_elevation=".3" camera_distance=".8"> @@ -9240,14 +9240,14 @@ render_pass="bump"> id="1083" group="0" sex="female" - name="Breast_Physics_UpDown_Bounce" - label="Breast Physics UpDown Bounce" + name="Breast_Physics_UpDown_Gain" + label="Breast Physics UpDown Gain" wearable="shape" edit_group="shape_physics" label_min="Less" label_max="More" value_default="50" - value_min="0" + value_min="1" value_max="100" camera_elevation=".3" camera_distance=".8"> @@ -9312,7 +9312,7 @@ render_pass="bump"> id="1087" group="0" sex="female" - name="Breast_Female_Cleavage" + name="Breast_Female_Cleavage_Driver" label="Breast Cleavage" wearable="shape" edit_group="shape_torso" @@ -9333,7 +9333,7 @@ render_pass="bump"> id="1088" group="0" sex="female" - name="Breast_Gravity" + name="Breast_Gravity_Driver" label="Breast Buoyancy" wearable="shape" edit_group="shape_torso" diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index f595a05a28..0f5df8ce12 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -598,7 +598,7 @@ public: mBreastGravityParam = (F32)0.0; mBreastSpringParam = LLVector3((F32)3.0, (F32)0.0, (F32)3.0); - mBreastAccelerationParam = LLVector3((F32)50.0, (F32)0.0, (F32)50.0); + mBreastGainParam = LLVector3((F32)50.0, (F32)0.0, (F32)50.0); mBreastDampingParam = LLVector3((F32)0.3, (F32)0.0, (F32)0.3); mBreastMaxVelocityParam = LLVector3((F32)10.0, (F32)0.0, (F32)10.0); @@ -669,17 +669,17 @@ public: // User-set params static const std::string breast_param_names_user[3] = { - "Breast_Female_Cleavage", + "Breast_Female_Cleavage_Driver", "", - "Breast_Gravity" + "Breast_Gravity_Driver" }; // Params driven by this algorithm static const std::string breast_param_names_driven[3] = { - "Breast_Female_Cleavage_Driven", + "Breast_Female_Cleavage", "", - "Breast_Gravity_Driven" + "Breast_Gravity" }; for (U32 i=0; i < 3; i++) @@ -779,7 +779,6 @@ public: mCharLastAcceleration_local_vec = char_acceleration_local_vec; - char_acceleration_local_vec *= mBreastAccelerationParam; return char_acceleration_local_vec; } @@ -795,7 +794,7 @@ public: char dummy_str[255]; fscanf(fread,"%s %f\n",dummy_str, &mBreastMassParam); fscanf(fread,"%s %f %f %f\n",dummy_str, &mBreastSpringParam[0],&mBreastSpringParam[1],&mBreastSpringParam[2]); - fscanf(fread,"%s %f %f %f\n",dummy_str, &mBreastAccelerationParam[0],&mBreastAccelerationParam[1],&mBreastAccelerationParam[2]); + fscanf(fread,"%s %f %f %f\n",dummy_str, &mBreastGainParam[0],&mBreastGainParam[1],&mBreastGainParam[2]); fscanf(fread,"%s %f %f %f\n",dummy_str, &mBreastDampingParam[0],&mBreastDampingParam[1],&mBreastDampingParam[2]); fscanf(fread,"%s %f %f %f\n",dummy_str, &mBreastMaxVelocityParam[0],&mBreastMaxVelocityParam[1],&mBreastMaxVelocityParam[2]); fscanf(fread,"%s %f %f %f\n",dummy_str, &mBreastDragParam[0], &mBreastDragParam[1], &mBreastDragParam[2]); @@ -818,13 +817,13 @@ public: mBreastGravityParam = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_Gravity"))->getWeight(); mBreastSpringParam[0] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_Side_Spring"))->getWeight(); - mBreastAccelerationParam[0] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_Side_Bounce"))->getWeight(); + mBreastGainParam[0] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_Side_Gain"))->getWeight(); mBreastDampingParam[0] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_Side_Damping"))->getWeight(); mBreastMaxVelocityParam[0] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_Side_Range"))->getWeight(); mBreastDragParam[0] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_Side_Drag"))->getWeight(); mBreastSpringParam[2] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_UpDown_Spring"))->getWeight(); - mBreastAccelerationParam[2] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_UpDown_Bounce"))->getWeight(); + mBreastGainParam[2] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_UpDown_Gain"))->getWeight(); mBreastDampingParam[2] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_UpDown_Damping"))->getWeight(); mBreastMaxVelocityParam[2] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_UpDown_Range"))->getWeight(); mBreastDragParam[2] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_UpDown_Drag"))->getWeight(); @@ -856,9 +855,13 @@ public: const LLVector3 spring_length_local = breast_current_local_pt-breast_user_local_pt; LLVector3 force_spring_local_vec = -spring_length_local; force_spring_local_vec *= mBreastSpringParam; - const LLVector3 force_accel_local_vec = char_acceleration_local_vec * mBreastMassParam; - + + LLVector3 force_accel_local_vec = char_acceleration_local_vec * mBreastMassParam; const LLVector3 force_gravity_local_vec = toLocal(LLVector3(0,0,1))* mBreastGravityParam * mBreastMassParam; + force_accel_local_vec += force_gravity_local_vec; + force_accel_local_vec[0] *= mBreastGainParam[0]; + force_accel_local_vec[1] *= mBreastGainParam[1]; + force_accel_local_vec[2] *= mBreastGainParam[2]; LLVector3 force_damping_local_vec = -mBreastDampingParam; force_damping_local_vec *= mBreastVelocity_local_vec; @@ -867,13 +870,14 @@ public: force_drag_local_vec[1] *= mBreastDragParam[1]; force_drag_local_vec[2] *= mBreastDragParam[2]; - const LLVector3 force_net_local_vec = + LLVector3 force_net_local_vec = force_accel_local_vec + force_gravity_local_vec + force_spring_local_vec + force_damping_local_vec + force_drag_local_vec; + LLVector3 acceleration_local_vec = force_net_local_vec / mBreastMassParam; mBreastVelocity_local_vec += acceleration_local_vec; mBreastVelocity_local_vec.clamp(-mBreastMaxVelocityParam, mBreastMaxVelocityParam); @@ -946,7 +950,7 @@ private: LLVector3 mBreastSpringParam; LLVector3 mBreastDampingParam; - LLVector3 mBreastAccelerationParam; + LLVector3 mBreastGainParam; LLVector3 mBreastMaxVelocityParam; LLVector3 mBreastDragParam; diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index e16bbfa5a5..7a010697ac 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2473,15 +2473,16 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. Breast Mass Breast Smoothing +Breast Gravity Breast Side Spring -Breast Side Bounce +Breast Side Gain Breast Side Damping Breast Side Drag Breast Side Max Breast UpDown Spring -Breast UpDown Bounce +Breast UpDown Gain Breast UpDown Damping Breast UpDown Drag Breast UpDown Range -- cgit v1.2.3 From 981a43b355e44daa7e1b4065b896ea4cd2fec3a2 Mon Sep 17 00:00:00 2001 From: Loren Shih Date: Mon, 23 Aug 2010 16:13:10 -0400 Subject: Created new wearable type. Added debug setting for disabling physics. Added disable-multiwear and disable-camera-reset to wearabletype. --- indra/newview/app_settings/settings.xml | 13 + indra/newview/character/avatar_lad.xml | 54 +- indra/newview/llagentwearables.cpp | 4 +- indra/newview/llinventorybridge.cpp | 5 + indra/newview/llinventoryicon.cpp | 2 + indra/newview/llinventoryicon.h | 4 +- indra/newview/llpaneleditwearable.cpp | 15 +- indra/newview/llpaneleditwearable.h | 1 + indra/newview/llpaneloutfitedit.cpp | 1 + indra/newview/llpaneloutfitedit.h | 1 + indra/newview/llsidepanelappearance.cpp | 4 +- indra/newview/llsidepanelappearance.h | 2 +- indra/newview/llviewerinventory.cpp | 1 + indra/newview/llvoavatar.cpp | 7 +- indra/newview/llwearableitemslist.cpp | 1 + indra/newview/llwearabletype.cpp | 81 +- indra/newview/llwearabletype.h | 5 +- indra/newview/skins/default/textures/textures.xml | 1 + .../skins/default/xui/en/floater_customize.xml | 3389 -------------------- .../skins/default/xui/en/menu_attachment_self.xml | 8 - .../skins/default/xui/en/menu_avatar_self.xml | 20 +- .../skins/default/xui/en/menu_inventory.xml | 8 + .../skins/default/xui/en/menu_inventory_add.xml | 8 + .../skins/default/xui/en/menu_outfit_gear.xml | 8 + indra/newview/skins/default/xui/en/menu_viewer.xml | 10 + .../skins/default/xui/en/panel_edit_physics.xml | 51 + .../skins/default/xui/en/panel_edit_wearable.xml | 18 + indra/newview/skins/default/xui/en/strings.xml | 4 + 28 files changed, 254 insertions(+), 3472 deletions(-) delete mode 100644 indra/newview/skins/default/xui/en/floater_customize.xml create mode 100644 indra/newview/skins/default/xui/en/panel_edit_physics.xml diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 07418d1b5e..8310c50b1e 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -619,6 +619,19 @@ Value 0 + + AvatarPhysics + + Comment + Enable avatar physics, such as breast physics. + Persist + 1 + Type + Boolean + Value + 1 + + BackgroundYieldTime Comment diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index 4f64d669f5..7dd15c67c7 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -9079,8 +9079,8 @@ render_pass="bump"> sex="female" name="Breast_Physics_Mass" label="Breast Physics Mass" - wearable="shape" - edit_group="shape_physics" + wearable="physics" + edit_group="physics" label_min="Less" label_max="More" value_default="1" @@ -9097,8 +9097,8 @@ render_pass="bump"> sex="female" name="Breast_Physics_Smoothing" label="Breast Physics Smoothing" - wearable="shape" - edit_group="shape_physics" + wearable="physics" + edit_group="physics" label_min="Less" label_max="More" value_default="2" @@ -9115,8 +9115,8 @@ render_pass="bump"> sex="female" name="Breast_Physics_Gravity" label="Breast Physics Gravity" - wearable="shape" - edit_group="shape_physics" + wearable="physics" + edit_group="physics" label_min="Less" label_max="More" value_default="0" @@ -9133,8 +9133,8 @@ render_pass="bump"> sex="female" name="Breast_Physics_Side_Spring" label="Breast Physics Side Spring" - wearable="shape" - edit_group="shape_physics" + wearable="physics" + edit_group="physics" label_min="Less" label_max="More" value_default="3" @@ -9151,8 +9151,8 @@ render_pass="bump"> sex="female" name="Breast_Physics_Side_Gain" label="Breast Physics Side Gain" - wearable="shape" - edit_group="shape_physics" + wearable="physics" + edit_group="physics" label_min="Less" label_max="More" value_default="10" @@ -9169,8 +9169,8 @@ render_pass="bump"> sex="female" name="Breast_Physics_Side_Damping" label="Breast Physics Side Damping" - wearable="shape" - edit_group="shape_physics" + wearable="physics" + edit_group="physics" label_min="Less" label_max="More" value_default=".5" @@ -9187,8 +9187,8 @@ render_pass="bump"> sex="female" name="Breast_Physics_Side_Drag" label="Breast Physics Side Drag" - wearable="shape" - edit_group="shape_physics" + wearable="physics" + edit_group="physics" label_min="Less" label_max="More" value_default=".1" @@ -9205,8 +9205,8 @@ render_pass="bump"> sex="female" name="Breast_Physics_Side_Range" label="Breast Physics Side Range" - wearable="shape" - edit_group="shape_physics" + wearable="physics" + edit_group="physics" label_min="Less" label_max="More" value_default="10" @@ -9224,8 +9224,8 @@ render_pass="bump"> sex="female" name="Breast_Physics_UpDown_Spring" label="Breast Physics UpDown Spring" - wearable="shape" - edit_group="shape_physics" + wearable="physics" + edit_group="physics" label_min="Less" label_max="More" value_default="1.5" @@ -9242,8 +9242,8 @@ render_pass="bump"> sex="female" name="Breast_Physics_UpDown_Gain" label="Breast Physics UpDown Gain" - wearable="shape" - edit_group="shape_physics" + wearable="physics" + edit_group="physics" label_min="Less" label_max="More" value_default="50" @@ -9260,8 +9260,8 @@ render_pass="bump"> sex="female" name="Breast_Physics_UpDown_Damping" label="Breast Physics UpDown Damping" - wearable="shape" - edit_group="shape_physics" + wearable="physics" + edit_group="physics" label_min="Less" label_max="More" value_default=".1" @@ -9278,8 +9278,8 @@ render_pass="bump"> sex="female" name="Breast_Physics_UpDown_Drag" label="Breast Physics UpDown Drag" - wearable="shape" - edit_group="shape_physics" + wearable="physics" + edit_group="physics" label_min="Less" label_max="More" value_default=".1" @@ -9296,8 +9296,8 @@ render_pass="bump"> sex="female" name="Breast_Physics_UpDown_Range" label="Breast Physics UpDown Range" - wearable="shape" - edit_group="shape_physics" + wearable="physics" + edit_group="physics" label_min="Less" label_max="More" value_default="10" @@ -9308,6 +9308,8 @@ render_pass="bump"> + + getType()); LLPanel* panel = LLSideTray::getInstance()->getPanel("sidepanel_appearance"); - LLSidepanelAppearance::editWearable(wearable, panel); + LLSidepanelAppearance::editWearable(wearable, panel, disable_camera_switch); } // Request editing the item after it gets worn. diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index aff0bc4099..a564059b87 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -4496,6 +4496,11 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags) disabled_items.push_back(std::string("Take Off")); disabled_items.push_back(std::string("Wearable Edit")); } + if (gAgentWearables.isWearingWearableType(mWearableType) && + !LLWearableType::getAllowMultiwear(mWearableType)) + { + disabled_items.push_back(std::string("Wearable Add")); + } break; default: break; diff --git a/indra/newview/llinventoryicon.cpp b/indra/newview/llinventoryicon.cpp index 021790648d..0574f0efe5 100644 --- a/indra/newview/llinventoryicon.cpp +++ b/indra/newview/llinventoryicon.cpp @@ -82,6 +82,8 @@ LLIconDictionary::LLIconDictionary() addEntry(LLInventoryIcon::ICONNAME_ANIMATION, new IconEntry("Inv_Animation")); addEntry(LLInventoryIcon::ICONNAME_GESTURE, new IconEntry("Inv_Gesture")); + addEntry(LLInventoryIcon::ICONNAME_CLOTHING_PHYSICS, new IconEntry("Inv_Physics")); + addEntry(LLInventoryIcon::ICONNAME_LINKITEM, new IconEntry("Inv_LinkItem")); addEntry(LLInventoryIcon::ICONNAME_LINKFOLDER, new IconEntry("Inv_LinkItem")); diff --git a/indra/newview/llinventoryicon.h b/indra/newview/llinventoryicon.h index 3c7ac7f609..ea00206ba1 100644 --- a/indra/newview/llinventoryicon.h +++ b/indra/newview/llinventoryicon.h @@ -66,9 +66,11 @@ public: ICONNAME_CLOTHING_SKIRT, ICONNAME_CLOTHING_ALPHA, ICONNAME_CLOTHING_TATTOO, - + ICONNAME_ANIMATION, ICONNAME_GESTURE, + + ICONNAME_CLOTHING_PHYSICS, ICONNAME_LINKITEM, ICONNAME_LINKFOLDER, diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp index bfe3aa0e61..baccb9a807 100644 --- a/indra/newview/llpaneleditwearable.cpp +++ b/indra/newview/llpaneleditwearable.cpp @@ -72,7 +72,6 @@ enum ESubpart { SUBPART_SHAPE_MOUTH, SUBPART_SHAPE_CHIN, SUBPART_SHAPE_TORSO, - SUBPART_SHAPE_PHYSICS, SUBPART_SHAPE_LEGS, SUBPART_SHAPE_WHOLE, SUBPART_SHAPE_DETAIL, @@ -95,7 +94,8 @@ enum ESubpart { SUBPART_UNDERPANTS, SUBPART_SKIRT, SUBPART_ALPHA, - SUBPART_TATTOO + SUBPART_TATTOO, + SUBPART_PHYSICS }; using namespace LLVOAvatarDefines; @@ -219,7 +219,7 @@ LLEditWearableDictionary::Wearables::Wearables() // note the subpart that is listed first is treated as "default", regardless of what order is in enum. // Please match the order presented in XUI. -Nyx // this will affect what camera angle is shown when first editing a wearable - addEntry(LLWearableType::WT_SHAPE, new WearableEntry(LLWearableType::WT_SHAPE,"edit_shape_title","shape_desc_text",0,0,10, SUBPART_SHAPE_WHOLE, SUBPART_SHAPE_HEAD, SUBPART_SHAPE_EYES, SUBPART_SHAPE_EARS, SUBPART_SHAPE_NOSE, SUBPART_SHAPE_MOUTH, SUBPART_SHAPE_CHIN, SUBPART_SHAPE_TORSO, SUBPART_SHAPE_LEGS, SUBPART_SHAPE_PHYSICS)); + addEntry(LLWearableType::WT_SHAPE, new WearableEntry(LLWearableType::WT_SHAPE,"edit_shape_title","shape_desc_text",0,0,9, SUBPART_SHAPE_WHOLE, SUBPART_SHAPE_HEAD, SUBPART_SHAPE_EYES, SUBPART_SHAPE_EARS, SUBPART_SHAPE_NOSE, SUBPART_SHAPE_MOUTH, SUBPART_SHAPE_CHIN, SUBPART_SHAPE_TORSO, SUBPART_SHAPE_LEGS)); addEntry(LLWearableType::WT_SKIN, new WearableEntry(LLWearableType::WT_SKIN,"edit_skin_title","skin_desc_text",0,3,4, TEX_HEAD_BODYPAINT, TEX_UPPER_BODYPAINT, TEX_LOWER_BODYPAINT, SUBPART_SKIN_COLOR, SUBPART_SKIN_FACEDETAIL, SUBPART_SKIN_MAKEUP, SUBPART_SKIN_BODYDETAIL)); addEntry(LLWearableType::WT_HAIR, new WearableEntry(LLWearableType::WT_HAIR,"edit_hair_title","hair_desc_text",0,1,4, TEX_HAIR, SUBPART_HAIR_COLOR, SUBPART_HAIR_STYLE, SUBPART_HAIR_EYEBROWS, SUBPART_HAIR_FACIAL)); addEntry(LLWearableType::WT_EYES, new WearableEntry(LLWearableType::WT_EYES,"edit_eyes_title","eyes_desc_text",0,1,1, TEX_EYES_IRIS, SUBPART_EYES)); @@ -234,6 +234,7 @@ LLEditWearableDictionary::Wearables::Wearables() addEntry(LLWearableType::WT_SKIRT, new WearableEntry(LLWearableType::WT_SKIRT,"edit_skirt_title","skirt_desc_text",1,1,1, TEX_SKIRT, TEX_SKIRT, SUBPART_SKIRT)); addEntry(LLWearableType::WT_ALPHA, new WearableEntry(LLWearableType::WT_ALPHA,"edit_alpha_title","alpha_desc_text",0,5,1, TEX_LOWER_ALPHA, TEX_UPPER_ALPHA, TEX_HEAD_ALPHA, TEX_EYES_ALPHA, TEX_HAIR_ALPHA, SUBPART_ALPHA)); addEntry(LLWearableType::WT_TATTOO, new WearableEntry(LLWearableType::WT_TATTOO,"edit_tattoo_title","tattoo_desc_text",1,3,1, TEX_HEAD_TATTOO, TEX_LOWER_TATTOO, TEX_UPPER_TATTOO, TEX_HEAD_TATTOO, SUBPART_TATTOO)); + addEntry(LLWearableType::WT_PHYSICS, new WearableEntry(LLWearableType::WT_PHYSICS,"edit_physics_title","physics_desc_text",0,0,1, SUBPART_PHYSICS)); } LLEditWearableDictionary::WearableEntry::WearableEntry(LLWearableType::EType type, @@ -279,7 +280,6 @@ LLEditWearableDictionary::Subparts::Subparts() addEntry(SUBPART_SHAPE_MOUTH, new SubpartEntry(SUBPART_SHAPE_MOUTH, "mHead", "shape_mouth", "shape_mouth_param_list", "shape_mouth_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH)); addEntry(SUBPART_SHAPE_CHIN, new SubpartEntry(SUBPART_SHAPE_CHIN, "mHead", "shape_chin", "shape_chin_param_list", "shape_chin_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH)); addEntry(SUBPART_SHAPE_TORSO, new SubpartEntry(SUBPART_SHAPE_TORSO, "mTorso", "shape_torso", "shape_torso_param_list", "shape_torso_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(-1.f, 0.15f, 0.3f),SEX_BOTH)); - addEntry(SUBPART_SHAPE_PHYSICS, new SubpartEntry(SUBPART_SHAPE_PHYSICS, "mTorso", "shape_physics", "shape_physics_param_list", "shape_physics_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(-1.f, 0.15f, 0.3f),SEX_FEMALE)); addEntry(SUBPART_SHAPE_LEGS, new SubpartEntry(SUBPART_SHAPE_LEGS, "mPelvis", "shape_legs", "shape_legs_param_list", "shape_legs_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH)); addEntry(SUBPART_SKIN_COLOR, new SubpartEntry(SUBPART_SKIN_COLOR, "mHead", "skin_color", "skin_color_param_list", "skin_color_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH)); @@ -305,6 +305,7 @@ LLEditWearableDictionary::Subparts::Subparts() addEntry(SUBPART_UNDERPANTS, new SubpartEntry(SUBPART_UNDERPANTS, "mPelvis", "underpants", "underpants_main_param_list", "underpants_main_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH)); addEntry(SUBPART_ALPHA, new SubpartEntry(SUBPART_ALPHA, "mPelvis", "alpha", "alpha_main_param_list", "alpha_main_tab", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f),SEX_BOTH)); addEntry(SUBPART_TATTOO, new SubpartEntry(SUBPART_TATTOO, "mPelvis", "tattoo", "tattoo_main_param_list", "tattoo_main_tab", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f),SEX_BOTH)); + addEntry(SUBPART_PHYSICS, new SubpartEntry(SUBPART_PHYSICS, "mTorso", "physics", "physics_main_param_list", "physics_main_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(-1.f, 0.15f, 0.3f),SEX_FEMALE)); } LLEditWearableDictionary::SubpartEntry::SubpartEntry(ESubpart part, @@ -741,6 +742,7 @@ BOOL LLPanelEditWearable::postBuild() mPanelSkirt = getChild("edit_skirt_panel"); mPanelAlpha = getChild("edit_alpha_panel"); mPanelTattoo = getChild("edit_tattoo_panel"); + mPanelPhysics = getChild("edit_physics_panel"); mTxtAvatarHeight = mPanelShape->getChild("avatar_height"); @@ -1360,6 +1362,11 @@ LLPanel* LLPanelEditWearable::getPanel(LLWearableType::EType type) case LLWearableType::WT_TATTOO: return mPanelTattoo; break; + + case LLWearableType::WT_PHYSICS: + return mPanelPhysics; + break; + default: break; } diff --git a/indra/newview/llpaneleditwearable.h b/indra/newview/llpaneleditwearable.h index 623101d835..692a7ce90f 100644 --- a/indra/newview/llpaneleditwearable.h +++ b/indra/newview/llpaneleditwearable.h @@ -163,6 +163,7 @@ private: LLPanel *mPanelSkirt; LLPanel *mPanelAlpha; LLPanel *mPanelTattoo; + LLPanel *mPanelPhysics; typedef std::map string_texture_index_map_t; string_texture_index_map_t mAlphaCheckbox2Index; diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp index c9380bf6e6..4a87249257 100644 --- a/indra/newview/llpaneloutfitedit.cpp +++ b/indra/newview/llpaneloutfitedit.cpp @@ -466,6 +466,7 @@ BOOL LLPanelOutfitEdit::postBuild() mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("skirt"), new LLFindActualWearablesOfType(LLWearableType::WT_SKIRT))); mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("alpha"), new LLFindActualWearablesOfType(LLWearableType::WT_ALPHA))); mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("tattoo"), new LLFindActualWearablesOfType(LLWearableType::WT_TATTOO))); + mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("physics"), new LLFindActualWearablesOfType(LLWearableType::WT_PHYSICS))); mCurrentOutfitName = getChild("curr_outfit_name"); mStatus = getChild("status"); diff --git a/indra/newview/llpaneloutfitedit.h b/indra/newview/llpaneloutfitedit.h index 2dca986e33..f420930acd 100644 --- a/indra/newview/llpaneloutfitedit.h +++ b/indra/newview/llpaneloutfitedit.h @@ -96,6 +96,7 @@ public: LVIT_SKIRT, LVIT_ALPHA, LVIT_TATTOO, + LVIT_PHYSICS, NUM_LIST_VIEW_ITEM_TYPES } EListViewItemType; diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index 333a463844..cd6f87f615 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -434,14 +434,14 @@ void LLSidepanelAppearance::refreshCurrentOutfitName(const std::string& name) } //static -void LLSidepanelAppearance::editWearable(LLWearable *wearable, LLView *data) +void LLSidepanelAppearance::editWearable(LLWearable *wearable, LLView *data, BOOL disable_camera_switch) { LLSideTray::getInstance()->showPanel("sidepanel_appearance"); LLSidepanelAppearance *panel = dynamic_cast(data); if (panel) { - panel->showWearableEditPanel(wearable); + panel->showWearableEditPanel(wearable, disable_camera_switch); } } diff --git a/indra/newview/llsidepanelappearance.h b/indra/newview/llsidepanelappearance.h index 022280132e..70c8b7b797 100644 --- a/indra/newview/llsidepanelappearance.h +++ b/indra/newview/llsidepanelappearance.h @@ -51,7 +51,7 @@ public: void refreshCurrentOutfitName(const std::string& name = ""); - static void editWearable(LLWearable *wearable, LLView *data); + static void editWearable(LLWearable *wearable, LLView *data, BOOL disable_camera_switch = FALSE); void fetchInventory(); void inventoryFetched(); diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 75a5b14154..fc9f3aecf3 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -85,6 +85,7 @@ public: mInventoryItemsDict["New Skirt"] = LLTrans::getString("New Skirt"); mInventoryItemsDict["New Alpha"] = LLTrans::getString("New Alpha"); mInventoryItemsDict["New Tattoo"] = LLTrans::getString("New Tattoo"); + mInventoryItemsDict["New Physics"] = LLTrans::getString("New Physics"); mInventoryItemsDict["Invalid Wearable"] = LLTrans::getString("Invalid Wearable"); mInventoryItemsDict["New Gesture"] = LLTrans::getString("New Gesture"); diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 0f5df8ce12..80b10cc05e 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -103,7 +103,7 @@ extern F32 ANIM_SPEED_MIN; #include -#define OUTPUT_BREAST_DATA +// #define OUTPUT_BREAST_DATA using namespace LLVOAvatarDefines; @@ -787,6 +787,11 @@ public: // must return FALSE when the motion is completed. virtual BOOL onUpdate(F32 time, U8* joint_mask) { + if (!gSavedSettings.getBOOL("AvatarPhysics")) + { + return FALSE; + } + /* FILE *fread = fopen("c:\\temp\\breast_data.txt","r"); if (fread) diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp index a49dc1b59d..b777885f79 100644 --- a/indra/newview/llwearableitemslist.cpp +++ b/indra/newview/llwearableitemslist.cpp @@ -443,6 +443,7 @@ clothing_to_string_map_t init_clothing_string_map() w_map.insert(std::make_pair(LLWearableType::WT_SKIRT, "skirt_not_worn")); w_map.insert(std::make_pair(LLWearableType::WT_ALPHA, "alpha_not_worn")); w_map.insert(std::make_pair(LLWearableType::WT_TATTOO, "tattoo_not_worn")); + w_map.insert(std::make_pair(LLWearableType::WT_PHYSICS, "physics_not_worn")); return w_map; } diff --git a/indra/newview/llwearabletype.cpp b/indra/newview/llwearabletype.cpp index d2e62c86ab..bb1ed61f40 100644 --- a/indra/newview/llwearabletype.cpp +++ b/indra/newview/llwearabletype.cpp @@ -34,25 +34,27 @@ struct WearableEntry : public LLDictionaryEntry WearableEntry(const std::string &name, const std::string& default_new_name, LLAssetType::EType assetType, - LLInventoryIcon::EIconName iconName); + LLInventoryIcon::EIconName iconName, + BOOL disable_camera_switch = FALSE, + BOOL allow_multiwear = TRUE) : + LLDictionaryEntry(name), + mAssetType(assetType), + mDefaultNewName(default_new_name), + mLabel(LLTrans::getString(name)), + mIconName(iconName), + mDisableCameraSwitch(disable_camera_switch), + mAllowMultiwear(allow_multiwear) + { + + } const LLAssetType::EType mAssetType; const std::string mLabel; const std::string mDefaultNewName; //keep mLabel for backward compatibility LLInventoryIcon::EIconName mIconName; + BOOL mDisableCameraSwitch; + BOOL mAllowMultiwear; }; -WearableEntry::WearableEntry(const std::string &name, - const std::string& default_new_name, - LLAssetType::EType assetType, - LLInventoryIcon::EIconName iconName) : - LLDictionaryEntry(name), - mAssetType(assetType), - mDefaultNewName(default_new_name), - mLabel(LLTrans::getString(name)), - mIconName(iconName) -{ -} - class LLWearableDictionary : public LLSingleton, public LLDictionary { @@ -62,23 +64,26 @@ public: LLWearableDictionary::LLWearableDictionary() { - addEntry(LLWearableType::WT_SHAPE, new WearableEntry("shape", "New Shape", LLAssetType::AT_BODYPART, LLInventoryIcon::ICONNAME_BODYPART_SHAPE)); - addEntry(LLWearableType::WT_SKIN, new WearableEntry("skin", "New Skin", LLAssetType::AT_BODYPART, LLInventoryIcon::ICONNAME_BODYPART_SKIN)); - addEntry(LLWearableType::WT_HAIR, new WearableEntry("hair", "New Hair", LLAssetType::AT_BODYPART, LLInventoryIcon::ICONNAME_BODYPART_HAIR)); - addEntry(LLWearableType::WT_EYES, new WearableEntry("eyes", "New Eyes", LLAssetType::AT_BODYPART, LLInventoryIcon::ICONNAME_BODYPART_EYES)); - addEntry(LLWearableType::WT_SHIRT, new WearableEntry("shirt", "New Shirt", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_SHIRT)); - addEntry(LLWearableType::WT_PANTS, new WearableEntry("pants", "New Pants", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_PANTS)); - addEntry(LLWearableType::WT_SHOES, new WearableEntry("shoes", "New Shoes", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_SHOES)); - addEntry(LLWearableType::WT_SOCKS, new WearableEntry("socks", "New Socks", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_SOCKS)); - addEntry(LLWearableType::WT_JACKET, new WearableEntry("jacket", "New Jacket", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_JACKET)); - addEntry(LLWearableType::WT_GLOVES, new WearableEntry("gloves", "New Gloves", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_GLOVES)); - addEntry(LLWearableType::WT_UNDERSHIRT, new WearableEntry("undershirt", "New Undershirt", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_UNDERSHIRT)); - addEntry(LLWearableType::WT_UNDERPANTS, new WearableEntry("underpants", "New Underpants", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_UNDERPANTS)); - addEntry(LLWearableType::WT_SKIRT, new WearableEntry("skirt", "New Skirt", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_SKIRT)); - addEntry(LLWearableType::WT_ALPHA, new WearableEntry("alpha", "New Alpha", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_ALPHA)); - addEntry(LLWearableType::WT_TATTOO, new WearableEntry("tattoo", "New Tattoo", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_TATTOO)); - addEntry(LLWearableType::WT_INVALID, new WearableEntry("invalid", "Invalid Wearable", LLAssetType::AT_NONE, LLInventoryIcon::ICONNAME_NONE)); - addEntry(LLWearableType::WT_NONE, new WearableEntry("none", "Invalid Wearable", LLAssetType::AT_NONE, LLInventoryIcon::ICONNAME_NONE)); + addEntry(LLWearableType::WT_SHAPE, new WearableEntry("shape", "New Shape", LLAssetType::AT_BODYPART, LLInventoryIcon::ICONNAME_BODYPART_SHAPE, FALSE, FALSE)); + addEntry(LLWearableType::WT_SKIN, new WearableEntry("skin", "New Skin", LLAssetType::AT_BODYPART, LLInventoryIcon::ICONNAME_BODYPART_SKIN, FALSE, FALSE)); + addEntry(LLWearableType::WT_HAIR, new WearableEntry("hair", "New Hair", LLAssetType::AT_BODYPART, LLInventoryIcon::ICONNAME_BODYPART_HAIR, FALSE, FALSE)); + addEntry(LLWearableType::WT_EYES, new WearableEntry("eyes", "New Eyes", LLAssetType::AT_BODYPART, LLInventoryIcon::ICONNAME_BODYPART_EYES, FALSE, FALSE)); + addEntry(LLWearableType::WT_SHIRT, new WearableEntry("shirt", "New Shirt", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_SHIRT, FALSE, TRUE)); + addEntry(LLWearableType::WT_PANTS, new WearableEntry("pants", "New Pants", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_PANTS, FALSE, TRUE)); + addEntry(LLWearableType::WT_SHOES, new WearableEntry("shoes", "New Shoes", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_SHOES, FALSE, TRUE)); + addEntry(LLWearableType::WT_SOCKS, new WearableEntry("socks", "New Socks", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_SOCKS, FALSE, TRUE)); + addEntry(LLWearableType::WT_JACKET, new WearableEntry("jacket", "New Jacket", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_JACKET, FALSE, TRUE)); + addEntry(LLWearableType::WT_GLOVES, new WearableEntry("gloves", "New Gloves", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_GLOVES, FALSE, TRUE)); + addEntry(LLWearableType::WT_UNDERSHIRT, new WearableEntry("undershirt", "New Undershirt", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_UNDERSHIRT, FALSE, TRUE)); + addEntry(LLWearableType::WT_UNDERPANTS, new WearableEntry("underpants", "New Underpants", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_UNDERPANTS, FALSE, TRUE)); + addEntry(LLWearableType::WT_SKIRT, new WearableEntry("skirt", "New Skirt", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_SKIRT, FALSE, TRUE)); + addEntry(LLWearableType::WT_ALPHA, new WearableEntry("alpha", "New Alpha", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_ALPHA, FALSE, TRUE)); + addEntry(LLWearableType::WT_TATTOO, new WearableEntry("tattoo", "New Tattoo", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_TATTOO, FALSE, TRUE)); + + addEntry(LLWearableType::WT_PHYSICS, new WearableEntry("physics", "New Physics", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_PHYSICS, TRUE, FALSE)); + + addEntry(LLWearableType::WT_INVALID, new WearableEntry("invalid", "Invalid Wearable", LLAssetType::AT_NONE, LLInventoryIcon::ICONNAME_NONE, FALSE, FALSE)); + addEntry(LLWearableType::WT_NONE, new WearableEntry("none", "Invalid Wearable", LLAssetType::AT_NONE, LLInventoryIcon::ICONNAME_NONE, FALSE, FALSE)); } // static @@ -129,3 +134,19 @@ LLInventoryIcon::EIconName LLWearableType::getIconName(LLWearableType::EType typ return entry->mIconName; } +// static +BOOL LLWearableType::getDisableCameraSwitch(LLWearableType::EType type) +{ + const LLWearableDictionary *dict = LLWearableDictionary::getInstance(); + const WearableEntry *entry = dict->lookup(type); + return entry->mDisableCameraSwitch; +} + +// static +BOOL LLWearableType::getAllowMultiwear(LLWearableType::EType type) +{ + const LLWearableDictionary *dict = LLWearableDictionary::getInstance(); + const WearableEntry *entry = dict->lookup(type); + return entry->mAllowMultiwear; +} + diff --git a/indra/newview/llwearabletype.h b/indra/newview/llwearabletype.h index 3bbf8ba0bd..d633b4807e 100644 --- a/indra/newview/llwearabletype.h +++ b/indra/newview/llwearabletype.h @@ -52,7 +52,8 @@ public: WT_SKIRT = 12, WT_ALPHA = 13, WT_TATTOO = 14, - WT_COUNT = 15, + WT_PHYSICS = 15, + WT_COUNT = 16, WT_INVALID = 255, WT_NONE = -1, @@ -64,6 +65,8 @@ public: static LLAssetType::EType getAssetType(EType type); static EType typeNameToType(const std::string& type_name); static LLInventoryIcon::EIconName getIconName(EType type); + static BOOL getDisableCameraSwitch(EType type); + static BOOL getAllowMultiwear(EType type); protected: LLWearableType() {} diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 082b37d80b..65d86403f2 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -223,6 +223,7 @@ with the same filename but different name + diff --git a/indra/newview/skins/default/xui/en/floater_customize.xml b/indra/newview/skins/default/xui/en/floater_customize.xml deleted file mode 100644 index 01bced81d0..0000000000 --- a/indra/newview/skins/default/xui/en/floater_customize.xml +++ /dev/null @@ -1,3389 +0,0 @@ - - - - - Body Parts - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml index 7fa4cd840a..d2519a5aa4 100644 --- a/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml @@ -38,6 +38,17 @@ function="Inventory.GearDefault.Check" parameter="sort_by_recent" /> + + + + - - - - + + + + diff --git a/indra/newview/skins/default/xui/en/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/en/menu_places_gear_folder.xml index 6f46165883..1aeb166e01 100644 --- a/indra/newview/skins/default/xui/en/menu_places_gear_folder.xml +++ b/indra/newview/skins/default/xui/en/menu_places_gear_folder.xml @@ -25,6 +25,14 @@ function="Places.LandmarksGear.Enable" parameter="category" /> + + + + + + + + + + + + + + @@ -2152,6 +2172,16 @@ function="Advanced.ToggleInfoDisplay" parameter="render batches" /> + + + + diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 3df53ac442..f008042a81 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -6303,15 +6303,6 @@ An error has occurred while trying to connect to voice chat for [VOICE_CHANNEL_N - -You just entered a region using a different server version, which may affect performance. [[URL] View the release notes.] - - Are you sure you want to share the following items: -[ITEMS] +<nolink>[ITEMS]</nolink> With the following Residents: diff --git a/indra/newview/skins/default/xui/en/panel_group_land_money.xml b/indra/newview/skins/default/xui/en/panel_group_land_money.xml index 61d6cbb2d0..eff674c628 100644 --- a/indra/newview/skins/default/xui/en/panel_group_land_money.xml +++ b/indra/newview/skins/default/xui/en/panel_group_land_money.xml @@ -67,23 +67,23 @@ + relative_width="0.2" /> + relative_width="0.2" /> + relative_width="0.2" /> + relative_width="0.2" /> + relative_width="0.2" /> diff --git a/indra/newview/skins/default/xui/en/panel_nearby_media.xml b/indra/newview/skins/default/xui/en/panel_nearby_media.xml index 8c13ced8f3..9bd60b935f 100644 --- a/indra/newview/skins/default/xui/en/panel_nearby_media.xml +++ b/indra/newview/skins/default/xui/en/panel_nearby_media.xml @@ -68,24 +68,12 @@ right="-8" width="66" height="22" + is_toggle="true" label="More >>" - label_selected="Less <<"> + label_selected="<< Less"> - - + + - + + width="350"> + + + width="110"> + + - + @@ -2321,9 +2321,6 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh Alt+ Shift+ - Esc - Home - File Saved Receiving @@ -2335,16 +2332,16 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh PDT - Forward - Left - Right - Back - North - South - West - East - Up - Down + Forward + Left + Right + Back + North + South + West + East + Up + Down Any Category @@ -3313,4 +3310,119 @@ Abuse Report There are no items in this outfit + + Esc + Space + Enter + Tab + Ins + Del + Backsp + Shift + Ctrl + Alt + CapsLock + Left + Right + Up + Down + Home + End + PgUp + PgDn + + F1 + F2 + F3 + F4 + F5 + F6 + F7 + F8 + F9 + F10 + F11 + F12 + + Add + Subtract + Multiply + Divide + PAD_DIVIDE + PAD_LEFT + PAD_RIGHT + PAD_DOWN + PAD_UP + PAD_HOME + PAD_END + PAD_PGUP + PAD_PGDN + PAD_CENTER + PAD_INS + PAD_DEL + PAD_Enter + PAD_BUTTON0 + PAD_BUTTON1 + PAD_BUTTON2 + PAD_BUTTON3 + PAD_BUTTON4 + PAD_BUTTON5 + PAD_BUTTON6 + PAD_BUTTON7 + PAD_BUTTON8 + PAD_BUTTON9 + PAD_BUTTON10 + PAD_BUTTON11 + PAD_BUTTON12 + PAD_BUTTON13 + PAD_BUTTON14 + PAD_BUTTON15 + + - + = + ` + ; + [ + ] + \ + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + + A + B + C + D + E + F + G + H + I + J + K + L + M + N + O + P + Q + R + S + T + U + V + W + X + Y + Z + + diff --git a/indra/newview/skins/default/xui/en/widgets/floater.xml b/indra/newview/skins/default/xui/en/widgets/floater.xml index 85d0c633af..2e5ebafe46 100644 --- a/indra/newview/skins/default/xui/en/widgets/floater.xml +++ b/indra/newview/skins/default/xui/en/widgets/floater.xml @@ -21,4 +21,5 @@ tear_off_pressed_image="tearoff_pressed.tga" dock_pressed_image="Icon_Dock_Press" help_pressed_image="Icon_Help_Press" + focus_root="true" /> diff --git a/indra/newview/skins/default/xui/en/widgets/talk_button.xml b/indra/newview/skins/default/xui/en/widgets/talk_button.xml index a7e271a1ff..d792e9f29c 100644 --- a/indra/newview/skins/default/xui/en/widgets/talk_button.xml +++ b/indra/newview/skins/default/xui/en/widgets/talk_button.xml @@ -23,11 +23,11 @@ bottom="0" tab_stop="false" is_toggle="true" - image_selected="SegmentedBtn_Right_Selected_Press" - image_unselected="SegmentedBtn_Right_Off" - image_pressed="SegmentedBtn_Right_Press" - image_pressed_selected="SegmentedBtn_Right_Selected_Press" - image_overlay="Arrow_Small_Up" + image_disabled="ComboButton_UpOff" + image_unselected="ComboButton_UpOff" + image_selected="ComboButton_On" + image_pressed="ComboButton_UpSelected" + image_pressed_selected="ComboButton_Selected" /> Se ha producido un error al intentar conectarte al [VOICE_CHANNEL_NAME]. Por favor, inténtalo más tarde. - - Acabas de entrar en una región que usa un servidor con una versión distinta, y esto puede influir en el funcionamiento. [[URL] Ver las notas de desarrollo]. - No se admite el formato de la SLurl que has pulsado. @@ -2762,7 +2759,7 @@ Se mostrará cuando haya suficiente espacio. ¿Estás seguro de que quieres compartir los elementos siguientes? -[ITEMS] +<nolink>[ITEMS]</nolink> Con los siguientes residentes: diff --git a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml index 7989100c09..6c4ab0f14f 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml @@ -9,7 +9,7 @@ - + diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index 810b1630dd..19adf29d29 100644 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -1846,34 +1846,34 @@ Se esperaba .wav, .tga, .bmp, .jpg, .jpeg, o .bvh PDT - + Adelante - + Izquierda - + Derecha - + Atrás - + Norte - + Sur - + Oeste - + Este - + Arriba - + Abajo diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml index 140bbcc18b..603b8f0edc 100644 --- a/indra/newview/skins/default/xui/fr/notifications.xml +++ b/indra/newview/skins/default/xui/fr/notifications.xml @@ -2702,9 +2702,6 @@ Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignore Une erreur est survenue pendant la connexion au chat vocal pour [VOICE_CHANNEL_NAME]. Veuillez réessayer ultérieurement. - - La région dans laquelle vous avez pénétré utilise une version de serveur différente, ce qui peut avoir un impact sur votre performance. [[URL] Consultez les notes de version.] - La SLurl que vous avez saisie n'est pas prise en charge. @@ -2758,7 +2755,7 @@ Le bouton sera affiché quand il y aura suffisamment de place. Voulez-vous vraiment partager les articles suivants : -[ITEMS] +<nolink>[ITEMS]</nolink> avec les résidents suivants : diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml b/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml index 44c866a30f..48630918d7 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml @@ -9,7 +9,7 @@ - + diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml index d75f6c731d..74c1fd8622 100644 --- a/indra/newview/skins/default/xui/fr/strings.xml +++ b/indra/newview/skins/default/xui/fr/strings.xml @@ -1888,34 +1888,34 @@ PDT - + Vers l'avant - + Gauche - + Droite - + Arrière - + Nord - + Sud - + Ouest - + Est - + Haut - + Bas diff --git a/indra/newview/skins/default/xui/it/notifications.xml b/indra/newview/skins/default/xui/it/notifications.xml index 32483881b2..cce5888598 100644 --- a/indra/newview/skins/default/xui/it/notifications.xml +++ b/indra/newview/skins/default/xui/it/notifications.xml @@ -2623,9 +2623,6 @@ Clicca su Accetta per unirti alla chat oppure su Declina per declinare l'in Si è verificato un errore durante il tentativo di collegarti a una voice chat con [VOICE_CHANNEL_NAME]. Riprova più tardi. - - Sei appena entrato in una regione che usa una versione differente del server: ciò potrebbe incidere sule prestazioni. [[URL] Visualizza le note sulla versione.] - Lo SLurl su cui hai cliccato non è valido. @@ -2679,7 +2676,7 @@ Il pulsante verrà visualizzato quando lo spazio sarà sufficiente. Sei sicuro di volere condividere gli oggetti -[ITEMS] +<nolink>[ITEMS]</nolink> Con i seguenti residenti? diff --git a/indra/newview/skins/default/xui/it/panel_preferences_sound.xml b/indra/newview/skins/default/xui/it/panel_preferences_sound.xml index 2ddb226020..6e70a314c5 100644 --- a/indra/newview/skins/default/xui/it/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_sound.xml @@ -6,7 +6,7 @@ - + diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml index dfe635182e..37dc90d056 100644 --- a/indra/newview/skins/default/xui/it/strings.xml +++ b/indra/newview/skins/default/xui/it/strings.xml @@ -1846,34 +1846,34 @@ Tipi conosciuti .wav, .tga, .bmp, .jpg, .jpeg, or .bvh Ora legale Pacifico - + Avanti - + Sinistra - + Destra - + Indietro - + Nord - + Sud - + Ovest - + Est - + Su - + Giù diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml index c0af0e03ff..baec8c073c 100644 --- a/indra/newview/skins/default/xui/ja/notifications.xml +++ b/indra/newview/skins/default/xui/ja/notifications.xml @@ -2675,9 +2675,6 @@ M キーを押して変更します。 [VOICE_CHANNEL_NAME] のボイスチャットに接続中に、エラーが発生しました。後でもう一度お試しください。 - - サーバーのバージョンが異なるリージョンに来ました。パフォーマンスに影響することがあります。 [[URL] リリースノートを確認] - クリックした SLurl はサポートされていません。 @@ -2731,7 +2728,7 @@ M キーを押して変更します。 次のアイテムを共有しますか: -[ITEMS] +<nolink>[ITEMS]</nolink> 次の住人と共有しますか: diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml index 4f29ae7b44..9fbbd46220 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml @@ -6,7 +6,7 @@ - + diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml index 187f21257a..75cb126874 100644 --- a/indra/newview/skins/default/xui/ja/strings.xml +++ b/indra/newview/skins/default/xui/ja/strings.xml @@ -1882,34 +1882,34 @@ 太平洋夏時間 - + - + - + - + 後ろ - + - + - + 西 - + - + - + diff --git a/indra/newview/skins/default/xui/nl/notifications.xml b/indra/newview/skins/default/xui/nl/notifications.xml index be0c17d2ff..f27b83d3f9 100644 --- a/indra/newview/skins/default/xui/nl/notifications.xml +++ b/indra/newview/skins/default/xui/nl/notifications.xml @@ -3012,9 +3012,6 @@ Klik Accepteren om deel te nemen aan de chat of Afwijzen om de uitnodiging af te Er is een fout opgetreden tijdens het verbinden met voice chat voor [VOICE_CHANNEL_NAME]. Probeert u het later alstublieft opnieuw. - - De regio die u bent binnengetreden wordt onder een andere simulatorversie uitgevoerd. Klik dit bericht voor meer details. - De URL die u heeft geklikt kan niet binnen deze webbrowser worden geopend. diff --git a/indra/newview/skins/default/xui/nl/strings.xml b/indra/newview/skins/default/xui/nl/strings.xml index 07265d2716..87e3638a49 100644 --- a/indra/newview/skins/default/xui/nl/strings.xml +++ b/indra/newview/skins/default/xui/nl/strings.xml @@ -1441,34 +1441,34 @@ Verwacht .wav, .tga, .bmp, .jpg, .jpeg, or .bvh PDT - + Vooruit - + Links - + Rechts - + Achteruit - + Noord - + Zuid - + West - + Oost - + Omhoog - + Omlaag diff --git a/indra/newview/skins/default/xui/pl/notifications.xml b/indra/newview/skins/default/xui/pl/notifications.xml index 8dc4b041cd..25fa5da3ab 100644 --- a/indra/newview/skins/default/xui/pl/notifications.xml +++ b/indra/newview/skins/default/xui/pl/notifications.xml @@ -2672,9 +2672,6 @@ Wybierz Zaakceptuj żeby zacząć czat albo Odmów żeby nie przyjąć zaproszen Błąd podczas łączenia z rozmową [VOICE_CHANNEL_NAME]. Spróbuj póżniej. - - Ten region używa innej wersji symulatora. Kliknij na tą wiadomość żeby uzyskać więcej informacji: [[URL] View the release notes.] - Nie można otworzyć wybranego SLurl. @@ -2728,7 +2725,7 @@ Przycisk zostanie wyświetlony w przypadku dostatecznej ilości przestrzeni. Jesteś pewien/pewna, że chcesz udostępnić następujące obiekty: -[ITEMS] +<nolink>[ITEMS]</nolink> następującym Rezydentom: diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml b/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml index c708cc0b99..ac93949a1b 100644 --- a/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml @@ -9,7 +9,7 @@ - + diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml index d1fb382a2d..e6019bf66d 100644 --- a/indra/newview/skins/default/xui/pl/strings.xml +++ b/indra/newview/skins/default/xui/pl/strings.xml @@ -1843,34 +1843,34 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh PDT - + Do przodu - + W lewo - + W prawo - + Wróć - + Północ - + Południe - + Zachód - + Wschód - + W górę - + W dół diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml index 5f09397ac5..4b2e4bc5e0 100644 --- a/indra/newview/skins/default/xui/pt/notifications.xml +++ b/indra/newview/skins/default/xui/pt/notifications.xml @@ -481,7 +481,7 @@ Para aumentar a qualidade do vídeo, vá para Preferências > Vídeo. Você não tem autorização para copiar os itens abaixo: -[ITENS] +[ITEMS] ao dá-los, você ficará sem eles no seu inventário. Deseja realmente dar estes itens? @@ -2686,9 +2686,6 @@ Clique em Aceitar para atender ou em Recusar para recusar este convite. Clique Ocorreu um erro enquanto você tentava se conectar à conversa de voz de [VOICE_CHANNEL_NAME]. Favor tentar novamente mais tarde. - - Você chegou a uma região com uma versão diferente de servidor, que pode afetar o desempenho. [[URL] Consultar notas da versão.] - O SLurl no qual você clicou não é suportado. @@ -2742,7 +2739,7 @@ O botão será exibido quando houver espaço suficente. Tem certeza de que quer compartilhar os items abaixo? -[ITENS] +<nolink>[ITEMS]</nolink> Com os seguintes residentes: diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml b/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml index 60f51c33e5..3846bfb377 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml @@ -9,7 +9,7 @@ - + diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml index ce2c2ddaa1..06123e0118 100644 --- a/indra/newview/skins/default/xui/pt/strings.xml +++ b/indra/newview/skins/default/xui/pt/strings.xml @@ -1846,34 +1846,34 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh PDT - + Avante - + Esquerda - + Direita - + Atrás - + Norte - + Sul - + Oeste - + Leste - + Acima - + Abaixo -- cgit v1.2.3 From 49e28d324066add8cca44e27806b8077d3b0c542 Mon Sep 17 00:00:00 2001 From: "Christian Goetze (CG)" Date: Thu, 17 Feb 2011 12:09:10 -0800 Subject: Cherrypick Merov's fix for update_version_files.py. --- indra/lib/python/indra/util/llversion.py | 57 +++++++++++--------------------- scripts/update_version_files.py | 54 ++++++++++++++++++------------ 2 files changed, 52 insertions(+), 59 deletions(-) diff --git a/indra/lib/python/indra/util/llversion.py b/indra/lib/python/indra/util/llversion.py index 2718a85f41..ba6f567b60 100644 --- a/indra/lib/python/indra/util/llversion.py +++ b/indra/lib/python/indra/util/llversion.py @@ -1,7 +1,9 @@ -"""@file llversion.py -@brief Utility for parsing llcommon/llversion${server}.h - for the version string and channel string - Utility that parses hg or svn info for branch and revision +#!/usr/bin/env python +"""\ +@file llversion.py +@brief Parses llcommon/llversionserver.h and llcommon/llversionviewer.h + for the version string and channel string. + Parses hg info for branch and revision. $LicenseInfo:firstyear=2006&license=mit$ @@ -27,7 +29,7 @@ THE SOFTWARE. $/LicenseInfo$ """ -import re, sys, os, commands +import re, sys, os, subprocess # Methods for gathering version information from # llversionviewer.h and llversionserver.h @@ -73,29 +75,13 @@ def get_viewer_channel(): def get_server_channel(): return get_channel('server') -# Methods for gathering subversion information -def get_svn_status_matching(regular_expression): - # Get the subversion info from the working source tree - status, output = commands.getstatusoutput('svn info %s' % get_src_root()) - m = regular_expression.search(output) - if not m: - print >> sys.stderr, "Failed to parse svn info output, result follows:" - print >> sys.stderr, output - raise Exception, "No matching svn status in "+src_root - return m.group(1) - -def get_svn_branch(): - branch_re = re.compile('URL: (\S+)') - return get_svn_status_matching(branch_re) - -def get_svn_revision(): - last_rev_re = re.compile('Last Changed Rev: (\d+)') - return get_svn_status_matching(last_rev_re) - +# Methods for gathering hg information def get_hg_repo(): - status, output = commands.getstatusoutput('hg showconfig paths.default') + child = subprocess.Popen(["hg","showconfig","paths.default"], stdout=subprocess.PIPE) + output, error = child.communicate() + status = child.returncode if status: - print >> sys.stderr, output + print >> sys.stderr, error sys.exit(1) if not output: print >> sys.stderr, 'ERROR: cannot find repo we cloned from' @@ -103,24 +89,19 @@ def get_hg_repo(): return output def get_hg_changeset(): - # The right thing to do: - # status, output = commands.getstatusoutput('hg id -i') - # if status: - # print >> sys.stderr, output - # sys.exit(1) - - # The temporary hack: - status, output = commands.getstatusoutput('hg parents --template "{rev}"') + # The right thing to do would be to use the *global* revision id: + # "hg id -i" + # For the moment though, we use the parent revision: + child = subprocess.Popen(["hg","parents","--template","{rev}"], stdout=subprocess.PIPE) + output, error = child.communicate() + status = child.returncode if status: - print >> sys.stderr, output + print >> sys.stderr, error sys.exit(1) lines = output.splitlines() if len(lines) > 1: print >> sys.stderr, 'ERROR: working directory has %d parents' % len(lines) return lines[0] -def using_svn(): - return os.path.isdir(os.path.join(get_src_root(), '.svn')) - def using_hg(): return os.path.isdir(os.path.join(get_src_root(), '.hg')) diff --git a/scripts/update_version_files.py b/scripts/update_version_files.py index da60fd105a..87036dc1c0 100755 --- a/scripts/update_version_files.py +++ b/scripts/update_version_files.py @@ -1,8 +1,30 @@ -#!/usr/bin/python -# -# Update all of the various files in the repository to a new version number, -# instead of having to figure it out by hand -# +#!/usr/bin/env python +"""\ +@file update_version_files.py +@brief Update all of the various files in the repository to a new version number, +instead of having to figure it out by hand + +$LicenseInfo:firstyear=2010&license=viewerlgpl$ +Second Life Viewer Source Code +Copyright (C) 2010-2011, Linden Research, Inc. + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; +version 2.1 of the License only. + +This library 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA +$/LicenseInfo$ +""" import sys import os.path @@ -37,9 +59,6 @@ add_indra_lib_path() import getopt, os, re, commands from indra.util import llversion -svn = os.path.expandvars("${SVN}") -if not svn or svn == "${SVN}": svn = "svn" - def usage(): print "Usage:" print sys.argv[0] + """ [options] @@ -68,7 +87,7 @@ Options: Print this message and exit. Common Uses: - # Update server and viewer build numbers to the current SVN revision: + # Update server and viewer build numbers to the current hg revision: update_version_files.py # Update build numbers unless we are on a release branch: @@ -80,7 +99,7 @@ Common Uses: # Update just the viewer version number explicitly: update_version_files.py --viewer --version=1.18.1.6 - # Update just the server build number to the current SVN revision: + # Update just the server build number to the current hg revision: update_version_files.py --server # Update the viewer channel @@ -152,9 +171,7 @@ re_map['indra/newview/English.lproj/InfoPlist.strings'] = \ 'CFBundleGetInfoString = "Second Life version %(VER_MAJOR)s.%(VER_MINOR)s.%(VER_PATCH)s.%(VER_BUILD)s')) -version_re = re.compile('(\d+).(\d+).(\d+).(\d+)') -svn_branch_re = re.compile('^URL:\s+\S+/([^/\s]+)$', re.MULTILINE) -svn_revision_re = re.compile('^Last Changed Rev: (\d+)$', re.MULTILINE) +version_re = re.compile('(\d+).(\d+).(\d+).(\d+)') def main(): script_path = os.path.dirname(__file__) @@ -249,13 +266,7 @@ def main(): server_version = new_version else: - if llversion.using_svn(): - if new_revision: - revision = new_revision - else: - revision = llversion.get_svn_revision() - branch = llversion.get_svn_branch() - elif llversion.using_hg(): + if llversion.using_hg(): if new_revision: revision = new_revision else: @@ -327,5 +338,6 @@ def main(): print "File %(filename)s not present, skipping..." % locals() return 0 -main() +if __name__ == '__main__': + sys.exit(main()) -- cgit v1.2.3 From 76d67b1f78eb4e8dc11c962d998e06fe28653a4b Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Thu, 17 Feb 2011 18:46:04 -0500 Subject: adjust parameters for integration build --- BuildParams | 1 + 1 file changed, 1 insertion(+) diff --git a/BuildParams b/BuildParams index 8a188ad231..26ca976b74 100644 --- a/BuildParams +++ b/BuildParams @@ -145,6 +145,7 @@ media.build_viewer_update_version_manager = false # ================ L-oz_viewer-autobuild.build_link_parallel=false +L-oz_viewer-autobuildvs2010.build_link_parallel=false # ======================================== # enus -- cgit v1.2.3 From 930710ceecf32c12af5d6e416a4697f9eb9df8aa Mon Sep 17 00:00:00 2001 From: brad kittenbrink Date: Thu, 17 Feb 2011 15:50:44 -0800 Subject: Added an EventAPI listener to LLWindow for hooking into key and mouse inputs. --- indra/llwindow/CMakeLists.txt | 2 + indra/llwindow/llwindow.cpp | 10 ++- indra/llwindow/llwindow.h | 2 + indra/llwindow/llwindowlistener.cpp | 174 ++++++++++++++++++++++++++++++++++++ indra/llwindow/llwindowlistener.h | 53 +++++++++++ 5 files changed, 239 insertions(+), 2 deletions(-) create mode 100644 indra/llwindow/llwindowlistener.cpp create mode 100644 indra/llwindow/llwindowlistener.h diff --git a/indra/llwindow/CMakeLists.txt b/indra/llwindow/CMakeLists.txt index 4d2677fd91..00aaba2052 100644 --- a/indra/llwindow/CMakeLists.txt +++ b/indra/llwindow/CMakeLists.txt @@ -36,6 +36,7 @@ set(llwindow_SOURCE_FILES llkeyboard.cpp llwindowheadless.cpp llwindowcallbacks.cpp + llwindowlistener.cpp ) set(llwindow_HEADER_FILES @@ -44,6 +45,7 @@ set(llwindow_HEADER_FILES llkeyboard.h llwindowheadless.h llwindowcallbacks.h + llwindowlistener.h ) set(viewer_SOURCE_FILES diff --git a/indra/llwindow/llwindow.cpp b/indra/llwindow/llwindow.cpp index 072f694c24..2d00c37719 100644 --- a/indra/llwindow/llwindow.cpp +++ b/indra/llwindow/llwindow.cpp @@ -41,6 +41,7 @@ #include "llkeyboard.h" #include "linked_lists.h" #include "llwindowcallbacks.h" +#include "llwindowlistener.h" // @@ -115,10 +116,15 @@ LLWindow::LLWindow(LLWindowCallbacks* callbacks, BOOL fullscreen, U32 flags) mHideCursorPermanent(FALSE), mFlags(flags), mHighSurrogate(0) -{ } +{ + mListener = new LLWindowListener(callbacks, gKeyboard); +} LLWindow::~LLWindow() -{ } +{ + delete mListener; + mListener = NULL; +} //virtual BOOL LLWindow::isValid() diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h index e8a86a1880..6bdc01ae88 100644 --- a/indra/llwindow/llwindow.h +++ b/indra/llwindow/llwindow.h @@ -36,6 +36,7 @@ class LLSplashScreen; class LLPreeditor; class LLWindowCallbacks; +class LLWindowListener; // Refer to llwindow_test in test/common/llwindow for usage example @@ -188,6 +189,7 @@ protected: BOOL mHideCursorPermanent; U32 mFlags; U16 mHighSurrogate; + LLWindowListener* mListener; // Handle a UTF-16 encoding unit received from keyboard. // Converting the series of UTF-16 encoding units to UTF-32 data, diff --git a/indra/llwindow/llwindowlistener.cpp b/indra/llwindow/llwindowlistener.cpp new file mode 100644 index 0000000000..22cc12acee --- /dev/null +++ b/indra/llwindow/llwindowlistener.cpp @@ -0,0 +1,174 @@ +/** + * @file llwindowlistener.cpp + * @brief EventAPI interface for injecting input into LLWindow + * + * $LicenseInfo:firstyear=2001&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "linden_common.h" + +#include "llwindowlistener.h" + +#include "llcoord.h" +#include "llkeyboard.h" +#include "llwindowcallbacks.h" + +LLWindowListener::LLWindowListener(LLWindowCallbacks *window, LLKeyboard * keyboard) + : LLEventAPI("LLWindow", "Inject input events into the LLWindow instance"), + mWindow(window), + mKeyboard(keyboard) +{ + add("keyDown", + "Given [\"keycode\"] or [\"char\"], will inject the given keypress event.", + &LLWindowListener::keyDown); + add("keyUp", + "Given [\"keycode\"] or [\"char\"], will inject the given key release event.", + &LLWindowListener::keyUp); + add("mouseDown", + "Given [\"button\"], [\"x\"] and [\"y\"], will inject the given mouse click event.", + &LLWindowListener::mouseDown); + add("mouseUp", + "Given [\"button\"], [\"x\"] and [\"y\"], will inject the given mouse release event.", + &LLWindowListener::mouseUp); + add("mouseMove", + "Given [\"x\"] and [\"y\"], will inject the given mouse movement event.", + &LLWindowListener::mouseMove); + add("mouseScroll", + "Given a number of [\"clicks\"], will inject the given mouse scroll event.", + &LLWindowListener::mouseScroll); +} + +void LLWindowListener::keyDown(LLSD const & evt) +{ + if(NULL == mKeyboard) + { + // *HACK to handle the fact that LLWindow subclasses have to initialize + // things in an inconvenient order + mKeyboard = gKeyboard; + } + + KEY keycode = 0; + if(evt.has("keycode")) + { + keycode = KEY(evt["keycode"].asInteger()); + } + else + { + keycode = KEY(evt["char"].asString()[0]); + } + + // *TODO - figure out how to handle the mask + mKeyboard->handleTranslatedKeyDown(keycode, 0); +} + +void LLWindowListener::keyUp(LLSD const & evt) +{ + if(NULL == mKeyboard) + { + // *HACK to handle the fact that LLWindow subclasses have to initialize + // things in an inconvenient order + mKeyboard = gKeyboard; + } + + KEY keycode = 0; + if(evt.has("keycode")) + { + keycode = KEY(evt["keycode"].asInteger()); + } + else + { + keycode = KEY(evt["char"].asString()[0]); + } + + // *TODO - figure out how to handle the mask + mKeyboard->handleTranslatedKeyDown(keycode, 0); +} + +void LLWindowListener::mouseDown(LLSD const & evt) +{ + LLCoordGL pos(evt["x"].asInteger(), evt["y"].asInteger()); + + std::string const & button = evt["button"].asString(); + + if(button == "LEFT") + { + // *TODO - figure out how to handle the mask + mWindow->handleMouseDown(NULL, pos, 0); + } + else if (button == "RIGHT") + { + // *TODO - figure out how to handle the mask + mWindow->handleRightMouseDown(NULL, pos, 0); + } + else if (button == "MIDDLE") + { + // *TODO - figure out how to handle the mask + mWindow->handleMiddleMouseDown(NULL, pos, 0); + } + else + { + llwarns << "ignoring unknown mous button \"" << button << '\"' << llendl; + } +} + +void LLWindowListener::mouseUp(LLSD const & evt) +{ + LLCoordGL pos(evt["x"].asInteger(), evt["y"].asInteger()); + + std::string const & button = evt["button"].asString(); + + if(button == "LEFT") + { + // *TODO - figure out how to handle the mask + mWindow->handleMouseUp(NULL, pos, 0); + } + else if (button == "RIGHT") + { + // *TODO - figure out how to handle the mask + mWindow->handleRightMouseUp(NULL, pos, 0); + } + else if (button == "MIDDLE") + { + // *TODO - figure out how to handle the mask + mWindow->handleMiddleMouseUp(NULL, pos, 0); + } + else + { + llwarns << "ignoring unknown mous button \"" << button << '\"' << llendl; + } +} + +void LLWindowListener::mouseMove(LLSD const & evt) +{ + LLCoordGL pos(evt["x"].asInteger(), evt["y"].asInteger()); + + // *TODO - figure out how to handle the mask + mWindow->handleMouseMove(NULL, pos, 0); +} + +void LLWindowListener::mouseScroll(LLSD const & evt) +{ + S32 clicks = evt["clicks"].asInteger(); + + mWindow->handleScrollWheel(NULL, clicks); +} + diff --git a/indra/llwindow/llwindowlistener.h b/indra/llwindow/llwindowlistener.h new file mode 100644 index 0000000000..5b234c5d1d --- /dev/null +++ b/indra/llwindow/llwindowlistener.h @@ -0,0 +1,53 @@ +/** + * @file llwindowlistener.h + * @brief EventAPI interface for injecting input into LLWindow + * + * $LicenseInfo:firstyear=2001&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#ifndef LL_LLWINDOWLISTENER_H +#define LL_LLWINDOWLISTENER_H + +#include "lleventapi.h" + +class LLKeyboard; +class LLWindowCallbacks; + +class LLWindowListener : public LLEventAPI +{ +public: + LLWindowListener(LLWindowCallbacks * window, LLKeyboard * keyboard); + + void keyDown(LLSD const & evt); + void keyUp(LLSD const & evt); + void mouseDown(LLSD const & evt); + void mouseUp(LLSD const & evt); + void mouseMove(LLSD const & evt); + void mouseScroll(LLSD const & evt); + +private: + LLWindowCallbacks * mWindow; + LLKeyboard * mKeyboard; +}; + + +#endif // LL_LLWINDOWLISTENER_H -- cgit v1.2.3 From 83a42e91d43c1d9c1b57fc664ce3d6171205e751 Mon Sep 17 00:00:00 2001 From: brad kittenbrink Date: Thu, 17 Feb 2011 16:20:58 -0800 Subject: Ported over mani's patch for handling finding of the RO appdata dir when running from the debugger. ported from changeset https://hg.lindenlab.com/alain/indra-common/changeset/99a9d1876e83/ reviewed by Richard. --- indra/llvfs/lldir_win32.cpp | 42 +++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/indra/llvfs/lldir_win32.cpp b/indra/llvfs/lldir_win32.cpp index b9a3995e25..4e2a55f4b3 100644 --- a/indra/llvfs/lldir_win32.cpp +++ b/indra/llvfs/lldir_win32.cpp @@ -81,10 +81,11 @@ LLDir_Win32::LLDir_Win32() // fprintf(stderr, "mTempDir = <%s>",mTempDir); -#if 1 - // Don't use the real app path for now, as we'll have to add parsing to detect if - // we're in a developer tree, which has a different structure from the installed product. + // Set working directory, for LLDir::getWorkingDir() + GetCurrentDirectory(MAX_PATH, w_str); + mWorkingDir = utf16str_to_utf8str(llutf16string(w_str)); + // Set the executable directory S32 size = GetModuleFileName(NULL, w_str, MAX_PATH); if (size) { @@ -100,32 +101,35 @@ LLDir_Win32::LLDir_Win32() { mExecutableFilename = mExecutablePathAndName; } - GetCurrentDirectory(MAX_PATH, w_str); - mWorkingDir = utf16str_to_utf8str(llutf16string(w_str)); } else { fprintf(stderr, "Couldn't get APP path, assuming current directory!"); - GetCurrentDirectory(MAX_PATH, w_str); - mExecutableDir = utf16str_to_utf8str(llutf16string(w_str)); + mExecutableDir = mWorkingDir; // Assume it's the current directory } -#else - GetCurrentDirectory(MAX_PATH, w_str); - mExecutableDir = utf16str_to_utf8str(llutf16string(w_str)); -#endif - if (mExecutableDir.find("indra") == std::string::npos) + // mAppRODataDir = "."; + + // Determine the location of the App-Read-Only-Data + // Try the working directory then the exe's dir. + mAppRODataDir = mWorkingDir; + + +// if (mExecutableDir.find("indra") == std::string::npos) + + // *NOTE:Mani - It is a mistake to put viewer specific code in + // the LLDir implementation. The references to 'skins' and + // 'llplugin' need to go somewhere else. + // alas... this also gets called during static initialization + // time due to the construction of gDirUtil in lldir.cpp. + if(! LLFile::isdir(mAppRODataDir + mDirDelimiter + "skins")) { - // Running from installed directory. Make sure current - // directory isn't something crazy (e.g. if invoking from - // command line). - SetCurrentDirectory(utf8str_to_utf16str(mExecutableDir).c_str()); - GetCurrentDirectory(MAX_PATH, w_str); - mWorkingDir = utf16str_to_utf8str(llutf16string(w_str)); + // What? No skins in the working dir? + // Try the executable's directory. + mAppRODataDir = mExecutableDir; } - mAppRODataDir = mWorkingDir; llinfos << "mAppRODataDir = " << mAppRODataDir << llendl; -- cgit v1.2.3 From 2ab9ba026e7002613717b1d847225ee103a26260 Mon Sep 17 00:00:00 2001 From: Alain Linden Date: Thu, 17 Feb 2011 17:49:03 -0800 Subject: update to latest apr_suite package. --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 9657253138..4518ef06ec 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -114,9 +114,9 @@ archive hash - 925015cb33630fd73db5dcb6817bf0a2 + 73785c200a5b4ef74a1230b028bb680d url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/apr_suite-1.3.8-windows-20101001a.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-apr/rev/221588/arch/CYGWIN/installer/apr_suite-1.4.2-windows-20110217.tar.bz2 name windows -- cgit v1.2.3 From ae1435e8ee63a7d0e6ada77303eb01802580ec8e Mon Sep 17 00:00:00 2001 From: Merov Linden Date: Thu, 17 Feb 2011 21:13:48 -0800 Subject: Autobuild: fix for Mac build using XCode --- indra/cmake/JsonCpp.cmake | 2 +- indra/llcommon/tests/llerror_test.cpp | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/indra/cmake/JsonCpp.cmake b/indra/cmake/JsonCpp.cmake index 5e6672ecd4..96488360a4 100644 --- a/indra/cmake/JsonCpp.cmake +++ b/indra/cmake/JsonCpp.cmake @@ -14,7 +14,7 @@ else (STANDALONE) debug json_vc100debug_libmt.lib optimized json_vc100_libmt) elseif (DARWIN) - set(JSONCPP_LIBRARIES libjson_linux-gcc-4.0.1_libmt) + set(JSONCPP_LIBRARIES libjson_linux-gcc-4.0.1_libmt.a) elseif (LINUX) set(JSONCPP_LIBRARIES libjson_linux-gcc-4.3.2_libmt) endif (WINDOWS) diff --git a/indra/llcommon/tests/llerror_test.cpp b/indra/llcommon/tests/llerror_test.cpp index 1ef8fc9712..09a20231de 100644 --- a/indra/llcommon/tests/llerror_test.cpp +++ b/indra/llcommon/tests/llerror_test.cpp @@ -48,7 +48,10 @@ namespace { static bool fatalWasCalled; void fatalCall(const std::string&) { fatalWasCalled = true; } +} +namespace tut +{ class TestRecorder : public LLError::Recorder { public: @@ -56,7 +59,7 @@ namespace ~TestRecorder() { LLError::removeRecorder(this); } void recordMessage(LLError::ELevel level, - const std::string& message) + const std::string& message) { mMessages.push_back(message); } @@ -66,12 +69,12 @@ namespace void setWantsTime(bool t) { mWantsTime = t; } bool wantsTime() { return mWantsTime; } - + std::string message(int n) { std::ostringstream test_name; test_name << "testing message " << n << ", not enough messages"; - + tut::ensure(test_name.str(), n < countMessages()); return mMessages[n]; } @@ -82,10 +85,7 @@ namespace bool mWantsTime; }; -} - -namespace tut -{ + struct ErrorTestData { TestRecorder mRecorder; @@ -381,7 +381,7 @@ namespace } typedef std::string (*LogFromFunction)(bool); - void testLogName(TestRecorder& recorder, LogFromFunction f, + void testLogName(tut::TestRecorder& recorder, LogFromFunction f, const std::string& class_name = "") { recorder.clearMessages(); -- cgit v1.2.3 From 4ef02bc1b6cf5e044d2cf57725eac1a4ccd7580d Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Fri, 18 Feb 2011 10:56:26 -0500 Subject: Introduce and use new sendReply() function for LLEventAPI methods. Each LLEventAPI method that generates a reply needs to extract the name of the reply LLEventPump from the request, typically from a ["reply"] key, copy the ["reqid"] value from request to reply, locate the reply LLEventPump and send the enriched reply object. Encapsulate in sendReply() function before we proliferate doing all that by hand too many more times. --- indra/llcommon/llevents.cpp | 13 +++++++++++++ indra/llcommon/llevents.h | 14 ++++++++++++++ indra/llui/llfloaterreglistener.cpp | 12 ++++-------- indra/newview/llsidetraylistener.cpp | 15 +++++---------- indra/newview/llviewerwindowlistener.cpp | 5 +---- 5 files changed, 37 insertions(+), 22 deletions(-) diff --git a/indra/llcommon/llevents.cpp b/indra/llcommon/llevents.cpp index 97e2bdeb57..ff03506e84 100644 --- a/indra/llcommon/llevents.cpp +++ b/indra/llcommon/llevents.cpp @@ -588,3 +588,16 @@ void LLReqID::stamp(LLSD& response) const } response["reqid"] = mReqid; } + +bool sendReply(const LLSD& reply, const LLSD& request, const std::string& replyKey) +{ + // Copy 'reply' to modify it. + LLSD newreply(reply); + // Get the ["reqid"] element from request + LLReqID reqID(request); + // and copy it to 'newreply'. + reqID.stamp(newreply); + // Send reply on LLEventPump named in request[replyKey]. Don't forget to + // send the modified 'newreply' instead of the original 'reply'. + return LLEventPumps::instance().obtain(request[replyKey]).post(newreply); +} diff --git a/indra/llcommon/llevents.h b/indra/llcommon/llevents.h index 2491cf1371..65b0fef354 100644 --- a/indra/llcommon/llevents.h +++ b/indra/llcommon/llevents.h @@ -691,6 +691,20 @@ private: LLSD mReqid; }; +/** + * Conventionally send a reply to a request event. + * + * @a reply is the LLSD reply event to send + * @a request is the corresponding LLSD request event + * @a replyKey is the key in the @a request event, conventionally ["reply"], + * whose value is the name of the LLEventPump on which to send the reply. + * + * Before sending the reply event, sendReply() copies the ["reqid"] item from + * the request to the reply. + */ +LL_COMMON_API bool sendReply(const LLSD& reply, const LLSD& request, + const std::string& replyKey="reply"); + /** * Base class for LLListenerWrapper. See visit_and_connect() and llwrap(). We * provide virtual @c accept_xxx() methods, customization points allowing a diff --git a/indra/llui/llfloaterreglistener.cpp b/indra/llui/llfloaterreglistener.cpp index ec2ac6834e..7525b8cab3 100644 --- a/indra/llui/llfloaterreglistener.cpp +++ b/indra/llui/llfloaterreglistener.cpp @@ -76,9 +76,7 @@ LLFloaterRegListener::LLFloaterRegListener(): void LLFloaterRegListener::getBuildMap(const LLSD& event) const { - // Honor the "reqid" convention by echoing event["reqid"] in our reply packet. - LLReqID reqID(event); - LLSD reply(reqID.makeResponse()); + LLSD reply; // Build an LLSD map that mirrors sBuildMap. Since we have no good way to // represent a C++ callable in LLSD, the only part of BuildData we can // store is the filename. For each LLSD map entry, it would be more @@ -91,7 +89,7 @@ void LLFloaterRegListener::getBuildMap(const LLSD& event) const reply[mi->first] = mi->second.mFile; } // Send the reply to the LLEventPump named in event["reply"]. - LLEventPumps::instance().obtain(event["reply"]).post(reply); + sendReply(reply, event); } void LLFloaterRegListener::showInstance(const LLSD& event) const @@ -111,10 +109,8 @@ void LLFloaterRegListener::toggleInstance(const LLSD& event) const void LLFloaterRegListener::instanceVisible(const LLSD& event) const { - LLReqID reqID(event); - LLSD reply(reqID.makeResponse()); - reply["visible"] = LLFloaterReg::instanceVisible(event["name"], event["key"]); - LLEventPumps::instance().obtain(event["reply"]).post(reply); + sendReply(LLSDMap("visible", LLFloaterReg::instanceVisible(event["name"], event["key"])), + event); } void LLFloaterRegListener::clickButton(const LLSD& event) const diff --git a/indra/newview/llsidetraylistener.cpp b/indra/newview/llsidetraylistener.cpp index 185bf1d6a7..6db13e517d 100644 --- a/indra/newview/llsidetraylistener.cpp +++ b/indra/newview/llsidetraylistener.cpp @@ -37,16 +37,12 @@ LLSideTrayListener::LLSideTrayListener(const Getter& getter): void LLSideTrayListener::getCollapsed(const LLSD& event) const { - LLReqID reqID(event); - LLSD reply(reqID.makeResponse()); - reply["open"] = ! mGetter()->getCollapsed(); - LLEventPumps::instance().obtain(event["reply"]).post(reply); + sendReply(LLSDMap("open", ! mGetter()->getCollapsed()), event); } void LLSideTrayListener::getTabs(const LLSD& event) const { - LLReqID reqID(event); - LLSD reply(reqID.makeResponse()); + LLSD reply; LLSideTray* tray = mGetter(); LLSD::Integer ord(0); @@ -68,7 +64,7 @@ void LLSideTrayListener::getTabs(const LLSD& event) const reply[child->getName()] = info; } - LLEventPumps::instance().obtain(event["reply"]).post(reply); + sendReply(reply, event); } static LLSD getTabInfo(LLPanel* tab) @@ -133,8 +129,7 @@ static LLSD getTabInfo(LLPanel* tab) void LLSideTrayListener::getPanels(const LLSD& event) const { - LLReqID reqID(event); - LLSD reply(reqID.makeResponse()); + LLSD reply; LLSideTray* tray = mGetter(); // Iterate through the attached tabs. @@ -163,5 +158,5 @@ void LLSideTrayListener::getPanels(const LLSD& event) const reply[tab->getName()] = getTabInfo(tab).with("attached", false).with("ord", ord); } - LLEventPumps::instance().obtain(event["reply"]).post(reply); + sendReply(reply, event); } diff --git a/indra/newview/llviewerwindowlistener.cpp b/indra/newview/llviewerwindowlistener.cpp index 0b52948680..1fe5fc9800 100644 --- a/indra/newview/llviewerwindowlistener.cpp +++ b/indra/newview/llviewerwindowlistener.cpp @@ -65,7 +65,6 @@ LLViewerWindowListener::LLViewerWindowListener(LLViewerWindow* llviewerwindow): void LLViewerWindowListener::saveSnapshot(const LLSD& event) const { - LLReqID reqid(event); typedef std::map TypeMap; TypeMap types; #define tp(name) types[#name] = LLViewerWindow::SNAPSHOT_TYPE_##name @@ -98,9 +97,7 @@ void LLViewerWindowListener::saveSnapshot(const LLSD& event) const type = found->second; } bool ok = mViewerWindow->saveSnapshot(event["filename"], width, height, showui, rebuild, type); - LLSD response(reqid.makeResponse()); - response["ok"] = ok; - LLEventPumps::instance().obtain(event["reply"]).post(response); + sendReply(LLSDMap("ok", ok), event); } void LLViewerWindowListener::requestReshape(LLSD const & event_data) const -- cgit v1.2.3 From 0e39a7881e29fe58761403424941b78f82042ac1 Mon Sep 17 00:00:00 2001 From: Joshua Bell Date: Fri, 18 Feb 2011 11:31:18 -0800 Subject: Initial stub for getValue() and path walker --- indra/newview/lluilistener.cpp | 31 +++++++++++++++++++++++++++++++ indra/newview/lluilistener.h | 1 + 2 files changed, 32 insertions(+) diff --git a/indra/newview/lluilistener.cpp b/indra/newview/lluilistener.cpp index 4d6eac4958..dafca0abf2 100644 --- a/indra/newview/lluilistener.cpp +++ b/indra/newview/lluilistener.cpp @@ -47,6 +47,12 @@ LLUIListener::LLUIListener(): "as if from a user gesture on a menu -- or a button click.", &LLUIListener::call, LLSD().with("function", LLSD())); + + add("getValue", + "For the UI control identified by the path in [\"path\"], return the control's\n" + "current value as [\"value\"] reply.", + &LLUIListener::getValue, + LLSD().with("path", LLSD())); } void LLUIListener::call(const LLSD& event) const @@ -71,3 +77,28 @@ void LLUIListener::call(const LLSD& event) const (*func)(NULL, event["parameter"]); } } + +const LLUICtrl* resolve_path(const LLUICtrl* base, const std::string path) +{ + // *TODO: walk the path + return NULL; +} + +void LLUIListener::getValue(const LLSD&event) const +{ + LLSD reply; + + const LLUICtrl* root = NULL; // *TODO: look this up + const LLUICtrl* ctrl = resolve_path(root, event["path"].asString()); + + if (ctrl) + { + reply["value"] = ctrl->getValue(); + } + else + { + // *TODO: ??? return something indicating failure to resolve + } + + sendReply(reply, event, "reply"); +} diff --git a/indra/newview/lluilistener.h b/indra/newview/lluilistener.h index e7847f01e8..08724024dc 100644 --- a/indra/newview/lluilistener.h +++ b/indra/newview/lluilistener.h @@ -41,6 +41,7 @@ public: private: void call(const LLSD& event) const; + void getValue(const LLSD&event) const; }; #endif /* ! defined(LL_LLUILISTENER_H) */ -- cgit v1.2.3 From f6970e6ad1f0576ec194fdc8d369030f1e31aeab Mon Sep 17 00:00:00 2001 From: Joshua Bell Date: Fri, 18 Feb 2011 13:04:41 -0800 Subject: Implemented path resolution. Should be able to test this now. --- indra/newview/lluilistener.cpp | 42 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/indra/newview/lluilistener.cpp b/indra/newview/lluilistener.cpp index dafca0abf2..22d3b8b219 100644 --- a/indra/newview/lluilistener.cpp +++ b/indra/newview/lluilistener.cpp @@ -34,9 +34,11 @@ // std headers // external library headers // other Linden headers +#include "llviewerwindow.h" // to get root view #include "lluictrl.h" #include "llerror.h" + LLUIListener::LLUIListener(): LLEventAPI("UI", "LLUICtrl::CommitCallbackRegistry listener.\n" @@ -78,9 +80,38 @@ void LLUIListener::call(const LLSD& event) const } } -const LLUICtrl* resolve_path(const LLUICtrl* base, const std::string path) +const LLView* resolve_path(const LLView* context, const std::string path) { - // *TODO: walk the path + std::vector parts; + const std::string delims("/"); + LLStringUtilBase::getTokens(path, parts, delims); + + bool recurse = false; + for (std::vector::iterator it = parts.begin(); + it != parts.end() && context; it++) + { + std::string part = *it; + + if (part.length() == 0) + { + // Allow "foo//bar" meaning "descendant named bar" + recurse = true; + } + else + { + const LLView* found = context->findChildView(part, recurse); + if (!found) + { + return NULL; + } + else + { + context = found; + } + recurse = false; + } + } + return NULL; } @@ -88,9 +119,10 @@ void LLUIListener::getValue(const LLSD&event) const { LLSD reply; - const LLUICtrl* root = NULL; // *TODO: look this up - const LLUICtrl* ctrl = resolve_path(root, event["path"].asString()); - + const LLView* root = (LLView*)(gViewerWindow->getRootView()); + const LLView* view = resolve_path(root, event["path"].asString()); + const LLUICtrl* ctrl(dynamic_cast(view)); + if (ctrl) { reply["value"] = ctrl->getValue(); -- cgit v1.2.3 From 14e09f9f799a5c0c660a28a6c0ae5b73a0d1dff8 Mon Sep 17 00:00:00 2001 From: callum Date: Fri, 18 Feb 2011 13:33:58 -0800 Subject: Pull in autobuild derrived jpeglib (version 8c) for Windows MSVC 2010 --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 4518ef06ec..4a62681543 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -860,9 +860,9 @@ archive hash - 4a4d88f6ba42fa0acd47881f2d7ed7a7 + a202ec58cef9097c94acfa958ed6da8d url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-6b-windows-20101001b.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-jpeglib/rev/221594/arch/CYGWIN/installer/jpeglib-8c-windows-20110217.tar.bz2 name windows -- cgit v1.2.3 From 18bf5f09b22a2c36ccf543104b1115a7b0b9db71 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Fri, 18 Feb 2011 17:49:01 -0500 Subject: Add LLAgent operations to set/query avatar orientation. --- indra/newview/llagentlistener.cpp | 36 ++++++++++++++++++++++++++++++++++++ indra/newview/llagentlistener.h | 2 ++ 2 files changed, 38 insertions(+) diff --git a/indra/newview/llagentlistener.cpp b/indra/newview/llagentlistener.cpp index d520debc31..c453fe91f4 100644 --- a/indra/newview/llagentlistener.cpp +++ b/indra/newview/llagentlistener.cpp @@ -37,6 +37,8 @@ #include "llviewerobject.h" #include "llviewerobjectlist.h" #include "llviewerregion.h" +#include "llsdutil.h" +#include "llsdutil_math.h" LLAgentListener::LLAgentListener(LLAgent &agent) : LLEventAPI("LLAgent", @@ -53,6 +55,15 @@ LLAgentListener::LLAgentListener(LLAgent &agent) add("requestStand", "Ask to stand up", &LLAgentListener::requestStand); + add("resetAxes", + "Set the agent to a fixed orientation (optionally specify [\"lookat\"] = array of [x, y, z])", + &LLAgentListener::resetAxes); + add("getAxes", + "Send information about the agent's orientation on [\"reply\"]:\n" + "[\"euler\"]: map of {roll, pitch, yaw}\n" + "[\"quat\"]: array of [x, y, z, w] quaternion values", + &LLAgentListener::getAxes, + LLSDMap("reply", LLSD())); } void LLAgentListener::requestTeleport(LLSD const & event_data) const @@ -104,3 +115,28 @@ void LLAgentListener::requestStand(LLSD const & event_data) const mAgent.setControlFlags(AGENT_CONTROL_STAND_UP); } +void LLAgentListener::resetAxes(const LLSD& event) const +{ + if (event.has("lookat")) + { + mAgent.resetAxes(ll_vector3_from_sd(event["lookat"])); + } + else + { + // no "lookat", default call + mAgent.resetAxes(); + } +} + +void LLAgentListener::getAxes(const LLSD& event) const +{ + LLQuaternion quat(mAgent.getQuat()); + F32 roll, pitch, yaw; + quat.getEulerAngles(&roll, &pitch, &yaw); + // The official query API for LLQuaternion's [x, y, z, w] values is its + // public member mQ... + sendReply(LLSDMap + ("quat", llsd_copy_array(boost::begin(quat.mQ), boost::end(quat.mQ))) + ("euler", LLSDMap("roll", roll)("pitch", pitch)("yaw", yaw)), + event); +} diff --git a/indra/newview/llagentlistener.h b/indra/newview/llagentlistener.h index 9b585152f4..0aa58d0b16 100644 --- a/indra/newview/llagentlistener.h +++ b/indra/newview/llagentlistener.h @@ -44,6 +44,8 @@ private: void requestTeleport(LLSD const & event_data) const; void requestSit(LLSD const & event_data) const; void requestStand(LLSD const & event_data) const; + void resetAxes(const LLSD& event) const; + void getAxes(const LLSD& event) const; private: LLAgent & mAgent; -- cgit v1.2.3 From 774405e92bec6bdfa9e2be28e04b4b47fd71615e Mon Sep 17 00:00:00 2001 From: Don Kjer Date: Fri, 18 Feb 2011 23:16:38 +0000 Subject: Cleanup of headless client (was: DisableRendering mode) * Now called 'HeadlessClient' instead of 'DisableRendering' * Removed most cases where we skipped certain behaviors in the client when in this mode. This gets us closer to a 'true' client, for testing purposes. --- indra/llrender/llgl.cpp | 88 ++++++++++++++------- indra/llrender/llgl.h | 2 +- indra/llrender/llimagegl.cpp | 8 +- indra/llwindow/llwindowheadless.cpp | 1 + indra/newview/app_settings/settings.xml | 4 +- indra/newview/llagent.cpp | 11 --- indra/newview/llagentcamera.cpp | 29 ++++--- indra/newview/llappviewer.cpp | 118 +++++++++++++--------------- indra/newview/llfloaterbump.cpp | 2 - indra/newview/llhudeffectlookat.cpp | 5 -- indra/newview/llhudmanager.cpp | 7 -- indra/newview/llimview.cpp | 9 --- indra/newview/llselectmgr.cpp | 18 ++--- indra/newview/llstartup.cpp | 132 +++++++++++++------------------- indra/newview/llsurface.cpp | 5 -- indra/newview/lltexturestats.cpp | 2 +- indra/newview/llviewerdisplay.cpp | 6 +- indra/newview/llviewermessage.cpp | 30 +++----- indra/newview/llviewerobject.cpp | 11 --- indra/newview/llviewerobjectlist.cpp | 26 +++---- indra/newview/llviewerparcelmgr.cpp | 5 -- indra/newview/llviewerregion.cpp | 35 +++------ indra/newview/llviewerstats.cpp | 2 +- indra/newview/llviewertexture.cpp | 100 ++++++++++++------------ indra/newview/llviewertexturelist.cpp | 15 +--- indra/newview/llviewerwindow.cpp | 56 +++++--------- indra/newview/llvoavatar.cpp | 55 +------------ indra/newview/llvoavatarself.cpp | 4 - indra/newview/llworld.cpp | 10 +-- indra/newview/pipeline.cpp | 4 - 30 files changed, 305 insertions(+), 495 deletions(-) diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp index 6ea63809f8..c86c89fa9b 100644 --- a/indra/llrender/llgl.cpp +++ b/indra/llrender/llgl.cpp @@ -57,9 +57,12 @@ BOOL gDebugSession = FALSE; BOOL gDebugGL = FALSE; BOOL gClothRipple = FALSE; -BOOL gNoRender = FALSE; +BOOL gHeadlessClient = FALSE; BOOL gGLActive = FALSE; +static const std::string HEADLESS_VENDOR_STRING("Linden Lab"); +static const std::string HEADLESS_RENDERER_STRING("Headless"); +static const std::string HEADLESS_VERSION_STRING("1.0"); std::ofstream gFailLog; @@ -538,9 +541,19 @@ void LLGLManager::setToDebugGPU() void LLGLManager::getGLInfo(LLSD& info) { - info["GLInfo"]["GLVendor"] = std::string((const char *)glGetString(GL_VENDOR)); - info["GLInfo"]["GLRenderer"] = std::string((const char *)glGetString(GL_RENDERER)); - info["GLInfo"]["GLVersion"] = std::string((const char *)glGetString(GL_VERSION)); + if (gHeadlessClient) + { + info["GLInfo"]["GLVendor"] = HEADLESS_VENDOR_STRING; + info["GLInfo"]["GLRenderer"] = HEADLESS_RENDERER_STRING; + info["GLInfo"]["GLVersion"] = HEADLESS_VERSION_STRING; + return; + } + else + { + info["GLInfo"]["GLVendor"] = std::string((const char *)glGetString(GL_VENDOR)); + info["GLInfo"]["GLRenderer"] = std::string((const char *)glGetString(GL_RENDERER)); + info["GLInfo"]["GLVersion"] = std::string((const char *)glGetString(GL_VERSION)); + } #if !LL_MESA_HEADLESS std::string all_exts = ll_safe_string((const char *)gGLHExts.mSysExts); @@ -556,14 +569,22 @@ void LLGLManager::getGLInfo(LLSD& info) std::string LLGLManager::getGLInfoString() { std::string info_str; - std::string all_exts, line; - info_str += std::string("GL_VENDOR ") + ll_safe_string((const char *)glGetString(GL_VENDOR)) + std::string("\n"); - info_str += std::string("GL_RENDERER ") + ll_safe_string((const char *)glGetString(GL_RENDERER)) + std::string("\n"); - info_str += std::string("GL_VERSION ") + ll_safe_string((const char *)glGetString(GL_VERSION)) + std::string("\n"); + if (gHeadlessClient) + { + info_str += std::string("GL_VENDOR ") + HEADLESS_VENDOR_STRING + std::string("\n"); + info_str += std::string("GL_RENDERER ") + HEADLESS_RENDERER_STRING + std::string("\n"); + info_str += std::string("GL_VERSION ") + HEADLESS_VERSION_STRING + std::string("\n"); + } + else + { + info_str += std::string("GL_VENDOR ") + ll_safe_string((const char *)glGetString(GL_VENDOR)) + std::string("\n"); + info_str += std::string("GL_RENDERER ") + ll_safe_string((const char *)glGetString(GL_RENDERER)) + std::string("\n"); + info_str += std::string("GL_VERSION ") + ll_safe_string((const char *)glGetString(GL_VERSION)) + std::string("\n"); + } #if !LL_MESA_HEADLESS - all_exts = (const char *)gGLHExts.mSysExts; + std::string all_exts= ll_safe_string(((const char *)gGLHExts.mSysExts)); LLStringUtil::replaceChar(all_exts, ' ', '\n'); info_str += std::string("GL_EXTENSIONS:\n") + all_exts + std::string("\n"); #endif @@ -573,15 +594,21 @@ std::string LLGLManager::getGLInfoString() void LLGLManager::printGLInfoString() { - std::string info_str; - std::string all_exts, line; - - LL_INFOS("RenderInit") << "GL_VENDOR: " << ((const char *)glGetString(GL_VENDOR)) << LL_ENDL; - LL_INFOS("RenderInit") << "GL_RENDERER: " << ((const char *)glGetString(GL_RENDERER)) << LL_ENDL; - LL_INFOS("RenderInit") << "GL_VERSION: " << ((const char *)glGetString(GL_VERSION)) << LL_ENDL; + if (gHeadlessClient) + { + LL_INFOS("RenderInit") << "GL_VENDOR: " << HEADLESS_VENDOR_STRING << LL_ENDL; + LL_INFOS("RenderInit") << "GL_RENDERER: " << HEADLESS_RENDERER_STRING << LL_ENDL; + LL_INFOS("RenderInit") << "GL_VERSION: " << HEADLESS_VERSION_STRING << LL_ENDL; + } + else + { + LL_INFOS("RenderInit") << "GL_VENDOR: " << ((const char *)glGetString(GL_VENDOR)) << LL_ENDL; + LL_INFOS("RenderInit") << "GL_RENDERER: " << ((const char *)glGetString(GL_RENDERER)) << LL_ENDL; + LL_INFOS("RenderInit") << "GL_VERSION: " << ((const char *)glGetString(GL_VERSION)) << LL_ENDL; + } #if !LL_MESA_HEADLESS - all_exts = std::string(gGLHExts.mSysExts); + std::string all_exts= ll_safe_string(((const char *)gGLHExts.mSysExts)); LLStringUtil::replaceChar(all_exts, ' ', '\n'); LL_DEBUGS("RenderInit") << "GL_EXTENSIONS:\n" << all_exts << LL_ENDL; #endif @@ -590,7 +617,14 @@ void LLGLManager::printGLInfoString() std::string LLGLManager::getRawGLString() { std::string gl_string; - gl_string = ll_safe_string((char*)glGetString(GL_VENDOR)) + " " + ll_safe_string((char*)glGetString(GL_RENDERER)); + if (gHeadlessClient) + { + gl_string = HEADLESS_VENDOR_STRING + " " + HEADLESS_RENDERER_STRING; + } + else + { + gl_string = ll_safe_string((char*)glGetString(GL_VENDOR)) + " " + ll_safe_string((char*)glGetString(GL_RENDERER)); + } return gl_string; } @@ -614,47 +648,47 @@ void LLGLManager::initExtensions() mHasMultitexture = TRUE; # else mHasMultitexture = FALSE; -# endif +# endif // GL_ARB_multitexture # ifdef GL_ARB_texture_env_combine mHasARBEnvCombine = TRUE; # else mHasARBEnvCombine = FALSE; -# endif +# endif // GL_ARB_texture_env_combine # ifdef GL_ARB_texture_compression mHasCompressedTextures = TRUE; # else mHasCompressedTextures = FALSE; -# endif +# endif // GL_ARB_texture_compression # ifdef GL_ARB_vertex_buffer_object mHasVertexBufferObject = TRUE; # else mHasVertexBufferObject = FALSE; -# endif +# endif // GL_ARB_vertex_buffer_object # ifdef GL_EXT_framebuffer_object mHasFramebufferObject = TRUE; # else mHasFramebufferObject = FALSE; -# endif +# endif // GL_EXT_framebuffer_object # ifdef GL_EXT_framebuffer_multisample mHasFramebufferMultisample = TRUE; # else mHasFramebufferMultisample = FALSE; -# endif +# endif // GL_EXT_framebuffer_multisample # ifdef GL_ARB_draw_buffers mHasDrawBuffers = TRUE; #else mHasDrawBuffers = FALSE; -# endif +# endif // GL_ARB_draw_buffers # if defined(GL_NV_depth_clamp) || defined(GL_ARB_depth_clamp) mHasDepthClamp = TRUE; #else mHasDepthClamp = FALSE; -#endif +#endif // defined(GL_NV_depth_clamp) || defined(GL_ARB_depth_clamp) # if GL_EXT_blend_func_separate mHasBlendFuncSeparate = TRUE; #else mHasBlendFuncSeparate = FALSE; -# endif +# endif // GL_EXT_blend_func_separate mHasMipMapGeneration = FALSE; mHasSeparateSpecularColor = FALSE; mHasAnisotropic = FALSE; @@ -1145,7 +1179,7 @@ void assert_glerror() } } - if (!gNoRender && gDebugGL) + if (gDebugGL) { do_assert_glerror(); } diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h index 85fab7a0f8..684fd50883 100644 --- a/indra/llrender/llgl.h +++ b/indra/llrender/llgl.h @@ -415,7 +415,7 @@ void set_binormals(const S32 index, const U32 stride, const LLVector3 *binormals void parse_gl_version( S32* major, S32* minor, S32* release, std::string* vendor_specific ); extern BOOL gClothRipple; -extern BOOL gNoRender; +extern BOOL gHeadlessClient; extern BOOL gGLActive; #endif // LL_LLGL_H diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index e8e98211f1..d4ffd6f88e 100644 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp @@ -967,12 +967,14 @@ BOOL LLImageGL::setSubImage(const U8* datap, S32 data_width, S32 data_height, S3 } if (mTexName == 0) { - llwarns << "Setting subimage on image without GL texture" << llendl; + // *TODO: Re-enable warning? Ran into thread locking issues? DK 2011-02-18 + //llwarns << "Setting subimage on image without GL texture" << llendl; return FALSE; } if (datap == NULL) { - llwarns << "Setting subimage on image with NULL datap" << llendl; + // *TODO: Re-enable warning? Ran into thread locking issues? DK 2011-02-18 + //llwarns << "Setting subimage on image with NULL datap" << llendl; return FALSE; } @@ -1100,6 +1102,7 @@ void LLImageGL::setManualImage(U32 target, S32 miplevel, S32 intformat, S32 widt //the texture is assiciate with some image by calling glTexImage outside LLImageGL BOOL LLImageGL::createGLTexture() { + if (gHeadlessClient) return FALSE; if (gGLManager.mIsDisabled) { llwarns << "Trying to create a texture while GL is disabled!" << llendl; @@ -1128,6 +1131,7 @@ BOOL LLImageGL::createGLTexture() BOOL LLImageGL::createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S32 usename/*=0*/, BOOL to_create, S32 category) { + if (gHeadlessClient) return FALSE; if (gGLManager.mIsDisabled) { llwarns << "Trying to create a texture while GL is disabled!" << llendl; diff --git a/indra/llwindow/llwindowheadless.cpp b/indra/llwindow/llwindowheadless.cpp index 35398f1c09..2e811ab23f 100644 --- a/indra/llwindow/llwindowheadless.cpp +++ b/indra/llwindow/llwindowheadless.cpp @@ -28,6 +28,7 @@ #include "indra_constants.h" #include "llwindowheadless.h" +#include "llgl.h" // // LLWindowHeadless diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index ced46c7294..603fddbccd 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -2612,10 +2612,10 @@ Value 0 - DisableRendering + HeadlessClient Comment - Disable GL rendering and GUI (load testing) + Run in headless mode by disabling GL rendering, keyboard, etc Persist 1 Type diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 7d908df5ce..7d491a7774 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -1119,12 +1119,6 @@ void LLAgent::resetControlFlags() //----------------------------------------------------------------------------- void LLAgent::setAFK() { - // Drones can't go AFK - if (gNoRender) - { - return; - } - if (!gAgent.getRegion()) { // Don't set AFK if we're not talking to a region yet. @@ -1684,11 +1678,6 @@ void LLAgent::clearRenderState(U8 clearstate) //----------------------------------------------------------------------------- U8 LLAgent::getRenderState() { - if (gNoRender || gKeyboard == NULL) - { - return 0; - } - // *FIX: don't do stuff in a getter! This is infinite loop city! if ((mTypingTimer.getElapsedTimeF32() > TYPING_TIMEOUT_SECS) && (mRenderState & AGENT_STATE_TYPING)) diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index f01d5ff1f5..6c5c3bcdab 100644 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -282,25 +282,22 @@ void LLAgentCamera::resetView(BOOL reset_camera, BOOL change_camera) gAgent.stopAutoPilot(TRUE); } - if (!gNoRender) - { - LLSelectMgr::getInstance()->unhighlightAll(); + LLSelectMgr::getInstance()->unhighlightAll(); - // By popular request, keep land selection while walking around. JC - // LLViewerParcelMgr::getInstance()->deselectLand(); + // By popular request, keep land selection while walking around. JC + // LLViewerParcelMgr::getInstance()->deselectLand(); - // force deselect when walking and attachment is selected - // this is so people don't wig out when their avatar moves without animating - if (LLSelectMgr::getInstance()->getSelection()->isAttachment()) - { - LLSelectMgr::getInstance()->deselectAll(); - } + // force deselect when walking and attachment is selected + // this is so people don't wig out when their avatar moves without animating + if (LLSelectMgr::getInstance()->getSelection()->isAttachment()) + { + LLSelectMgr::getInstance()->deselectAll(); + } - if (gMenuHolder != NULL) - { - // Hide all popup menus - gMenuHolder->hideMenus(); - } + if (gMenuHolder != NULL) + { + // Hide all popup menus + gMenuHolder->hideMenus(); } if (change_camera && !gSavedSettings.getBOOL("FreezeTime")) diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 6a9dfaf21b..25bdaed0c9 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -881,7 +881,7 @@ bool LLAppViewer::init() } // If we don't have the right GL requirements, exit. - if (!gGLManager.mHasRequirements && !gNoRender) + if (!gGLManager.mHasRequirements) { // can't use an alert here since we're exiting and // all hell breaks lose. @@ -1171,7 +1171,8 @@ bool LLAppViewer::mainLoop() } // Render scene. - if (!LLApp::isExiting()) + // *TODO: Should we run display() even during gHeadlessClient? DK 2011-02-18 + if (!LLApp::isExiting() && !gHeadlessClient) { pingMainloopTimeout("Main:Display"); gGLActive = TRUE; @@ -1199,8 +1200,7 @@ bool LLAppViewer::mainLoop() } // yield cooperatively when not running as foreground window - if ( gNoRender - || (gViewerWindow && !gViewerWindow->mWindow->getVisible()) + if ( (gViewerWindow && !gViewerWindow->mWindow->getVisible()) || !gFocusMgr.getAppHasFocus()) { // Sleep if we're not rendering, or the window is minimized. @@ -2640,7 +2640,8 @@ bool LLAppViewer::initWindow() LL_INFOS("AppInit") << "Initializing window..." << LL_ENDL; // store setting in a global for easy access and modification - gNoRender = gSavedSettings.getBOOL("DisableRendering"); + gHeadlessClient = gSavedSettings.getBOOL("DisableRendering") + || gSavedSettings.getBOOL("HeadlessClient"); // always start windowed BOOL ignorePixelDepth = gSavedSettings.getBOOL("IgnorePixelDepth"); @@ -2676,28 +2677,25 @@ bool LLAppViewer::initWindow() gViewerWindow->mWindow->maximize(); } - if (!gNoRender) + // + // Initialize GL stuff + // + + if (mForceGraphicsDetail) { - // - // Initialize GL stuff - // + LLFeatureManager::getInstance()->setGraphicsLevel(gSavedSettings.getU32("RenderQualityPerformance"), false); + } + + // Set this flag in case we crash while initializing GL + gSavedSettings.setBOOL("RenderInitError", TRUE); + gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE ); - if (mForceGraphicsDetail) - { - LLFeatureManager::getInstance()->setGraphicsLevel(gSavedSettings.getU32("RenderQualityPerformance"), false); - } - - // Set this flag in case we crash while initializing GL - gSavedSettings.setBOOL("RenderInitError", TRUE); - gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE ); - - gPipeline.init(); - stop_glerror(); - gViewerWindow->initGLDefaults(); + gPipeline.init(); + stop_glerror(); + gViewerWindow->initGLDefaults(); - gSavedSettings.setBOOL("RenderInitError", FALSE); - gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE ); - } + gSavedSettings.setBOOL("RenderInitError", FALSE); + gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE ); //If we have a startup crash, it's usually near GL initialization, so simulate that. if(gCrashOnStartup) @@ -2739,12 +2737,9 @@ void LLAppViewer::cleanupSavedSettings() gSavedSettings.setBOOL("ShowObjectUpdates", gShowObjectUpdates); - if (!gNoRender) + if (gDebugView) { - if (gDebugView) - { - gSavedSettings.setBOOL("ShowDebugConsole", gDebugView->mDebugConsolep->getVisible()); - } + gSavedSettings.setBOOL("ShowDebugConsole", gDebugView->mDebugConsolep->getVisible()); } // save window position if not maximized @@ -3711,7 +3706,7 @@ void LLAppViewer::badNetworkHandler() // is destroyed. void LLAppViewer::saveFinalSnapshot() { - if (!mSavedFinalSnapshot && !gNoRender) + if (!mSavedFinalSnapshot) { gSavedSettings.setVector3d("FocusPosOnLogout", gAgentCamera.calcFocusPositionTargetGlobal()); gSavedSettings.setVector3d("CameraPosOnLogout", gAgentCamera.calcCameraPositionTargetGlobal()); @@ -4115,34 +4110,31 @@ void LLAppViewer::idle() // // Update weather effects // - if (!gNoRender) - { - LLWorld::getInstance()->updateClouds(gFrameDTClamped); - gSky.propagateHeavenlyBodies(gFrameDTClamped); // moves sun, moon, and planets + LLWorld::getInstance()->updateClouds(gFrameDTClamped); + gSky.propagateHeavenlyBodies(gFrameDTClamped); // moves sun, moon, and planets - // Update wind vector - LLVector3 wind_position_region; - static LLVector3 average_wind; + // Update wind vector + LLVector3 wind_position_region; + static LLVector3 average_wind; - LLViewerRegion *regionp; - regionp = LLWorld::getInstance()->resolveRegionGlobal(wind_position_region, gAgent.getPositionGlobal()); // puts agent's local coords into wind_position - if (regionp) - { - gWindVec = regionp->mWind.getVelocity(wind_position_region); + LLViewerRegion *regionp; + regionp = LLWorld::getInstance()->resolveRegionGlobal(wind_position_region, gAgent.getPositionGlobal()); // puts agent's local coords into wind_position + if (regionp) + { + gWindVec = regionp->mWind.getVelocity(wind_position_region); - // Compute average wind and use to drive motion of water - - average_wind = regionp->mWind.getAverage(); - F32 cloud_density = regionp->mCloudLayer.getDensityRegion(wind_position_region); - - gSky.setCloudDensityAtAgent(cloud_density); - gSky.setWind(average_wind); - //LLVOWater::setWind(average_wind); - } - else - { - gWindVec.setVec(0.0f, 0.0f, 0.0f); - } + // Compute average wind and use to drive motion of water + + average_wind = regionp->mWind.getAverage(); + F32 cloud_density = regionp->mCloudLayer.getDensityRegion(wind_position_region); + + gSky.setCloudDensityAtAgent(cloud_density); + gSky.setWind(average_wind); + //LLVOWater::setWind(average_wind); + } + else + { + gWindVec.setVec(0.0f, 0.0f, 0.0f); } ////////////////////////////////////// @@ -4151,13 +4143,10 @@ void LLAppViewer::idle() // Here, particles are updated and drawables are moved. // - if (!gNoRender) - { - LLFastTimer t(FTM_WORLD_UPDATE); - gPipeline.updateMove(); + LLFastTimer t(FTM_WORLD_UPDATE); + gPipeline.updateMove(); - LLWorld::getInstance()->updateParticles(); - } + LLWorld::getInstance()->updateParticles(); if (LLViewerJoystick::getInstance()->getOverrideCamera()) { @@ -4523,12 +4512,9 @@ void LLAppViewer::disconnectViewer() gSavedSettings.setBOOL("FlyingAtExit", gAgent.getFlying() ); // Un-minimize all windows so they don't get saved minimized - if (!gNoRender) + if (gFloaterView) { - if (gFloaterView) - { - gFloaterView->restoreAll(); - } + gFloaterView->restoreAll(); } if (LLSelectMgr::getInstance()) diff --git a/indra/newview/llfloaterbump.cpp b/indra/newview/llfloaterbump.cpp index 61cf4dad93..eeb81085bb 100644 --- a/indra/newview/llfloaterbump.cpp +++ b/indra/newview/llfloaterbump.cpp @@ -38,13 +38,11 @@ ///---------------------------------------------------------------------------- /// Class LLFloaterBump ///---------------------------------------------------------------------------- -extern BOOL gNoRender; // Default constructor LLFloaterBump::LLFloaterBump(const LLSD& key) : LLFloater(key) { - if(gNoRender) return; } diff --git a/indra/newview/llhudeffectlookat.cpp b/indra/newview/llhudeffectlookat.cpp index 8cf7d23f88..72f64752d6 100644 --- a/indra/newview/llhudeffectlookat.cpp +++ b/indra/newview/llhudeffectlookat.cpp @@ -587,11 +587,6 @@ void LLHUDEffectLookAt::update() */ bool LLHUDEffectLookAt::calcTargetPosition() { - if (gNoRender) - { - return false; - } - LLViewerObject *target_obj = (LLViewerObject *)mTargetObject; LLVector3 local_offset; diff --git a/indra/newview/llhudmanager.cpp b/indra/newview/llhudmanager.cpp index 5f3178b955..8f14b53db0 100644 --- a/indra/newview/llhudmanager.cpp +++ b/indra/newview/llhudmanager.cpp @@ -38,8 +38,6 @@ #include "llviewercontrol.h" #include "llviewerobjectlist.h" -extern BOOL gNoRender; - // These are loaded from saved settings. LLColor4 LLHUDManager::sParentColor; LLColor4 LLHUDManager::sChildColor; @@ -150,11 +148,6 @@ LLHUDEffect *LLHUDManager::createViewerEffect(const U8 type, BOOL send_to_sim, B //static void LLHUDManager::processViewerEffect(LLMessageSystem *mesgsys, void **user_data) { - if (gNoRender) - { - return; - } - LLHUDEffect *effectp = NULL; LLUUID effect_id; U8 effect_type = 0; diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 9623554200..060ad17c02 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -3174,10 +3174,6 @@ public: //just like a normal IM //this is just replicated code from process_improved_im //and should really go in it's own function -jwolk - if (gNoRender) - { - return; - } LLChat chat; std::string message = message_params["message"].asString(); @@ -3254,11 +3250,6 @@ public: } //end if invitation has instant message else if ( input["body"].has("voice") ) { - if (gNoRender) - { - return; - } - if(!LLVoiceClient::getInstance()->voiceEnabled() || !LLVoiceClient::getInstance()->isVoiceWorking()) { // Don't display voice invites unless the user has voice enabled. diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index da891d1c51..81f4dd802a 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -516,17 +516,15 @@ BOOL LLSelectMgr::removeObjectFromSelections(const LLUUID &id) { BOOL object_found = FALSE; LLTool *tool = NULL; - if (!gNoRender) - { - tool = LLToolMgr::getInstance()->getCurrentTool(); - // It's possible that the tool is editing an object that is not selected - LLViewerObject* tool_editing_object = tool->getEditingObject(); - if( tool_editing_object && tool_editing_object->mID == id) - { - tool->stopEditing(); - object_found = TRUE; - } + tool = LLToolMgr::getInstance()->getCurrentTool(); + + // It's possible that the tool is editing an object that is not selected + LLViewerObject* tool_editing_object = tool->getEditingObject(); + if( tool_editing_object && tool_editing_object->mID == id) + { + tool->stopEditing(); + object_found = TRUE; } // Iterate through selected objects list and kill the object diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 0eac7d5e2a..34a79bcde3 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -354,11 +354,8 @@ bool idle_startup() LLStringUtil::setLocale (LLTrans::getString(system)); - if (!gNoRender) - { - //note: Removing this line will cause incorrect button size in the login screen. -- bao. - gTextureList.updateImages(0.01f) ; - } + //note: Removing this line will cause incorrect button size in the login screen. -- bao. + gTextureList.updateImages(0.01f) ; if ( STATE_FIRST == LLStartUp::getStartupState() ) { @@ -673,6 +670,7 @@ bool idle_startup() { gUserCredential = gLoginHandler.initializeLoginInfo(); } + // Previous initialzeLoginInfo may have generated user credentials. Re-check them. if (gUserCredential.isNull()) { show_connect_box = TRUE; @@ -731,9 +729,9 @@ bool idle_startup() { gUserCredential = gLoginHandler.initializeLoginInfo(); } - if (gNoRender) + if (gHeadlessClient) { - LL_ERRS("AppInit") << "Need to autologin or use command line with norender!" << LL_ENDL; + LL_WARNS("AppInit") << "Waiting at connection box in headless client. Did you mean to add autologin params?" << LL_ENDL; } // Make sure the process dialog doesn't hide things gViewerWindow->setShowProgress(FALSE); @@ -941,10 +939,7 @@ bool idle_startup() gViewerWindow->getWindow()->setCursor(UI_CURSOR_WAIT); - if (!gNoRender) - { - init_start_screen(agent_location_id); - } + init_start_screen(agent_location_id); // Display the startup progress bar. gViewerWindow->setShowProgress(TRUE); @@ -975,11 +970,6 @@ bool idle_startup() // Setting initial values... LLLoginInstance* login = LLLoginInstance::getInstance(); login->setNotificationsInterface(LLNotifications::getInstance()); - if(gNoRender) - { - // HACK, skip optional updates if you're running drones - login->setSkipOptionalUpdate(true); - } login->setSerialNumber(LLAppViewer::instance()->getSerialNumber()); login->setLastExecEvent(gLastExecEvent); @@ -1265,14 +1255,11 @@ bool idle_startup() gLoginMenuBarView->setVisible( FALSE ); gLoginMenuBarView->setEnabled( FALSE ); - if (!gNoRender) - { - // direct logging to the debug console's line buffer - LLError::logToFixedBuffer(gDebugView->mDebugConsolep); - - // set initial visibility of debug console - gDebugView->mDebugConsolep->setVisible(gSavedSettings.getBOOL("ShowDebugConsole")); - } + // direct logging to the debug console's line buffer + LLError::logToFixedBuffer(gDebugView->mDebugConsolep); + + // set initial visibility of debug console + gDebugView->mDebugConsolep->setVisible(gSavedSettings.getBOOL("ShowDebugConsole")); // // Set message handlers @@ -1300,7 +1287,7 @@ bool idle_startup() //gCacheName is required for nearby chat history loading //so I just moved nearby history loading a few states further - if (!gNoRender && gSavedPerAccountSettings.getBOOL("LogShowHistory")) + if (gSavedPerAccountSettings.getBOOL("LogShowHistory")) { LLNearbyChat* nearby_chat = LLNearbyChat::getInstance(); if (nearby_chat) nearby_chat->loadHistory(); @@ -1352,18 +1339,15 @@ bool idle_startup() gAgentCamera.resetCamera(); // Initialize global class data needed for surfaces (i.e. textures) - if (!gNoRender) - { - LL_DEBUGS("AppInit") << "Initializing sky..." << LL_ENDL; - // Initialize all of the viewer object classes for the first time (doing things like texture fetches. - LLGLState::checkStates(); - LLGLState::checkTextureChannels(); + LL_DEBUGS("AppInit") << "Initializing sky..." << LL_ENDL; + // Initialize all of the viewer object classes for the first time (doing things like texture fetches. + LLGLState::checkStates(); + LLGLState::checkTextureChannels(); - gSky.init(initial_sun_direction); + gSky.init(initial_sun_direction); - LLGLState::checkStates(); - LLGLState::checkTextureChannels(); - } + LLGLState::checkStates(); + LLGLState::checkTextureChannels(); LL_DEBUGS("AppInit") << "Decoding images..." << LL_ENDL; // For all images pre-loaded into viewer cache, decode them. @@ -1726,46 +1710,43 @@ bool idle_startup() LLUIColorTable::instance().saveUserSettings(); }; - if (!gNoRender) - { - // JC: Initializing audio requests many sounds for download. - init_audio(); - - // JC: Initialize "active" gestures. This may also trigger - // many gesture downloads, if this is the user's first - // time on this machine or -purge has been run. - LLSD gesture_options - = LLLoginInstance::getInstance()->getResponse("gestures"); - if (gesture_options.isDefined()) + // JC: Initializing audio requests many sounds for download. + init_audio(); + + // JC: Initialize "active" gestures. This may also trigger + // many gesture downloads, if this is the user's first + // time on this machine or -purge has been run. + LLSD gesture_options + = LLLoginInstance::getInstance()->getResponse("gestures"); + if (gesture_options.isDefined()) + { + LL_DEBUGS("AppInit") << "Gesture Manager loading " << gesture_options.size() + << LL_ENDL; + uuid_vec_t item_ids; + for(LLSD::array_const_iterator resp_it = gesture_options.beginArray(), + end = gesture_options.endArray(); resp_it != end; ++resp_it) { - LL_DEBUGS("AppInit") << "Gesture Manager loading " << gesture_options.size() - << LL_ENDL; - uuid_vec_t item_ids; - for(LLSD::array_const_iterator resp_it = gesture_options.beginArray(), - end = gesture_options.endArray(); resp_it != end; ++resp_it) - { - // If the id is not specifed in the LLSD, - // the LLSD operator[]() will return a null LLUUID. - LLUUID item_id = (*resp_it)["item_id"]; - LLUUID asset_id = (*resp_it)["asset_id"]; + // If the id is not specifed in the LLSD, + // the LLSD operator[]() will return a null LLUUID. + LLUUID item_id = (*resp_it)["item_id"]; + LLUUID asset_id = (*resp_it)["asset_id"]; - if (item_id.notNull() && asset_id.notNull()) - { - // Could schedule and delay these for later. - const BOOL no_inform_server = FALSE; - const BOOL no_deactivate_similar = FALSE; - LLGestureMgr::instance().activateGestureWithAsset(item_id, asset_id, - no_inform_server, - no_deactivate_similar); - // We need to fetch the inventory items for these gestures - // so we have the names to populate the UI. - item_ids.push_back(item_id); - } + if (item_id.notNull() && asset_id.notNull()) + { + // Could schedule and delay these for later. + const BOOL no_inform_server = FALSE; + const BOOL no_deactivate_similar = FALSE; + LLGestureMgr::instance().activateGestureWithAsset(item_id, asset_id, + no_inform_server, + no_deactivate_similar); + // We need to fetch the inventory items for these gestures + // so we have the names to populate the UI. + item_ids.push_back(item_id); } - // no need to add gesture to inventory observer, it's already made in constructor - LLGestureMgr::instance().setFetchIDs(item_ids); - LLGestureMgr::instance().startFetch(); } + // no need to add gesture to inventory observer, it's already made in constructor + LLGestureMgr::instance().setFetchIDs(item_ids); + LLGestureMgr::instance().startFetch(); } gDisplaySwapBuffers = TRUE; @@ -1786,13 +1767,6 @@ bool idle_startup() // JC - 7/20/2002 gViewerWindow->sendShapeToSim(); - - // Ignore stipend information for now. Money history is on the web site. - // if needed, show the L$ history window - //if (stipend_since_login && !gNoRender) - //{ - //} - // The reason we show the alert is because we want to // reduce confusion for when you log in and your provided // location is not your expected location. So, if this is @@ -3218,7 +3192,7 @@ bool process_login_success_response() void transition_back_to_login_panel(const std::string& emsg) { - if (gNoRender) + if (gHeadlessClient && gSavedSettings.getBOOL("AutoLogin")) { LL_WARNS("AppInit") << "Failed to login!" << LL_ENDL; LL_WARNS("AppInit") << emsg << LL_ENDL; diff --git a/indra/newview/llsurface.cpp b/indra/newview/llsurface.cpp index 6fc8153b77..bccabe21a8 100644 --- a/indra/newview/llsurface.cpp +++ b/indra/newview/llsurface.cpp @@ -340,11 +340,6 @@ void LLSurface::connectNeighbor(LLSurface *neighborp, U32 direction) S32 i; LLSurfacePatch *patchp, *neighbor_patchp; - if (gNoRender) - { - return; - } - mNeighbors[direction] = neighborp; neighborp->mNeighbors[gDirOpposite[direction]] = this; diff --git a/indra/newview/lltexturestats.cpp b/indra/newview/lltexturestats.cpp index dd35d5cf83..f820ae65df 100644 --- a/indra/newview/lltexturestats.cpp +++ b/indra/newview/lltexturestats.cpp @@ -37,7 +37,7 @@ void send_texture_stats_to_sim(const LLSD &texture_stats) { LLSD texture_stats_report; // Only send stats if the agent is connected to a region. - if (!gAgent.getRegion() || gNoRender) + if (!gAgent.getRegion()) { return; } diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index ddb11829df..3e13537113 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -115,8 +115,7 @@ void display_startup() { if ( !gViewerWindow->getActive() || !gViewerWindow->mWindow->getVisible() - || gViewerWindow->mWindow->getMinimized() - || gNoRender ) + || gViewerWindow->mWindow->getMinimized() ) { return; } @@ -294,7 +293,8 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) // Logic for forcing window updates if we're in drone mode. // - if (gNoRender) + // *TODO: Investigate running display() during gHeadlessClient. See if this early exit is needed DK 2011-02-18 + if (gHeadlessClient) { #if LL_WINDOWS static F32 last_update_time = 0.f; diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 6fc85a3944..7e8fbf7345 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -343,12 +343,6 @@ void process_layer_data(LLMessageSystem *mesgsys, void **user_data) { LLViewerRegion *regionp = LLWorld::getInstance()->getRegion(mesgsys->getSender()); - if (!regionp || gNoRender) - { - return; - } - - S32 size; S8 type; @@ -2163,10 +2157,6 @@ void god_message_name_cb(const LLAvatarName& av_name, LLChat chat, std::string m void process_improved_im(LLMessageSystem *msg, void **user_data) { - if (gNoRender) - { - return; - } LLUUID from_id; BOOL from_group; LLUUID to_id; @@ -3936,7 +3926,14 @@ void send_agent_update(BOOL force_send, BOOL send_reliable) // LBUTTON and ML_LBUTTON so that using the camera (alt-key) doesn't // trigger a control event. U32 control_flags = gAgent.getControlFlags(); - MASK key_mask = gKeyboard->currentMask(TRUE); + + MASK key_mask = MASK_NONE; + // *TODO: Create a headless gKeyboard DK 2011-02-18 + if (gKeyboard) + { + key_mask = gKeyboard->currentMask(TRUE); + } + if (key_mask & MASK_ALT || key_mask & MASK_CONTROL) { control_flags &= ~( AGENT_CONTROL_LBUTTON_DOWN | @@ -4255,7 +4252,7 @@ void process_time_synch(LLMessageSystem *mesgsys, void **user_data) gSky.setSunPhase(phase); gSky.setSunTargetDirection(sun_direction, sun_ang_velocity); - if (!gNoRender && !(gSavedSettings.getBOOL("SkyOverrideSimSunPosition") || gSky.getOverrideSun())) + if ( !(gSavedSettings.getBOOL("SkyOverrideSimSunPosition") || gSky.getOverrideSun()) ) { gSky.setSunDirection(sun_direction, sun_ang_velocity); } @@ -5517,21 +5514,12 @@ time_t gLastDisplayedTime = 0; void handle_show_mean_events(void *) { - if (gNoRender) - { - return; - } LLFloaterReg::showInstance("bumps"); //LLFloaterBump::showInstance(); } void mean_name_callback(const LLUUID &id, const std::string& full_name, bool is_group) { - if (gNoRender) - { - return; - } - static const U32 max_collision_list_size = 20; if (gMeanCollisionList.size() > max_collision_list_size) { diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 090d3cadd4..c60bdf31c9 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -469,11 +469,6 @@ void LLViewerObject::initVOClasses() // Initialized shared class stuff first. LLVOAvatar::initClass(); LLVOTree::initClass(); - if (gNoRender) - { - // Don't init anything else in drone mode - return; - } llinfos << "Viewer Object size: " << sizeof(LLViewerObject) << llendl; LLVOGrass::initClass(); LLVOWater::initClass(); @@ -2151,12 +2146,6 @@ BOOL LLViewerObject::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) } } - if (gNoRender) - { - // Skip drawable stuff if not rendering. - return TRUE; - } - updateDrawable(FALSE); return TRUE; diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index 970cc2e2a7..d112b3490e 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -636,19 +636,16 @@ void LLViewerObjectList::updateApparentAngles(LLAgent &agent) } - if (!gNoRender) + // Slam priorities for textures that we care about (hovered, selected, and focused) + // Hovered + // Assumes only one level deep of parenting + LLSelectNode* nodep = LLSelectMgr::instance().getHoverNode(); + if (nodep) { - // Slam priorities for textures that we care about (hovered, selected, and focused) - // Hovered - // Assumes only one level deep of parenting - LLSelectNode* nodep = LLSelectMgr::instance().getHoverNode(); - if (nodep) + objectp = nodep->getObject(); + if (objectp) { - objectp = nodep->getObject(); - if (objectp) - { - objectp->boostTexturePriority(); - } + objectp->boostTexturePriority(); } } @@ -1099,7 +1096,7 @@ void LLViewerObjectList::shiftObjects(const LLVector3 &offset) // We need to update many object caches, I'll document this more as I dig through the code // cleaning things out... - if (gNoRender || 0 == offset.magVecSquared()) + if (0 == offset.magVecSquared()) { return; } @@ -1505,11 +1502,6 @@ void LLViewerObjectList::orphanize(LLViewerObject *childp, U32 parent_id, U32 ip void LLViewerObjectList::findOrphans(LLViewerObject* objectp, U32 ip, U32 port) { - if (gNoRender) - { - return; - } - if (objectp->isDead()) { llwarns << "Trying to find orphans for dead obj " << objectp->mID diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index fccd1156d3..e84e4a859a 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -1383,11 +1383,6 @@ void LLViewerParcelMgr::setHoverParcel(const LLVector3d& pos) // static void LLViewerParcelMgr::processParcelOverlay(LLMessageSystem *msg, void **user) { - if (gNoRender) - { - return; - } - // Extract the packed overlay information S32 packed_overlay_size = msg->getSizeFast(_PREHASH_ParcelData, _PREHASH_Data); diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 23b7b921b8..8e0373c79e 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -72,8 +72,6 @@ #pragma warning(disable:4355) #endif -extern BOOL gNoRender; - const F32 WATER_TEXTURE_SCALE = 8.f; // Number of times to repeat the water texture across a region const S16 MAX_MAP_DIST = 10; @@ -234,28 +232,19 @@ LLViewerRegion::LLViewerRegion(const U64 &handle, updateRenderMatrix(); mLandp = new LLSurface('l', NULL); - if (!gNoRender) - { - // Create the composition layer for the surface - mCompositionp = new LLVLComposition(mLandp, grids_per_region_edge, region_width_meters/grids_per_region_edge); - mCompositionp->setSurface(mLandp); - - // Create the surfaces - mLandp->setRegion(this); - mLandp->create(grids_per_region_edge, - grids_per_patch_edge, - mOriginGlobal, - mWidth); - } - if (!gNoRender) - { - mParcelOverlay = new LLViewerParcelOverlay(this, region_width_meters); - } - else - { - mParcelOverlay = NULL; - } + // Create the composition layer for the surface + mCompositionp = new LLVLComposition(mLandp, grids_per_region_edge, region_width_meters/grids_per_region_edge); + mCompositionp->setSurface(mLandp); + + // Create the surfaces + mLandp->setRegion(this); + mLandp->create(grids_per_region_edge, + grids_per_patch_edge, + mOriginGlobal, + mWidth); + + mParcelOverlay = new LLViewerParcelOverlay(this, region_width_meters); setOriginGlobal(from_region_handle(handle)); calculateCenterGlobal(); diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index 546ee9a334..e29370dfa4 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -711,7 +711,7 @@ void send_stats() // but that day is not today. // Only send stats if the agent is connected to a region. - if (!gAgent.getRegion() || gNoRender) + if (!gAgent.getRegion()) { return; } diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index cd16b15e3e..16e73da79b 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -1415,61 +1415,59 @@ BOOL LLViewerFetchedTexture::createTexture(S32 usename/*= 0*/) // mRawImage->getWidth(), mRawImage->getHeight(),mRawImage->getDataSize()) // << mID.getString() << llendl; BOOL res = TRUE; - if (!gNoRender) - { - // store original size only for locally-sourced images - if (mUrl.compare(0, 7, "file://") == 0) - { - mOrigWidth = mRawImage->getWidth(); - mOrigHeight = mRawImage->getHeight(); - // leave black border, do not scale image content - mRawImage->expandToPowerOfTwo(MAX_IMAGE_SIZE, FALSE); - - mFullWidth = mRawImage->getWidth(); - mFullHeight = mRawImage->getHeight(); - setTexelsPerImage(); - } - else - { - mOrigWidth = mFullWidth; - mOrigHeight = mFullHeight; - } + // store original size only for locally-sourced images + if (mUrl.compare(0, 7, "file://") == 0) + { + mOrigWidth = mRawImage->getWidth(); + mOrigHeight = mRawImage->getHeight(); - bool size_okay = true; + // leave black border, do not scale image content + mRawImage->expandToPowerOfTwo(MAX_IMAGE_SIZE, FALSE); - U32 raw_width = mRawImage->getWidth() << mRawDiscardLevel; - U32 raw_height = mRawImage->getHeight() << mRawDiscardLevel; - if( raw_width > MAX_IMAGE_SIZE || raw_height > MAX_IMAGE_SIZE ) - { - llinfos << "Width or height is greater than " << MAX_IMAGE_SIZE << ": (" << raw_width << "," << raw_height << ")" << llendl; - size_okay = false; - } - - if (!LLImageGL::checkSize(mRawImage->getWidth(), mRawImage->getHeight())) - { - // A non power-of-two image was uploaded (through a non standard client) - llinfos << "Non power of two width or height: (" << mRawImage->getWidth() << "," << mRawImage->getHeight() << ")" << llendl; - size_okay = false; - } - - if( !size_okay ) - { - // An inappropriately-sized image was uploaded (through a non standard client) - // We treat these images as missing assets which causes them to - // be renderd as 'missing image' and to stop requesting data - setIsMissingAsset(); - destroyRawImage(); - return FALSE; - } - - if(!(res = insertToAtlas())) - { - res = mGLTexturep->createGLTexture(mRawDiscardLevel, mRawImage, usename, TRUE, mBoostLevel); - resetFaceAtlas() ; - } - setActive() ; + mFullWidth = mRawImage->getWidth(); + mFullHeight = mRawImage->getHeight(); + setTexelsPerImage(); + } + else + { + mOrigWidth = mFullWidth; + mOrigHeight = mFullHeight; + } + + bool size_okay = true; + + U32 raw_width = mRawImage->getWidth() << mRawDiscardLevel; + U32 raw_height = mRawImage->getHeight() << mRawDiscardLevel; + if( raw_width > MAX_IMAGE_SIZE || raw_height > MAX_IMAGE_SIZE ) + { + llinfos << "Width or height is greater than " << MAX_IMAGE_SIZE << ": (" << raw_width << "," << raw_height << ")" << llendl; + size_okay = false; + } + + if (!LLImageGL::checkSize(mRawImage->getWidth(), mRawImage->getHeight())) + { + // A non power-of-two image was uploaded (through a non standard client) + llinfos << "Non power of two width or height: (" << mRawImage->getWidth() << "," << mRawImage->getHeight() << ")" << llendl; + size_okay = false; + } + + if( !size_okay ) + { + // An inappropriately-sized image was uploaded (through a non standard client) + // We treat these images as missing assets which causes them to + // be renderd as 'missing image' and to stop requesting data + setIsMissingAsset(); + destroyRawImage(); + return FALSE; + } + + if(!(res = insertToAtlas())) + { + res = mGLTexturep->createGLTexture(mRawDiscardLevel, mRawImage, usename, TRUE, mBoostLevel); + resetFaceAtlas() ; } + setActive() ; if (!mForceToSaveRawImage) { diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 10126219f8..06f6ff23c2 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -91,11 +91,6 @@ void LLViewerTextureList::init() sNumImages = 0; mMaxResidentTexMemInMegaBytes = 0; mMaxTotalTextureMemInMegaBytes = 0 ; - if (gNoRender) - { - // Don't initialize GL stuff if we're not rendering. - return; - } mUpdateStats = TRUE; @@ -345,13 +340,6 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromUrl(const std::string& LLGLenum primary_format, const LLUUID& force_id) { - if (gNoRender) - { - // Never mind that this ignores image_set_id; - // getImage() will handle that later. - return LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, LLViewerTexture::BOOST_UI); - } - // generate UUID based on hash of filename LLUUID new_id; if (force_id.notNull()) @@ -741,7 +729,7 @@ static LLFastTimer::DeclareTimer FTM_IMAGE_CREATE("Create Images"); F32 LLViewerTextureList::updateImagesCreateTextures(F32 max_time) { - if (gNoRender || gGLManager.mIsDisabled) return 0.0f; + if (gGLManager.mIsDisabled) return 0.0f; // // Create GL textures for all textures that need them (images which have been @@ -876,7 +864,6 @@ void LLViewerTextureList::updateImagesUpdateStats() void LLViewerTextureList::decodeAllImages(F32 max_time) { LLTimer timer; - if(gNoRender) return; // Update texture stats and priorities std::vector > image_list; diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 166b110412..435da72622 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1225,8 +1225,9 @@ void LLViewerWindow::handleMenuSelect(LLWindow *window, S32 menu_item) BOOL LLViewerWindow::handlePaint(LLWindow *window, S32 x, S32 y, S32 width, S32 height) { + // *TODO: Enable similar information output for other platforms? DK 2011-02-18 #if LL_WINDOWS - if (gNoRender) + if (gHeadlessClient) { HWND window_handle = (HWND)window->getPlatformWindow(); PAINTSTRUCT ps; @@ -1256,7 +1257,7 @@ BOOL LLViewerWindow::handlePaint(LLWindow *window, S32 x, S32 y, S32 width, S len = temp_str.length(); TextOutA(hdc, 0, 25, temp_str.c_str(), len); - TextOutA(hdc, 0, 50, "Set \"DisableRendering FALSE\" in settings.ini file to reenable", 61); + TextOutA(hdc, 0, 50, "Set \"HeadlessClient FALSE\" in settings.ini file to reenable", 61); EndPaint(window_handle, &ps); return TRUE; } @@ -1404,9 +1405,9 @@ LLViewerWindow::LLViewerWindow( mWindow = LLWindowManager::createWindow(this, title, name, x, y, width, height, 0, fullscreen, - gNoRender, + gHeadlessClient, gSavedSettings.getBOOL("DisableVerticalSync"), - !gNoRender, + !gHeadlessClient, ignore_pixel_depth, gSavedSettings.getBOOL("RenderUseFBO") ? 0 : gSavedSettings.getU32("RenderFSAASamples")); //don't use window level anti-aliasing if FBOs are enabled @@ -1862,11 +1863,8 @@ void LLViewerWindow::shutdownGL() LLVertexBuffer::cleanupClass(); llinfos << "Stopping GL during shutdown" << llendl; - if (!gNoRender) - { - stopGL(FALSE); - stop_glerror(); - } + stopGL(FALSE); + stop_glerror(); gGL.shutdown(); } @@ -1930,11 +1928,6 @@ void LLViewerWindow::reshape(S32 width, S32 height) // may have been destructed. if (!LLApp::isExiting()) { - if (gNoRender) - { - return; - } - gWindowResized = TRUE; // update our window rectangle @@ -2575,11 +2568,12 @@ void LLViewerWindow::updateUI() S32 x = mCurrentMousePoint.mX; S32 y = mCurrentMousePoint.mY; - MASK mask = gKeyboard->currentMask(TRUE); - if (gNoRender) + MASK mask = MASK_NONE; + // *TODO: Create a headless gKeyboard DK 2011-02-18 + if (gKeyboard) { - return; + mask = gKeyboard->currentMask(TRUE); } if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_RAYCAST)) @@ -3410,11 +3404,6 @@ BOOL LLViewerWindow::clickPointOnSurfaceGlobal(const S32 x, const S32 y, LLViewe void LLViewerWindow::pickAsync(S32 x, S32 y_from_bot, MASK mask, void (*callback)(const LLPickInfo& info), BOOL pick_transparent) { - if (gNoRender) - { - return; - } - BOOL in_build_mode = LLFloaterReg::instanceVisible("build"); if (in_build_mode || LLDrawPoolAlpha::sShowDebugAlpha) { @@ -3450,11 +3439,6 @@ void LLViewerWindow::schedulePick(LLPickInfo& pick_info) void LLViewerWindow::performPick() { - if (gNoRender) - { - return; - } - if (!mPicks.empty()) { std::vector::iterator pick_it; @@ -3486,11 +3470,6 @@ void LLViewerWindow::returnEmptyPicks() // Performs the GL object/land pick. LLPickInfo LLViewerWindow::pickImmediate(S32 x, S32 y_from_bot, BOOL pick_transparent) { - if (gNoRender) - { - return LLPickInfo(); - } - BOOL in_build_mode = LLFloaterReg::instanceVisible("build"); if (in_build_mode || LLDrawPoolAlpha::sShowDebugAlpha) { @@ -3500,7 +3479,13 @@ LLPickInfo LLViewerWindow::pickImmediate(S32 x, S32 y_from_bot, BOOL pick_trans } // shortcut queueing in mPicks and just update mLastPick in place - mLastPick = LLPickInfo(LLCoordGL(x, y_from_bot), gKeyboard->currentMask(TRUE), pick_transparent, TRUE, NULL); + MASK key_mask = MASK_NONE; + // *TODO: Create a headless gKeyboard DK 2011-02-18 + if (gKeyboard) + { + key_mask = gKeyboard->currentMask(TRUE); + } + mLastPick = LLPickInfo(LLCoordGL(x, y_from_bot), key_mask, pick_transparent, TRUE, NULL); mLastPick.fetchResults(); return mLastPick; @@ -4774,12 +4759,9 @@ bool LLViewerWindow::onAlert(const LLSD& notify) { LLNotificationPtr notification = LLNotifications::instance().find(notify["id"].asUUID()); - if (gNoRender) + if (gHeadlessClient) { llinfos << "Alert: " << notification->getName() << llendl; - notification->respond(LLSD::emptyMap()); - LLNotifications::instance().cancel(notification); - return false; } // If we're in mouselook, the mouse is hidden and so the user can't click diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index fd89044995..26b595c923 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -1295,18 +1295,8 @@ void LLVOAvatar::initInstance(void) } - if (gNoRender) - { - return; - } - buildCharacter(); - if (gNoRender) - { - return; - } - // preload specific motions here createMotion( ANIM_AGENT_CUSTOMIZE); createMotion( ANIM_AGENT_CUSTOMIZE_DONE); @@ -1747,12 +1737,6 @@ void LLVOAvatar::buildCharacter() BOOL status = loadAvatar(); stop_glerror(); - if (gNoRender) - { - // Still want to load the avatar skeleton so visual parameters work. - return; - } - // gPrintMessagesThisFrame = TRUE; lldebugs << "Avatar load took " << timer.getElapsedTimeF32() << " seconds." << llendl; @@ -2223,7 +2207,7 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) setPixelAreaAndAngle(gAgent); // force asynchronous drawable update - if(mDrawable.notNull() && !gNoRender) + if(mDrawable.notNull()) { LLFastTimer t(FTM_JOINT_UPDATE); @@ -2280,11 +2264,6 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) LLVector3 root_pos_last = mRoot.getWorldPosition(); BOOL detailed_update = updateCharacter(agent); - if (gNoRender) - { - return TRUE; - } - static LLUICachedControl visualizers_in_calls("ShowVoiceVisualizersInCalls", false); bool voice_enabled = (visualizers_in_calls || LLVoiceClient::getInstance()->inProximalChannel()) && LLVoiceClient::getInstance()->getVoiceEnabled(mID); @@ -3257,17 +3236,6 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) } } - if (gNoRender) - { - // Hack if we're running drones... - if (isSelf()) - { - gAgent.setPositionAgent(getPositionAgent()); - } - return FALSE; - } - - LLVector3d root_pos_global; if (!mIsBuilt) @@ -4194,7 +4162,7 @@ void LLVOAvatar::updateTextures() { BOOL render_avatar = TRUE; - if (mIsDummy || gNoRender) + if (mIsDummy) { return; } @@ -4468,11 +4436,6 @@ void LLVOAvatar::processAnimationStateChanges() { LLMemType mt(LLMemType::MTYPE_AVATAR); - if (gNoRender) - { - return; - } - if ( isAnyAnimationSignaled(AGENT_WALK_ANIMS, NUM_AGENT_WALK_ANIMS) ) { startMotion(ANIM_AGENT_WALK_ADJUST); @@ -4867,7 +4830,7 @@ void LLVOAvatar::getGround(const LLVector3 &in_pos_agent, LLVector3 &out_pos_age LLVector3d z_vec(0.0f, 0.0f, 1.0f); LLVector3d p0_global, p1_global; - if (gNoRender || mIsDummy) + if (mIsDummy) { outNorm.setVec(z_vec); out_pos_agent = in_pos_agent; @@ -5439,11 +5402,6 @@ BOOL LLVOAvatar::loadLayersets() //----------------------------------------------------------------------------- void LLVOAvatar::updateVisualParams() { - if (gNoRender) - { - return; - } - setSex( (getVisualParamWeight( "male" ) > 0.5f) ? SEX_MALE : SEX_FEMALE ); LLCharacter::updateVisualParams(); @@ -6174,8 +6132,6 @@ LLMotion* LLVOAvatar::findMotion(const LLUUID& id) const void LLVOAvatar::updateMeshTextures() { // llinfos << "updateMeshTextures" << llendl; - if (gNoRender) return; - // if user has never specified a texture, assign the default for (U32 i=0; i < getNumTEs(); i++) { @@ -6831,11 +6787,6 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) } } - if (gNoRender) - { - return; - } - ESex old_sex = getSex(); // llinfos << "LLVOAvatar::processAvatarAppearance()" << llendl; diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 5f9e343907..c74b60f7e7 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -2506,10 +2506,6 @@ bool LLVOAvatarSelf::sendAppearanceMessage(LLMessageSystem *mesgsys) const //------------------------------------------------------------------------ BOOL LLVOAvatarSelf::needsRenderBeam() { - if (gNoRender) - { - return FALSE; - } LLTool *tool = LLToolMgr::getInstance()->getCurrentTool(); BOOL is_touching_or_grabbing = (tool == LLToolGrab::getInstance() && LLToolGrab::getInstance()->isEditing()); diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index 399442e5c4..7f3a8deb47 100644 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -98,11 +98,6 @@ LLWorld::LLWorld() : mEdgeWaterObjects[i] = NULL; } - if (gNoRender) - { - return; - } - LLPointer raw = new LLImageRaw(1,1,4); U8 *default_texture = raw->getData(); *(default_texture++) = MAX_WATER_COLOR.mV[0]; @@ -622,10 +617,7 @@ void LLWorld::updateVisibilities() if (LLViewerCamera::getInstance()->sphereInFrustum(regionp->getCenterAgent(), radius)) { regionp->calculateCameraDistance(); - if (!gNoRender) - { - regionp->getLand().updatePatchVisibilities(gAgent); - } + regionp->getLand().updatePatchVisibilities(gAgent); } else { diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 59b526059b..b4ea455318 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -1227,10 +1227,6 @@ void LLPipeline::unlinkDrawable(LLDrawable *drawable) U32 LLPipeline::addObject(LLViewerObject *vobj) { LLMemType mt_ao(LLMemType::MTYPE_PIPELINE_ADD_OBJECT); - if (gNoRender) - { - return 0; - } if (gSavedSettings.getBOOL("RenderDelayCreation")) { -- cgit v1.2.3 From 3f5760b5ee4e422e11f3416133b7a4c3a73b1d8c Mon Sep 17 00:00:00 2001 From: Don Kjer Date: Fri, 18 Feb 2011 23:53:38 +0000 Subject: More cleanup from self-reviewing headless client changes --- indra/llwindow/llwindowheadless.cpp | 1 - indra/newview/llappviewer.cpp | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/indra/llwindow/llwindowheadless.cpp b/indra/llwindow/llwindowheadless.cpp index 2e811ab23f..35398f1c09 100644 --- a/indra/llwindow/llwindowheadless.cpp +++ b/indra/llwindow/llwindowheadless.cpp @@ -28,7 +28,6 @@ #include "indra_constants.h" #include "llwindowheadless.h" -#include "llgl.h" // // LLWindowHeadless diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 25bdaed0c9..0595d6f3c7 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -2640,8 +2640,7 @@ bool LLAppViewer::initWindow() LL_INFOS("AppInit") << "Initializing window..." << LL_ENDL; // store setting in a global for easy access and modification - gHeadlessClient = gSavedSettings.getBOOL("DisableRendering") - || gSavedSettings.getBOOL("HeadlessClient"); + gHeadlessClient = gSavedSettings.getBOOL("HeadlessClient"); // always start windowed BOOL ignorePixelDepth = gSavedSettings.getBOOL("IgnorePixelDepth"); -- cgit v1.2.3 From efc572339df531cc149d0ddb8f58a692cd796055 Mon Sep 17 00:00:00 2001 From: Alain Linden Date: Fri, 18 Feb 2011 16:06:56 -0800 Subject: remove installable mesa for windows; not used. --- autobuild.xml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 4518ef06ec..f0e6ac4287 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1131,18 +1131,6 @@ name linux - windows - - archive - - hash - 178a79f9af90b16f0a62430f9fe88f28 - url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/mesa-7.0-windows-20101001a.tar.bz2 - - name - windows - ndofdev -- cgit v1.2.3 From 96cac7c82fcb189a61d514a244b62970e943e4ad Mon Sep 17 00:00:00 2001 From: Joshua Bell Date: Fri, 18 Feb 2011 17:01:48 -0800 Subject: Fix up path resolution. --- indra/newview/lluilistener.cpp | 80 +++++++++++++++++++++++++++++++++--------- 1 file changed, 63 insertions(+), 17 deletions(-) diff --git a/indra/newview/lluilistener.cpp b/indra/newview/lluilistener.cpp index 22d3b8b219..d02d126cb5 100644 --- a/indra/newview/lluilistener.cpp +++ b/indra/newview/lluilistener.cpp @@ -32,6 +32,7 @@ #include "lluilistener.h" // STL headers // std headers +#include // external library headers // other Linden headers #include "llviewerwindow.h" // to get root view @@ -80,45 +81,90 @@ void LLUIListener::call(const LLSD& event) const } } +// Split string given a single character delimiter. +// Note that this returns empty strings for leading, trailing, and adjacent +// delimiters, such as "/foo/bar//baz/" -> ["", "foo", "bar", "", "baz", "" ] +std::vector split(const std::string& s, char delim) +{ + std::stringstream ss(s); + std::string item; + std::vector items; + while (std::getline(ss, item, delim)) + { + items.push_back(item); + } + return items; +} + +// Walk the LLView tree to resolve a path +// Paths can be discovered using Develop > XUI > Show XUI Paths +// +// A leading "/" indicates the root of the tree is the starting +// position of the search, (otherwise the context node is used) +// +// Adjacent "//" mean that the next level of the search is done +// recursively ("descendant" rather than "child"). +// +// Return values: If no match is found, NULL is returned, +// otherwise the matching LLView* is returned. +// +// Examples: +// +// "/" -> return the root view +// "/foo" -> find "foo" as a direct child of the root +// "foo" -> find "foo" as a direct child of the context node +// "//foo" -> find the first "foo" child anywhere in the tree +// "/foo/bar" -> find "foo" as direct child of the root, and +// "bar" as a direct child of "foo" +// "//foo//bar/baz" -> find the first "foo" anywhere in the +// tree, the first "bar" anywhere under it, and "baz" +// as a direct child of that +// const LLView* resolve_path(const LLView* context, const std::string path) { - std::vector parts; - const std::string delims("/"); - LLStringUtilBase::getTokens(path, parts, delims); + std::vector parts = split(path, '/'); + + if (parts.size() == 0) + { + return context; + } + + std::vector::iterator it = parts.begin(); + + // leading / means "start at root" + if ((*it).length() == 0) + { + context = (LLView*)(gViewerWindow->getRootView()); + it++; + } bool recurse = false; - for (std::vector::iterator it = parts.begin(); - it != parts.end() && context; it++) + for (; it != parts.end() && context; it++) { std::string part = *it; - + if (part.length() == 0) { - // Allow "foo//bar" meaning "descendant named bar" recurse = true; } else { const LLView* found = context->findChildView(part, recurse); if (!found) - { return NULL; - } - else - { - context = found; - } + + context = found; recurse = false; } } - return NULL; + return context; } void LLUIListener::getValue(const LLSD&event) const { - LLSD reply; - + LLSD reply = LLSD::emptyMap(); + const LLView* root = (LLView*)(gViewerWindow->getRootView()); const LLView* view = resolve_path(root, event["path"].asString()); const LLUICtrl* ctrl(dynamic_cast(view)); @@ -132,5 +178,5 @@ void LLUIListener::getValue(const LLSD&event) const // *TODO: ??? return something indicating failure to resolve } - sendReply(reply, event, "reply"); + sendReply(reply, event); } -- cgit v1.2.3 From b5e843abb59ac32cb8cd85dc4b1a43f2bb5c22ee Mon Sep 17 00:00:00 2001 From: Don Kjer Date: Sat, 19 Feb 2011 02:21:51 +0000 Subject: Fix for more instances of dereferencing gKeyboard in headless client. --- indra/newview/llviewerwindow.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 336915ac8c..2d6fabf611 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -2973,7 +2973,13 @@ void LLViewerWindow::updateLayout() } // Update the location of the blue box tool popup LLCoordGL select_center_screen; - gFloaterTools->updatePopup( select_center_screen, gKeyboard->currentMask(TRUE) ); + MASK mask = MASK_NONE; + // *TODO: Create a headless gKeyboard DK 2011-02-18 + if (gKeyboard) + { + mask = gKeyboard->currentMask(TRUE); + } + gFloaterTools->updatePopup( select_center_screen, mask ); } else { @@ -3099,7 +3105,13 @@ void LLViewerWindow::updateKeyboardFocus() // sync all floaters with their focus state gFloaterView->highlightFocusedFloater(); gSnapshotFloaterView->highlightFocusedFloater(); - if ((gKeyboard->currentMask(TRUE) & MASK_CONTROL) == 0) + MASK mask = MASK_NONE; + // *TODO: Create a headless gKeyboard DK 2011-02-18 + if (gKeyboard) + { + mask = gKeyboard->currentMask(TRUE); + } + if ((mask & MASK_CONTROL) == 0) { // control key no longer held down, finish cycle mode gFloaterView->setCycleMode(FALSE); -- cgit v1.2.3 From 7b9d54379f5ede0b046d2263487bb566f1928b23 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Fri, 18 Feb 2011 21:29:25 -0500 Subject: use improved packaging for jsoncpp --- autobuild.xml | 12 ++++++------ indra/cmake/JsonCpp.cmake | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 3cce930f28..dfd3051ed4 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -884,9 +884,9 @@ archive hash - de8b96120c274e052abb4f692861be46 + 22c2ab6ef046c0c1f6cf674297f3e8ef url - http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-jsoncpp/rev/220079/arch/Darwin/installer/jsoncpp-0.5.0-darwin-20110131.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-jsoncpp/rev/221698/arch/Darwin/installer/jsoncpp-0.5.0-darwin-20110218.tar.bz2 name darwin @@ -896,9 +896,9 @@ archive hash - db7826354e60fb4ae14bf40258c088af + 20546118096e4828d9f29913ec7d954a url - http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-jsoncpp/rev/220079/arch/Linux/installer/jsoncpp-0.5.0-linux-20110131.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-jsoncpp/rev/221698/arch/Linux/installer/jsoncpp-0.5.0-linux-20110219.tar.bz2 name linux @@ -908,9 +908,9 @@ archive hash - afff2018e6a887c281b072eecdd9343e + 0959e349c4f7c0b33539269502486737 url - http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-jsoncpp/rev/220579/arch/CYGWIN/installer/jsoncpp-0.5.0-windows-20110208.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-jsoncpp/rev/221698/arch/CYGWIN/installer/jsoncpp-0.5.0-windows-20110218.tar.bz2 name windows diff --git a/indra/cmake/JsonCpp.cmake b/indra/cmake/JsonCpp.cmake index 96488360a4..7c686eff07 100644 --- a/indra/cmake/JsonCpp.cmake +++ b/indra/cmake/JsonCpp.cmake @@ -14,9 +14,9 @@ else (STANDALONE) debug json_vc100debug_libmt.lib optimized json_vc100_libmt) elseif (DARWIN) - set(JSONCPP_LIBRARIES libjson_linux-gcc-4.0.1_libmt.a) + set(JSONCPP_LIBRARIES libjson_darwin_libmt.a) elseif (LINUX) - set(JSONCPP_LIBRARIES libjson_linux-gcc-4.3.2_libmt) + set(JSONCPP_LIBRARIES libjson_linux-gcc-4.1.3_libmt) endif (WINDOWS) set(JSONCPP_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/json) endif (STANDALONE) -- cgit v1.2.3 From c522aedacee8e5ecfbbb1573232af5311f96595a Mon Sep 17 00:00:00 2001 From: brad kittenbrink Date: Fri, 18 Feb 2011 18:31:19 -0800 Subject: Fix for packaging failure. Installer was missing the SecondLife.exe binary due to improperly disabled msvcrt manifest checking. reviewed by jenn. --- indra/newview/viewer_manifest.py | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index c11e5ed429..92b0129611 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -174,9 +174,6 @@ class WindowsManifest(ViewerManifest): return ''.join(self.channel().split()) + '.exe' def test_msvcrt_and_copy_action(self, src, dst): - # Skip this test as of VS2010 - return - # This is used to test a dll manifest. # It is used as a temporary override during the construct method from test_win32_manifest import test_assembly_binding @@ -196,9 +193,6 @@ class WindowsManifest(ViewerManifest): print "Doesn't exist:", src def test_for_no_msvcrt_manifest_and_copy_action(self, src, dst): - # Skip this test as of VS2010 - return - # This is used to test that no manifest for the msvcrt exists. # It is used as a temporary override during the construct method from test_win32_manifest import test_assembly_binding @@ -225,22 +219,25 @@ class WindowsManifest(ViewerManifest): else: print "Doesn't exist:", src - def enable_crt_manifest_check(self): - if self.is_packaging_viewer(): - WindowsManifest.copy_action = WindowsManifest.test_msvcrt_and_copy_action + ### DISABLED MANIFEST CHECKING for vs2010. we may need to reenable this + # shortly. If this hasn't been reenabled by the 2.9 viewer release then it + # should be deleted -brad + #def enable_crt_manifest_check(self): + # if self.is_packaging_viewer(): + # WindowsManifest.copy_action = WindowsManifest.test_msvcrt_and_copy_action - def enable_no_crt_manifest_check(self): - if self.is_packaging_viewer(): - WindowsManifest.copy_action = WindowsManifest.test_for_no_msvcrt_manifest_and_copy_action + #def enable_no_crt_manifest_check(self): + # if self.is_packaging_viewer(): + # WindowsManifest.copy_action = WindowsManifest.test_for_no_msvcrt_manifest_and_copy_action - def disable_manifest_check(self): - if self.is_packaging_viewer(): - del WindowsManifest.copy_action + #def disable_manifest_check(self): + # if self.is_packaging_viewer(): + # del WindowsManifest.copy_action def construct(self): super(WindowsManifest, self).construct() - self.enable_crt_manifest_check() + #self.enable_crt_manifest_check() if self.is_packaging_viewer(): # Find secondlife-bin.exe in the 'configuration' dir, then rename it to the result of final_exe. @@ -251,7 +248,7 @@ class WindowsManifest(ViewerManifest): 'llplugin', 'slplugin', self.args['configuration'], "slplugin.exe"), "slplugin.exe") - self.disable_manifest_check() + #self.disable_manifest_check() self.path(src="../viewer_components/updater/scripts/windows/update_install.bat", dst="update_install.bat") @@ -259,7 +256,7 @@ class WindowsManifest(ViewerManifest): if self.prefix(src=os.path.join(os.pardir, 'sharedlibs', self.args['configuration']), dst=""): - self.enable_crt_manifest_check() + #self.enable_crt_manifest_check() # Get llcommon and deps. If missing assume static linkage and continue. try: @@ -271,7 +268,7 @@ class WindowsManifest(ViewerManifest): print err.message print "Skipping llcommon.dll (assuming llcommon was linked statically)" - self.disable_manifest_check() + #self.disable_manifest_check() # Get fmod dll, continue if missing try: @@ -326,7 +323,7 @@ class WindowsManifest(ViewerManifest): self.path("featuretable.txt") self.path("featuretable_xp.txt") - self.enable_no_crt_manifest_check() + #self.enable_no_crt_manifest_check() # Media plugins - QuickTime if self.prefix(src='../media_plugins/quicktime/%s' % self.args['configuration'], dst="llplugin"): @@ -407,7 +404,7 @@ class WindowsManifest(ViewerManifest): self.end_prefix() - self.disable_manifest_check() + #self.disable_manifest_check() # pull in the crash logger and updater from other projects # tag:"crash-logger" here as a cue to the exporter -- cgit v1.2.3 From 2f6073bdb532c22efd808e064505c6b9d164268f Mon Sep 17 00:00:00 2001 From: brad kittenbrink Date: Fri, 18 Feb 2011 18:32:06 -0800 Subject: Fix for failure to link Release builds due to :Release being an invalid path name on windows. --- indra/newview/CMakeLists.txt | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index abba6f134d..db029f9de7 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1433,19 +1433,13 @@ set(PACKAGE ON CACHE BOOL "Add a package target that builds an installer package.") if (WINDOWS) - if(MSVC71) - set(release_flags "/MAP:Release/${VIEWER_BINARY_NAME}.map /MAPINFO:LINES") - else(MSVC71) - set(release_flags "/MAP:Release/${VIEWER_BINARY_NAME}.map") - endif(MSVC71) - set_target_properties(${VIEWER_BINARY_NAME} PROPERTIES # *TODO -reenable this once we get server usage sorted out #LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:WINDOWS /INCLUDE:\"__tcmalloc\"" LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:WINDOWS" LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\" /INCREMENTAL:NO" - LINK_FLAGS_RELEASE ${release_flags} + LINK_FLAGS_RELEASE "" ) if(USE_PRECOMPILED_HEADERS) set_target_properties( -- cgit v1.2.3 From f0519e8c044bc8301a4b3170869206e3d4fab35c Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Sat, 19 Feb 2011 07:28:34 -0500 Subject: make sure parallel builds are off for my test repos (and clean out some obsolete entries) --- BuildParams | 59 ++--------------------------------------------------------- 1 file changed, 2 insertions(+), 57 deletions(-) diff --git a/BuildParams b/BuildParams index cf837dac70..4e0d639b74 100644 --- a/BuildParams +++ b/BuildParams @@ -56,14 +56,6 @@ viewer-release.build_debug_release_separately = true viewer-release.build_viewer_update_version_manager = true viewer-release.release-viewer.jira = DRTVWR-13 -# ======================================== -# aimee -# ======================================== - -viewer-development-import.build_debug_release_separately = true -viewer-development-fixes.build_debug_release_separately = true -viewer-development-tweaks.build_debug_release_separately = true - # ======================================= # brad # ======================================== @@ -151,55 +143,8 @@ media.build_viewer_update_version_manager = false # oz # ================ -oz_viewer-review1_coverity.coverity_product = viewer - -oz_viewer-review1.build_Linux = true -oz_viewer-review1_debug.build_Linux = false -oz_viewer-review1_coverity.build_Linux = false - -oz_viewer-review1.build_Darwin = true -oz_viewer-review1_debug.build_Darwin = false -oz_viewer-review1_coverity.build_Darwin = false - -oz_viewer-review1.build_CYGWIN = true -oz_viewer-review1.build_CYGWIN_Debug = false -oz_viewer-review1.build_CYGWIN_RelWithDebInfo = false -oz_viewer-review1.build_CYGWIN_Release = true -oz_viewer-review1_debug.build_CYGWIN_Debug = true -oz_viewer-review1_debug.build_CYGWIN_RelWithDebInfo = true -oz_viewer-review1_debug.build_CYGWIN_Release = false -oz_viewer-review1_coverity.build_coverity = true -oz_viewer-review1_coverity.build_CYGWIN_Debug = false -oz_viewer-review1_coverity.build_CYGWIN_RelWithDebInfo = false -oz_viewer-review1_coverity.build_CYGWIN_Release = false - -oz_viewer-review2_coverity.coverity_product = viewer - -oz_viewer-review2.build_Linux = true -oz_viewer-review2_debug.build_Linux = false -oz_viewer-review2_coverity.build_Linux = false - -oz_viewer-review2.build_Darwin = true -oz_viewer-review2_debug.build_Darwin = false -oz_viewer-review2_coverity.build_Darwin = false - -oz_viewer-review2.build_CYGWIN = true -oz_viewer-review2.build_CYGWIN_Debug = false -oz_viewer-review2.build_CYGWIN_RelWithDebInfo = false -oz_viewer-review2.build_CYGWIN_Release = true -oz_viewer-review2_debug.build_CYGWIN_Debug = true -oz_viewer-review2_debug.build_CYGWIN_RelWithDebInfo = true -oz_viewer-review2_debug.build_CYGWIN_Release = false -oz_viewer-review2_coverity.build_coverity = true -oz_viewer-review2_coverity.build_CYGWIN_Debug = false -oz_viewer-review2_coverity.build_CYGWIN_RelWithDebInfo = false -oz_viewer-review2_coverity.build_CYGWIN_Release = false - -# ======================================== -# tofu -# ======================================== - -tofu_viewer-development-staging.email = tofu.linden@lindenlab.com +oz_viewer-autobuild2010.build_link_parallel = false +oz_viewer-vs2010.build_link_parallel = false # ======================================== # enus -- cgit v1.2.3 From ece9940bff81ed148d3fc4ec5b23d02a27429180 Mon Sep 17 00:00:00 2001 From: callum Date: Sat, 19 Feb 2011 09:33:49 -0800 Subject: Pull in FreeType 2.4.4 for Windows (built using AutoBuild) --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 3cce930f28..5456d2aea8 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -522,9 +522,9 @@ archive hash - f7bd61490e6290b1981538b744919afd + 271349827b939406162ce42e42cd18e0 url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.3.9-windows-20101001a.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-freetype/rev/221707/arch/CYGWIN/installer/freetype-2.4.4-windows-20110218.tar.bz2 name windows -- cgit v1.2.3 From d982fbfc061f51329c5f64476d15db7cb234e762 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Mon, 21 Feb 2011 07:19:24 -0500 Subject: change host reverse lookup test to use our own host (linux.org failed) --- indra/llmessage/tests/llhost_test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/llmessage/tests/llhost_test.cpp b/indra/llmessage/tests/llhost_test.cpp index b20bceae1d..705473b0c0 100644 --- a/indra/llmessage/tests/llhost_test.cpp +++ b/indra/llmessage/tests/llhost_test.cpp @@ -152,7 +152,7 @@ namespace tut void host_object::test<9>() { // skip("setHostByName(\"google.com\"); getHostName() -> (e.g.) \"yx-in-f100.1e100.net\""); - std::string hostStr = "linux.org"; + std::string hostStr = "lindenlab.com"; LLHost host; host.setHostByName(hostStr); -- cgit v1.2.3 From 2d268422deb1846da889e38100eae60b42c4d21c Mon Sep 17 00:00:00 2001 From: Nicky Date: Sat, 19 Feb 2011 20:27:38 +0100 Subject: Do not add /include/json as an include director. Instead use /include. Otherwise include/json/features.h will mask /usr/include/features. --- indra/cmake/JsonCpp.cmake | 2 +- indra/newview/lltranslate.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/cmake/JsonCpp.cmake b/indra/cmake/JsonCpp.cmake index 7c686eff07..66c1739ff4 100644 --- a/indra/cmake/JsonCpp.cmake +++ b/indra/cmake/JsonCpp.cmake @@ -18,5 +18,5 @@ else (STANDALONE) elseif (LINUX) set(JSONCPP_LIBRARIES libjson_linux-gcc-4.1.3_libmt) endif (WINDOWS) - set(JSONCPP_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/json) + set(JSONCPP_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include) endif (STANDALONE) diff --git a/indra/newview/lltranslate.cpp b/indra/newview/lltranslate.cpp index 7731a98778..c777e15523 100644 --- a/indra/newview/lltranslate.cpp +++ b/indra/newview/lltranslate.cpp @@ -39,7 +39,7 @@ #include "llversioninfo.h" #include "llviewercontrol.h" -#include "reader.h" +#include "json/reader.h" // These two are concatenated with the language specifiers to form a complete Google Translate URL const char* LLTranslate::m_GoogleURL = "http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q="; -- cgit v1.2.3 From 531de7491b0e73031538dbb9f5dc0dbea8e5f8e2 Mon Sep 17 00:00:00 2001 From: squire Date: Mon, 21 Feb 2011 18:57:54 -0800 Subject: Changes windows build and PNG cmake to reflect latests libpng builds --- autobuild.xml | 4 ++-- indra/cmake/PNG.cmake | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 4518ef06ec..f319f9d852 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1004,9 +1004,9 @@ archive hash - dd0e68bde099def37c6a7527673aa672 + 735a955e6442733e2342ab12c1087488 url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.2.35-windows-20101001a.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-libpng/rev/221747/arch/CYGWIN/installer/libpng-1.5.1-windows-20110221.tar.bz2 name windows diff --git a/indra/cmake/PNG.cmake b/indra/cmake/PNG.cmake index f6522d9e2f..33fc3e5bac 100644 --- a/indra/cmake/PNG.cmake +++ b/indra/cmake/PNG.cmake @@ -8,6 +8,6 @@ if (STANDALONE) include(FindPNG) else (STANDALONE) use_prebuilt_binary(libpng) - set(PNG_LIBRARIES png12) - set(PNG_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/libpng12) + set(PNG_LIBRARIES libpng15) + set(PNG_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/libpng15) endif (STANDALONE) -- cgit v1.2.3 From 0130a0801e001225d41493575b7ea3d8682ce949 Mon Sep 17 00:00:00 2001 From: Alain Linden Date: Tue, 22 Feb 2011 10:49:32 -0800 Subject: update google_breakpad archive usage on windows. --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 3cce930f28..65824b8dd0 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -704,9 +704,9 @@ archive hash - 320972cefe728e668b0dc6356eeda58f + 627c51136e14e64c5d39933f3abd3bdf url - scp:install-packages.lindenlab.com:/local/www/install-packages/doc/google_breakpad-0.0.0-rev599-windows-20110128.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-breakpad/rev/220211/arch/CYGWIN/installer/google_breakpad-0.0.0-rev599-windows-20110218.tar.bz2 name windows -- cgit v1.2.3 From 3e11fad96e57a57a10dd6b7af60c9eeb96add0b1 Mon Sep 17 00:00:00 2001 From: Alain Linden Date: Tue, 22 Feb 2011 13:13:02 -0800 Subject: update vstool to support vs2010. --- indra/llmessage/tests/llhost_test.cpp | 1 + indra/tools/vstool/VSTool.csproj | 5 ++++- indra/tools/vstool/VSTool.exe | Bin 24576 -> 24576 bytes indra/tools/vstool/VSTool.sln | 4 ++-- indra/tools/vstool/main.cs | 10 ++++++++++ 5 files changed, 17 insertions(+), 3 deletions(-) diff --git a/indra/llmessage/tests/llhost_test.cpp b/indra/llmessage/tests/llhost_test.cpp index b20bceae1d..38e4a0b127 100644 --- a/indra/llmessage/tests/llhost_test.cpp +++ b/indra/llmessage/tests/llhost_test.cpp @@ -151,6 +151,7 @@ namespace tut template<> template<> void host_object::test<9>() { + skip("this test is flaky, but we should figure out why..."); // skip("setHostByName(\"google.com\"); getHostName() -> (e.g.) \"yx-in-f100.1e100.net\""); std::string hostStr = "linux.org"; LLHost host; diff --git a/indra/tools/vstool/VSTool.csproj b/indra/tools/vstool/VSTool.csproj index 24f1031f81..7f431e85c7 100644 --- a/indra/tools/vstool/VSTool.csproj +++ b/indra/tools/vstool/VSTool.csproj @@ -1,4 +1,5 @@ - + + Local 8.0.50727 @@ -25,6 +26,8 @@ + v2.0 + 2.0 .\ diff --git a/indra/tools/vstool/VSTool.exe b/indra/tools/vstool/VSTool.exe index 6d1497d5e5..8be428614e 100755 Binary files a/indra/tools/vstool/VSTool.exe and b/indra/tools/vstool/VSTool.exe differ diff --git a/indra/tools/vstool/VSTool.sln b/indra/tools/vstool/VSTool.sln index 8859671802..21e3d75971 100644 --- a/indra/tools/vstool/VSTool.sln +++ b/indra/tools/vstool/VSTool.sln @@ -1,5 +1,5 @@ -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VSTool", "VSTool.csproj", "{96943E2D-1373-4617-A117-D0F997A94919}" EndProject Global diff --git a/indra/tools/vstool/main.cs b/indra/tools/vstool/main.cs index cc268d59d9..cc73261e30 100644 --- a/indra/tools/vstool/main.cs +++ b/indra/tools/vstool/main.cs @@ -550,6 +550,11 @@ namespace VSTool case "10.00": version = "VC90"; break; + + case "11.00": + version = "VC100"; + break; + default: throw new ApplicationException("Unknown .sln version: " + format); } @@ -585,6 +590,11 @@ namespace VSTool case "VC90": progid = "VisualStudio.DTE.9.0"; break; + + case "VC100": + progid = "VisualStudio.DTE.10.0"; + break; + default: throw new ApplicationException("Can't handle VS version: " + version); } -- cgit v1.2.3 From 62feb3b4bcb172f0668aaba9cb27b3387a7c4336 Mon Sep 17 00:00:00 2001 From: Alain Linden Date: Tue, 22 Feb 2011 14:54:28 -0800 Subject: windows uses updated ogg-vorbis archive. --- autobuild.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 84cd28d599..8baa4d70a7 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1186,7 +1186,7 @@ license ogg-vorbis license_file - LICENSES/ogg.txt + LICENSES/ogg-vorbis.txt name ogg-vorbis platforms @@ -1220,9 +1220,9 @@ archive hash - 61f4987290b90416fdba2cd4c4b2ecf3 + c8fccf7eeb25fd45cb7e04399c0b83ee url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg-vorbis-1.1.3-1.2.0-windows-20101001a.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-ogvorbis/rev/221801/arch/CYGWIN/installer/ogg_vorbis-1.1.3-1.2.0-windows-20110222.tar.bz2 name windows -- cgit v1.2.3 From 1362a3e117dadbc5b1de18487314d4af57ce850f Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Tue, 22 Feb 2011 20:13:07 -0500 Subject: Move Josh's resolvePath() function to LLUI. Use boost::split_iterator to split LLView pathname on slashes. --- indra/llui/llui.cpp | 49 +++++++++++++++++++++++ indra/llui/llui.h | 27 +++++++++++++ indra/newview/lluilistener.cpp | 89 ++---------------------------------------- 3 files changed, 80 insertions(+), 85 deletions(-) diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp index c300fe55d9..87669574c2 100644 --- a/indra/llui/llui.cpp +++ b/indra/llui/llui.cpp @@ -61,6 +61,8 @@ // for XUIParse #include "llquaternion.h" #include +#include +#include // // Globals @@ -2020,6 +2022,53 @@ void LLUI::positionViewNearMouse(LLView* view, S32 spawn_x, S32 spawn_y) view->translateIntoRectWithExclusion( virtual_window_rect, mouse_rect, FALSE ); } +LLView* LLUI::resolvePath(LLView* context, const std::string& path) +{ + // Nothing about resolvePath() should require non-const LLView*. If caller + // wants non-const, call the const flavor and then cast away const-ness. + return const_cast(resolvePath(const_cast(context), path)); +} + +const LLView* LLUI::resolvePath(const LLView* context, const std::string& path) +{ + // Create an iterator over slash-separated parts of 'path'. Dereferencing + // this iterator returns an iterator_range over the substring. Unlike + // LLStringUtil::getTokens(), this split_iterator doesn't combine adjacent + // delimiters: leading/trailing slash produces an empty substring, double + // slash produces an empty substring. That's what we need. + boost::split_iterator ti(path, boost::first_finder("/")), tend; + + if (ti == tend) + { + // 'path' is completely empty, no navigation + return context; + } + + // leading / means "start at root" + if (ti->empty()) + { + context = getRootView(); + ++ti; + } + + bool recurse = false; + for (; ti != tend && context; ++ti) + { + if (ti->empty()) + { + recurse = true; + } + else + { + std::string part(ti->begin(), ti->end()); + context = context->findChildView(part, recurse); + recurse = false; + } + } + + return context; +} + // LLLocalClipRect and LLScreenClipRect moved to lllocalcliprect.h/cpp diff --git a/indra/llui/llui.h b/indra/llui/llui.h index 62d10df8b2..50cb9e6632 100644 --- a/indra/llui/llui.h +++ b/indra/llui/llui.h @@ -185,6 +185,33 @@ public: //helper functions (should probably move free standing rendering helper functions here) static LLView* getRootView() { return sRootView; } static void setRootView(LLView* view) { sRootView = view; } + /** + * Walk the LLView tree to resolve a path + * Paths can be discovered using Develop > XUI > Show XUI Paths + * + * A leading "/" indicates the root of the tree is the starting + * position of the search, (otherwise the context node is used) + * + * Adjacent "//" mean that the next level of the search is done + * recursively ("descendant" rather than "child"). + * + * Return values: If no match is found, NULL is returned, + * otherwise the matching LLView* is returned. + * + * Examples: + * + * "/" -> return the root view + * "/foo" -> find "foo" as a direct child of the root + * "foo" -> find "foo" as a direct child of the context node + * "//foo" -> find the first "foo" child anywhere in the tree + * "/foo/bar" -> find "foo" as direct child of the root, and + * "bar" as a direct child of "foo" + * "//foo//bar/baz" -> find the first "foo" anywhere in the + * tree, the first "bar" anywhere under it, and "baz" + * as a direct child of that + */ + static const LLView* resolvePath(const LLView* context, const std::string& path); + static LLView* resolvePath(LLView* context, const std::string& path); static std::string locateSkin(const std::string& filename); static void setMousePositionScreen(S32 x, S32 y); static void getMousePositionScreen(S32 *x, S32 *y); diff --git a/indra/newview/lluilistener.cpp b/indra/newview/lluilistener.cpp index d02d126cb5..6b2cd71d40 100644 --- a/indra/newview/lluilistener.cpp +++ b/indra/newview/lluilistener.cpp @@ -32,10 +32,9 @@ #include "lluilistener.h" // STL headers // std headers -#include // external library headers // other Linden headers -#include "llviewerwindow.h" // to get root view +#include "llui.h" // getRootView(), resolvePath() #include "lluictrl.h" #include "llerror.h" @@ -55,7 +54,7 @@ LLUIListener::LLUIListener(): "For the UI control identified by the path in [\"path\"], return the control's\n" "current value as [\"value\"] reply.", &LLUIListener::getValue, - LLSD().with("path", LLSD())); + LLSDMap("path", LLSD())("reply", LLSD())); } void LLUIListener::call(const LLSD& event) const @@ -81,92 +80,12 @@ void LLUIListener::call(const LLSD& event) const } } -// Split string given a single character delimiter. -// Note that this returns empty strings for leading, trailing, and adjacent -// delimiters, such as "/foo/bar//baz/" -> ["", "foo", "bar", "", "baz", "" ] -std::vector split(const std::string& s, char delim) -{ - std::stringstream ss(s); - std::string item; - std::vector items; - while (std::getline(ss, item, delim)) - { - items.push_back(item); - } - return items; -} - -// Walk the LLView tree to resolve a path -// Paths can be discovered using Develop > XUI > Show XUI Paths -// -// A leading "/" indicates the root of the tree is the starting -// position of the search, (otherwise the context node is used) -// -// Adjacent "//" mean that the next level of the search is done -// recursively ("descendant" rather than "child"). -// -// Return values: If no match is found, NULL is returned, -// otherwise the matching LLView* is returned. -// -// Examples: -// -// "/" -> return the root view -// "/foo" -> find "foo" as a direct child of the root -// "foo" -> find "foo" as a direct child of the context node -// "//foo" -> find the first "foo" child anywhere in the tree -// "/foo/bar" -> find "foo" as direct child of the root, and -// "bar" as a direct child of "foo" -// "//foo//bar/baz" -> find the first "foo" anywhere in the -// tree, the first "bar" anywhere under it, and "baz" -// as a direct child of that -// -const LLView* resolve_path(const LLView* context, const std::string path) -{ - std::vector parts = split(path, '/'); - - if (parts.size() == 0) - { - return context; - } - - std::vector::iterator it = parts.begin(); - - // leading / means "start at root" - if ((*it).length() == 0) - { - context = (LLView*)(gViewerWindow->getRootView()); - it++; - } - - bool recurse = false; - for (; it != parts.end() && context; it++) - { - std::string part = *it; - - if (part.length() == 0) - { - recurse = true; - } - else - { - const LLView* found = context->findChildView(part, recurse); - if (!found) - return NULL; - - context = found; - recurse = false; - } - } - - return context; -} - void LLUIListener::getValue(const LLSD&event) const { LLSD reply = LLSD::emptyMap(); - const LLView* root = (LLView*)(gViewerWindow->getRootView()); - const LLView* view = resolve_path(root, event["path"].asString()); + const LLView* root = LLUI::getRootView(); + const LLView* view = LLUI::resolvePath(root, event["path"].asString()); const LLUICtrl* ctrl(dynamic_cast(view)); if (ctrl) -- cgit v1.2.3 From 28ef58285e95e3234d0faa5f230456ae47ecde13 Mon Sep 17 00:00:00 2001 From: Don Kjer Date: Wed, 23 Feb 2011 02:10:54 +0000 Subject: Comment fix from code review with brad --- indra/newview/llstartup.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 34a79bcde3..49d4983294 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -670,7 +670,7 @@ bool idle_startup() { gUserCredential = gLoginHandler.initializeLoginInfo(); } - // Previous initialzeLoginInfo may have generated user credentials. Re-check them. + // Previous initializeLoginInfo may have generated user credentials. Re-check them. if (gUserCredential.isNull()) { show_connect_box = TRUE; -- cgit v1.2.3 From 0929315ab103433275a71f26a4900ee0615932e9 Mon Sep 17 00:00:00 2001 From: Don Kjer Date: Wed, 23 Feb 2011 05:40:08 +0000 Subject: Added headless client keyboard --- indra/llwindow/CMakeLists.txt | 2 ++ indra/llwindow/llkeyboardheadless.cpp | 50 +++++++++++++++++++++++++++++++++++ indra/llwindow/llkeyboardheadless.h | 45 +++++++++++++++++++++++++++++++ indra/llwindow/llwindowheadless.cpp | 4 +++ indra/newview/llviewermessage.cpp | 7 +---- indra/newview/llviewerwindow.cpp | 28 +++----------------- 6 files changed, 106 insertions(+), 30 deletions(-) create mode 100644 indra/llwindow/llkeyboardheadless.cpp create mode 100644 indra/llwindow/llkeyboardheadless.h diff --git a/indra/llwindow/CMakeLists.txt b/indra/llwindow/CMakeLists.txt index 00aaba2052..08ebaf7577 100644 --- a/indra/llwindow/CMakeLists.txt +++ b/indra/llwindow/CMakeLists.txt @@ -34,6 +34,7 @@ include_directories( set(llwindow_SOURCE_FILES llkeyboard.cpp + llkeyboardheadless.cpp llwindowheadless.cpp llwindowcallbacks.cpp llwindowlistener.cpp @@ -43,6 +44,7 @@ set(llwindow_HEADER_FILES CMakeLists.txt llkeyboard.h + llkeyboardheadless.h llwindowheadless.h llwindowcallbacks.h llwindowlistener.h diff --git a/indra/llwindow/llkeyboardheadless.cpp b/indra/llwindow/llkeyboardheadless.cpp new file mode 100644 index 0000000000..4dfaaed4e1 --- /dev/null +++ b/indra/llwindow/llkeyboardheadless.cpp @@ -0,0 +1,50 @@ +/** + * @file llkeyboardheadless.cpp + * @brief Handler for assignable key bindings + * + * $LicenseInfo:firstyear=2001&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "linden_common.h" +#include "llkeyboardheadless.h" +#include "llwindowcallbacks.h" + +LLKeyboardHeadless::LLKeyboardHeadless() +{ } + +void LLKeyboardHeadless::resetMaskKeys() +{ } + + +BOOL LLKeyboardHeadless::handleKeyDown(const U16 key, const U32 mask) +{ return FALSE; } + + +BOOL LLKeyboardHeadless::handleKeyUp(const U16 key, const U32 mask) +{ return FALSE; } + +MASK LLKeyboardHeadless::currentMask(BOOL for_mouse_event) +{ return MASK_NONE; } + +void LLKeyboardHeadless::scanKeyboard() +{ } + diff --git a/indra/llwindow/llkeyboardheadless.h b/indra/llwindow/llkeyboardheadless.h new file mode 100644 index 0000000000..4e666f8ce8 --- /dev/null +++ b/indra/llwindow/llkeyboardheadless.h @@ -0,0 +1,45 @@ +/** + * @file llkeyboardheadless.h + * @brief Handler for assignable key bindings + * + * $LicenseInfo:firstyear=2004&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#ifndef LL_LLKEYBOARDHEADLESS_H +#define LL_LLKEYBOARDHEADLESS_H + +#include "llkeyboard.h" + +class LLKeyboardHeadless : public LLKeyboard +{ +public: + LLKeyboardHeadless(); + /*virtual*/ ~LLKeyboardHeadless() {}; + + /*virtual*/ BOOL handleKeyUp(const U16 key, MASK mask); + /*virtual*/ BOOL handleKeyDown(const U16 key, MASK mask); + /*virtual*/ void resetMaskKeys(); + /*virtual*/ MASK currentMask(BOOL for_mouse_event); + /*virtual*/ void scanKeyboard(); +}; + +#endif diff --git a/indra/llwindow/llwindowheadless.cpp b/indra/llwindow/llwindowheadless.cpp index 35398f1c09..e6e6bc67ff 100644 --- a/indra/llwindow/llwindowheadless.cpp +++ b/indra/llwindow/llwindowheadless.cpp @@ -28,6 +28,7 @@ #include "indra_constants.h" #include "llwindowheadless.h" +#include "llkeyboardheadless.h" // // LLWindowHeadless @@ -37,6 +38,9 @@ LLWindowHeadless::LLWindowHeadless(LLWindowCallbacks* callbacks, const std::stri BOOL disable_vsync, BOOL use_gl, BOOL ignore_pixel_depth) : LLWindow(callbacks, fullscreen, flags) { + // Initialize a headless keyboard. + gKeyboard = new LLKeyboardHeadless(); + gKeyboard->setCallbacks(callbacks); } diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 852911ceb7..3097e98509 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -3935,12 +3935,7 @@ void send_agent_update(BOOL force_send, BOOL send_reliable) // trigger a control event. U32 control_flags = gAgent.getControlFlags(); - MASK key_mask = MASK_NONE; - // *TODO: Create a headless gKeyboard DK 2011-02-18 - if (gKeyboard) - { - key_mask = gKeyboard->currentMask(TRUE); - } + MASK key_mask = gKeyboard->currentMask(TRUE); if (key_mask & MASK_ALT || key_mask & MASK_CONTROL) { diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 21e3626bf8..a5218786d8 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -2577,12 +2577,7 @@ void LLViewerWindow::updateUI() S32 x = mCurrentMousePoint.mX; S32 y = mCurrentMousePoint.mY; - MASK mask = MASK_NONE; - // *TODO: Create a headless gKeyboard DK 2011-02-18 - if (gKeyboard) - { - mask = gKeyboard->currentMask(TRUE); - } + MASK mask = gKeyboard->currentMask(TRUE); if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_RAYCAST)) { @@ -2973,12 +2968,7 @@ void LLViewerWindow::updateLayout() } // Update the location of the blue box tool popup LLCoordGL select_center_screen; - MASK mask = MASK_NONE; - // *TODO: Create a headless gKeyboard DK 2011-02-18 - if (gKeyboard) - { - mask = gKeyboard->currentMask(TRUE); - } + MASK mask = gKeyboard->currentMask(TRUE); gFloaterTools->updatePopup( select_center_screen, mask ); } else @@ -3105,12 +3095,7 @@ void LLViewerWindow::updateKeyboardFocus() // sync all floaters with their focus state gFloaterView->highlightFocusedFloater(); gSnapshotFloaterView->highlightFocusedFloater(); - MASK mask = MASK_NONE; - // *TODO: Create a headless gKeyboard DK 2011-02-18 - if (gKeyboard) - { - mask = gKeyboard->currentMask(TRUE); - } + MASK mask = gKeyboard->currentMask(TRUE); if ((mask & MASK_CONTROL) == 0) { // control key no longer held down, finish cycle mode @@ -3499,12 +3484,7 @@ LLPickInfo LLViewerWindow::pickImmediate(S32 x, S32 y_from_bot, BOOL pick_trans } // shortcut queueing in mPicks and just update mLastPick in place - MASK key_mask = MASK_NONE; - // *TODO: Create a headless gKeyboard DK 2011-02-18 - if (gKeyboard) - { - key_mask = gKeyboard->currentMask(TRUE); - } + MASK key_mask = gKeyboard->currentMask(TRUE); mLastPick = LLPickInfo(LLCoordGL(x, y_from_bot), key_mask, pick_transparent, TRUE, NULL); mLastPick.fetchResults(); -- cgit v1.2.3 From f939b95d0c7b257a67bfc605d0cd590b3f442df8 Mon Sep 17 00:00:00 2001 From: Alain Linden Date: Wed, 23 Feb 2011 15:50:03 -0800 Subject: update windows to use new libndofdev and google-mock archives. --- autobuild.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 8baa4d70a7..c030ee1117 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -718,7 +718,7 @@ license bsd license_file - LICENSES/googlemock.txt + LICENSES/gmock.txt name googlemock platforms @@ -752,9 +752,9 @@ archive hash - ec7f12a339ad8c5628db8f8f8fbfe77f + 5aaee3bbdff61e6e3cd03c7e726aab48 url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/googlemock-1.1.0-windows-20101001a.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-mock/rev/221925/arch/CYGWIN/installer/gmock-1.5.0-windows-20110223.tar.bz2 name windows @@ -1138,7 +1138,7 @@ license linden license_file - LICENSES/ndofdev.txt + LICENSES/libndofdev.txt name ndofdev platforms @@ -1172,9 +1172,9 @@ archive hash - 9d4f6c042c27fdab81e00238af7e55f0 + 3a4bec9562ed6ac53e85abcb1afc5fc0 url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ndofdev-windows-20101001a.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-libndofdev/rev/221922/arch/CYGWIN/installer/libndofdev-0.1-windows-20110223.tar.bz2 name windows -- cgit v1.2.3 From b1c1e9fb4dfdce2f612736b9edcbad0420f48233 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Wed, 23 Feb 2011 20:46:31 -0500 Subject: Added tag dons-headless-hackathon-work for changeset 3178e311da3a --- .hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/.hgtags b/.hgtags index 2b143b0013..d78dce8f6e 100644 --- a/.hgtags +++ b/.hgtags @@ -71,3 +71,4 @@ b723921b5c711bd24dbe77dc76ef488b544dac78 DRTVWR-34_2.5.0-beta3 b723921b5c711bd24dbe77dc76ef488b544dac78 2.5.0-release b723921b5c711bd24dbe77dc76ef488b544dac78 DRTVWR-31_2.5.0-release 92e58e51776a4f8c29069b1a62ff21454d2085f0 2.6.0-start +3178e311da3a8739a85363665006ea3c4610cad4 dons-headless-hackathon-work -- cgit v1.2.3 From a0ebf8d95ba7d81b749d818d0c7edf0769493f49 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Thu, 24 Feb 2011 14:24:01 -0500 Subject: use our own domain for llhost_test; linux.org changed dns and broke it --- indra/llmessage/tests/llhost_test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/llmessage/tests/llhost_test.cpp b/indra/llmessage/tests/llhost_test.cpp index b20bceae1d..705473b0c0 100644 --- a/indra/llmessage/tests/llhost_test.cpp +++ b/indra/llmessage/tests/llhost_test.cpp @@ -152,7 +152,7 @@ namespace tut void host_object::test<9>() { // skip("setHostByName(\"google.com\"); getHostName() -> (e.g.) \"yx-in-f100.1e100.net\""); - std::string hostStr = "linux.org"; + std::string hostStr = "lindenlab.com"; LLHost host; host.setHostByName(hostStr); -- cgit v1.2.3 From 1db3f3b5cede4971049a91f5cb99f76fd0952b54 Mon Sep 17 00:00:00 2001 From: Alain Linden Date: Thu, 24 Feb 2011 12:27:58 -0800 Subject: integrate xmlrpc-epi into windows build. --- autobuild.xml | 6 +++--- indra/cmake/XmlRpcEpi.cmake | 5 ++++- indra/newview/CMakeLists.txt | 2 ++ 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index c030ee1117..9b670e5875 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1478,7 +1478,7 @@ license xmlrpc-epi license_file - LICENSES/xmlrpc.txt + LICENSES/xmlrpc-epi.txt name xmlrpc-epi platforms @@ -1512,9 +1512,9 @@ archive hash - ea06e2f1c1ed59a2d2b6cdb6f459d1c0 + 5181d1a8f2516928ac064d72acf164a4 url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/xmlrpc-epi-0.51-windows-20101001a.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-xmlrpc-epi/rev/222021/arch/CYGWIN/installer/xmlrpc_epi-0.54.1-windows-20110224.tar.bz2 name windows diff --git a/indra/cmake/XmlRpcEpi.cmake b/indra/cmake/XmlRpcEpi.cmake index 107d1926ba..5bd4848245 100644 --- a/indra/cmake/XmlRpcEpi.cmake +++ b/indra/cmake/XmlRpcEpi.cmake @@ -9,7 +9,10 @@ if (STANDALONE) else (STANDALONE) use_prebuilt_binary(xmlrpc-epi) if (WINDOWS) - set(XMLRPCEPI_LIBRARIES xmlrpcepi) + set(XMLRPCEPI_LIBRARIES + debug xmlrpc-epid + optimized xmlrpc-epi + ) else (WINDOWS) set(XMLRPCEPI_LIBRARIES xmlrpc-epi) endif (WINDOWS) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index db029f9de7..1f07af0608 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -10,6 +10,7 @@ include(DirectX) include(OpenSSL) include(DragDrop) include(ELFIO) +include(EXPAT) include(FMOD) include(OPENAL) include(FindOpenGL) @@ -1681,6 +1682,7 @@ target_link_libraries(${VIEWER_BINARY_NAME} ${SMARTHEAP_LIBRARY} ${UI_LIBRARIES} ${WINDOWS_LIBRARIES} + ${EXPAT_LIBRARIES} ${XMLRPCEPI_LIBRARIES} ${ELFIO_LIBRARIES} ${OPENSSL_LIBRARIES} -- cgit v1.2.3 From d8944cfef3479d1530bd6ec3ad11c0bc46745000 Mon Sep 17 00:00:00 2001 From: Merov Linden Date: Thu, 24 Feb 2011 14:07:03 -0800 Subject: Windows uses updated fmod archive and vs2010 compiled kdu archive. --- autobuild.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 9b670e5875..59bfd8704d 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -426,9 +426,9 @@ archive hash - b9fa0ef683657090ae66663863ebba74 + d9a9a6ad86895353bcd63374a4c1a91d url - http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/merov_fmod-autobuild/rev/219050/arch/CYGWIN/installer/fmod-3.75-windows-20110113.tar.bz2 + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-fmod-private/rev/221852/arch/CYGWIN/installer/fmod-3.75-windows-20110222.tar.bz2 name windows @@ -956,9 +956,9 @@ archive hash - 0c7b5596c27f511d4957abe35f7f8dee + 6cd9f36465ef73a3df34bf2b3bba2ced url - scp:install-packages.lindenlab.com:/local/www/install-packages/doc/kdu-6.4.1-windows-20110113.tar.bz2 + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-kdu-private/rev/221672/arch/CYGWIN/installer/kdu-6.4.1-windows-20110218.tar.bz2 name windows -- cgit v1.2.3 From 2c27d432288c4c678ddee0c839576e759d6b3195 Mon Sep 17 00:00:00 2001 From: Alain Linden Date: Thu, 24 Feb 2011 15:43:50 -0800 Subject: update to fixed debug google-mock archive. --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 59bfd8704d..d407f565d9 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -752,9 +752,9 @@ archive hash - 5aaee3bbdff61e6e3cd03c7e726aab48 + 212701468920519f3989677cea9ca4f1 url - http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-mock/rev/221925/arch/CYGWIN/installer/gmock-1.5.0-windows-20110223.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-mock/rev/222036/arch/CYGWIN/installer/gmock-1.5.0-windows-20110224.tar.bz2 name windows -- cgit v1.2.3 From b1787a19d37b831de5465c0b0f3b7abd42d99afb Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Thu, 24 Feb 2011 21:40:18 -0500 Subject: change to canonical build of the pth lib --- autobuild.xml | 110 ++++++++++++++++++++++++++++------------------------------ 1 file changed, 53 insertions(+), 57 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index ec332a81bb..4589ad3076 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1380,9 +1380,9 @@ archive hash - d47d121c8eaed4ac6d8253ceda23b5c9 + 320820c5a886f8daf366ba5fcd264b34 url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/pth-2.0.7-darwin-20101004.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-pth/rev/222035/arch/Darwin/installer/pth-2.0.7-darwin-20110224.tar.bz2 name darwin @@ -1658,29 +1658,6 @@ name OpenSourceRelWithDebInfo - - VCexpressRelWithDebInfo - - configure - - arguments - - ../indra - - command - cmake - options - - -DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo - -DUNATTENDED:BOOL=OFF - -DWORD_SIZE:STRING=32 - -DROOT_PROJECT_NAME:STRING=SecondLife - - - name - VCexpressRelWithDebInfo - - OpenSourceRelease configure @@ -1813,6 +1790,27 @@ name Release + VCexpressRelWithDebInfo + + configure + + arguments + + ../indra + + command + cmake + options + + -DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo + -DUNATTENDED:BOOL=OFF + -DWORD_SIZE:STRING=32 + -DROOT_PROJECT_NAME:STRING=SecondLife + + + name + VCexpressRelWithDebInfo + name common @@ -2425,38 +2423,6 @@ name OpenSourceRelWithDebInfo - - VCexpressRelWithDebInfo - - build - - arguments - - "RelWithDebInfo|Win32" - - command - vcbuild.exe - options - - /u - SecondLife.sln - - - configure - - options - - -G - "Visual Studio 8 2005" - -DSTANDALONE:BOOL=FALSE - -DINSTALL_PROPRIETARY=FALSE - -DFMOD=FALSE - - - name - VCexpressRelWithDebInfo - - OpenSourceRelease build @@ -2639,6 +2605,36 @@ name Release + VCexpressRelWithDebInfo + + build + + arguments + + "RelWithDebInfo|Win32" + + command + vcbuild.exe + options + + /u + SecondLife.sln + + + configure + + options + + -G + "Visual Studio 8 2005" + -DSTANDALONE:BOOL=FALSE + -DINSTALL_PROPRIETARY=FALSE + -DFMOD=FALSE + + + name + VCexpressRelWithDebInfo + name windows -- cgit v1.2.3 From eb3de8543e5580cb353230577f9f6606e71002f2 Mon Sep 17 00:00:00 2001 From: Merov Linden Date: Thu, 24 Feb 2011 20:57:34 -0800 Subject: STORM-1023 (was OPEN-4) and STORM-1022 (was OPEN-24) : fmod and kdu changes : cmake changes making possible to use Findxxx when INSTALL_PROPRIETARY is OFF and STANDALONE is OFF too, simplify cmake scripts around INSTALL_PROPRIETARY, add fmodex to FindFMOD --- indra/cmake/FMOD.cmake | 25 +++++++++++++++---------- indra/cmake/FindFMOD.cmake | 2 +- indra/cmake/LLKDU.cmake | 11 ++++++----- indra/cmake/Prebuilt.cmake | 45 ++++++++++++++------------------------------- 4 files changed, 36 insertions(+), 47 deletions(-) diff --git a/indra/cmake/FMOD.cmake b/indra/cmake/FMOD.cmake index dcf44cd642..6a4322df9b 100644 --- a/indra/cmake/FMOD.cmake +++ b/indra/cmake/FMOD.cmake @@ -1,17 +1,23 @@ # -*- cmake -*- -set(FMOD ON CACHE BOOL "Use FMOD sound library.") +# FMOD can be set when launching the make using the argument -DFMOD:BOOL=ON +# When building using proprietary binaries though (i.e. having access to LL private servers), +# we always build with FMOD. +# Open source devs should use the -DFMOD:BOOL=ON then if they want to build with FMOD, whether +# they are using STANDALONE or not. +if (INSTALL_PROPRIETARY) + set(FMOD ON CACHE BOOL "Use FMOD sound library.") +endif (INSTALL_PROPRIETARY) if (FMOD) - if (STANDALONE) + if (NOT INSTALL_PROPRIETARY) + # This cover the STANDALONE case and the NOT STANDALONE but not using proprietary libraries + # This should then be invoke by all open source devs outside LL set(FMOD_FIND_REQUIRED ON) include(FindFMOD) - else (STANDALONE) - if (INSTALL_PROPRIETARY) - include(Prebuilt) - use_prebuilt_binary(fmod) - endif (INSTALL_PROPRIETARY) - + else (NOT INSTALL_PROPRIETARY) + include(Prebuilt) + use_prebuilt_binary(fmod) if (WINDOWS) set(FMOD_LIBRARY fmod) elseif (DARWIN) @@ -19,8 +25,7 @@ if (FMOD) elseif (LINUX) set(FMOD_LIBRARY fmod-3.75) endif (WINDOWS) - SET(FMOD_LIBRARIES ${FMOD_LIBRARY}) set(FMOD_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include) - endif (STANDALONE) + endif (NOT INSTALL_PROPRIETARY) endif (FMOD) diff --git a/indra/cmake/FindFMOD.cmake b/indra/cmake/FindFMOD.cmake index e60b386027..1ebbc8c96e 100644 --- a/indra/cmake/FindFMOD.cmake +++ b/indra/cmake/FindFMOD.cmake @@ -11,7 +11,7 @@ FIND_PATH(FMOD_INCLUDE_DIR fmod.h PATH_SUFFIXES fmod) -SET(FMOD_NAMES ${FMOD_NAMES} fmod fmodvc fmod-3.75) +SET(FMOD_NAMES ${FMOD_NAMES} fmod fmodvc fmodex fmod-3.75) FIND_LIBRARY(FMOD_LIBRARY NAMES ${FMOD_NAMES} PATH_SUFFIXES fmod diff --git a/indra/cmake/LLKDU.cmake b/indra/cmake/LLKDU.cmake index 13c2b86e2f..e478b01f84 100644 --- a/indra/cmake/LLKDU.cmake +++ b/indra/cmake/LLKDU.cmake @@ -1,13 +1,14 @@ # -*- cmake -*- -include(Prebuilt) # USE_KDU can be set when launching cmake as an option using the argument -DUSE_KDU:BOOL=ON -# When building using proprietary binaries though (i.e. having access to LL private servers), we always build with KDU -if (INSTALL_PROPRIETARY AND NOT STANDALONE) - set(USE_KDU ON) -endif (INSTALL_PROPRIETARY AND NOT STANDALONE) +# When building using proprietary binaries though (i.e. having access to LL private servers), +# we always build with KDU +if (INSTALL_PROPRIETARY) + set(USE_KDU ON CACHE BOOL "Use Kakadu library.") +endif (INSTALL_PROPRIETARY) if (USE_KDU) + include(Prebuilt) use_prebuilt_binary(kdu) if (WINDOWS) set(KDU_LIBRARY kdu.lib) diff --git a/indra/cmake/Prebuilt.cmake b/indra/cmake/Prebuilt.cmake index 9b758b03f0..1b60d176f1 100644 --- a/indra/cmake/Prebuilt.cmake +++ b/indra/cmake/Prebuilt.cmake @@ -11,38 +11,21 @@ macro (use_prebuilt_binary _binary) if(${CMAKE_BINARY_DIR}/temp/sentinel_installed IS_NEWER_THAN ${CMAKE_BINARY_DIR}/temp/${_binary}_installed) if(INSTALL_PROPRIETARY) include(FindSCP) - if(DEBUG_PREBUILT) - message("cd ${CMAKE_SOURCE_DIR} && ${AUTOBUILD_EXECUTABLE} install - --install-dir=${AUTOBUILD_INSTALL_DIR} - #--scp="${SCP_EXECUTABLE}" - --skip-license-check - ${_binary} ") - endif(DEBUG_PREBUILT) - execute_process(COMMAND "${AUTOBUILD_EXECUTABLE}" - install - --install-dir=${AUTOBUILD_INSTALL_DIR} - #--scp="${SCP_EXECUTABLE}" - --skip-license-check - ${_binary} - WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" - RESULT_VARIABLE ${_binary}_installed - ) - else(INSTALL_PROPRIETARY) - if(DEBUG_PREBUILT) - message("cd ${CMAKE_SOURCE_DIR} && ${AUTOBUILD_EXECUTABLE} install - --install-dir=${AUTOBUILD_INSTALL_DIR} - --skip-license-check - ${_binary} ") - endif(DEBUG_PREBUILT) - execute_process(COMMAND "${AUTOBUILD_EXECUTABLE}" - install - --install-dir=${AUTOBUILD_INSTALL_DIR} - --skip-license-check - ${_binary} - WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" - RESULT_VARIABLE ${_binary}_installed - ) endif(INSTALL_PROPRIETARY) + if(DEBUG_PREBUILT) + message("cd ${CMAKE_SOURCE_DIR} && ${AUTOBUILD_EXECUTABLE} install + --install-dir=${AUTOBUILD_INSTALL_DIR} + --skip-license-check + ${_binary} ") + endif(DEBUG_PREBUILT) + execute_process(COMMAND "${AUTOBUILD_EXECUTABLE}" + install + --install-dir=${AUTOBUILD_INSTALL_DIR} + --skip-license-check + ${_binary} + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + RESULT_VARIABLE ${_binary}_installed + ) file(WRITE ${CMAKE_BINARY_DIR}/temp/${_binary}_installed "${${_binary}_installed}") else(${CMAKE_BINARY_DIR}/temp/sentinel_installed IS_NEWER_THAN ${CMAKE_BINARY_DIR}/temp/${_binary}_installed) set(${_binary}_installed 0) -- cgit v1.2.3 From 7f00a037ee61de0573f00b33ab637794387b2b64 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Fri, 25 Feb 2011 12:36:17 -0500 Subject: update to TeamCity build from https://bitbucket.org/lindenlab/3p-elfio --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 4589ad3076..b575eeeb6c 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -330,9 +330,9 @@ archive hash - d931e16a382aa3a5c99a8dea6b5f8391 + 031e6315a5c0829c9b9a2ec18aeb7ae3 url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/elfio-1.0.3-linux-20101013.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-elfio/rev/222074/arch/Linux/installer/elfio-1.0.3-linux-20110225.tar.bz2 name linux -- cgit v1.2.3 From d9a47b33954010bbb1d52491940004368363641b Mon Sep 17 00:00:00 2001 From: Jennifer Leech Date: Fri, 25 Feb 2011 14:48:13 -0800 Subject: s/build-vc80/build-vc100/ --- build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sh b/build.sh index eb34665eae..f0bdc5d78d 100755 --- a/build.sh +++ b/build.sh @@ -27,7 +27,7 @@ build_dir_Linux() build_dir_CYGWIN() { - echo build-vc80 + echo build-vc100 } installer_Darwin() -- cgit v1.2.3 From a7e2f1eafd303dad844c36ec77bb6a98fd6ee38c Mon Sep 17 00:00:00 2001 From: Jennifer Leech Date: Mon, 28 Feb 2011 23:47:48 -0800 Subject: Take out symbol generation for slplugin.exe since this step currently fails, need to debug, but don't want it to be a blocker. This is expected to get TeamCity runs passing on Windows. --- indra/newview/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 1f07af0608..55de2c8d20 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1841,7 +1841,9 @@ if (PACKAGE) if (WINDOWS) set(VIEWER_DIST_DIR "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}") set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-windows.tar.bz2") - set(VIEWER_EXE_GLOBS "${VIEWER_BINARY_NAME}${CMAKE_EXECUTABLE_SUFFIX} slplugin.exe") + # slplugin.exe failing symbols dump - need to debug, might have to do with updated version of google breakpad + # set(VIEWER_EXE_GLOBS "${VIEWER_BINARY_NAME}${CMAKE_EXECUTABLE_SUFFIX} slplugin.exe") + set(VIEWER_EXE_GLOBS "${VIEWER_BINARY_NAME}${CMAKE_EXECUTABLE_SUFFIX}") set(VIEWER_LIB_GLOB "*${CMAKE_SHARED_MODULE_SUFFIX}") set(VIEWER_COPY_MANIFEST copy_w_viewer_manifest) endif (WINDOWS) -- cgit v1.2.3 From a14c5e8f31ede83b0d72aec2ed363ae55b866b09 Mon Sep 17 00:00:00 2001 From: Jennifer Leech Date: Tue, 1 Mar 2011 11:30:47 -0800 Subject: Added 'env|sort' to build.sh for debugging TC builds. --- build.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build.sh b/build.sh index f0bdc5d78d..b75823f45f 100755 --- a/build.sh +++ b/build.sh @@ -141,6 +141,10 @@ fi # load autbuild provided shell functions and variables eval "$("$AUTOBUILD" source_environment)" +# dump environment variables for debugging +env|sort + + # Install packages. "$AUTOBUILD" install --skip-license-check -- cgit v1.2.3 From c5aaefe37f9d7e894076dae26245a3d87f74d0ff Mon Sep 17 00:00:00 2001 From: "Andrew A. de Laix" Date: Tue, 1 Mar 2011 13:13:05 -0800 Subject: fix some mac build problems with library name changes with new packaages. --- indra/cmake/CARes.cmake | 5 +---- indra/cmake/JPEG.cmake | 5 +---- indra/cmake/PNG.cmake | 9 +++++++-- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/indra/cmake/CARes.cmake b/indra/cmake/CARes.cmake index 1850b706ac..b0dac5b12f 100644 --- a/indra/cmake/CARes.cmake +++ b/indra/cmake/CARes.cmake @@ -13,10 +13,7 @@ else (STANDALONE) if (WINDOWS) set(CARES_LIBRARIES areslib) elseif (DARWIN) - set(CARES_LIBRARIES - optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libcares.a - debug ${ARCH_PREBUILT_DIRS_DEBUG}/libcares.a - ) + set(CARES_LIBRARIES cares) else (WINDOWS) set(CARES_LIBRARIES cares) endif (WINDOWS) diff --git a/indra/cmake/JPEG.cmake b/indra/cmake/JPEG.cmake index 9514d59f64..0f0bbb9564 100644 --- a/indra/cmake/JPEG.cmake +++ b/indra/cmake/JPEG.cmake @@ -12,10 +12,7 @@ else (STANDALONE) if (LINUX) set(JPEG_LIBRARIES jpeg) elseif (DARWIN) - set(JPEG_LIBRARIES - optimized ${ARCH_PREBUILT_DIRS_RELEASE}/liblljpeg.a - debug ${ARCH_PREBUILT_DIRS_DEBUG}/liblljpeg.a - ) + set(JPEG_LIBRARIES lljpeg) elseif (WINDOWS) set(JPEG_LIBRARIES jpeglib) endif (LINUX) diff --git a/indra/cmake/PNG.cmake b/indra/cmake/PNG.cmake index 33fc3e5bac..86b7267494 100644 --- a/indra/cmake/PNG.cmake +++ b/indra/cmake/PNG.cmake @@ -8,6 +8,11 @@ if (STANDALONE) include(FindPNG) else (STANDALONE) use_prebuilt_binary(libpng) - set(PNG_LIBRARIES libpng15) - set(PNG_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/libpng15) + if (WINDOWS) + set(PNG_LIBRARIES libpng15) + set(PNG_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/libpng15) + else() + set(PNG_LIBRARIES png12) + set(PNG_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/libpng12) + endif() endif (STANDALONE) -- cgit v1.2.3 From 6a10c803d3b7d16c25d085f19fafd404b95eb485 Mon Sep 17 00:00:00 2001 From: Jennifer Leech Date: Tue, 1 Mar 2011 14:26:24 -0800 Subject: Setting TMP env var to be used during builds. Possible collision when using VS2010 with system-wide TMP directory. Also temporarily disabling Debug and Release builds to get a faster loop cyle on TC. --- BuildParams | 8 ++++++++ build.sh | 2 ++ 2 files changed, 10 insertions(+) diff --git a/BuildParams b/BuildParams index cf837dac70..3f2d74421a 100644 --- a/BuildParams +++ b/BuildParams @@ -238,4 +238,12 @@ viewer-asset-delivery-metrics.build_server_tests = false #============================================================================== viewer-autobuild.build_link_parallel = false viewer-vs2010.build_link_parallel = false + + +#============================================================================== +# vs2010 debug - for TC debugging only +#============================================================================== +viewer-vs2010.build_CYGWIN_Debug = false +viewer-vs2010.build_CYGWIN_Release = false + # eof diff --git a/build.sh b/build.sh index b75823f45f..645c6d05ac 100755 --- a/build.sh +++ b/build.sh @@ -165,6 +165,8 @@ do build_dir_stubs="$build_dir/win_setup/$variant" rm -rf "$build_dir" mkdir -p "$build_dir" + mkdir -p "$build_dir/tmp" + export TMP="$build_dir/tmp" if pre_build "$variant" "$build_dir" >> "$build_log" 2>&1 then if $build_link_parallel -- cgit v1.2.3 From 88f507f9ccae33a3fa9b3706a96af5c87db804b5 Mon Sep 17 00:00:00 2001 From: Alain Linden Date: Tue, 1 Mar 2011 15:32:35 -0800 Subject: fixes to get openal working on windows. --- autobuild.xml | 12 ++++++++++++ indra/cmake/OPENAL.cmake | 14 +++++++++++--- indra/llaudio/llaudioengine_openal.cpp | 2 ++ indra/llaudio/llaudioengine_openal.h | 2 +- 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 8dd2f91718..819bc27c1e 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1301,6 +1301,18 @@ name linux + windows + + archive + + hash + 04df406f3e5d04cf176660bdac66c3a1 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-openal/rev/222391/arch/CYGWIN/installer/openal-1.12.854-1.1.0-windows-20110301.tar.bz2 + + name + windows + version 3ad86a1c diff --git a/indra/cmake/OPENAL.cmake b/indra/cmake/OPENAL.cmake index ed483e5aea..a3e1fb924e 100644 --- a/indra/cmake/OPENAL.cmake +++ b/indra/cmake/OPENAL.cmake @@ -9,6 +9,7 @@ else (LINUX) endif (LINUX) if (OPENAL) + set(OPENAL_LIB_INCLUDE_DIRS "${LIBS_PREBUILT_DIR}/include/AL") if (STANDALONE) include(FindPkgConfig) include(FindOpenAL) @@ -17,10 +18,17 @@ if (OPENAL) else (STANDALONE) use_prebuilt_binary(openal_soft) endif (STANDALONE) - set(OPENAL_LIBRARIES - openal - alut + if(WINDOWS) + set(OPENAL_LIBRARIES + OpenAL32 + alut ) + else() + set(OPENAL_LIBRARIES + openal + alut + ) + endif() endif (OPENAL) if (OPENAL) diff --git a/indra/llaudio/llaudioengine_openal.cpp b/indra/llaudio/llaudioengine_openal.cpp index e352045291..34a057dcc0 100644 --- a/indra/llaudio/llaudioengine_openal.cpp +++ b/indra/llaudio/llaudioengine_openal.cpp @@ -32,6 +32,8 @@ #include "lllistener_openal.h" +const float LLAudioEngine_OpenAL::WIND_BUFFER_SIZE_SEC = 0.05f; + LLAudioEngine_OpenAL::LLAudioEngine_OpenAL() : mWindGen(NULL), diff --git a/indra/llaudio/llaudioengine_openal.h b/indra/llaudio/llaudioengine_openal.h index 258febb1a8..6639d9dfe6 100644 --- a/indra/llaudio/llaudioengine_openal.h +++ b/indra/llaudio/llaudioengine_openal.h @@ -67,7 +67,7 @@ class LLAudioEngine_OpenAL : public LLAudioEngine int mNumEmptyWindALBuffers; static const int MAX_NUM_WIND_BUFFERS = 80; - static const float WIND_BUFFER_SIZE_SEC = 0.05f; // 1/20th sec + static const float WIND_BUFFER_SIZE_SEC; // 1/20th sec }; class LLAudioChannelOpenAL : public LLAudioChannel -- cgit v1.2.3 From f228cebc7709321ee5d04c40066c755bed41af76 Mon Sep 17 00:00:00 2001 From: Alain Linden Date: Tue, 1 Mar 2011 16:27:04 -0800 Subject: add openal include path for openal dependent build. --- indra/newview/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 55de2c8d20..3c24006fb8 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -67,6 +67,7 @@ include_directories( ${LSCRIPT_INCLUDE_DIRS}/lscript_compile ${LLLOGIN_INCLUDE_DIRS} ${UPDATER_INCLUDE_DIRS} + ${OPENAL_LIB_INCLUDE_DIRS} ) set(viewer_SOURCE_FILES -- cgit v1.2.3 From 7093503e26e48b25f6e1ae251dab89191fce8d9f Mon Sep 17 00:00:00 2001 From: Jennifer Leech Date: Tue, 1 Mar 2011 19:54:17 -0800 Subject: Attempting to configure VS2010 to only use one processor core to troubleshoot conflict with TC. --- autobuild.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/autobuild.xml b/autobuild.xml index 819bc27c1e..7ff756dc7e 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1961,6 +1961,7 @@ /build "/cfg=Release|Win32" + "/CL_ADD="/m:1"" configure -- cgit v1.2.3 From 9256402b065acdabc63f76bd71c938edbf65dde2 Mon Sep 17 00:00:00 2001 From: Jennifer Leech Date: Wed, 2 Mar 2011 00:31:38 -0800 Subject: Attempting to modify quoting of build options string to see if this corrects failure to run BuildConsole on TC. --- autobuild.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/autobuild.xml b/autobuild.xml index 7ff756dc7e..5ad24958c1 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1961,7 +1961,7 @@ /build "/cfg=Release|Win32" - "/CL_ADD="/m:1"" + "/CL_ADD=/m:1" configure -- cgit v1.2.3 From 899d0d6282c9efa0a16e19b3a5c16389d287ec6b Mon Sep 17 00:00:00 2001 From: Andrew de Laix Date: Wed, 2 Mar 2011 17:49:59 +0000 Subject: update to jsoncpp built with gcc4.1 --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 5456d2aea8..b65c8fe914 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -896,9 +896,9 @@ archive hash - db7826354e60fb4ae14bf40258c088af + 20546118096e4828d9f29913ec7d954a url - http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-jsoncpp/rev/220079/arch/Linux/installer/jsoncpp-0.5.0-linux-20110131.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-jsoncpp/rev/221698/arch/Linux/installer/jsoncpp-0.5.0-linux-20110219.tar.bz2 name linux -- cgit v1.2.3 From 99ba5e2670d04baf641c6d612f253a46f857769e Mon Sep 17 00:00:00 2001 From: Andrew de Laix Date: Wed, 2 Mar 2011 21:28:26 +0000 Subject: revert to old jsoncpp library on linux to fix build. --- autobuild.xml | 4 ++-- indra/cmake/JsonCpp.cmake | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index b522878671..d9bfe77caa 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -896,9 +896,9 @@ archive hash - 20546118096e4828d9f29913ec7d954a + 7e6b2fc7ad4e12d94d01cc49c22c6f67 url - http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-jsoncpp/rev/221698/arch/Linux/installer/jsoncpp-0.5.0-linux-20110219.tar.bz2 + http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jsoncpp-svn-r69-linux-20101013.tar.bz2 name linux diff --git a/indra/cmake/JsonCpp.cmake b/indra/cmake/JsonCpp.cmake index 96488360a4..9024fa92a7 100644 --- a/indra/cmake/JsonCpp.cmake +++ b/indra/cmake/JsonCpp.cmake @@ -16,7 +16,7 @@ else (STANDALONE) elseif (DARWIN) set(JSONCPP_LIBRARIES libjson_linux-gcc-4.0.1_libmt.a) elseif (LINUX) - set(JSONCPP_LIBRARIES libjson_linux-gcc-4.3.2_libmt) + set(JSONCPP_LIBRARIES libjsoncpp.a) endif (WINDOWS) - set(JSONCPP_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/json) + set(JSONCPP_INCLUDE_DIRS "${LIBS_PREBUILT_DIR}/include/jsoncpp" "${LIBS_PREBUILT_DIR}/include/json") endif (STANDALONE) -- cgit v1.2.3 From c3efc900c612c8222a8112eb3ee5ca78848cf080 Mon Sep 17 00:00:00 2001 From: Jennifer Leech Date: Wed, 2 Mar 2011 14:40:31 -0800 Subject: Make temporary disabling of Debug/Release builds broadened to all builds regardless of name. Need to increase iteration speed. Will revert when finished. --- BuildParams | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BuildParams b/BuildParams index 3f2d74421a..067ce91b8b 100644 --- a/BuildParams +++ b/BuildParams @@ -243,7 +243,7 @@ viewer-vs2010.build_link_parallel = false #============================================================================== # vs2010 debug - for TC debugging only #============================================================================== -viewer-vs2010.build_CYGWIN_Debug = false -viewer-vs2010.build_CYGWIN_Release = false +build_CYGWIN_Debug = false +build_CYGWIN_Release = false # eof -- cgit v1.2.3 From f680c91a09a4d0560fd8e1065b4427afc3c6e3f3 Mon Sep 17 00:00:00 2001 From: Alain Linden Date: Wed, 2 Mar 2011 14:50:49 -0800 Subject: update openjpeg package usage for windows. --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 819bc27c1e..a6d594a6b5 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1356,9 +1356,9 @@ archive hash - 039c65405b2bea7c1bf67cfeb15a67fe + ca5765af55f798724d601720afdf6953 url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.3-windows-20101001b.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-openjpeg/rev/222548/arch/CYGWIN/installer/openjpeg-1.4-windows-20110302.tar.bz2 name windows -- cgit v1.2.3 From 0d93ce2e4a3daabc8d653290e39b67e5cddabb14 Mon Sep 17 00:00:00 2001 From: Jennifer Leech Date: Wed, 2 Mar 2011 16:42:03 -0800 Subject: RelWithDebInfo build succeeded on TeamCity! Re-enabling Degug and Release builds. --- BuildParams | 7 ------- 1 file changed, 7 deletions(-) diff --git a/BuildParams b/BuildParams index 067ce91b8b..5ec8517ccf 100644 --- a/BuildParams +++ b/BuildParams @@ -239,11 +239,4 @@ viewer-asset-delivery-metrics.build_server_tests = false viewer-autobuild.build_link_parallel = false viewer-vs2010.build_link_parallel = false - -#============================================================================== -# vs2010 debug - for TC debugging only -#============================================================================== -build_CYGWIN_Debug = false -build_CYGWIN_Release = false - # eof -- cgit v1.2.3 From d0ed06ffcae08a11ee8b5ff35692b25b5cbbb48a Mon Sep 17 00:00:00 2001 From: Alain Linden Date: Thu, 3 Mar 2011 11:23:09 -0800 Subject: resolve merge conflict. --- build.sh | 21 +-------------------- 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/build.sh b/build.sh index 31820f9058..625a09009b 100755 --- a/build.sh +++ b/build.sh @@ -51,26 +51,7 @@ pre_build() { local variant="$1" begin_section "Pre$variant" -<<<<<<< local - #export PATH="/cygdrive/c/Program Files/Microsoft Visual Studio 8/Common7/IDE/:$PATH" - python develop.py \ - --incredibuild \ - --unattended \ - -t $variant \ - -G "$cmake_generator" \ - configure \ - -DGRID:STRING="$viewer_grid" \ - -DVIEWER_CHANNEL:STRING="$viewer_channel" \ - -DVIEWER_LOGIN_CHANNEL:STRING="$login_channel" \ - -DINSTALL_PROPRIETARY:BOOL=ON \ - -DRELEASE_CRASH_REPORTING:BOOL=ON \ - -DLOCALIZESETUP:BOOL=ON \ - -DPACKAGE:BOOL=ON \ - -DCMAKE_VERBOSE_MAKEFILE:BOOL=TRUE \ - -DLL_TESTS:BOOL="$run_tests" -======= - "$AUTOBUILD" configure -c $variant -- -DPACKAGE:BOOL=ON -DRELEASE_CRASH_REPORTING:BOOL=ON -DUSE_PRECOMPILED_HEADERS=FALSE ->>>>>>> other + "$AUTOBUILD" configure -c $variant -- -DPACKAGE:BOOL=ON -DRELEASE_CRASH_REPORTING:BOOL=ON -DUSE_PRECOMPILED_HEADERS=FALSE end_section "Pre$variant" } -- cgit v1.2.3 From 149ace0b1f3f9bb6394aec367da5748bc092ef7a Mon Sep 17 00:00:00 2001 From: Merov Linden Date: Thu, 3 Mar 2011 11:28:06 -0800 Subject: Autobuild : points to the corrected pth package for Mac --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index b575eeeb6c..a09ebc8982 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1380,9 +1380,9 @@ archive hash - 320820c5a886f8daf366ba5fcd264b34 + 2172379794217d0ffba0db09b2ac17bf url - http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-pth/rev/222035/arch/Darwin/installer/pth-2.0.7-darwin-20110224.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-pth/rev/222617/arch/Darwin/installer/pth-2.0.7-darwin-20110303.tar.bz2 name darwin -- cgit v1.2.3 From 6e97ead181f04c5cb4953e5e3316d7d8caf0a1ec Mon Sep 17 00:00:00 2001 From: Kelly Washington Date: Thu, 3 Mar 2011 12:05:40 -0800 Subject: Add early exit to message template check if it hasn't changed. --- indra/cmake/TemplateCheck.cmake | 6 +++--- scripts/template_verifier.py | 22 +++++++++++++++++++++- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/indra/cmake/TemplateCheck.cmake b/indra/cmake/TemplateCheck.cmake index fa4e387dd5..24805b4214 100644 --- a/indra/cmake/TemplateCheck.cmake +++ b/indra/cmake/TemplateCheck.cmake @@ -5,10 +5,10 @@ include(Python) macro (check_message_template _target) add_custom_command( TARGET ${_target} - POST_BUILD + PRE_LINK COMMAND ${PYTHON_EXECUTABLE} ARGS ${SCRIPTS_DIR}/template_verifier.py - --mode=development --cache_master - COMMENT "Verifying message template" + --mode=development --cache_master ${TEMPLATE_VERIFIER_OPTIONS} + COMMENT "Verifying message template - See http://wiki.secondlife.com/wiki/Template_verifier.py" ) endmacro (check_message_template) diff --git a/scripts/template_verifier.py b/scripts/template_verifier.py index ddb050fbbb..d01750ffc6 100644 --- a/scripts/template_verifier.py +++ b/scripts/template_verifier.py @@ -66,6 +66,7 @@ add_indra_lib_path() import optparse import os import urllib +import hashlib from indra.ipc import compatibility from indra.ipc import tokenstream @@ -233,6 +234,9 @@ http://wiki.secondlife.com/wiki/Template_verifier.py parser.add_option( '-c', '--cache_master', action='store_true', dest='cache_master', default=False, help="""Set to true to attempt use local cached copy of the master template.""") + parser.add_option( + '-f', '--force', action='store_true', dest='force_verification', + default=False, help="""Set to true to skip the sha_1 check and force template verification.""") options, args = parser.parse_args(sysargs) @@ -269,8 +273,18 @@ http://wiki.secondlife.com/wiki/Template_verifier.py print "current:", current_filename current_url = 'file://%s' % current_filename - # retrieve the contents of the local template and check for syntax + # retrieve the contents of the local template current = fetch(current_url) + hexdigest = hashlib.sha1(current).hexdigest() + if not options.force_verification: + # Early exist if the template hasn't changed. + sha_url = "%s.sha1" % current_url + current_sha = fetch(sha_url) + if hexdigest == current_sha: + print "Message template SHA_1 has not changed." + sys.exit(0) + + # and check for syntax current_parsed = llmessage.parseTemplateString(current) if options.cache_master: @@ -301,6 +315,12 @@ http://wiki.secondlife.com/wiki/Template_verifier.py if acceptable: explain("--- PASS ---", compat) + if options.force_verification == False: + print "Updating sha1 to %s" % hexdigest + sha_filename = "%s.sha1" % current_filename + sha_file = open(sha_filename, 'w') + sha_file.write(hexdigest) + sha_file.close() else: explain("*** FAIL ***", compat) return 1 -- cgit v1.2.3 From f360ce118d8016a052e30538037993d984ae01d8 Mon Sep 17 00:00:00 2001 From: Kelly Washington Date: Thu, 3 Mar 2011 12:14:10 -0800 Subject: Add template .sha1 --- scripts/messages/message_template.msg.sha1 | 1 + 1 file changed, 1 insertion(+) create mode 100644 scripts/messages/message_template.msg.sha1 diff --git a/scripts/messages/message_template.msg.sha1 b/scripts/messages/message_template.msg.sha1 new file mode 100644 index 0000000000..dcd172cdf6 --- /dev/null +++ b/scripts/messages/message_template.msg.sha1 @@ -0,0 +1 @@ +a7f6fe7e34c9c92b7315c6fb56ad32b8f651d4fb \ No newline at end of file -- cgit v1.2.3 From a8b9392fd83c9fcd2261e76a135d451ae5b90e9b Mon Sep 17 00:00:00 2001 From: Merov Linden Date: Thu, 3 Mar 2011 12:53:50 -0800 Subject: Autobuild : fix llcommon tests warning so Mac builds --- indra/llcommon/tests/llerror_test.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/indra/llcommon/tests/llerror_test.cpp b/indra/llcommon/tests/llerror_test.cpp index 1ef8fc9712..2350059626 100644 --- a/indra/llcommon/tests/llerror_test.cpp +++ b/indra/llcommon/tests/llerror_test.cpp @@ -48,7 +48,10 @@ namespace { static bool fatalWasCalled; void fatalCall(const std::string&) { fatalWasCalled = true; } +} +namespace tut +{ class TestRecorder : public LLError::Recorder { public: @@ -82,10 +85,7 @@ namespace bool mWantsTime; }; -} - -namespace tut -{ + struct ErrorTestData { TestRecorder mRecorder; @@ -381,7 +381,7 @@ namespace } typedef std::string (*LogFromFunction)(bool); - void testLogName(TestRecorder& recorder, LogFromFunction f, + void testLogName(tut::TestRecorder& recorder, LogFromFunction f, const std::string& class_name = "") { recorder.clearMessages(); -- cgit v1.2.3 From 0b44850c6f1057cd095ed9fe68f9285e546c662e Mon Sep 17 00:00:00 2001 From: Kelly Washington Date: Thu, 3 Mar 2011 13:14:53 -0800 Subject: Always do the template check, now that it is quick and local if it hasn't changed. --- indra/newview/CMakeLists.txt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 1f4302d870..75e0ec12b8 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1631,8 +1631,6 @@ if (WINDOWS) # sorted out on the parabuild cluster... #${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.bz2) - check_message_template(package) - endif (PACKAGE) endif (WINDOWS) @@ -1711,7 +1709,6 @@ if (LINUX) add_custom_target(package ALL DEPENDS ${product}.tar.bz2) add_dependencies(package linux-crash-logger-target) add_dependencies(package linux-updater-target) - check_message_template(package) endif (PACKAGE) add_custom_command( @@ -1774,7 +1771,6 @@ if (DARWIN) if (PACKAGE) add_custom_target(package ALL DEPENDS ${VIEWER_BINARY_NAME}) - check_message_template(package) add_custom_command( TARGET package POST_BUILD @@ -1935,4 +1931,5 @@ if (LL_TESTS) endif (LL_TESTS) +check_message_template(${VIEWER_BINARY_NAME}) -- cgit v1.2.3 From 9bd9a556087fa1fc2dc68ed807a55c4a35ffc622 Mon Sep 17 00:00:00 2001 From: Alain Linden Date: Thu, 3 Mar 2011 14:42:48 -0800 Subject: hacky addition of VSTool postprocessing to set startup project and default configuration. --- autobuild.xml | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/autobuild.xml b/autobuild.xml index a090833b51..abffc9fe28 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1904,6 +1904,14 @@ arguments ..\indra + && + ..\indra\tools\vstool\VSTool.exe + --solution + SecondLife.sln + --config + Debug + --startup + secondlife-bin options @@ -1935,6 +1943,14 @@ arguments ..\indra + && + ..\indra\tools\vstool\VSTool.exe + --solution + SecondLife.sln + --config + RelWithDebInfo + --startup + secondlife-bin options @@ -1961,7 +1977,7 @@ /build "/cfg=Release|Win32" - "/CL_ADD=/m:1" + "/CL_ADD=/m:1" configure @@ -1969,6 +1985,14 @@ arguments ..\indra + && + ..\indra\tools\vstool\VSTool.exe + --solution + SecondLife.sln + --config + Release + --startup + secondlife-bin options -- cgit v1.2.3 From 58e5c8476dfd30f8d303ce5a60db872066008b83 Mon Sep 17 00:00:00 2001 From: Alain Linden Date: Thu, 3 Mar 2011 16:15:08 -0800 Subject: update to use new GL archive (includes only headers; that's all that is needed) --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index abffc9fe28..1090453e05 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -42,9 +42,9 @@ archive hash - a94538d064cd0a235b2a95389e7e8ee8 + f8d98cbe78d5aafbc7aaabf840325aaf url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/GL-windows-20101001a.tar.bz2 + http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/GL-0.0.0-windows-20110303.tar.bz2 name windows -- cgit v1.2.3 From fb8a2aa572624bd49fcbe899ba705c4f9d3ce256 Mon Sep 17 00:00:00 2001 From: "Andrew A. de Laix" Date: Thu, 3 Mar 2011 16:51:21 -0800 Subject: imported patch mac_archives --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 1090453e05..5851fc3221 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -90,9 +90,9 @@ archive hash - 4e9cd47faf1e74e1a5bf386dc55dd47e + 9868bfa0b6954e4884c49c6f30068c80 url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/apr_suite-1.3.7-darwin-20101004.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-apr/rev/221588/arch/Darwin/installer/apr_suite-1.4.2-darwin-20110217.tar.bz2 name darwin -- cgit v1.2.3 From 5048942dbc0a0aa577625bc47d77162cbcf1afdc Mon Sep 17 00:00:00 2001 From: Merov Linden Date: Thu, 3 Mar 2011 23:11:38 -0800 Subject: Autobuild : Fix llsdmessage integration test failure on Mac --- indra/llmessage/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/indra/llmessage/CMakeLists.txt b/indra/llmessage/CMakeLists.txt index 1cad0f6d22..d1bb7cc5d4 100644 --- a/indra/llmessage/CMakeLists.txt +++ b/indra/llmessage/CMakeLists.txt @@ -11,6 +11,7 @@ include(LLMessage) include(LLVFS) include(LLAddBuildTest) include(Tut) +include(Python) include_directories (${CMAKE_CURRENT_SOURCE_DIR}) -- cgit v1.2.3 From 04284652cfce57b0df3bc6b12f7568fa8da22ebb Mon Sep 17 00:00:00 2001 From: Dave Parks Date: Fri, 4 Mar 2011 15:04:46 -0600 Subject: SH-1066 Fix for bumpmaps not loading properly after enabling deferred rendering. (transplanted from 30156869364d642a378411539bbca86068e29b77) --- indra/newview/pipeline.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index a533be675c..404e8cbdb9 100755 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -836,6 +836,7 @@ void LLPipeline::releaseGLBuffers() mGlow[i].release(); } + gBumpImageList.destroyGL(); LLVOAvatar::resetImpostors(); } @@ -958,6 +959,8 @@ void LLPipeline::createGLBuffers() addDeferredAttachments(mGIMap); } } + + gBumpImageList.restoreGL(); } void LLPipeline::restoreGL() -- cgit v1.2.3 From 7285dd9e42ffd58ea51335de96eadadb652f6b49 Mon Sep 17 00:00:00 2001 From: "Andrew A. de Laix" Date: Fri, 4 Mar 2011 14:49:20 -0800 Subject: ares, boost, expat, freetype archives updated to latest builds. --- autobuild.xml | 16 ++++++++-------- indra/cmake/APR.cmake | 4 ++-- indra/cmake/Boost.cmake | 10 +++++----- indra/cmake/Copy3rdPartyLibs.cmake | 6 +++--- indra/newview/viewer_manifest.py | 12 ++++++------ 5 files changed, 24 insertions(+), 24 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 5851fc3221..17bb0e91ce 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -138,9 +138,9 @@ archive hash - 577e89e72a6df485ee0c42ef7bfd8c34 + e6caaeea16131e1f2343ecd7765e3147 url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.7.1-darwin-20101004.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-ares/rev/220963/arch/Darwin/installer/ares-1.7.1-darwin-20110217.tar.bz2 name darwin @@ -186,9 +186,9 @@ archive hash - 3a8b4bc2ea3dde26c2a7e1481f039864 + d98078791ce345bf6168ce9ba53ca2d7 url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-darwin-20101004.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-boost/rev/222752/arch/Darwin/installer/boost-1.45.0-darwin-20110304.tar.bz2 name darwin @@ -354,9 +354,9 @@ archive hash - 594e0d61d115ab06ca11bc84d374d23a + 180e03d0be1f1acfc3244e78742d7bef url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/expat-1.95.8-darwin-20101004.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-expat/rev/221695/arch/Darwin/installer/expat-2.0.1-darwin-20110218.tar.bz2 name darwin @@ -498,9 +498,9 @@ archive hash - 753021e66345612b4fc77c711b426f11 + 3e7e133f1fa61d9acabdf01f5494209e url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.3.9-darwin-20101004.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-freetype/rev/222716/arch/Darwin/installer/freetype-2.4.4-darwin-20110304.tar.bz2 name darwin diff --git a/indra/cmake/APR.cmake b/indra/cmake/APR.cmake index 5b31b0d237..daafa00fe2 100644 --- a/indra/cmake/APR.cmake +++ b/indra/cmake/APR.cmake @@ -32,8 +32,8 @@ else (STANDALONE) ) elseif (DARWIN) if (LLCOMMON_LINK_SHARED) - set(APR_selector "0.3.7.dylib") - set(APRUTIL_selector "0.3.8.dylib") + set(APR_selector "0.dylib") + set(APRUTIL_selector "0.dylib") else (LLCOMMON_LINK_SHARED) set(APR_selector "a") set(APRUTIL_selector "a") diff --git a/indra/cmake/Boost.cmake b/indra/cmake/Boost.cmake index b9c047a764..67dc9f0891 100644 --- a/indra/cmake/Boost.cmake +++ b/indra/cmake/Boost.cmake @@ -50,11 +50,11 @@ else (STANDALONE) debug libboost_filesystem-vc100-mt-gd-${BOOST_VERSION}) endif (MSVC80) elseif (DARWIN) - set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options-xgcc40-mt) - set(BOOST_REGEX_LIBRARY boost_regex-xgcc40-mt) - set(BOOST_SIGNALS_LIBRARY boost_signals-xgcc40-mt) - set(BOOST_SYSTEM_LIBRARY boost_system-xgcc40-mt) - set(BOOST_FILESYSTEM_LIBRARY boost_filesystem-xgcc40-mt) + set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options) + set(BOOST_REGEX_LIBRARY boost_regex) +# set(BOOST_SIGNALS_LIBRARY boost_signals) + set(BOOST_SYSTEM_LIBRARY boost_system) + set(BOOST_FILESYSTEM_LIBRARY boost_filesystem) elseif (LINUX) set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options-gcc41-mt) set(BOOST_REGEX_LIBRARY boost_regex-gcc41-mt) diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index 0c65229afc..43b0347aa9 100644 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -200,11 +200,11 @@ elseif(DARWIN) ) set(release_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}") set(release_files - libapr-1.0.3.7.dylib + libapr-1.0.dylib libapr-1.dylib - libaprutil-1.0.3.8.dylib + libaprutil-1.0.dylib libaprutil-1.dylib - libexpat.0.5.0.dylib + libexpat.1.5.2.dylib libexpat.dylib libllqtwebkit.dylib libndofdev.dylib diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 3e09b9daa0..9be3aa709b 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -636,9 +636,9 @@ class DarwinManifest(ViewerManifest): dylibs[lib] = True if dylibs["llcommon"]: - for libfile in ("libapr-1.0.3.7.dylib", - "libaprutil-1.0.3.8.dylib", - "libexpat.0.5.0.dylib", + for libfile in ("libapr-1.0.dylib", + "libaprutil-1.0.dylib", + "libexpat.1.5.2.dylib", "libexception_handler.dylib", ): self.path(os.path.join(libdir, libfile), libfile) @@ -667,9 +667,9 @@ class DarwinManifest(ViewerManifest): mac_updater_res_path = self.dst_path_of("mac-updater.app/Contents/Resources") slplugin_res_path = self.dst_path_of("SLPlugin.app/Contents/Resources") for libfile in ("libllcommon.dylib", - "libapr-1.0.3.7.dylib", - "libaprutil-1.0.3.8.dylib", - "libexpat.0.5.0.dylib", + "libapr-1.0.dylib", + "libaprutil-1.0.dylib", + "libexpat.1.5.2.dylib", "libexception_handler.dylib", ): target_lib = os.path.join('../../..', libfile) -- cgit v1.2.3 From ec11823c77ac232d59f4b9ddcff354523b6e0f73 Mon Sep 17 00:00:00 2001 From: Dave Parks Date: Fri, 4 Mar 2011 18:46:26 -0600 Subject: SH-1069 Fix for some bump maps not loading fully. (transplanted from 1a03c3745cbbe47e5cc5dfec3a9114516865ddc0) --- indra/newview/lldrawpoolbump.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp index 0a642f494b..3f5cb4778e 100644 --- a/indra/newview/lldrawpoolbump.cpp +++ b/indra/newview/lldrawpoolbump.cpp @@ -1126,7 +1126,9 @@ void LLBumpImageList::onSourceLoaded( BOOL success, LLViewerTexture *src_vi, LLI bump_image_map_t::iterator iter = entries_list.find(source_asset_id); if (iter == entries_list.end() || - iter->second.isNull()) + iter->second.isNull() || + iter->second->getWidth() != src->getWidth() || + iter->second->getHeight() != src->getHeight()) // bump not cached yet or has changed resolution { //make sure an entry exists for this image LLPointer raw = new LLImageRaw(1,1,1); raw->clear(0x77, 0x77, 0xFF, 0xFF); -- cgit v1.2.3 From 4745d124c8d8b4725d8313311d9e8e4b9bf172ee Mon Sep 17 00:00:00 2001 From: Merov Linden Date: Fri, 4 Mar 2011 22:56:15 -0800 Subject: STORM-1023 : allow non standalone and non install prebuilt to use local fmod package path in autobuild.xml --- indra/cmake/FMOD.cmake | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) mode change 100644 => 100755 indra/cmake/FMOD.cmake diff --git a/indra/cmake/FMOD.cmake b/indra/cmake/FMOD.cmake old mode 100644 new mode 100755 index 6a4322df9b..cb5124812d --- a/indra/cmake/FMOD.cmake +++ b/indra/cmake/FMOD.cmake @@ -10,22 +10,30 @@ if (INSTALL_PROPRIETARY) endif (INSTALL_PROPRIETARY) if (FMOD) - if (NOT INSTALL_PROPRIETARY) - # This cover the STANDALONE case and the NOT STANDALONE but not using proprietary libraries - # This should then be invoke by all open source devs outside LL + if (STANDALONE) + # In that case, we use the version of the library installed on the system set(FMOD_FIND_REQUIRED ON) include(FindFMOD) - else (NOT INSTALL_PROPRIETARY) - include(Prebuilt) - use_prebuilt_binary(fmod) - if (WINDOWS) - set(FMOD_LIBRARY fmod) - elseif (DARWIN) - set(FMOD_LIBRARY fmod) - elseif (LINUX) - set(FMOD_LIBRARY fmod-3.75) - endif (WINDOWS) - SET(FMOD_LIBRARIES ${FMOD_LIBRARY}) - set(FMOD_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include) - endif (NOT INSTALL_PROPRIETARY) + else (STANDALONE) + if (FMOD_LIBRARY AND FMOD_INCLUDE_DIR) + # If the path have been specified in the arguments, use that + set(FMOD_LIBRARIES ${FMOD_LIBRARY}) + MESSAGE(STATUS "Using FMOD path: ${FMOD_LIBRARIES}, ${FMOD_INCLUDE_DIR}") + else (FMOD_LIBRARY AND FMOD_INCLUDE_DIR) + # If not, we're going to try to get the package listed in autobuild.xml + # Note: if you're not using INSTALL_PROPRIETARY, the package URL should be local (file:/// URL) + # as accessing the private LL location will fail if you don't have the credential + include(Prebuilt) + use_prebuilt_binary(fmod) + if (WINDOWS) + set(FMOD_LIBRARY fmod) + elseif (DARWIN) + set(FMOD_LIBRARY fmod) + elseif (LINUX) + set(FMOD_LIBRARY fmod-3.75) + endif (WINDOWS) + set(FMOD_LIBRARIES ${FMOD_LIBRARY}) + set(FMOD_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include) + endif (FMOD_LIBRARY AND FMOD_INCLUDE_DIR) + endif (STANDALONE) endif (FMOD) -- cgit v1.2.3 From d63c1a4df14f5eaeee37b82890a445e912d60683 Mon Sep 17 00:00:00 2001 From: Merov Linden Date: Sat, 5 Mar 2011 19:18:39 -0800 Subject: STORM-1023 : add missing fmod dependency so viewer can compile with -DFMOD_INCLUDE_DIR option --- indra/newview/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index ef1d05a779..21efcd284e 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -49,6 +49,7 @@ include_directories( ${LLAUDIO_INCLUDE_DIRS} ${LLCHARACTER_INCLUDE_DIRS} ${LLCOMMON_INCLUDE_DIRS} + ${FMOD_INCLUDE_DIR} ${LLIMAGE_INCLUDE_DIRS} ${LLKDU_INCLUDE_DIRS} ${LLINVENTORY_INCLUDE_DIRS} -- cgit v1.2.3 From 006674447a3f082ee2e352bc8a201929ad677897 Mon Sep 17 00:00:00 2001 From: "Andrew A. de Laix" Date: Mon, 7 Mar 2011 09:50:05 -0800 Subject: update darwin freetype archive. --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 17bb0e91ce..1b7627fb37 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -498,9 +498,9 @@ archive hash - 3e7e133f1fa61d9acabdf01f5494209e + c0eacb6348e032fbc69cfdc4bd215ee4 url - http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-freetype/rev/222716/arch/Darwin/installer/freetype-2.4.4-darwin-20110304.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-freetype/rev/222819/arch/Darwin/installer/freetype-2.4.4-darwin-20110307.tar.bz2 name darwin -- cgit v1.2.3 From 7587b1b3bbcd2c395729d6a203c45e754dd746bf Mon Sep 17 00:00:00 2001 From: "Andrew A. de Laix" Date: Mon, 7 Mar 2011 10:43:18 -0800 Subject: update mac google_breakpad archive. --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 1b7627fb37..f808339a49 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -692,9 +692,9 @@ archive hash - 239e5be637bb6282a297a8636ef3c77e + 21babc394dbf8572830f2e85adec7b9f url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google_breakpad-0.0.0-rev599-linux-20110119a.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-breakpad/rev/220211/arch/Darwin/installer/google_breakpad-0.0.0-rev599-darwin-20110202.tar.bz2 name linux -- cgit v1.2.3 From 33927b8451bde10feeda0fc3d3c478b79ef2e0e2 Mon Sep 17 00:00:00 2001 From: "Andrew A. de Laix" Date: Mon, 7 Mar 2011 11:44:51 -0800 Subject: update libpng and jpeglib archives for mac. --- autobuild.xml | 8 ++++---- indra/cmake/JPEG.cmake | 2 +- indra/cmake/PNG.cmake | 3 +++ 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index f808339a49..37388a8fa4 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -836,9 +836,9 @@ archive hash - d94de5a98492018144b95a8022ed4e44 + 71bd6efbf508e1f2e7d98a6195a93e9e url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-6b-darwin-20101004.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-jpeglib/rev/222232/arch/Darwin/installer/jpeglib-8c-darwin-20110228.tar.bz2 name darwin @@ -980,9 +980,9 @@ archive hash - 4aa623811aff42df702e8d3fdd848ac3 + 6fe1adf12d98bce9111f60ee762007b9 url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.2.35-darwin-20101004.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-libpng/rev/221851/arch/Darwin/installer/libpng-1.5.1-darwin-20110222.tar.bz2 name darwin diff --git a/indra/cmake/JPEG.cmake b/indra/cmake/JPEG.cmake index 0f0bbb9564..4f99efd602 100644 --- a/indra/cmake/JPEG.cmake +++ b/indra/cmake/JPEG.cmake @@ -12,7 +12,7 @@ else (STANDALONE) if (LINUX) set(JPEG_LIBRARIES jpeg) elseif (DARWIN) - set(JPEG_LIBRARIES lljpeg) + set(JPEG_LIBRARIES jpeg) elseif (WINDOWS) set(JPEG_LIBRARIES jpeglib) endif (LINUX) diff --git a/indra/cmake/PNG.cmake b/indra/cmake/PNG.cmake index 86b7267494..60f749869a 100644 --- a/indra/cmake/PNG.cmake +++ b/indra/cmake/PNG.cmake @@ -11,6 +11,9 @@ else (STANDALONE) if (WINDOWS) set(PNG_LIBRARIES libpng15) set(PNG_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/libpng15) + elseif(DARWIN) + set(PNG_LIBRARIES png15) + set(PNG_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/libpng15) else() set(PNG_LIBRARIES png12) set(PNG_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/libpng12) -- cgit v1.2.3 From 12c2fd2ef051ca922f0d3076bc8160820980b6e2 Mon Sep 17 00:00:00 2001 From: "Andrew A. de Laix" Date: Mon, 7 Mar 2011 14:23:09 -0800 Subject: update ogg-vorbis archive usage for darwin. --- autobuild.xml | 4 ++-- indra/llaudio/llaudiodecodemgr.cpp | 8 +++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 37388a8fa4..0736a6afca 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1196,9 +1196,9 @@ archive hash - 510c88fb183556b8c5fba25eb0c3d85e + 57f32a1a670f06a4dc036eb1164ad9d7 url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg-vorbis-1.03-1.1.2-darwin-20101004.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-ogvorbis/rev/221801/arch/Darwin/installer/ogg_vorbis-1.1.3-1.2.0-darwin-20110222.tar.bz2 name darwin diff --git a/indra/llaudio/llaudiodecodemgr.cpp b/indra/llaudio/llaudiodecodemgr.cpp index 01dfd03c18..84105ddfca 100644 --- a/indra/llaudio/llaudiodecodemgr.cpp +++ b/indra/llaudio/llaudiodecodemgr.cpp @@ -680,4 +680,10 @@ BOOL LLAudioDecodeMgr::addDecodeRequest(const LLUUID &uuid) return FALSE; } - +#ifdef LL_DARWIN +// HACK: to fool the compiler into not emitting unused warnings. +namespace { + const ov_callbacks callback_array[4] = {OV_CALLBACKS_DEFAULT, OV_CALLBACKS_NOCLOSE, OV_CALLBACKS_STREAMONLY, + OV_CALLBACKS_STREAMONLY_NOCLOSE}; +} +#endif -- cgit v1.2.3 From d9715317b17152c445f6c5933fbeb2c1e0900bba Mon Sep 17 00:00:00 2001 From: "Andrew A. de Laix" Date: Mon, 7 Mar 2011 14:54:50 -0800 Subject: update openSSL archive usage for darwin. --- autobuild.xml | 4 ++-- indra/cmake/OpenSSL.cmake | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 0736a6afca..aa3414efc5 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1244,9 +1244,9 @@ archive hash - 9cf8e84cb91996616cf627ad18c85442 + facee34b8bd57ad602157e65a5af1a49 url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.8l-darwin-20101004.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-openssl/rev/220986/arch/Darwin/installer/openssl-0.9.8q-darwin-20110211.tar.bz2 name darwin diff --git a/indra/cmake/OpenSSL.cmake b/indra/cmake/OpenSSL.cmake index c692b67b49..5982ee9a49 100644 --- a/indra/cmake/OpenSSL.cmake +++ b/indra/cmake/OpenSSL.cmake @@ -19,5 +19,5 @@ endif (STANDALONE) if (LINUX) set(CRYPTO_LIBRARIES crypto) elseif (DARWIN) - set(CRYPTO_LIBRARIES llcrypto) + set(CRYPTO_LIBRARIES crypto) endif (LINUX) -- cgit v1.2.3 From e77de9352985079635af4f8f1e18d4ee218d18e7 Mon Sep 17 00:00:00 2001 From: "Andrew A. de Laix" Date: Mon, 7 Mar 2011 15:09:15 -0800 Subject: update openjpeg archive usage for darwin. --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index aa3414efc5..061eec49fe 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1332,9 +1332,9 @@ archive hash - 972088359b9472a3baf4dda695cbda44 + 4be51c7cca7d84831e30b63279df7ae5 url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.3.0-darwin-20101004.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-openjpeg/rev/222548/arch/Darwin/installer/openjpeg-1.4-darwin-20110302.tar.bz2 name darwin -- cgit v1.2.3 From 64293a808c9d0d7cae5a0a7aa916c037bc3e3d58 Mon Sep 17 00:00:00 2001 From: "Andrew A. de Laix" Date: Mon, 7 Mar 2011 15:21:47 -0800 Subject: update pth archive usage for darwin. --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 061eec49fe..2e6c503554 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1380,9 +1380,9 @@ archive hash - d47d121c8eaed4ac6d8253ceda23b5c9 + 2172379794217d0ffba0db09b2ac17bf url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/pth-2.0.7-darwin-20101004.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-pth/rev/222617/arch/Darwin/installer/pth-2.0.7-darwin-20110303.tar.bz2 name darwin -- cgit v1.2.3 From d107e4b0a760778ee298f988e112b46dacaa4579 Mon Sep 17 00:00:00 2001 From: "Andrew A. de Laix" Date: Mon, 7 Mar 2011 16:08:56 -0800 Subject: update xmlrpc-epi archive for darwin. --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 2e6c503554..7c709d7ee9 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1500,9 +1500,9 @@ archive hash - 994193ab308ac40994421ca411249b65 + a3e0fb4b4a51b01690a99747a1cca531 url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/xmlrpc-epi-0.51-darwin-20101004.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-xmlrpc-epi/rev/222889/arch/Darwin/installer/xmlrpc_epi-0.54.1-darwin-20110307.tar.bz2 name darwin -- cgit v1.2.3 From 1f4630a967db381a96b13ad448d29b340b062ef5 Mon Sep 17 00:00:00 2001 From: "Andrew A. de Laix" Date: Mon, 7 Mar 2011 16:18:09 -0800 Subject: updating zlib archive for darwin. --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 7c709d7ee9..a8dc98c6c2 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1548,9 +1548,9 @@ archive hash - 3d1b42e6c3fcfebe00c6b87a0228c0ab + 49b8de20f3bb43537f51311894a72de1 url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/zlib-1.1.4-darwin-20101004.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-zlib/rev/220983/arch/Darwin/installer/zlib-1.2.5-darwin-20110211.tar.bz2 name darwin -- cgit v1.2.3 From 3ebe0dd12bef7e3443ec98c56203f6ed2e850687 Mon Sep 17 00:00:00 2001 From: "Andrew A. de Laix" Date: Mon, 7 Mar 2011 16:35:08 -0800 Subject: Backed out changeset 7f3922c6bbc4 -- updated linux by mistake. --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index f808339a49..1b7627fb37 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -692,9 +692,9 @@ archive hash - 21babc394dbf8572830f2e85adec7b9f + 239e5be637bb6282a297a8636ef3c77e url - http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-breakpad/rev/220211/arch/Darwin/installer/google_breakpad-0.0.0-rev599-darwin-20110202.tar.bz2 + http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google_breakpad-0.0.0-rev599-linux-20110119a.tar.bz2 name linux -- cgit v1.2.3 From a60bf285b8fcfc3c00d1c96315db5cb6f236bee2 Mon Sep 17 00:00:00 2001 From: "Andrew A. de Laix" Date: Tue, 8 Mar 2011 09:18:44 -0800 Subject: really update google_breakpad archive usage for darwin. --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 513cb76b5f..3a15dfe391 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -680,9 +680,9 @@ archive hash - 5937f12de19ce4fa394048f22557b6c5 + 21babc394dbf8572830f2e85adec7b9f url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google_breakpad-0.0.0-rev599-darwin-20110119.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-breakpad/rev/220211/arch/Darwin/installer/google_breakpad-0.0.0-rev599-darwin-20110202.tar.bz2 name darwin -- cgit v1.2.3 From b1a71cbcd2a5ea524357f5c64fb3fafce067d85f Mon Sep 17 00:00:00 2001 From: "Andrew A. de Laix" Date: Tue, 8 Mar 2011 11:02:10 -0800 Subject: update fmod and kdu archive usage for mac. --- autobuild.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 3a15dfe391..9fd3430cff 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -402,9 +402,9 @@ archive hash - 4521b86ff92c3843e47a58b38e76e667 + 61ead113e6479452e6b690c84b4e9d30 url - scp:install-packages.lindenlab.com:/local/www/install-packages/doc/fmod-3.75-darwin-20101004.tar.bz2 + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-fmod-private/rev/221852/arch/Darwin/installer/fmod-3.75-darwin-20110222.tar.bz2 name darwin @@ -932,9 +932,9 @@ archive hash - 408f1375f5a4d864cfb47b36c8ab6052 + d91e1f483209cd3eba04135c6a59e829 url - scp:install-packages.lindenlab.com:/local/www/install-packages/doc/kdu-6.4.1-darwin-20110112.tar.bz2 + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-kdu-private/rev/221672/arch/Darwin/installer/kdu-6.4.1-darwin-20110218.tar.bz2 name darwin -- cgit v1.2.3 From 49698a49de7840783ac12c6c6ccebedd686537f4 Mon Sep 17 00:00:00 2001 From: "Andrew A. de Laix" Date: Tue, 8 Mar 2011 14:14:57 -0800 Subject: update llqtwebkit usage on darwin. --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 9fd3430cff..cb55ea3564 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1076,9 +1076,9 @@ archive hash - d3890220418a66607569fe406ebe24c7 + 0326cb770c7ff995cf822fb330ae9d0c url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-4.7.1-darwin-20110113.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llqtwebkit/rev/223111/arch/Darwin/installer/llqtwebkit-4.7.1-darwin-20110308.tar.bz2 name darwin -- cgit v1.2.3 From eddf24a00fac10a5c2928b9797393cab8a547971 Mon Sep 17 00:00:00 2001 From: "Andrew A. de Laix" Date: Wed, 9 Mar 2011 08:58:52 -0800 Subject: update ndofdev archive usage on darwin. --- autobuild.xml | 4 ++-- indra/newview/viewer_manifest.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index cb55ea3564..9cbf89d7db 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1148,9 +1148,9 @@ archive hash - d56bb37233e6f1308fb0a5b8e37a2429 + 674d37d2ba76a2df7f18c47bf50b5d03 url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ndofdev-darwin-20101004.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-libndofdev/rev/223177/arch/Darwin/installer/libndofdev-0.1-darwin-20110308.tar.bz2 name darwin diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 9be3aa709b..cf7ece2284 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -574,7 +574,7 @@ class DarwinManifest(ViewerManifest): self.path("Info-SecondLife.plist", dst="Info.plist") # copy additional libs in /Contents/MacOS/ - self.path("../packages/lib/release/libndofdev.dylib", dst="MacOS/libndofdev.dylib") + self.path("../packages/lib/release/libndofdev.dylib", dst="Resources/libndofdev.dylib") self.path("../viewer_components/updater/scripts/darwin/update_install", "MacOS/update_install") -- cgit v1.2.3 From fb86600a33adeb744b877959cafe4d1d063f662b Mon Sep 17 00:00:00 2001 From: "Andrew A. de Laix" Date: Wed, 9 Mar 2011 09:26:12 -0800 Subject: update glui archive for darwin. --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 9cbf89d7db..13f67dd01a 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -594,9 +594,9 @@ archive hash - c3bfca7ad2eb90ea33f3fd6f974ca394 + 2bb7adabbd1fe2c7f99ddc4240842cc4 url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glui-2.36-darwin-20101004.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-glui/rev/221069/arch/Darwin/installer/glui-2.36-darwin-20110309.tar.bz2 name darwin -- cgit v1.2.3 From 03c9c4da848b4e75055828a6d8df1d64d382928a Mon Sep 17 00:00:00 2001 From: "Twisted Laws twisted_laws@hotmail.com" Date: Wed, 9 Mar 2011 17:59:59 -0500 Subject: STORM-954 patch correction --- indra/newview/llworld.cpp | 65 ++++++++++++++++++++--------------------------- 1 file changed, 27 insertions(+), 38 deletions(-) diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index 8f7197c607..8ace747d60 100644 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -1454,59 +1454,48 @@ void LLWorld::getAvatars(uuid_vec_t* avatar_ids, std::vector* positi { positions->clear(); } - for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); - iter != LLWorld::getInstance()->getRegionList().end(); ++iter) + // get the list of avatars from the character list first, so distances are correct + // when agent is above 1020m and other avatars are nearby + for (std::vector::iterator iter = LLCharacter::sInstances.begin(); + iter != LLCharacter::sInstances.end(); ++iter) { - LLViewerRegion* regionp = *iter; - const LLVector3d& origin_global = regionp->getOriginGlobal(); - S32 count = regionp->mMapAvatars.count(); - for (S32 i = 0; i < count; i++) + LLVOAvatar* pVOAvatar = (LLVOAvatar*) *iter; + if(!pVOAvatar->isDead() && !pVOAvatar->isSelf()) { - LLVector3d pos_global = unpackLocalToGlobalPosition(regionp->mMapAvatars.get(i), origin_global); - if(dist_vec(pos_global, relative_to) <= radius) + LLUUID uuid = pVOAvatar->getID(); + if(!uuid.isNull()) { - if(positions != NULL) - { - positions->push_back(pos_global); - } - if(avatar_ids != NULL) + LLVector3d pos_global = pVOAvatar->getPositionGlobal(); + if(dist_vec(pos_global, relative_to) <= radius) { - avatar_ids->push_back(regionp->mMapAvatarIDs.get(i)); + if(positions != NULL) + positions->push_back(pos_global); + if(avatar_ids !=NULL) + avatar_ids->push_back(uuid); } } } } - // retrieve the list of close avatars from viewer objects as well - // for when we are above 1000m, only do this when we are retrieving - // uuid's too as there could be duplicates - if(avatar_ids != NULL) + // region avatars added for situations where radius is greater than RenderFarClip + for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); + iter != LLWorld::getInstance()->getRegionList().end(); ++iter) { - for (std::vector::iterator iter = LLCharacter::sInstances.begin(); - iter != LLCharacter::sInstances.end(); ++iter) + LLViewerRegion* regionp = *iter; + const LLVector3d& origin_global = regionp->getOriginGlobal(); + S32 count = regionp->mMapAvatars.count(); + for (S32 i = 0; i < count; i++) { - LLVOAvatar* pVOAvatar = (LLVOAvatar*) *iter; - if(pVOAvatar->isDead() || pVOAvatar->isSelf()) - continue; - LLUUID uuid = pVOAvatar->getID(); - if(uuid.isNull()) - continue; - LLVector3d pos_global = pVOAvatar->getPositionGlobal(); + LLVector3d pos_global = unpackLocalToGlobalPosition(regionp->mMapAvatars.get(i), origin_global); if(dist_vec(pos_global, relative_to) <= radius) { - bool found = false; - uuid_vec_t::iterator sel_iter = avatar_ids->begin(); - for (; sel_iter != avatar_ids->end(); sel_iter++) - { - if(*sel_iter == uuid) - { - found = true; - break; - } - } - if(!found) + LLUUID uuid = regionp->mMapAvatarIDs.get(i); + // if this avatar doesn't already exist in the list, add it + if(uuid.notNull() && avatar_ids!=NULL && std::find(avatar_ids->begin(), avatar_ids->end(), uuid) == avatar_ids->end()) { if(positions != NULL) + { positions->push_back(pos_global); + } avatar_ids->push_back(uuid); } } -- cgit v1.2.3 From 4947062236f9abe280beac8ba8abea22f3d1d226 Mon Sep 17 00:00:00 2001 From: Andrew de Laix Date: Thu, 10 Mar 2011 00:48:20 +0000 Subject: update apr and sdl archives for linux; added new archive db (needed for linux only). --- autobuild.xml | 34 +++++++++++++++++++++++++++++----- indra/cmake/BerkeleyDB.cmake | 3 ++- indra/cmake/Copy3rdPartyLibs.cmake | 2 +- indra/cmake/LLWindow.cmake | 2 +- indra/newview/viewer_manifest.py | 5 ++++- 5 files changed, 37 insertions(+), 9 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 513cb76b5f..59d72cb9b6 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -66,9 +66,9 @@ archive hash - 1bd5be9e91ae1ae4a1cfa7649890f72b + 69ae3b1c9cdb0ebc0d0e1ac8413e3eb7 url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/SDL-1.2.12-linux-20101001.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-sdl/rev/223253/arch/Linux/installer/SDL-1.2.14-linux-20110309.tar.bz2 name linux @@ -102,9 +102,9 @@ archive hash - ae785a90f124aa572515fc7b97efc671 + ff62946c518a247c86e1066c1e9a5855 url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/apr_suite-1.2.8-linux-20100930.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-apr/rev/223260/arch/Linux/installer/apr_suite-1.4.2-linux-20110309.tar.bz2 name linux @@ -267,6 +267,30 @@ + db + + license + bsd + license_file + LICENSES/db.txt + name + db + platforms + + linux + + archive + + hash + 8f57c413e0786681cbcb9ed2fb8a6d37 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-db/rev/223263/arch/Linux/installer/db-5.1.25-linux-20110309.tar.bz2 + + name + linux + + + dbghelp license @@ -1977,7 +2001,7 @@ /build "/cfg=Release|Win32" - "/CL_ADD=/m:1" + "/CL_ADD=/m:1" configure diff --git a/indra/cmake/BerkeleyDB.cmake b/indra/cmake/BerkeleyDB.cmake index e3ca0fd77d..57b53f46ff 100644 --- a/indra/cmake/BerkeleyDB.cmake +++ b/indra/cmake/BerkeleyDB.cmake @@ -8,7 +8,8 @@ if (STANDALONE) else (STANDALONE) if (LINUX) # Need to add dependency pthread explicitely to support ld.gold. - set(DB_LIBRARIES db-4.2 pthread) + use_prebuilt_binary(db) + set(DB_LIBRARIES db-5.1 pthread) else (LINUX) set(DB_LIBRARIES db-4.2) endif (LINUX) diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index 43b0347aa9..81ce7852ff 100644 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -245,7 +245,7 @@ elseif(LINUX) libatk-1.0.so libbreakpad_client.so.0 libcrypto.so.0.9.7 - libdb-4.2.so + libdb-5.1.so libexpat.so libexpat.so.1 libgmock_main.so diff --git a/indra/cmake/LLWindow.cmake b/indra/cmake/LLWindow.cmake index a5b9cf47a4..b4bb9a078a 100644 --- a/indra/cmake/LLWindow.cmake +++ b/indra/cmake/LLWindow.cmake @@ -18,7 +18,7 @@ else (STANDALONE) use_prebuilt_binary(SDL) set (SDL_FOUND TRUE) set (SDL_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/i686-linux) - set (SDL_LIBRARY SDL) + set (SDL_LIBRARY SDL directfb fusion direct) endif (LINUX AND VIEWER) endif (STANDALONE) diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 9be3aa709b..68038121a0 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -934,12 +934,15 @@ class Linux_i686Manifest(LinuxManifest): self.path("libapr-1.so.0") self.path("libaprutil-1.so.0") self.path("libbreakpad_client.so.0.0.0", "libbreakpad_client.so.0") - self.path("libdb-4.2.so") + self.path("libdb-5.1.so") self.path("libcrypto.so.0.9.7") self.path("libexpat.so.1") self.path("libssl.so.0.9.7") self.path("libuuid.so.1") self.path("libSDL-1.2.so.0") + self.path("libdirectfb-1.4.so.5") + self.path("libfusion-1.4.so.5") + self.path("libdirect-1.4.so.5") self.path("libELFIO.so") self.path("libopenjpeg.so.1.3.0", "libopenjpeg.so.1.3") self.path("libalut.so") -- cgit v1.2.3 From b9a9b0017dd4714cbca4b0ddb69ed5e6b2f09528 Mon Sep 17 00:00:00 2001 From: brad kittenbrink Date: Wed, 9 Mar 2011 17:01:08 -0800 Subject: Fix for "doubleton" error using LLInstanceTracker across shared library boundaries. --- indra/llcommon/CMakeLists.txt | 1 + indra/llcommon/llinstancetracker.cpp | 17 ++++++++++++++--- indra/llcommon/llinstancetracker.h | 30 ++++++++++++++++++------------ 3 files changed, 33 insertions(+), 15 deletions(-) diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index dc9f93df3b..4f7e2f4c0d 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -62,6 +62,7 @@ set(llcommon_SOURCE_FILES llformat.cpp llframetimer.cpp llheartbeat.cpp + llinstancetracker.cpp llliveappconfig.cpp lllivefile.cpp lllog.cpp diff --git a/indra/llcommon/llinstancetracker.cpp b/indra/llcommon/llinstancetracker.cpp index 89bc6cca39..f576204511 100644 --- a/indra/llcommon/llinstancetracker.cpp +++ b/indra/llcommon/llinstancetracker.cpp @@ -32,6 +32,17 @@ // external library headers // other Linden headers -// llinstancetracker.h is presently header-only. This file exists only because our CMake -// test macro ADD_BUILD_TEST requires it. -int dummy = 0; +//static +void * & LLInstanceTrackerBase::getInstances(std::type_info const & info) +{ + static std::map instances; + + std::string k = info.name(); + if(instances.find(k) == instances.end()) + { + instances[k] = NULL; + } + + return instances[k]; +} + diff --git a/indra/llcommon/llinstancetracker.h b/indra/llcommon/llinstancetracker.h index 4945461d62..b971b2f914 100644 --- a/indra/llcommon/llinstancetracker.h +++ b/indra/llcommon/llinstancetracker.h @@ -37,14 +37,21 @@ #include #include +class LL_COMMON_API LLInstanceTrackerBase : public boost::noncopyable +{ + protected: + static void * & getInstances(std::type_info const & info); +}; + /// This mix-in class adds support for tracking all instances of the specified class parameter T /// The (optional) key associates a value of type KEY with a given instance of T, for quick lookup /// If KEY is not provided, then instances are stored in a simple set /// @NOTE: see explicit specialization below for default KEY==T* case template -class LLInstanceTracker : boost::noncopyable +class LLInstanceTracker : public LLInstanceTrackerBase { typedef typename std::map InstanceMap; + typedef LLInstanceTracker MyT; typedef boost::function KeyGetter; typedef boost::function InstancePtrGetter; public: @@ -99,25 +106,26 @@ private: static InstanceMap& getMap_() { - if (! sInstances) + void * & instances = getInstances(typeid(MyT)); + if (! instances) { - sInstances = new InstanceMap; + instances = new InstanceMap; } - return *sInstances; + return * static_cast(instances); } private: KEY mKey; - static InstanceMap* sInstances; }; /// explicit specialization for default case where KEY is T* /// use a simple std::set template -class LLInstanceTracker +class LLInstanceTracker : public LLInstanceTrackerBase { typedef typename std::set InstanceSet; + typedef LLInstanceTracker MyT; public: /// Dereferencing key_iter gives you a T* (since T* is the key) typedef typename InstanceSet::iterator key_iter; @@ -172,19 +180,17 @@ protected: static InstanceSet& getSet_() { - if (! sInstances) + void * & instances = getInstances(typeid(MyT)); + if (! instances) { - sInstances = new InstanceSet; + instances = new InstanceSet; } - return *sInstances; + return * static_cast(instances); } - static InstanceSet* sInstances; static S32 sIterationNestDepth; }; -template typename LLInstanceTracker::InstanceMap* LLInstanceTracker::sInstances = NULL; -template typename LLInstanceTracker::InstanceSet* LLInstanceTracker::sInstances = NULL; template S32 LLInstanceTracker::sIterationNestDepth = 0; #endif -- cgit v1.2.3 From 871677dc0bb391f05c3dadd34e7a41eec241e413 Mon Sep 17 00:00:00 2001 From: Andrew de Laix Date: Thu, 10 Mar 2011 01:31:40 +0000 Subject: ares archive updated for linux. --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 0a8742d99a..0e7a6b8ee3 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -150,9 +150,9 @@ archive hash - 3bf8f0f3c960cc594b2315b986b948fb + 0745872db83d45f4ab3bdc697d98e264 url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.7.1-linux-20100929.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-ares/rev/223275/arch/Linux/installer/ares-1.7.1-linux-20110310.tar.bz2 name linux -- cgit v1.2.3 From acec15e723c066efc6eb1e38c98b7af4e9993809 Mon Sep 17 00:00:00 2001 From: Andrew de Laix Date: Thu, 10 Mar 2011 17:53:15 +0000 Subject: update boost archive usage for linux. --- autobuild.xml | 4 ++-- indra/cmake/Boost.cmake | 9 +-------- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 0e7a6b8ee3..c85a273a99 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -198,9 +198,9 @@ archive hash - cb7cbafb06b878adf423db314b1787df + a34e7fffdb94a6a4d8a2966b1f216da3 url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-linux-20100929a.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-boost/rev/223302/arch/Linux/installer/boost-1.45.0-linux-20110310.tar.bz2 name linux diff --git a/indra/cmake/Boost.cmake b/indra/cmake/Boost.cmake index 67dc9f0891..2135f0584c 100644 --- a/indra/cmake/Boost.cmake +++ b/indra/cmake/Boost.cmake @@ -49,17 +49,10 @@ else (STANDALONE) optimized libboost_filesystem-vc100-mt-${BOOST_VERSION} debug libboost_filesystem-vc100-mt-gd-${BOOST_VERSION}) endif (MSVC80) - elseif (DARWIN) + elseif (DARWIN OR LINUX) set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options) set(BOOST_REGEX_LIBRARY boost_regex) -# set(BOOST_SIGNALS_LIBRARY boost_signals) set(BOOST_SYSTEM_LIBRARY boost_system) set(BOOST_FILESYSTEM_LIBRARY boost_filesystem) - elseif (LINUX) - set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options-gcc41-mt) - set(BOOST_REGEX_LIBRARY boost_regex-gcc41-mt) - set(BOOST_SIGNALS_LIBRARY boost_signals-gcc41-mt) - set(BOOST_SYSTEM_LIBRARY boost_system-gcc41-mt) - set(BOOST_FILESYSTEM_LIBRARY boost_filesystem-gcc41-mt) endif (WINDOWS) endif (STANDALONE) -- cgit v1.2.3 From 33fbb63227fb131d7a161f6fbde142a800995b73 Mon Sep 17 00:00:00 2001 From: Andrew de Laix Date: Thu, 10 Mar 2011 19:05:10 +0000 Subject: update curl archive for linux. --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index c85a273a99..df0e8047e4 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -246,9 +246,9 @@ archive hash - 49d4ac6773a585ad13190746db1e6e85 + 65ca0a9b42de855ea574e454ec2e14c3 url - http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-curl/rev/219379/arch/Linux/installer/curl-7.21.1-linux-20110121.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-curl/rev/220996/arch/Linux/installer/curl-7.21.1-linux-20110308.tar.bz2 name linux -- cgit v1.2.3 From 4a8e5d9df9c21884d172741d3a5aec7d94f3914f Mon Sep 17 00:00:00 2001 From: Andrew de Laix Date: Thu, 10 Mar 2011 21:51:13 +0000 Subject: update dbusglib archive for linux. --- autobuild.xml | 6 +++--- indra/cmake/DBusGlib.cmake | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index df0e8047e4..d5ee780629 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -320,7 +320,7 @@ license AFL2.1 license_file - LICENSES/dbusglib.txt + LICENSES/dbus-glib.txt name dbusglib platforms @@ -330,9 +330,9 @@ archive hash - bb9734fb6ae797e3fa34af1a4ef1ee7d + 94b058b9a81114dc4567bd78e4335425 url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/dbusglib-linux-20101013.tar.bz2 + http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/dbus_glib-0.76-linux-20110310.tar.bz2 name linux diff --git a/indra/cmake/DBusGlib.cmake b/indra/cmake/DBusGlib.cmake index 33c6343a93..83c08d3350 100644 --- a/indra/cmake/DBusGlib.cmake +++ b/indra/cmake/DBusGlib.cmake @@ -10,7 +10,7 @@ elseif (LINUX) use_prebuilt_binary(dbusglib) set(DBUSGLIB_FOUND ON FORCE BOOL) set(DBUSGLIB_INCLUDE_DIRS - ${LIBS_PREBUILT_DIR}/include/glib-2.0 + ${LIBS_PREBUILT_DIR}/include/dbus ) # We don't need to explicitly link against dbus-glib itself, because # the viewer probes for the system's copy at runtime. -- cgit v1.2.3 From b01b10bba3708b10440d59a7d0fd79430f5e37d7 Mon Sep 17 00:00:00 2001 From: Andrew de Laix Date: Thu, 10 Mar 2011 22:43:33 +0000 Subject: remove ELFIO cruft; no longer needed now that we use google breakpad. --- indra/cmake/CMakeLists.txt | 3 --- indra/cmake/ELFIO.cmake | 19 ------------------- indra/newview/CMakeLists.txt | 3 --- indra/newview/viewer_manifest.py | 1 - 4 files changed, 26 deletions(-) delete mode 100644 indra/cmake/ELFIO.cmake diff --git a/indra/cmake/CMakeLists.txt b/indra/cmake/CMakeLists.txt index 9ef49db07d..89c1c3691a 100644 --- a/indra/cmake/CMakeLists.txt +++ b/indra/cmake/CMakeLists.txt @@ -20,7 +20,6 @@ set(cmake_SOURCE_FILES CSharpMacros.cmake DBusGlib.cmake DirectX.cmake - ELFIO.cmake EXPAT.cmake FindAPR.cmake FindBerkeleyDB.cmake @@ -29,8 +28,6 @@ set(cmake_SOURCE_FILES FindFMOD.cmake FindGooglePerfTools.cmake FindMono.cmake -# MT deprecated in VS2010 -# FindMT.cmake FindMySQL.cmake FindOpenJPEG.cmake FindXmlRpcEpi.cmake diff --git a/indra/cmake/ELFIO.cmake b/indra/cmake/ELFIO.cmake deleted file mode 100644 index e51993b0f7..0000000000 --- a/indra/cmake/ELFIO.cmake +++ /dev/null @@ -1,19 +0,0 @@ -# -*- cmake -*- -include(Prebuilt) - -set(ELFIO_FIND_QUIETLY ON) - -if (STANDALONE) - include(FindELFIO) -elseif (LINUX) - use_prebuilt_binary(elfio) - set(ELFIO_LIBRARIES ELFIO) - set(ELFIO_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include) - set(ELFIO_FOUND "YES") -endif (STANDALONE) - -if (ELFIO_FOUND) - add_definitions(-DLL_ELFBIN=1) -else (ELFIO_FOUND) - set(ELFIO_INCLUDE_DIR "") -endif (ELFIO_FOUND) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 3c24006fb8..4c8b3e84a2 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -9,7 +9,6 @@ include(DBusGlib) include(DirectX) include(OpenSSL) include(DragDrop) -include(ELFIO) include(EXPAT) include(FMOD) include(OPENAL) @@ -45,7 +44,6 @@ include(CMakeCopyIfDifferent) include_directories( ${DBUSGLIB_INCLUDE_DIRS} - ${ELFIO_INCLUDE_DIR} ${JSONCPP_INCLUDE_DIRS} ${LLAUDIO_INCLUDE_DIRS} ${LLCHARACTER_INCLUDE_DIRS} @@ -1685,7 +1683,6 @@ target_link_libraries(${VIEWER_BINARY_NAME} ${WINDOWS_LIBRARIES} ${EXPAT_LIBRARIES} ${XMLRPCEPI_LIBRARIES} - ${ELFIO_LIBRARIES} ${OPENSSL_LIBRARIES} ${CRYPTO_LIBRARIES} ${LLLOGIN_LIBRARIES} diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 39fd2d8886..dd347c2778 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -943,7 +943,6 @@ class Linux_i686Manifest(LinuxManifest): self.path("libdirectfb-1.4.so.5") self.path("libfusion-1.4.so.5") self.path("libdirect-1.4.so.5") - self.path("libELFIO.so") self.path("libopenjpeg.so.1.3.0", "libopenjpeg.so.1.3") self.path("libalut.so") self.path("libopenal.so", "libopenal.so.1") -- cgit v1.2.3 From f3c54b503a8b2c55dd97e7741f917c972640fc50 Mon Sep 17 00:00:00 2001 From: Andrew de Laix Date: Thu, 10 Mar 2011 22:55:22 +0000 Subject: update expat archive for linux. --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index d5ee780629..8ca816db63 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -390,9 +390,9 @@ archive hash - 7c334794bba026685f967734ca963c85 + 9bd79781b58e556ab1c36084ec4a1c0c url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/expat-1.95.8-linux-20100929.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-expat/rev/221695/arch/Linux/installer/expat-2.0.1-linux-20110219.tar.bz2 name linux -- cgit v1.2.3 From 2ed71097ab67f84b67e575fbcbf790a1a8c56f6d Mon Sep 17 00:00:00 2001 From: Andrew de Laix Date: Fri, 11 Mar 2011 00:16:23 +0000 Subject: fmod archive updated for linux. --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 8ca816db63..89dcadbcce 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -438,9 +438,9 @@ archive hash - 221ec16b66ea2b0d1acb3247ad984bc4 + 0c61d643db54d2e5999be8254569d8b3 url - scp:install-packages.lindenlab.com:/local/www/install-packages/doc/fmod-3.75-linux-20100929.tar.bz2 + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-fmod-private/rev/221852/arch/Linux/installer/fmod-3.75-linux-20110223.tar.bz2 name linux -- cgit v1.2.3 From 353c54d6682614ad62d73ace66146602d6682584 Mon Sep 17 00:00:00 2001 From: Andrew de Laix Date: Fri, 11 Mar 2011 00:27:44 +0000 Subject: update fontconfig archive for linux. --- autobuild.xml | 4 ++-- indra/cmake/Copy3rdPartyLibs.cmake | 1 + indra/newview/viewer_manifest.py | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 89dcadbcce..c326023c51 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -474,9 +474,9 @@ archive hash - 9ebba6e0a1730992fa0643566f4e23cf + d8b08b657247566bde5fd853c7622478 url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/fontconfig-2.2.3-linux-20100930.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-fontconfig/rev/223389/arch/Linux/installer/fontconfig-2.8.0-linux-20110311.tar.bz2 name linux diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index 81ce7852ff..c942fafabd 100644 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -261,6 +261,7 @@ elseif(LINUX) libtcmalloc.so libuuid.so.1 libssl.so.0.9.7 + libfontconfig.so.1.4.4 ) if (FMOD) diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index dd347c2778..055bff378d 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -947,6 +947,7 @@ class Linux_i686Manifest(LinuxManifest): self.path("libalut.so") self.path("libopenal.so", "libopenal.so.1") self.path("libopenal.so", "libvivoxoal.so.1") # vivox's sdk expects this soname + self.path("libfontconfig.so.1.4.4") try: self.path("libfmod-3.75.so") pass -- cgit v1.2.3 From 44543756d8b7a9adbaa194697b2ca45e798e1406 Mon Sep 17 00:00:00 2001 From: Andrew de Laix Date: Fri, 11 Mar 2011 00:35:10 +0000 Subject: update freetype archive for linux. --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index c326023c51..bf3c9aa125 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -534,9 +534,9 @@ archive hash - a13ec6354d3a8a4576efcce895a74ceb + 9b58d1a9c15807a1301e42a313641010 url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.3.9-linux-2010-02-19a-20100929.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-freetype/rev/223377/arch/Linux/installer/freetype-2.4.4-linux-20110310.tar.bz2 name linux -- cgit v1.2.3 From 8c310339e281bc7344e6c7a7eb55cf5baa5debb4 Mon Sep 17 00:00:00 2001 From: Andrew de Laix Date: Fri, 11 Mar 2011 01:39:18 +0000 Subject: update google_breakpad archive for linux. --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index bf3c9aa125..ccab09a7ef 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -716,9 +716,9 @@ archive hash - 239e5be637bb6282a297a8636ef3c77e + 204b02a9480c411232255798839431a2 url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google_breakpad-0.0.0-rev599-linux-20110119a.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-breakpad/rev/223427/arch/Linux/installer/google_breakpad-0.0.0-rev599-linux-20110311.tar.bz2 name linux -- cgit v1.2.3 From d4d292258e31eee6d639106147758f39deae63e3 Mon Sep 17 00:00:00 2001 From: Ricky Curtice Date: Thu, 10 Mar 2011 22:07:06 -0800 Subject: Squared all dist_vec() based comparisons and other dist_vec() operations where sensible. Not all instances of dist_vec() were squared, only those where it wouldn't (hopefully) change the functionality. --- doc/contributions.txt | 1 + indra/llcharacter/llbvhloader.cpp | 6 +++--- indra/llmath/tests/llbbox_test.cpp | 2 +- indra/newview/llagent.cpp | 2 +- indra/newview/llfloaterchat.cpp | 5 +++-- indra/newview/llhudeffectlookat.cpp | 2 +- indra/newview/llhudeffectpointat.cpp | 2 +- indra/newview/llmaniprotate.cpp | 2 +- indra/newview/llmanipscale.cpp | 12 +++++------- indra/newview/llnetmap.cpp | 14 +++++++------- indra/newview/llpanelpeople.cpp | 4 ++-- indra/newview/llselectmgr.cpp | 8 +++++--- indra/newview/llspeakers.cpp | 2 +- indra/newview/llviewerchat.cpp | 10 ++++++---- indra/newview/llvoicevivox.cpp | 4 ++-- indra/newview/llworld.cpp | 6 ++++-- 16 files changed, 44 insertions(+), 38 deletions(-) diff --git a/doc/contributions.txt b/doc/contributions.txt index e94acb566a..9ba155eece 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -237,6 +237,7 @@ Coaldust Numbers VWR-1095 Cron Stardust VWR-10579 + VWR-25126 Cypren Christenson STORM-417 Dale Glass diff --git a/indra/llcharacter/llbvhloader.cpp b/indra/llcharacter/llbvhloader.cpp index 532a2c1b0d..a340bab6d3 100644 --- a/indra/llcharacter/llbvhloader.cpp +++ b/indra/llcharacter/llbvhloader.cpp @@ -1196,7 +1196,7 @@ void LLBVHLoader::optimize() if (ki_prev == ki_last_good_pos) { joint->mNumPosKeys++; - if (dist_vec(LLVector3(ki_prev->mPos), first_frame_pos) > POSITION_MOTION_THRESHOLD) + if (dist_vec_squared(LLVector3(ki_prev->mPos), first_frame_pos) > POSITION_MOTION_THRESHOLD * POSITION_MOTION_THRESHOLD) { pos_changed = TRUE; } @@ -1209,12 +1209,12 @@ void LLBVHLoader::optimize() LLVector3 current_pos(ki->mPos); LLVector3 interp_pos = lerp(current_pos, last_good_pos, 1.f / (F32)numPosFramesConsidered); - if (dist_vec(current_pos, first_frame_pos) > POSITION_MOTION_THRESHOLD) + if (dist_vec_squared(current_pos, first_frame_pos) > POSITION_MOTION_THRESHOLD * POSITION_MOTION_THRESHOLD) { pos_changed = TRUE; } - if (dist_vec(interp_pos, test_pos) < POSITION_KEYFRAME_THRESHOLD) + if (dist_vec_squared(interp_pos, test_pos) < POSITION_KEYFRAME_THRESHOLD * POSITION_KEYFRAME_THRESHOLD) { ki_prev->mIgnorePos = TRUE; numPosFramesConsidered++; diff --git a/indra/llmath/tests/llbbox_test.cpp b/indra/llmath/tests/llbbox_test.cpp index 8064ab217d..b9e1d29cd7 100644 --- a/indra/llmath/tests/llbbox_test.cpp +++ b/indra/llmath/tests/llbbox_test.cpp @@ -34,7 +34,7 @@ #define ANGLE (3.14159265f / 2.0f) -#define APPROX_EQUAL(a, b) dist_vec((a),(b)) < 1e-5 +#define APPROX_EQUAL(a, b) dist_vec_squared((a),(b)) < 1e-10 namespace tut { diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 7d908df5ce..4628adee1f 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -1343,7 +1343,7 @@ void LLAgent::stopAutoPilot(BOOL user_cancel) //NB: auto pilot can terminate for a reason other than reaching the destination if (mAutoPilotFinishedCallback) { - mAutoPilotFinishedCallback(!user_cancel && dist_vec(gAgent.getPositionGlobal(), mAutoPilotTargetGlobal) < mAutoPilotStopDistance, mAutoPilotCallbackData); + mAutoPilotFinishedCallback(!user_cancel && dist_vec_squared(gAgent.getPositionGlobal(), mAutoPilotTargetGlobal) < mAutoPilotStopDistance * mAutoPilotStopDistance, mAutoPilotCallbackData); } mLeaderID = LLUUID::null; diff --git a/indra/newview/llfloaterchat.cpp b/indra/newview/llfloaterchat.cpp index c2c2e7fe22..2679dbb78b 100644 --- a/indra/newview/llfloaterchat.cpp +++ b/indra/newview/llfloaterchat.cpp @@ -413,8 +413,9 @@ LLColor4 get_text_color(const LLChat& chat) if (!chat.mPosAgent.isExactlyZero()) { LLVector3 pos_agent = gAgent.getPositionAgent(); - F32 distance = dist_vec(pos_agent, chat.mPosAgent); - if (distance > gAgent.getNearChatRadius()) + F32 distance_squared = dist_vec_squared(pos_agent, chat.mPosAgent); + F32 dist_near_chat = gAgent.getNearChatRadius(); + if (distance_squared > dist_near_chat * dist_near_chat) { // diminish far-off chat text_color.mV[VALPHA] = 0.8f; diff --git a/indra/newview/llhudeffectlookat.cpp b/indra/newview/llhudeffectlookat.cpp index 8cf7d23f88..10ee6f1d39 100644 --- a/indra/newview/llhudeffectlookat.cpp +++ b/indra/newview/llhudeffectlookat.cpp @@ -416,7 +416,7 @@ BOOL LLHUDEffectLookAt::setLookAt(ELookAtType target_type, LLViewerObject *objec BOOL lookAtChanged = (target_type != mTargetType) || (object != mTargetObject); // lookat position has moved a certain amount and we haven't just sent an update - lookAtChanged = lookAtChanged || ((dist_vec(position, mLastSentOffsetGlobal) > MIN_DELTAPOS_FOR_UPDATE) && + lookAtChanged = lookAtChanged || ((dist_vec_squared(position, mLastSentOffsetGlobal) > MIN_DELTAPOS_FOR_UPDATE * MIN_DELTAPOS_FOR_UPDATE) && ((current_time - mLastSendTime) > (1.f / MAX_SENDS_PER_SEC))); if (lookAtChanged) diff --git a/indra/newview/llhudeffectpointat.cpp b/indra/newview/llhudeffectpointat.cpp index bfb0f150b3..562d7cd4ed 100644 --- a/indra/newview/llhudeffectpointat.cpp +++ b/indra/newview/llhudeffectpointat.cpp @@ -244,7 +244,7 @@ BOOL LLHUDEffectPointAt::setPointAt(EPointAtType target_type, LLViewerObject *ob BOOL targetTypeChanged = (target_type != mTargetType) || (object != mTargetObject); - BOOL targetPosChanged = (dist_vec(position, mLastSentOffsetGlobal) > MIN_DELTAPOS_FOR_UPDATE) && + BOOL targetPosChanged = (dist_vec_squared(position, mLastSentOffsetGlobal) > MIN_DELTAPOS_FOR_UPDATE * MIN_DELTAPOS_FOR_UPDATE) && ((current_time - mLastSendTime) > (1.f / MAX_SENDS_PER_SEC)); if (targetTypeChanged || targetPosChanged) diff --git a/indra/newview/llmaniprotate.cpp b/indra/newview/llmaniprotate.cpp index f1c7e952d1..815b718f33 100644 --- a/indra/newview/llmaniprotate.cpp +++ b/indra/newview/llmaniprotate.cpp @@ -1127,7 +1127,7 @@ BOOL LLManipRotate::updateVisiblity() if (gSavedSettings.getBOOL("LimitSelectDistance")) { F32 max_select_distance = gSavedSettings.getF32("MaxSelectDistance"); - if (dist_vec(gAgent.getPositionAgent(), center) > max_select_distance) + if (dist_vec_squared(gAgent.getPositionAgent(), center) > max_select_distance * max_select_distance) { visible = FALSE; } diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp index 060677f9f3..4f8e7e4792 100644 --- a/indra/newview/llmanipscale.cpp +++ b/indra/newview/llmanipscale.cpp @@ -217,8 +217,6 @@ void LLManipScale::render() LLVector3 center_agent = gAgent.getPosAgentFromGlobal(LLSelectMgr::getInstance()->getSelectionCenterGlobal()); - F32 range; - F32 range_from_agent; if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { mBoxHandleSize = BOX_HANDLE_BASE_SIZE * BOX_HANDLE_BASE_FACTOR / (F32) LLViewerCamera::getInstance()->getViewHeightInPixels(); @@ -226,25 +224,25 @@ void LLManipScale::render() } else { - range = dist_vec(gAgentCamera.getCameraPositionAgent(), center_agent); - range_from_agent = dist_vec(gAgent.getPositionAgent(), center_agent); + F32 range_squared = dist_vec_squared(gAgentCamera.getCameraPositionAgent(), center_agent); + F32 range_from_agent_squared = dist_vec_squared(gAgent.getPositionAgent(), center_agent); // Don't draw manip if object too far away if (gSavedSettings.getBOOL("LimitSelectDistance")) { F32 max_select_distance = gSavedSettings.getF32("MaxSelectDistance"); - if (range_from_agent > max_select_distance) + if (range_from_agent_squared > max_select_distance * max_select_distance) { return; } } - if (range > 0.001f) + if (range_squared > 0.00001f) { // range != zero F32 fraction_of_fov = BOX_HANDLE_BASE_SIZE / (F32) LLViewerCamera::getInstance()->getViewHeightInPixels(); F32 apparent_angle = fraction_of_fov * LLViewerCamera::getInstance()->getView(); // radians - mBoxHandleSize = range * tan(apparent_angle) * BOX_HANDLE_BASE_FACTOR; + mBoxHandleSize = fsqrtf(range_squared) * tan(apparent_angle) * BOX_HANDLE_BASE_FACTOR; } else { diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp index 93039d935d..394e0bf1f1 100644 --- a/indra/newview/llnetmap.cpp +++ b/indra/newview/llnetmap.cpp @@ -334,8 +334,8 @@ void LLNetMap::draw() //localMouse(&local_mouse_x, &local_mouse_y); LLUI::getMousePositionLocal(this, &local_mouse_x, &local_mouse_y); mClosestAgentToCursor.setNull(); - F32 closest_dist = F32_MAX; - F32 min_pick_dist = mDotRadius * MIN_PICK_SCALE; + F32 closest_dist_squared = F32_MAX; + F32 min_pick_dist_squared = (mDotRadius * MIN_PICK_SCALE) * (mDotRadius * MIN_PICK_SCALE); // Draw avatars for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); @@ -414,11 +414,11 @@ void LLNetMap::draw() } } - F32 dist_to_cursor = dist_vec(LLVector2(pos_map.mV[VX], pos_map.mV[VY]), + F32 dist_to_cursor_squared = dist_vec_squared(LLVector2(pos_map.mV[VX], pos_map.mV[VY]), LLVector2(local_mouse_x,local_mouse_y)); - if(dist_to_cursor < min_pick_dist && dist_to_cursor < closest_dist) + if(dist_to_cursor_squared < min_pick_dist_squared && dist_to_cursor_squared < closest_dist_squared) { - closest_dist = dist_to_cursor; + closest_dist_squared = dist_to_cursor_squared; mClosestAgentToCursor = regionp->mMapAvatarIDs.get(i); } } @@ -455,9 +455,9 @@ void LLNetMap::draw() dot_width, dot_width); - F32 dist_to_cursor = dist_vec(LLVector2(pos_map.mV[VX], pos_map.mV[VY]), + F32 dist_to_cursor_squared = dist_vec_squared(LLVector2(pos_map.mV[VX], pos_map.mV[VY]), LLVector2(local_mouse_x,local_mouse_y)); - if(dist_to_cursor < min_pick_dist && dist_to_cursor < closest_dist) + if(dist_to_cursor_squared < min_pick_dist_squared && dist_to_cursor_squared < closest_dist_squared) { mClosestAgentToCursor = gAgent.getID(); } diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index b52f33ec3b..dbfdf0bdf6 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -158,8 +158,8 @@ protected: const LLVector3d& me_pos = gAgent.getPositionGlobal(); const LLVector3d& item1_pos = mAvatarsPositions.find(item1->getAvatarId())->second; const LLVector3d& item2_pos = mAvatarsPositions.find(item2->getAvatarId())->second; - F32 dist1 = dist_vec(item1_pos, me_pos); - F32 dist2 = dist_vec(item2_pos, me_pos); + F32 dist1 = dist_vec_squared(item1_pos, me_pos); + F32 dist2 = dist_vec_squared(item2_pos, me_pos); return dist1 < dist2; } private: diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 50bc0b4a98..39f3cd4196 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -6577,12 +6577,14 @@ bool LLSelectMgr::selectionMove(const LLVector3& displ, { obj_pos = (*it)->getObject()->getPositionEdit(); - F32 obj_dist = dist_vec(obj_pos, LLViewerCamera::getInstance()->getOrigin()); - if (obj_dist < min_dist) + F32 obj_dist_squared = dist_vec_squared(obj_pos, LLViewerCamera::getInstance()->getOrigin()); + if (obj_dist_squared < min_dist) { - min_dist = obj_dist; + min_dist = obj_dist_squared; } } + // since the above uses squared values, take the square root. + min_dist = sqrt(min_dist); // factor the distance inside the displacement vector. This will get us // equally visible movements for both close and far away selections. diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp index 40aea05839..31492e33d9 100644 --- a/indra/newview/llspeakers.cpp +++ b/indra/newview/llspeakers.cpp @@ -920,7 +920,7 @@ void LLLocalSpeakerMgr::updateSpeakerList() if (speakerp->mStatus == LLSpeaker::STATUS_TEXT_ONLY) { LLVOAvatar* avatarp = (LLVOAvatar*)gObjectList.findObject(speaker_id); - if (!avatarp || dist_vec(avatarp->getPositionAgent(), gAgent.getPositionAgent()) > CHAT_NORMAL_RADIUS) + if (!avatarp || dist_vec_squared(avatarp->getPositionAgent(), gAgent.getPositionAgent()) > CHAT_NORMAL_RADIUS * CHAT_NORMAL_RADIUS) { setSpeakerNotInChannel(speakerp); } diff --git a/indra/newview/llviewerchat.cpp b/indra/newview/llviewerchat.cpp index 0af850a46b..7cce2831c9 100644 --- a/indra/newview/llviewerchat.cpp +++ b/indra/newview/llviewerchat.cpp @@ -87,8 +87,9 @@ void LLViewerChat::getChatColor(const LLChat& chat, LLColor4& r_color) if (!chat.mPosAgent.isExactlyZero()) { LLVector3 pos_agent = gAgent.getPositionAgent(); - F32 distance = dist_vec(pos_agent, chat.mPosAgent); - if (distance > gAgent.getNearChatRadius()) + F32 distance_squared = dist_vec_squared(pos_agent, chat.mPosAgent); + F32 dist_near_chat = gAgent.getNearChatRadius(); + if (distance_squared > dist_near_chat * dist_near_chat) { // diminish far-off chat r_color.mV[VALPHA] = 0.8f; @@ -152,8 +153,9 @@ void LLViewerChat::getChatColor(const LLChat& chat, std::string& r_color_name, F if (!chat.mPosAgent.isExactlyZero()) { LLVector3 pos_agent = gAgent.getPositionAgent(); - F32 distance = dist_vec(pos_agent, chat.mPosAgent); - if (distance > gAgent.getNearChatRadius()) + F32 distance_squared = dist_vec_squared(pos_agent, chat.mPosAgent); + F32 dist_near_chat = gAgent.getNearChatRadius(); + if (distance_squared > dist_near_chat * dist_near_chat) { // diminish far-off chat r_color_alpha = 0.8f; diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp index 08e242af8e..08581be38b 100644 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -5088,7 +5088,7 @@ void LLVivoxVoiceClient::enforceTether(void) } } - if(dist_vec(mCameraPosition, tethered) > 0.1) + if(dist_vec_squared(mCameraPosition, tethered) > 0.01) { mCameraPosition = tethered; mSpatialCoordsDirty = true; @@ -5150,7 +5150,7 @@ void LLVivoxVoiceClient::setCameraPosition(const LLVector3d &position, const LLV void LLVivoxVoiceClient::setAvatarPosition(const LLVector3d &position, const LLVector3 &velocity, const LLMatrix3 &rot) { - if(dist_vec(mAvatarPosition, position) > 0.1) + if(dist_vec_squared(mAvatarPosition, position) > 0.01) { mAvatarPosition = position; mSpatialCoordsDirty = true; diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index 8f7197c607..a21a7eac9e 100644 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -1446,6 +1446,8 @@ static LLVector3d unpackLocalToGlobalPosition(U32 compact_local, const LLVector3 void LLWorld::getAvatars(uuid_vec_t* avatar_ids, std::vector* positions, const LLVector3d& relative_to, F32 radius) const { + F32 radius_squared = radius * radius; + if(avatar_ids != NULL) { avatar_ids->clear(); @@ -1463,7 +1465,7 @@ void LLWorld::getAvatars(uuid_vec_t* avatar_ids, std::vector* positi for (S32 i = 0; i < count; i++) { LLVector3d pos_global = unpackLocalToGlobalPosition(regionp->mMapAvatars.get(i), origin_global); - if(dist_vec(pos_global, relative_to) <= radius) + if(dist_vec_squared(pos_global, relative_to) <= radius_squared) { if(positions != NULL) { @@ -1491,7 +1493,7 @@ void LLWorld::getAvatars(uuid_vec_t* avatar_ids, std::vector* positi if(uuid.isNull()) continue; LLVector3d pos_global = pVOAvatar->getPositionGlobal(); - if(dist_vec(pos_global, relative_to) <= radius) + if(dist_vec_squared(pos_global, relative_to) <= radius_squared) { bool found = false; uuid_vec_t::iterator sel_iter = avatar_ids->begin(); -- cgit v1.2.3 From d4427fafda6a56de3e6b8fb95e67dac05c189205 Mon Sep 17 00:00:00 2001 From: Andrew de Laix Date: Fri, 11 Mar 2011 19:17:14 +0000 Subject: package the exact shared library (manifest doesn't follow symlinks) --- indra/newview/viewer_manifest.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 055bff378d..0574d8c005 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -931,18 +931,18 @@ class Linux_i686Manifest(LinuxManifest): super(Linux_i686Manifest, self).construct() if self.prefix("../packages/lib/release", dst="lib"): - self.path("libapr-1.so.0") - self.path("libaprutil-1.so.0") - self.path("libbreakpad_client.so.0.0.0", "libbreakpad_client.so.0") + self.path("libapr-1.so.0.4.2") + self.path("libaprutil-1.so.0.3.10") + self.path("libbreakpad_client.so.0.0.0") self.path("libdb-5.1.so") self.path("libcrypto.so.0.9.7") - self.path("libexpat.so.1") + self.path("libexpat.so.1.5.2") self.path("libssl.so.0.9.7") self.path("libuuid.so.1") - self.path("libSDL-1.2.so.0") - self.path("libdirectfb-1.4.so.5") - self.path("libfusion-1.4.so.5") - self.path("libdirect-1.4.so.5") + self.path("libSDL-1.2.so.0.11.3") + self.path("libdirectfb-1.4.so.5.0.4") + self.path("libfusion-1.4.so.5.0.4") + self.path("libdirect-1.4.so.5.0.4") self.path("libopenjpeg.so.1.3.0", "libopenjpeg.so.1.3") self.path("libalut.so") self.path("libopenal.so", "libopenal.so.1") -- cgit v1.2.3 From 9603d73f1f0b13775aa50c08ca04d7711508f533 Mon Sep 17 00:00:00 2001 From: Andrew de Laix Date: Fri, 11 Mar 2011 19:32:18 +0000 Subject: update jpeglib archive for linux. --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index ccab09a7ef..155810452c 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -872,9 +872,9 @@ archive hash - a059a32904c1c7f47804d744ac2d4925 + fa1073ef1181f27e6bc01d571366070b url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-6b-linux-20100929.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-jpeglib/rev/222826/arch/Linux/installer/jpeglib-8c-linux-20110307.tar.bz2 name linux -- cgit v1.2.3 From 5b87c94fa7c2c991e2f225f0bc59614b8b32e4e0 Mon Sep 17 00:00:00 2001 From: Andrew de Laix Date: Fri, 11 Mar 2011 23:39:38 +0000 Subject: update kdu archive for linux. --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 155810452c..ab98824d56 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -968,9 +968,9 @@ archive hash - 9742279dfbe57be7a6aed12d60045459 + fbf8a4f78dff986d7c16b3a0437e033e url - scp:install-packages.lindenlab.com:/local/www/install-packages/doc/kdu-6.4.1-linux-20110119.tar.bz2 + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-kdu-private/rev/223538/arch/Linux/installer/kdu-6.4.1-linux-20110311.tar.bz2 name linux -- cgit v1.2.3 From fcdd82af83093a0e62200be7b1fc44e96fd76d57 Mon Sep 17 00:00:00 2001 From: Andrew de Laix Date: Fri, 11 Mar 2011 23:50:00 +0000 Subject: update libpng archive for linux. --- autobuild.xml | 4 ++-- indra/cmake/PNG.cmake | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index ab98824d56..b5c4894841 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1016,9 +1016,9 @@ archive hash - adeeca61be1b8f47ce85660c8c20a904 + 0681ab7e1988dfdbdad7dd9edb7760ee url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.2.35-linux-20100929.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-libpng/rev/221851/arch/Linux/installer/libpng-1.5.1-linux-20110223.tar.bz2 name linux diff --git a/indra/cmake/PNG.cmake b/indra/cmake/PNG.cmake index 60f749869a..913c575672 100644 --- a/indra/cmake/PNG.cmake +++ b/indra/cmake/PNG.cmake @@ -15,7 +15,7 @@ else (STANDALONE) set(PNG_LIBRARIES png15) set(PNG_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/libpng15) else() - set(PNG_LIBRARIES png12) - set(PNG_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/libpng12) + set(PNG_LIBRARIES png15) + set(PNG_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/libpng15) endif() endif (STANDALONE) -- cgit v1.2.3 From 9bac314ba0d8b6bd35c8d2e27ce99a28b924dea6 Mon Sep 17 00:00:00 2001 From: Ricky Curtice Date: Sat, 12 Mar 2011 23:39:10 -0800 Subject: Switched to using *_SQUARED constants instead of multiplied constants, and cleaned up a few other minor issues noted during review. --- indra/llcharacter/llbvhloader.cpp | 10 +++++----- indra/llcommon/indra_constants.h | 8 ++++++++ indra/newview/llagent.cpp | 2 +- indra/newview/llhudeffectlookat.cpp | 4 ++-- indra/newview/llhudeffectpointat.cpp | 4 ++-- indra/newview/llmaniprotate.cpp | 2 +- indra/newview/llmanipscale.cpp | 2 +- indra/newview/llnetmap.cpp | 2 +- indra/newview/llpanelpeople.cpp | 5 ++--- indra/newview/llselectmgr.cpp | 21 ++++++++++++--------- indra/newview/llspeakers.cpp | 2 +- indra/newview/llviewermessage.cpp | 3 ++- indra/newview/llviewerparceloverlay.cpp | 4 ++-- 13 files changed, 40 insertions(+), 29 deletions(-) diff --git a/indra/llcharacter/llbvhloader.cpp b/indra/llcharacter/llbvhloader.cpp index a340bab6d3..f3cf950afa 100644 --- a/indra/llcharacter/llbvhloader.cpp +++ b/indra/llcharacter/llbvhloader.cpp @@ -42,10 +42,10 @@ using namespace std; #define INCHES_TO_METERS 0.02540005f -const F32 POSITION_KEYFRAME_THRESHOLD = 0.03f; +const F32 POSITION_KEYFRAME_THRESHOLD_SQUARED = 0.03f * 0.03f; const F32 ROTATION_KEYFRAME_THRESHOLD = 0.01f; -const F32 POSITION_MOTION_THRESHOLD = 0.001f; +const F32 POSITION_MOTION_THRESHOLD_SQUARED = 0.001f * 0.001f; const F32 ROTATION_MOTION_THRESHOLD = 0.001f; char gInFile[1024]; /* Flawfinder: ignore */ @@ -1196,7 +1196,7 @@ void LLBVHLoader::optimize() if (ki_prev == ki_last_good_pos) { joint->mNumPosKeys++; - if (dist_vec_squared(LLVector3(ki_prev->mPos), first_frame_pos) > POSITION_MOTION_THRESHOLD * POSITION_MOTION_THRESHOLD) + if (dist_vec_squared(LLVector3(ki_prev->mPos), first_frame_pos) > POSITION_MOTION_THRESHOLD_SQUARED) { pos_changed = TRUE; } @@ -1209,12 +1209,12 @@ void LLBVHLoader::optimize() LLVector3 current_pos(ki->mPos); LLVector3 interp_pos = lerp(current_pos, last_good_pos, 1.f / (F32)numPosFramesConsidered); - if (dist_vec_squared(current_pos, first_frame_pos) > POSITION_MOTION_THRESHOLD * POSITION_MOTION_THRESHOLD) + if (dist_vec_squared(current_pos, first_frame_pos) > POSITION_MOTION_THRESHOLD_SQUARED) { pos_changed = TRUE; } - if (dist_vec_squared(interp_pos, test_pos) < POSITION_KEYFRAME_THRESHOLD * POSITION_KEYFRAME_THRESHOLD) + if (dist_vec_squared(interp_pos, test_pos) < POSITION_KEYFRAME_THRESHOLD_SQUARED) { ki_prev->mIgnorePos = TRUE; numPosFramesConsidered++; diff --git a/indra/llcommon/indra_constants.h b/indra/llcommon/indra_constants.h index 95cb606240..d0f287657e 100644 --- a/indra/llcommon/indra_constants.h +++ b/indra/llcommon/indra_constants.h @@ -312,6 +312,14 @@ const F32 CHAT_SHOUT_RADIUS = 100.f; const F32 CHAT_MAX_RADIUS = CHAT_SHOUT_RADIUS; const F32 CHAT_MAX_RADIUS_BY_TWO = CHAT_MAX_RADIUS / 2.f; +// squared editions of the above for distance checks +const F32 CHAT_WHISPER_RADIUS_SQUARED = CHAT_WHISPER_RADIUS * CHAT_WHISPER_RADIUS; +const F32 CHAT_NORMAL_RADIUS_SQUARED = CHAT_NORMAL_RADIUS * CHAT_NORMAL_RADIUS; +const F32 CHAT_SHOUT_RADIUS_SQUARED = CHAT_SHOUT_RADIUS * CHAT_SHOUT_RADIUS; +const F32 CHAT_MAX_RADIUS_SQUARED = CHAT_SHOUT_RADIUS_SQUARED; +const F32 CHAT_MAX_RADIUS_BY_TWO_SQUARED = CHAT_MAX_RADIUS_BY_TWO * CHAT_MAX_RADIUS_BY_TWO; + + // this times above gives barely audible radius const F32 CHAT_BARELY_AUDIBLE_FACTOR = 2.0f; diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 4628adee1f..f3f036a0d8 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -1343,7 +1343,7 @@ void LLAgent::stopAutoPilot(BOOL user_cancel) //NB: auto pilot can terminate for a reason other than reaching the destination if (mAutoPilotFinishedCallback) { - mAutoPilotFinishedCallback(!user_cancel && dist_vec_squared(gAgent.getPositionGlobal(), mAutoPilotTargetGlobal) < mAutoPilotStopDistance * mAutoPilotStopDistance, mAutoPilotCallbackData); + mAutoPilotFinishedCallback(!user_cancel && dist_vec_squared(gAgent.getPositionGlobal(), mAutoPilotTargetGlobal) < (mAutoPilotStopDistance * mAutoPilotStopDistance), mAutoPilotCallbackData); } mLeaderID = LLUUID::null; diff --git a/indra/newview/llhudeffectlookat.cpp b/indra/newview/llhudeffectlookat.cpp index 10ee6f1d39..882c0cf2e2 100644 --- a/indra/newview/llhudeffectlookat.cpp +++ b/indra/newview/llhudeffectlookat.cpp @@ -56,7 +56,7 @@ const S32 PKT_SIZE = 57; // throttle const F32 MAX_SENDS_PER_SEC = 4.f; -const F32 MIN_DELTAPOS_FOR_UPDATE = 0.05f; +const F32 MIN_DELTAPOS_FOR_UPDATE_SQUARED = 0.05f * 0.05f; const F32 MIN_TARGET_OFFSET_SQUARED = 0.0001f; @@ -416,7 +416,7 @@ BOOL LLHUDEffectLookAt::setLookAt(ELookAtType target_type, LLViewerObject *objec BOOL lookAtChanged = (target_type != mTargetType) || (object != mTargetObject); // lookat position has moved a certain amount and we haven't just sent an update - lookAtChanged = lookAtChanged || ((dist_vec_squared(position, mLastSentOffsetGlobal) > MIN_DELTAPOS_FOR_UPDATE * MIN_DELTAPOS_FOR_UPDATE) && + lookAtChanged = lookAtChanged || ((dist_vec_squared(position, mLastSentOffsetGlobal) > MIN_DELTAPOS_FOR_UPDATE_SQUARED) && ((current_time - mLastSendTime) > (1.f / MAX_SENDS_PER_SEC))); if (lookAtChanged) diff --git a/indra/newview/llhudeffectpointat.cpp b/indra/newview/llhudeffectpointat.cpp index 562d7cd4ed..28fe8e1c01 100644 --- a/indra/newview/llhudeffectpointat.cpp +++ b/indra/newview/llhudeffectpointat.cpp @@ -48,7 +48,7 @@ const S32 PKT_SIZE = 57; // throttle const F32 MAX_SENDS_PER_SEC = 4.f; -const F32 MIN_DELTAPOS_FOR_UPDATE = 0.05f; +const F32 MIN_DELTAPOS_FOR_UPDATE_SQUARED = 0.05f * 0.05f; // timeouts // can't use actual F32_MAX, because we add this to the current frametime @@ -244,7 +244,7 @@ BOOL LLHUDEffectPointAt::setPointAt(EPointAtType target_type, LLViewerObject *ob BOOL targetTypeChanged = (target_type != mTargetType) || (object != mTargetObject); - BOOL targetPosChanged = (dist_vec_squared(position, mLastSentOffsetGlobal) > MIN_DELTAPOS_FOR_UPDATE * MIN_DELTAPOS_FOR_UPDATE) && + BOOL targetPosChanged = (dist_vec_squared(position, mLastSentOffsetGlobal) > MIN_DELTAPOS_FOR_UPDATE_SQUARED) && ((current_time - mLastSendTime) > (1.f / MAX_SENDS_PER_SEC)); if (targetTypeChanged || targetPosChanged) diff --git a/indra/newview/llmaniprotate.cpp b/indra/newview/llmaniprotate.cpp index 815b718f33..6ee095475f 100644 --- a/indra/newview/llmaniprotate.cpp +++ b/indra/newview/llmaniprotate.cpp @@ -1127,7 +1127,7 @@ BOOL LLManipRotate::updateVisiblity() if (gSavedSettings.getBOOL("LimitSelectDistance")) { F32 max_select_distance = gSavedSettings.getF32("MaxSelectDistance"); - if (dist_vec_squared(gAgent.getPositionAgent(), center) > max_select_distance * max_select_distance) + if (dist_vec_squared(gAgent.getPositionAgent(), center) > (max_select_distance * max_select_distance)) { visible = FALSE; } diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp index 4f8e7e4792..9cdc092257 100644 --- a/indra/newview/llmanipscale.cpp +++ b/indra/newview/llmanipscale.cpp @@ -237,7 +237,7 @@ void LLManipScale::render() } } - if (range_squared > 0.00001f) + if (range_squared > 0.001f * 0.001f) { // range != zero F32 fraction_of_fov = BOX_HANDLE_BASE_SIZE / (F32) LLViewerCamera::getInstance()->getViewHeightInPixels(); diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp index 394e0bf1f1..bd4f152ded 100644 --- a/indra/newview/llnetmap.cpp +++ b/indra/newview/llnetmap.cpp @@ -334,7 +334,7 @@ void LLNetMap::draw() //localMouse(&local_mouse_x, &local_mouse_y); LLUI::getMousePositionLocal(this, &local_mouse_x, &local_mouse_y); mClosestAgentToCursor.setNull(); - F32 closest_dist_squared = F32_MAX; + F32 closest_dist_squared = F32_MAX; // value will be overridden in the loop F32 min_pick_dist_squared = (mDotRadius * MIN_PICK_SCALE) * (mDotRadius * MIN_PICK_SCALE); // Draw avatars diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index dbfdf0bdf6..e3a7b749ea 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -158,9 +158,8 @@ protected: const LLVector3d& me_pos = gAgent.getPositionGlobal(); const LLVector3d& item1_pos = mAvatarsPositions.find(item1->getAvatarId())->second; const LLVector3d& item2_pos = mAvatarsPositions.find(item2->getAvatarId())->second; - F32 dist1 = dist_vec_squared(item1_pos, me_pos); - F32 dist2 = dist_vec_squared(item2_pos, me_pos); - return dist1 < dist2; + + return dist_vec_squared(item1_pos, me_pos) < dist_vec_squared(item2_pos, me_pos); } private: id_to_pos_map_t mAvatarsPositions; diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 39f3cd4196..262c9a4515 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -6570,7 +6570,8 @@ bool LLSelectMgr::selectionMove(const LLVector3& displ, if (update_position) { // calculate the distance of the object closest to the camera origin - F32 min_dist = 1e+30f; + F32 min_dist_squared = F32_MAX; // value will be overridden in the loop + LLVector3 obj_pos; for (LLObjectSelection::root_iterator it = getSelection()->root_begin(); it != getSelection()->root_end(); ++it) @@ -6578,20 +6579,22 @@ bool LLSelectMgr::selectionMove(const LLVector3& displ, obj_pos = (*it)->getObject()->getPositionEdit(); F32 obj_dist_squared = dist_vec_squared(obj_pos, LLViewerCamera::getInstance()->getOrigin()); - if (obj_dist_squared < min_dist) + if (obj_dist_squared < min_dist_squared) { - min_dist = obj_dist_squared; + min_dist_squared = obj_dist_squared; } } - // since the above uses squared values, take the square root. - min_dist = sqrt(min_dist); + + // get the non-squared edition for use below + // note the use of fsqrtf, this was used in the definition of dist_vec() and is therefore re-used here + F32 min_dist = fsqrtf(min_dist_squared); // factor the distance inside the displacement vector. This will get us // equally visible movements for both close and far away selections. - min_dist = sqrt(min_dist) / 2; - displ_global.setVec(displ.mV[0]*min_dist, - displ.mV[1]*min_dist, - displ.mV[2]*min_dist); + F32 min_dist_factored = sqrt(min_dist) / 2; + displ_global.setVec(displ.mV[0]*min_dist_factored, + displ.mV[1]*min_dist_factored, + displ.mV[2]*min_dist_factored); // equates to: Displ_global = Displ * M_cam_axes_in_global_frame displ_global = LLViewerCamera::getInstance()->rotateToAbsolute(displ_global); diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp index 31492e33d9..c588bd8fb4 100644 --- a/indra/newview/llspeakers.cpp +++ b/indra/newview/llspeakers.cpp @@ -920,7 +920,7 @@ void LLLocalSpeakerMgr::updateSpeakerList() if (speakerp->mStatus == LLSpeaker::STATUS_TEXT_ONLY) { LLVOAvatar* avatarp = (LLVOAvatar*)gObjectList.findObject(speaker_id); - if (!avatarp || dist_vec_squared(avatarp->getPositionAgent(), gAgent.getPositionAgent()) > CHAT_NORMAL_RADIUS * CHAT_NORMAL_RADIUS) + if (!avatarp || dist_vec_squared(avatarp->getPositionAgent(), gAgent.getPositionAgent()) > CHAT_NORMAL_RADIUS_SQUARED) { setSpeakerNotInChannel(speakerp); } diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 947408f125..4dd5a3f6f1 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -122,6 +122,7 @@ // const F32 BIRD_AUDIBLE_RADIUS = 32.0f; const F32 SIT_DISTANCE_FROM_TARGET = 0.25f; +const F32 CAMERA_POSITION_THRESHOLD_SQUARED = 0.001f * 0.001f; static const F32 LOGOUT_REPLY_TIME = 3.f; // Wait this long after LogoutReply before quitting. // Determine how quickly residents' scripts can issue question dialogs @@ -4748,7 +4749,7 @@ void process_avatar_sit_response(LLMessageSystem *mesgsys, void **user_data) BOOL force_mouselook; mesgsys->getBOOLFast(_PREHASH_SitTransform, _PREHASH_ForceMouselook, force_mouselook); - if (isAgentAvatarValid() && dist_vec_squared(camera_eye, camera_at) > 0.0001f) + if (isAgentAvatarValid() && dist_vec_squared(camera_eye, camera_at) > CAMERA_POSITION_THRESHOLD_SQUARED) { gAgentCamera.setSitCamera(sitObjectID, camera_eye, camera_at); } diff --git a/indra/newview/llviewerparceloverlay.cpp b/indra/newview/llviewerparceloverlay.cpp index d07e06f6a7..26765bdd01 100644 --- a/indra/newview/llviewerparceloverlay.cpp +++ b/indra/newview/llviewerparceloverlay.cpp @@ -833,7 +833,7 @@ S32 LLViewerParcelOverlay::renderPropertyLines () U8* colorp; bool render_hidden = LLSelectMgr::sRenderHiddenSelections && LLFloaterReg::instanceVisible("build"); - const F32 PROPERTY_LINE_CLIP_DIST = 256.f; + const F32 PROPERTY_LINE_CLIP_DIST_SQUARED = 256.f * 256.f; for (i = 0; i < mVertexCount; i += vertex_per_edge) { @@ -844,7 +844,7 @@ S32 LLViewerParcelOverlay::renderPropertyLines () vertex.mV[VY] = *(vertexp+1); vertex.mV[VZ] = *(vertexp+2); - if (dist_vec_squared2D(vertex, camera_region) > PROPERTY_LINE_CLIP_DIST*PROPERTY_LINE_CLIP_DIST) + if (dist_vec_squared2D(vertex, camera_region) > PROPERTY_LINE_CLIP_DIST_SQUARED) { continue; } -- cgit v1.2.3 From c41d9949d797312626d44c639766b285111d608b Mon Sep 17 00:00:00 2001 From: Andrew de Laix Date: Mon, 14 Mar 2011 20:01:31 +0000 Subject: update llqtwebkit usage. --- autobuild.xml | 4 ++-- indra/cmake/WebKitLibPlugin.cmake | 4 ---- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index b5c4894841..2848a7e0f7 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1112,9 +1112,9 @@ archive hash - c05a33ee8b6f253b5a744596dfc3707d + f53e2a255d4c4039203de3e4640a2d41 url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-linux-qt4.6-20101013.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llqtwebkit/rev/223655/arch/Linux/installer/llqtwebkit-4.7.1-linux-20110314.tar.bz2 name linux diff --git a/indra/cmake/WebKitLibPlugin.cmake b/indra/cmake/WebKitLibPlugin.cmake index 1f5b0f5d84..8fb717cdb8 100644 --- a/indra/cmake/WebKitLibPlugin.cmake +++ b/indra/cmake/WebKitLibPlugin.cmake @@ -62,10 +62,6 @@ elseif (LINUX) else (STANDALONE) set(WEBKIT_PLUGIN_LIBRARIES llqtwebkit - - qgif - qjpeg - QtWebKit QtOpenGL QtNetwork -- cgit v1.2.3 From ec0c28ad8383dd6b342a317d15d44015fde15416 Mon Sep 17 00:00:00 2001 From: Andrew de Laix Date: Mon, 14 Mar 2011 20:24:55 +0000 Subject: update ogg-vorbis archive for linux. --- autobuild.xml | 4 ++-- indra/llaudio/llaudiodecodemgr.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 2848a7e0f7..5be2a6fa70 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1232,9 +1232,9 @@ archive hash - d4bda5baabfbfbd92ea7bd2a48c7fb8a + 17c000ceef32c0623d038b4c73791bee url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg-vorbis-1.2.0-linux-20100929.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-ogvorbis/rev/222841/arch/Linux/installer/ogg_vorbis-1.1.3-1.2.0-linux-20110307.tar.bz2 name linux diff --git a/indra/llaudio/llaudiodecodemgr.cpp b/indra/llaudio/llaudiodecodemgr.cpp index 84105ddfca..f0b44f97d2 100644 --- a/indra/llaudio/llaudiodecodemgr.cpp +++ b/indra/llaudio/llaudiodecodemgr.cpp @@ -680,7 +680,7 @@ BOOL LLAudioDecodeMgr::addDecodeRequest(const LLUUID &uuid) return FALSE; } -#ifdef LL_DARWIN +#if LL_DARWIN || LL_LINUX // HACK: to fool the compiler into not emitting unused warnings. namespace { const ov_callbacks callback_array[4] = {OV_CALLBACKS_DEFAULT, OV_CALLBACKS_NOCLOSE, OV_CALLBACKS_STREAMONLY, -- cgit v1.2.3 From 72d1febadb5f254eb7199bd26eb04a7553a6e55d Mon Sep 17 00:00:00 2001 From: Andrew de Laix Date: Mon, 14 Mar 2011 21:18:24 +0000 Subject: update openjpeg archive for linux. --- autobuild.xml | 4 ++-- indra/newview/viewer_manifest.py | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 5be2a6fa70..cdc724f571 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1368,9 +1368,9 @@ archive hash - c34975e8090d861c6e37ea606fd66940 + fb2382014c79e0049746e4e29bd834f9 url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.3-linux-20100929.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-openjpeg/rev/223705/arch/Linux/installer/openjpeg-1.4-linux-20110314.tar.bz2 name linux diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 0574d8c005..229055fdb7 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -943,7 +943,9 @@ class Linux_i686Manifest(LinuxManifest): self.path("libdirectfb-1.4.so.5.0.4") self.path("libfusion-1.4.so.5.0.4") self.path("libdirect-1.4.so.5.0.4") - self.path("libopenjpeg.so.1.3.0", "libopenjpeg.so.1.3") + self.path("libopenjpeg.so.1.4.0") + self.path("libopenjpeg.so.1") + self.path("libopenjpeg.so") self.path("libalut.so") self.path("libopenal.so", "libopenal.so.1") self.path("libopenal.so", "libvivoxoal.so.1") # vivox's sdk expects this soname -- cgit v1.2.3 From 17343b76dfc9351c6a7dc109ea11327306d250cc Mon Sep 17 00:00:00 2001 From: Andrew de Laix Date: Mon, 14 Mar 2011 22:43:09 +0000 Subject: update openssl archive for linux. --- autobuild.xml | 6 +++--- indra/cmake/Copy3rdPartyLibs.cmake | 4 ++-- indra/newview/viewer_manifest.py | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index cdc724f571..02da077faa 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1258,7 +1258,7 @@ license openSSL license_file - LICENSES/openSSL.txt + LICENSES/openssl.txt name openSSL platforms @@ -1280,9 +1280,9 @@ archive hash - 511cf1c200efe587552b8225dd361dbb + cc159598ef3fcd34fd33a8a0ef846165 url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.7c-linux-20100930.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-openssl/rev/223711/arch/Linux/installer/openssl-0.9.8q-linux-20110314.tar.bz2 name linux diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index c942fafabd..f1584ff0c4 100644 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -244,7 +244,7 @@ elseif(LINUX) libaprutil-1.so.0 libatk-1.0.so libbreakpad_client.so.0 - libcrypto.so.0.9.7 + libcrypto.so.0.9.8 libdb-5.1.so libexpat.so libexpat.so.1 @@ -260,7 +260,7 @@ elseif(LINUX) libstacktrace.so libtcmalloc.so libuuid.so.1 - libssl.so.0.9.7 + libssl.so.0.9.8 libfontconfig.so.1.4.4 ) diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 229055fdb7..addaafa494 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -935,9 +935,9 @@ class Linux_i686Manifest(LinuxManifest): self.path("libaprutil-1.so.0.3.10") self.path("libbreakpad_client.so.0.0.0") self.path("libdb-5.1.so") - self.path("libcrypto.so.0.9.7") + self.path("libcrypto.so.0.9.8") self.path("libexpat.so.1.5.2") - self.path("libssl.so.0.9.7") + self.path("libssl.so.0.9.8") self.path("libuuid.so.1") self.path("libSDL-1.2.so.0.11.3") self.path("libdirectfb-1.4.so.5.0.4") -- cgit v1.2.3 From f1f57ed5acb0d77d99b75e2021a51ab7d752d21f Mon Sep 17 00:00:00 2001 From: Andrew de Laix Date: Mon, 14 Mar 2011 23:03:41 +0000 Subject: update xmlrpc-epi archive for linux. --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 02da077faa..11962ce4d7 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1536,9 +1536,9 @@ archive hash - 3580c3729a034adff005a234f3ce6e84 + 174ab797440157956eda7061dae37564 url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/xmlrpc-epi-0.51-linux-20100929.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-xmlrpc-epi/rev/223735/arch/Linux/installer/xmlrpc_epi-0.54.1-linux-20110314.tar.bz2 name linux -- cgit v1.2.3 From e25c56dd670dabf89e189ee76e25d7df3bdf59e6 Mon Sep 17 00:00:00 2001 From: Andrew de Laix Date: Mon, 14 Mar 2011 23:25:23 +0000 Subject: update zlib archive for linux. --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 11962ce4d7..e060cc1bd6 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1584,9 +1584,9 @@ archive hash - 7e2818075e89f0729e869a244eafbbf7 + 7b4cf3aa2c04937d0a20761516587896 url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/zlib-1.2.3dfsg-linux-20100929.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-zlib/rev/223739/arch/Linux/installer/zlib-1.2.5-linux-20110314.tar.bz2 name linux -- cgit v1.2.3 From e594d2585c291206a6f355868a7defa1bfb2c3db Mon Sep 17 00:00:00 2001 From: Merov Linden Date: Mon, 14 Mar 2011 21:00:27 -0700 Subject: Fix for Mac Debug build: no special debug libs for cares and jpeg libs --- indra/cmake/CARes.cmake | 5 +---- indra/cmake/JPEG.cmake | 5 +---- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/indra/cmake/CARes.cmake b/indra/cmake/CARes.cmake index 1850b706ac..a902b9d623 100644 --- a/indra/cmake/CARes.cmake +++ b/indra/cmake/CARes.cmake @@ -13,10 +13,7 @@ else (STANDALONE) if (WINDOWS) set(CARES_LIBRARIES areslib) elseif (DARWIN) - set(CARES_LIBRARIES - optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libcares.a - debug ${ARCH_PREBUILT_DIRS_DEBUG}/libcares.a - ) + set(CARES_LIBRARIES libcares.a) else (WINDOWS) set(CARES_LIBRARIES cares) endif (WINDOWS) diff --git a/indra/cmake/JPEG.cmake b/indra/cmake/JPEG.cmake index 9514d59f64..6fa5f68935 100644 --- a/indra/cmake/JPEG.cmake +++ b/indra/cmake/JPEG.cmake @@ -12,10 +12,7 @@ else (STANDALONE) if (LINUX) set(JPEG_LIBRARIES jpeg) elseif (DARWIN) - set(JPEG_LIBRARIES - optimized ${ARCH_PREBUILT_DIRS_RELEASE}/liblljpeg.a - debug ${ARCH_PREBUILT_DIRS_DEBUG}/liblljpeg.a - ) + set(JPEG_LIBRARIES liblljpeg.a) elseif (WINDOWS) set(JPEG_LIBRARIES jpeglib) endif (LINUX) -- cgit v1.2.3 From 72fd8c2ec428cea667af6fdb360d8f68f6af6d6d Mon Sep 17 00:00:00 2001 From: Merov Linden Date: Mon, 14 Mar 2011 23:57:57 -0700 Subject: Fix Mac Json cmake script --- indra/cmake/JsonCpp.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/cmake/JsonCpp.cmake b/indra/cmake/JsonCpp.cmake index 9024fa92a7..644b417e17 100644 --- a/indra/cmake/JsonCpp.cmake +++ b/indra/cmake/JsonCpp.cmake @@ -14,7 +14,7 @@ else (STANDALONE) debug json_vc100debug_libmt.lib optimized json_vc100_libmt) elseif (DARWIN) - set(JSONCPP_LIBRARIES libjson_linux-gcc-4.0.1_libmt.a) + set(JSONCPP_LIBRARIES libjson_darwin_libmt.a) elseif (LINUX) set(JSONCPP_LIBRARIES libjsoncpp.a) endif (WINDOWS) -- cgit v1.2.3 From f1b1dbaba54ce678e6ec5311d4b50ded3f91d58c Mon Sep 17 00:00:00 2001 From: Seth ProductEngine Date: Tue, 15 Mar 2011 18:23:20 +0200 Subject: STORM-250 FIXED "More" link being toggled in expandable textbox after reshaping. --- indra/newview/llexpandabletextbox.cpp | 33 ++++++++++++++++++--------------- indra/newview/llexpandabletextbox.h | 6 ++++++ 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp index 5e10f60aba..5501b8c2ac 100644 --- a/indra/newview/llexpandabletextbox.cpp +++ b/indra/newview/llexpandabletextbox.cpp @@ -123,10 +123,7 @@ void LLExpandableTextBox::LLTextBoxEx::reshape(S32 width, S32 height, BOOL calle { LLTextEditor::reshape(width, height, called_from_parent); - if (getTextPixelHeight() > getRect().getHeight()) - { - showExpandText(); - } + hideOrShowExpandTextAsNeeded(); } void LLExpandableTextBox::LLTextBoxEx::setText(const LLStringExplicit& text,const LLStyle::Params& input_params) @@ -136,17 +133,7 @@ void LLExpandableTextBox::LLTextBoxEx::setText(const LLStringExplicit& text,cons mExpanderVisible = false; LLTextEditor::setText(text, input_params); - // text contents have changed, segments are cleared out - // so hide the expander and determine if we need it - //mExpanderVisible = false; - if (getTextPixelHeight() > getRect().getHeight()) - { - showExpandText(); - } - else - { - hideExpandText(); - } + hideOrShowExpandTextAsNeeded(); } @@ -200,6 +187,22 @@ S32 LLExpandableTextBox::LLTextBoxEx::getTextPixelHeight() return getTextBoundingRect().getHeight(); } +void LLExpandableTextBox::LLTextBoxEx::hideOrShowExpandTextAsNeeded() +{ + // Restore the text box contents to calculate the text height properly, + // otherwise if a part of the text is hidden under "More" link + // getTextPixelHeight() returns only the height of currently visible text + // including the "More" link. See STORM-250. + hideExpandText(); + + // Show the expander a.k.a. "More" link if we need it, depending on text + // contents height. If not, keep it hidden. + if (getTextPixelHeight() > getRect().getHeight()) + { + showExpandText(); + } +} + ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llexpandabletextbox.h b/indra/newview/llexpandabletextbox.h index bce77225c4..f75ef954ff 100644 --- a/indra/newview/llexpandabletextbox.h +++ b/indra/newview/llexpandabletextbox.h @@ -77,6 +77,12 @@ protected: */ void hideExpandText(); + /** + * Shows the "More" link if the text is too high to be completely + * visible without expanding the text box. Hides that link otherwise. + */ + void hideOrShowExpandTextAsNeeded(); + protected: LLTextBoxEx(const Params& p); -- cgit v1.2.3 From 1de3c1e127706ebc6a16f152635d456dcd59c17f Mon Sep 17 00:00:00 2001 From: Andrew de Laix Date: Tue, 15 Mar 2011 18:12:43 +0000 Subject: update jsoncpp archive on linux. --- autobuild.xml | 4 ++-- indra/cmake/JsonCpp.cmake | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index e060cc1bd6..6dfa7671d3 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -920,9 +920,9 @@ archive hash - 7e6b2fc7ad4e12d94d01cc49c22c6f67 + 840cd9455638c0ea52c613cfddd07d5b url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jsoncpp-svn-r69-linux-20101013.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-jsoncpp/rev/223959/arch/Linux/installer/jsoncpp-0.5.0-linux-20110315.tar.bz2 name linux diff --git a/indra/cmake/JsonCpp.cmake b/indra/cmake/JsonCpp.cmake index 9024fa92a7..499b00fb44 100644 --- a/indra/cmake/JsonCpp.cmake +++ b/indra/cmake/JsonCpp.cmake @@ -16,7 +16,7 @@ else (STANDALONE) elseif (DARWIN) set(JSONCPP_LIBRARIES libjson_linux-gcc-4.0.1_libmt.a) elseif (LINUX) - set(JSONCPP_LIBRARIES libjsoncpp.a) + set(JSONCPP_LIBRARIES libjson_linux-gcc-4.1.3_libmt.a) endif (WINDOWS) set(JSONCPP_INCLUDE_DIRS "${LIBS_PREBUILT_DIR}/include/jsoncpp" "${LIBS_PREBUILT_DIR}/include/json") endif (STANDALONE) -- cgit v1.2.3 From 650dd40187d63eb892a313b12d431f6b485e2dde Mon Sep 17 00:00:00 2001 From: Andrew de Laix Date: Tue, 15 Mar 2011 19:58:25 +0000 Subject: update openal archive for linux. --- autobuild.xml | 4 ++-- indra/newview/viewer_manifest.py | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 6dfa7671d3..8e6ad226f3 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1316,11 +1316,11 @@ archive hash - fccdca18a950ac9363c6fb39118b80e1 + 30b9b33fb9320d9b6634e0dbb013b4e7 hash_algorithm md5 url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openal-3ad86a1c-linux-20110114.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-openal/rev/223977/arch/Linux/installer/openal-1.12.854-1.1.0-linux-20110315.tar.bz2 name linux diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index addaafa494..2b756c8dce 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -947,7 +947,11 @@ class Linux_i686Manifest(LinuxManifest): self.path("libopenjpeg.so.1") self.path("libopenjpeg.so") self.path("libalut.so") - self.path("libopenal.so", "libopenal.so.1") + self.path("libalut.so.0") + self.path("libalut.so.0.0.0") + self.path("libopenal.so") + self.path("libopenal.so.1") + self.path("libopenal.so.1.12.854") self.path("libopenal.so", "libvivoxoal.so.1") # vivox's sdk expects this soname self.path("libfontconfig.so.1.4.4") try: -- cgit v1.2.3 From cd8485f9c0535455142f7f979159dcf8027ae93c Mon Sep 17 00:00:00 2001 From: Andrew de Laix Date: Tue, 15 Mar 2011 20:54:22 +0000 Subject: update uuid archive for linux. --- autobuild.xml | 4 ++-- indra/cmake/Copy3rdPartyLibs.cmake | 2 +- indra/newview/viewer_manifest.py | 4 +++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 8e6ad226f3..11ffd12123 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1052,9 +1052,9 @@ archive hash - 2b64ea42d54583ab82f4936ce6ea2a3c + 873e8e99d29711df2efa30646dca1795 url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libuuid-linux-20100930.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-libuuid/rev/223995/arch/Linux/installer/uuid-1.6.2-linux-20110315.tar.bz2 name linux diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index f1584ff0c4..169502731d 100644 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -259,7 +259,7 @@ elseif(LINUX) libssl.so libstacktrace.so libtcmalloc.so - libuuid.so.1 + libuuid.so.16.0.22 libssl.so.0.9.8 libfontconfig.so.1.4.4 ) diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 2b756c8dce..dad0519a8a 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -938,7 +938,9 @@ class Linux_i686Manifest(LinuxManifest): self.path("libcrypto.so.0.9.8") self.path("libexpat.so.1.5.2") self.path("libssl.so.0.9.8") - self.path("libuuid.so.1") + self.path("libuuid.so") + self.path("libuuid.so.16") + self.path("libuuid.so.16.0.22") self.path("libSDL-1.2.so.0.11.3") self.path("libdirectfb-1.4.so.5.0.4") self.path("libfusion-1.4.so.5.0.4") -- cgit v1.2.3 From 1f5f03da389af871cdb5366051aeeac7f42294ab Mon Sep 17 00:00:00 2001 From: "Andrew A. de Laix" Date: Wed, 16 Mar 2011 09:05:20 -0700 Subject: fix hash for curl archive on darwin. --- autobuild.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/autobuild.xml b/autobuild.xml index 11ffd12123..7a05b01555 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -618,7 +618,7 @@ archive hash - 2bb7adabbd1fe2c7f99ddc4240842cc4 + bd2f84ef8bd308570e2e532a371dc2ef url http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-glui/rev/221069/arch/Darwin/installer/glui-2.36-darwin-20110309.tar.bz2 -- cgit v1.2.3 From 38bdbbd01921e008a5882739992fd8139ec9e1fb Mon Sep 17 00:00:00 2001 From: Andrew de Laix Date: Wed, 16 Mar 2011 16:06:47 +0000 Subject: rename google archive for linux to google-perftools and update to latest. --- autobuild.xml | 28 +++++++--------------------- indra/cmake/Copy3rdPartyLibs.cmake | 2 +- indra/cmake/GooglePerfTools.cmake | 3 +-- 3 files changed, 9 insertions(+), 24 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 11ffd12123..6bf06212a9 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -639,12 +639,14 @@ - google + google-perftools license - mit + bsd + license_file + LICENSES/google-perftools.txt name - google + google-perftools platforms linux @@ -652,29 +654,13 @@ archive hash - 7d9d1b6d32ee273df164f7b7d5f29848 - hash_algorithm - md5 + cf513fc2eec4a414cc804cf408932a45 url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google-0.0.0-linux-20110114.tar.bz2 + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-google-perftools/rev/224046/arch/Linux/installer/google_perftools-1.7-linux-20110315.tar.bz2 name linux - - version - 0.0.0 - - google-perftools - - license - bsd - license_file - LICENSES/google.txt - name - google-perftools - platforms - windows archive diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index 169502731d..e2b7d3b888 100644 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -257,8 +257,8 @@ elseif(LINUX) libopenal.so libopenjpeg.so libssl.so - libstacktrace.so libtcmalloc.so + libuuid.so.16 libuuid.so.16.0.22 libssl.so.0.9.8 libfontconfig.so.1.4.4 diff --git a/indra/cmake/GooglePerfTools.cmake b/indra/cmake/GooglePerfTools.cmake index 133ae14d2f..6c784a3a76 100644 --- a/indra/cmake/GooglePerfTools.cmake +++ b/indra/cmake/GooglePerfTools.cmake @@ -12,9 +12,8 @@ else (STANDALONE) set(GOOGLE_PERFTOOLS_FOUND "YES") endif (WINDOWS) if (LINUX) - use_prebuilt_binary(google) + use_prebuilt_binary(google-perftools) set(TCMALLOC_LIBRARIES tcmalloc) - set(STACKTRACE_LIBRARIES stacktrace) set(PROFILER_LIBRARIES profiler) set(GOOGLE_PERFTOOLS_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include) -- cgit v1.2.3 From c5ce29c871a28c90691eb7391a176c5e0cbead91 Mon Sep 17 00:00:00 2001 From: "Christian Goetze (CG)" Date: Wed, 16 Mar 2011 12:30:41 -0700 Subject: Comment out setting of TMP, do not recompute AUTOBUILD if it is already defined. --- build.sh | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/build.sh b/build.sh index 625a09009b..86693a6fdb 100755 --- a/build.sh +++ b/build.sh @@ -119,23 +119,26 @@ fi # First three parts only, $revision will be appended automatically. build_viewer_update_version_manager_version=`python scripts/get_version.py --viewer-version | sed 's/\.[0-9]*$//'` -export autobuild_dir="$here/../../../autobuild/bin/" -if [ -d "$autobuild_dir" ] +if [ -z "$AUTOBUILD" ] then - export AUTOBUILD="$autobuild_dir"autobuild - if [ -x "$AUTOBUILD" ] + export autobuild_dir="$here/../../../autobuild/bin/" + if [ -d "$autobuild_dir" ] then - # *HACK - bash doesn't know how to pass real pathnames to native windows python - case "$arch" in - CYGWIN) AUTOBUILD=$(cygpath -u $AUTOBUILD.cmd) ;; - esac + export AUTOBUILD="$autobuild_dir"autobuild + if [ -x "$AUTOBUILD" ] + then + # *HACK - bash doesn't know how to pass real pathnames to native windows python + case "$arch" in + CYGWIN) AUTOBUILD=$(cygpath -u $AUTOBUILD.cmd) ;; + esac + else + record_failure "Not executable: $AUTOBUILD" + exit 1 + fi else - record_failure "Not executable: $AUTOBUILD" + record_failure "Not found: $autobuild_dir" exit 1 fi -else - record_failure "Not found: $autobuild_dir" - exit 1 fi # load autbuild provided shell functions and variables @@ -166,7 +169,7 @@ do rm -rf "$build_dir" mkdir -p "$build_dir" mkdir -p "$build_dir/tmp" - export TMP="$build_dir/tmp" + #export TMP="$build_dir/tmp" if pre_build "$variant" "$build_dir" >> "$build_log" 2>&1 then if $build_link_parallel -- cgit v1.2.3 From 12a539c82db8b8a42c6a1fa7c692be39e26219f2 Mon Sep 17 00:00:00 2001 From: "Andrew A. de Laix" Date: Wed, 16 Mar 2011 13:53:06 -0700 Subject: update to latest curl library (linked to cares). --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 676fae6aa1..ff36c1c9bc 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -234,9 +234,9 @@ archive hash - 89b89ad923816317e1a3be963b406f27 + aaea644191807f51051cefa2fac11069 url - http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-curl/rev/219379/arch/Darwin/installer/curl-7.21.1-darwin-20110120.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-curl/rev/224181/arch/Darwin/installer/curl-7.21.1-darwin-20110316.tar.bz2 name darwin -- cgit v1.2.3 From 2e0543a168255b6577da2e39a1f9a39207028d23 Mon Sep 17 00:00:00 2001 From: Andrew de Laix Date: Wed, 16 Mar 2011 20:54:12 +0000 Subject: update linux to lates curl archive (linked to cares). --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 676fae6aa1..690d62235a 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -246,9 +246,9 @@ archive hash - 65ca0a9b42de855ea574e454ec2e14c3 + 2d9377951d99a1aa4735cea8d4b5aa71 url - http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-curl/rev/220996/arch/Linux/installer/curl-7.21.1-linux-20110308.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-curl/rev/224181/arch/Linux/installer/curl-7.21.1-linux-20110316.tar.bz2 name linux -- cgit v1.2.3 From 4b66f1e0134d3275e852e6387570d6bfe479a1e1 Mon Sep 17 00:00:00 2001 From: Andrew de Laix Date: Wed, 16 Mar 2011 22:06:01 +0000 Subject: package all breakpad symlinks for linux. --- indra/newview/viewer_manifest.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index dad0519a8a..f600cb42b0 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -934,6 +934,8 @@ class Linux_i686Manifest(LinuxManifest): self.path("libapr-1.so.0.4.2") self.path("libaprutil-1.so.0.3.10") self.path("libbreakpad_client.so.0.0.0") + self.path("libbreakpad_client.so.0") + self.path("libbreakpad_client.so") self.path("libdb-5.1.so") self.path("libcrypto.so.0.9.8") self.path("libexpat.so.1.5.2") -- cgit v1.2.3 From 4d11d30a3e241ccc52f099079f597a71142a187e Mon Sep 17 00:00:00 2001 From: brad kittenbrink Date: Wed, 16 Mar 2011 19:29:14 -0400 Subject: Updated BuildParams in prep for vs2010 project viewer. --- BuildParams | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/BuildParams b/BuildParams index ac64b834de..df569b65e0 100644 --- a/BuildParams +++ b/BuildParams @@ -238,6 +238,15 @@ viewer-asset-delivery-metrics.build_server_tests = false # autobuild viewers #============================================================================== viewer-autobuild.build_link_parallel = false + +#======================================== +# VS2010 +#======================================== +viewer-vs2010.viewer_channel = "Project Viewer - VS2010" +viewer-vs2010.login_channel = "Project Viewer - VS2010" +viewer-vs2010.viewer_grid = agni +viewer-vs2010.build_debug_release_separately = true +viewer-vs2010.build_viewer_update_version_manager = false viewer-vs2010.build_link_parallel = false # eof -- cgit v1.2.3 From fea0cefcb3442ca640a7f502ba59398d32de3dbf Mon Sep 17 00:00:00 2001 From: "Christian Goetze (CG)" Date: Wed, 16 Mar 2011 16:44:19 -0700 Subject: Add a more precise error check for "autobuild source_environment". --- build.sh | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/build.sh b/build.sh index 86693a6fdb..f0c5dc91fc 100755 --- a/build.sh +++ b/build.sh @@ -142,7 +142,16 @@ then fi # load autbuild provided shell functions and variables -eval "$("$AUTOBUILD" source_environment)" +if "$AUTOBUILD" source_environment > source_environment +then + . source_environment +else + # dump environment variables for debugging + env|sort + record_failure "autobuild source_environment failed" + cat source_environment >&3 + exit 1 +fi # dump environment variables for debugging env|sort -- cgit v1.2.3 From 6ee772bd424fa59b76c6174fd0fed8f76ff99c93 Mon Sep 17 00:00:00 2001 From: Merov Linden Date: Wed, 16 Mar 2011 18:09:00 -0700 Subject: Autobuild 2010: clean up argument passing for all configs --- autobuild.xml | 227 ++++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 159 insertions(+), 68 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 590c80f540..686ed466ef 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1609,10 +1609,6 @@ configure - arguments - - ../indra - command cmake options @@ -1630,10 +1626,6 @@ configure - arguments - - ../indra - command cmake options @@ -1651,10 +1643,6 @@ configure - arguments - - ../indra - command cmake options @@ -1672,10 +1660,6 @@ configure - arguments - - ../indra - command cmake options @@ -1693,10 +1677,6 @@ configure - arguments - - ../indra - command cmake options @@ -1714,10 +1694,6 @@ configure - arguments - - ../indra - command cmake options @@ -1735,10 +1711,6 @@ configure - arguments - - ../indra - command cmake options @@ -1759,10 +1731,6 @@ configure - arguments - - ../indra - command cmake options @@ -1783,10 +1751,6 @@ configure - arguments - - ../indra - command cmake options @@ -1804,10 +1768,6 @@ configure - arguments - - ../indra - command cmake options @@ -1852,6 +1812,10 @@ configure + arguments + + ../indra + options -G @@ -1878,6 +1842,10 @@ configure + arguments + + ../indra + options -G @@ -1904,6 +1872,10 @@ configure + arguments + + ../indra + options -G @@ -1930,6 +1902,10 @@ configure + arguments + + ../indra + options -G @@ -1956,6 +1932,10 @@ configure + arguments + + ../indra + options -G @@ -1982,6 +1962,10 @@ configure + arguments + + ../indra + options -G @@ -2008,6 +1992,10 @@ configure + arguments + + ../indra + options -G @@ -2041,6 +2029,10 @@ configure + arguments + + ../indra + options -G @@ -2076,6 +2068,10 @@ configure + arguments + + ../indra + options -G @@ -2111,6 +2107,10 @@ configure + arguments + + ../indra + options -G @@ -2136,6 +2136,10 @@ configure + arguments + + ../indra + options -G @@ -2161,6 +2165,10 @@ configure + arguments + + ../indra + options -G @@ -2186,6 +2194,10 @@ configure + arguments + + ../indra + options -G @@ -2211,6 +2223,10 @@ configure + arguments + + ../indra + options -G @@ -2236,6 +2252,10 @@ configure + arguments + + ../indra + options -G @@ -2261,6 +2281,10 @@ configure + arguments + + ../indra + options -G @@ -2286,6 +2310,10 @@ configure + arguments + + ../indra + options -G @@ -2313,6 +2341,10 @@ configure + arguments + + ../indra + options -G @@ -2361,10 +2393,22 @@ configure + arguments + + ..\indra + && + ..\indra\tools\vstool\VSTool.exe + --solution + SecondLife.sln + --config + Debug + --startup + secondlife-bin + options -G - "Visual Studio 8 2005" + "Visual Studio 10" -DSTANDALONE:BOOL=OFF -DINSTALL_PROPRIETARY=TRUE -DFMOD=TRUE @@ -2379,15 +2423,7 @@ arguments - ..\indra - && - ..\indra\tools\vstool\VSTool.exe - --solution SecondLife.sln - --config - Debug - --startup - secondlife-bin command devenv.com @@ -2399,6 +2435,18 @@ configure + arguments + + ..\indra + && + ..\indra\tools\vstool\VSTool.exe + --solution + SecondLife.sln + --config + Debug + --startup + secondlife-bin + options -G @@ -2429,6 +2477,10 @@ configure + arguments + + ../indra + options -G @@ -2459,6 +2511,10 @@ configure + arguments + + ../indra + options -G @@ -2475,17 +2531,8 @@ build - arguments - ..\indra - && - ..\indra\tools\vstool\VSTool.exe - --solution SecondLife.sln - --config - RelWithDebInfo - --startup - secondlife-bin command devenv.com @@ -2497,6 +2544,18 @@ configure + arguments + + ..\indra + && + ..\indra\tools\vstool\VSTool.exe + --solution + SecondLife.sln + --config + RelWithDebInfo + --startup + secondlife-bin + options -G @@ -2527,6 +2586,10 @@ configure + arguments + + ../indra + options -G @@ -2557,6 +2620,10 @@ configure + arguments + + ../indra + options -G @@ -2587,6 +2654,18 @@ configure + arguments + + ..\indra + && + ..\indra\tools\vstool\VSTool.exe + --solution + SecondLife.sln + --config + RelWithDebInfo + --startup + secondlife-bin + options -G @@ -2620,6 +2699,18 @@ configure + arguments + + ..\indra + && + ..\indra\tools\vstool\VSTool.exe + --solution + SecondLife.sln + --config + Release + --startup + secondlife-bin + options -G @@ -2635,6 +2726,16 @@ VCexpressRelWithDebInfo build + + command + vcbuild.exe + options + + /u + SecondLife.sln + + + configure arguments @@ -2648,16 +2749,6 @@ --startup secondlife-bin - command - vcbuild.exe - options - - /u - SecondLife.sln - - - configure - options -G -- cgit v1.2.3 From 399d0aa76422362dbd9371d8f24d3863d3cabdfa Mon Sep 17 00:00:00 2001 From: Merov Linden Date: Wed, 16 Mar 2011 18:30:50 -0700 Subject: Autobuild: fixes an xml error that made configure exit with error --- autobuild.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/autobuild.xml b/autobuild.xml index 686ed466ef..fe35a96882 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -2531,6 +2531,7 @@ build + arguments SecondLife.sln -- cgit v1.2.3 From 92a68f350479cb4319c13e6784fb60e9d9b6d355 Mon Sep 17 00:00:00 2001 From: Merov Linden Date: Wed, 16 Mar 2011 22:45:50 -0700 Subject: Autobuild: go back to ignoring errors on autobuild source_environment invocation for the moment --- build.sh | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/build.sh b/build.sh index f0c5dc91fc..e302d95e76 100755 --- a/build.sh +++ b/build.sh @@ -142,16 +142,19 @@ then fi # load autbuild provided shell functions and variables -if "$AUTOBUILD" source_environment > source_environment -then - . source_environment -else +# Merov: going back to the previous code that passes even if it fails catching a failure +# TODO: use the correct code here under and fix the llbase import in python code +#if "$AUTOBUILD" source_environment > source_environment +#then +# . source_environment +#else # dump environment variables for debugging - env|sort - record_failure "autobuild source_environment failed" - cat source_environment >&3 - exit 1 -fi +# env|sort +# record_failure "autobuild source_environment failed" +# cat source_environment >&3 +# exit 1 +#fi +eval "$("$AUTOBUILD" source_environment)" # dump environment variables for debugging env|sort -- cgit v1.2.3 From 1ce22e11fd5cca67bf7e8d42d11bff7f710cce93 Mon Sep 17 00:00:00 2001 From: brad kittenbrink Date: Thu, 17 Mar 2011 12:49:30 -0400 Subject: Removed trailing spaces that were breaking BuildParams parsing. --- BuildParams | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/BuildParams b/BuildParams index df569b65e0..dbaf7d67a2 100644 --- a/BuildParams +++ b/BuildParams @@ -242,11 +242,11 @@ viewer-autobuild.build_link_parallel = false #======================================== # VS2010 #======================================== -viewer-vs2010.viewer_channel = "Project Viewer - VS2010" -viewer-vs2010.login_channel = "Project Viewer - VS2010" -viewer-vs2010.viewer_grid = agni -viewer-vs2010.build_debug_release_separately = true -viewer-vs2010.build_viewer_update_version_manager = false +viewer-vs2010.viewer_channel = "Project Viewer - VS2010" +viewer-vs2010.login_channel = "Project Viewer - VS2010" +viewer-vs2010.viewer_grid = agni +viewer-vs2010.build_debug_release_separately = true +viewer-vs2010.build_viewer_update_version_manager = false viewer-vs2010.build_link_parallel = false # eof -- cgit v1.2.3 From 3825ee503ddab29cf408ae35f5a43bcc154353f2 Mon Sep 17 00:00:00 2001 From: Loren Shih Date: Thu, 17 Mar 2011 17:36:01 -0400 Subject: Work in progress. Big code cleanup ported from TheShining/avatar-physics (defunct branch). Added butt and belly. --- indra/newview/CMakeLists.txt | 4 +- indra/newview/character/avatar_lad.xml | 76 ++++ indra/newview/llphysicsmotion.cpp | 559 +++++++++++++++++++++++++ indra/newview/llphysicsmotion.h | 124 ++++++ indra/newview/llpolymesh.cpp | 31 +- indra/newview/llpolymorph.cpp | 31 ++ indra/newview/llpolymorph.h | 1 + indra/newview/llvoavatar.cpp | 10 +- indra/newview/llvoavatar.h | 2 +- indra/newview/skins/default/xui/en/strings.xml | 1 + 10 files changed, 827 insertions(+), 12 deletions(-) create mode 100644 indra/newview/llphysicsmotion.cpp create mode 100644 indra/newview/llphysicsmotion.h diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 42c3297210..b7ed4fc0a4 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -96,7 +96,6 @@ set(viewer_SOURCE_FILES llbottomtray.cpp llbox.cpp llbreadcrumbview.cpp - llbreastmotion.cpp llbrowsernotification.cpp llbuycurrencyhtml.cpp llcallbacklist.cpp @@ -379,6 +378,7 @@ set(viewer_SOURCE_FILES llparcelselection.cpp llparticipantlist.cpp llpatchvertexarray.cpp + llphysicsmotion.cpp llplacesinventorybridge.cpp llplacesinventorypanel.cpp llpopupview.cpp @@ -636,7 +636,6 @@ set(viewer_HEADER_FILES llbottomtray.h llbox.h llbreadcrumbview.h - llbreastmotion.h llbuycurrencyhtml.h llcallbacklist.h llcallfloater.h @@ -914,6 +913,7 @@ set(viewer_HEADER_FILES llparcelselection.h llparticipantlist.h llpatchvertexarray.h + llphysicsmotion.h llplacesinventorybridge.h llplacesinventorypanel.h llpolymesh.h diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index 453ed1baf7..c4117da893 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -3794,6 +3794,23 @@ + + + + + + + + + + + + + + + + + + + + controller_map_t; + +#define MIN_REQUIRED_PIXEL_AREA_BREAST_MOTION 0.f; + +inline F64 llsgn(const F64 a) +{ + if (a >= 0) + return 1; + return -1; +} + +class LLPhysicsMotion +{ +public: + LLPhysicsMotion(const std::string ¶m_user_name, + const std::string ¶m_driven_name, + const std::string &joint_name, + LLCharacter *character, + const LLVector3 &motion_direction_vec, + const controller_map_t &controllers) : + mParamUserName(param_user_name), + mParamDrivenName(param_driven_name), + mJointName(joint_name), + mMotionDirectionVec(motion_direction_vec), + mParamUser(NULL), + mParamDriven(NULL), + + mParamControllers(controllers), + mCharacter(character), + mLastTime(0), + mPosition_local(0), + mVelocityJoint_local(0), + mPositionLastUpdate_local(0), + mPositionMin_local(0), + mPositionMax_local(0) + { + mJointState = new LLJointState; + } + + BOOL initialize(); + + ~LLPhysicsMotion() {} + + BOOL onUpdate(F32 time); + + LLPointer getJointState() + { + return mJointState; + } +protected: + F32 getParamValue(const std::string& controller_key) + { + const controller_map_t::const_iterator& entry = mParamControllers.find(controller_key); + if (entry == mParamControllers.end()) + { + return 1.0; + } + const std::string& param_name = (*entry).second.c_str(); + return mCharacter->getVisualParamWeight(param_name.c_str()); + } + + F32 toLocal(const LLVector3 &world); + F32 calculateVelocity_local(const F32 time_delta); + F32 calculateAcceleration_local(F32 velocity_local, + const F32 time_delta); + +private: + const std::string mParamDrivenName; + const std::string mParamUserName; + const LLVector3 mMotionDirectionVec; + const std::string mJointName; + + F32 mPosition_local; + F32 mVelocityJoint_local; // How fast the joint is moving + F32 mAccelerationJoint_local; // Acceleration on the joint + + F32 mVelocity_local; // How fast the param is moving + F32 mPositionLastUpdate_local; + F32 mPositionMin_local; + F32 mPositionMax_local; + LLVector3 mPosition_world; + + LLViewerVisualParam *mParamUser; + LLViewerVisualParam *mParamDriven; + const controller_map_t mParamControllers; + + LLPointer mJointState; + LLCharacter *mCharacter; + + F32 mLastTime; + +}; + + + +BOOL LLPhysicsMotion::initialize() +{ + if (!mJointState->setJoint(mCharacter->getJoint(mJointName.c_str()))) + return FALSE; + mJointState->setUsage(LLJointState::ROT); + + mParamUser = (LLViewerVisualParam*)mCharacter->getVisualParam(mParamUserName.c_str()); + mParamDriven = (LLViewerVisualParam*)mCharacter->getVisualParam(mParamDrivenName.c_str()); + if ((mParamUser == NULL) || + (mParamDriven == NULL)) + { + llinfos << "Failure reading in either of both of [ " << mParamUserName << " : " << mParamDrivenName << " ]" << llendl; + return FALSE; + } + mPositionMin_local = mParamDriven->getMinWeight(); + mPositionMax_local = mParamDriven->getMaxWeight(); + + return TRUE; +} + +LLPhysicsMotionController::LLPhysicsMotionController(const LLUUID &id) : + LLMotion(id), + mCharacter(NULL) +{ + mName = "breast_motion"; +} + +LLPhysicsMotionController::~LLPhysicsMotionController() +{ + for (motion_vec_t::iterator iter = mMotions.begin(); + iter != mMotions.end(); + ++iter) + { + delete (*iter); + } +} + +BOOL LLPhysicsMotionController::onActivate() +{ + return TRUE; +} + +void LLPhysicsMotionController::onDeactivate() +{ +} + +LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter *character) +{ + mCharacter = character; + + mMotions.clear(); + + controller_map_t controllers_cleavage; + controllers_cleavage["Mass"] = "Breast_Physics_Mass"; + controllers_cleavage["Smoothing"] = "Breast_Physics_Smoothing"; + controllers_cleavage["Gravity"] = "Breast_Physics_Gravity"; + controllers_cleavage["Damping"] = "Breast_Physics_Side_Damping"; + controllers_cleavage["Drag"] = "Breast_Physics_Side_Drag"; + controllers_cleavage["MaxSpeed"] = "Breast_Physics_Side_Max_Velocity"; + controllers_cleavage["Spring"] = "Breast_Physics_Side_Spring"; + controllers_cleavage["Gain"] = "Breast_Physics_Side_Gain"; + + LLPhysicsMotion *cleavage_motion = new LLPhysicsMotion("Breast_Female_Cleavage_Driver", + "Breast_Female_Cleavage", + "mChest", + character, + LLVector3(-1,0,0), + controllers_cleavage); + if (!cleavage_motion->initialize()) + return STATUS_FAILURE; + addMotion(cleavage_motion); + + controller_map_t controllers_bounce; + controllers_bounce["Mass"] = "Breast_Physics_Mass"; + controllers_bounce["Smoothing"] = "Breast_Physics_Smoothing"; + controllers_bounce["Gravity"] = "Breast_Physics_Gravity"; + controllers_bounce["Damping"] = "Breast_Physics_UpDown_Damping"; + controllers_bounce["Drag"] = "Breast_Physics_UpDown_Drag"; + controllers_bounce["MaxSpeed"] = "Breast_Physics_UpDown_Max_Velocity"; + controllers_bounce["Spring"] = "Breast_Physics_UpDown_Spring"; + controllers_bounce["Gain"] = "Breast_Physics_UpDown_Gain"; + + LLPhysicsMotion *bounce_motion = new LLPhysicsMotion("Breast_Gravity_Driver", + "Breast_Gravity", + "mChest", + character, + LLVector3(0,0,1), + controllers_bounce); + if (!bounce_motion->initialize()) + return STATUS_FAILURE; + addMotion(bounce_motion); + + controller_map_t controllers_butt_bounce; + controllers_butt_bounce["Mass"] = "Breast_Physics_Mass"; + controllers_butt_bounce["Smoothing"] = "Breast_Physics_Smoothing"; + controllers_butt_bounce["Gravity"] = "Breast_Physics_Gravity"; + controllers_butt_bounce["Damping"] = "Breast_Physics_Side_Damping"; + controllers_butt_bounce["Drag"] = "Breast_Physics_Side_Drag"; + controllers_butt_bounce["MaxSpeed"] = "Breast_Physics_Side_Max_Velocity"; + controllers_butt_bounce["Spring"] = "Breast_Physics_Side_Spring"; + controllers_butt_bounce["Gain"] = "Breast_Physics_Side_Gain"; + + LLPhysicsMotion *butt_bounce_motion = new LLPhysicsMotion("Butt_Gravity_Driver", + "Butt_Gravity", + "mPelvis", + character, + LLVector3(0,0,-1), + controllers_butt_bounce); + if (!butt_bounce_motion->initialize()) + return STATUS_FAILURE; + addMotion(butt_bounce_motion); + + controller_map_t controllers_belly_bounce; + controllers_belly_bounce["Mass"] = "Breast_Physics_Mass"; + controllers_belly_bounce["Smoothing"] = "Breast_Physics_Smoothing"; + controllers_belly_bounce["Gravity"] = "Breast_Physics_Gravity"; + controllers_belly_bounce["Damping"] = "Breast_Physics_UpDown_Damping"; + controllers_belly_bounce["Drag"] = "Breast_Physics_UpDown_Drag"; + controllers_belly_bounce["MaxSpeed"] = "Breast_Physics_UpDown_Max_Velocity"; + controllers_belly_bounce["Spring"] = "Breast_Physics_UpDown_Spring"; + controllers_belly_bounce["Gain"] = "Breast_Physics_UpDown_Gain"; + + LLPhysicsMotion *belly_bounce_motion = new LLPhysicsMotion("Big_Belly_Torso", + "Belly Size", + "mChest", + character, + LLVector3(-0.005f,0,0), + controllers_belly_bounce); + if (!belly_bounce_motion->initialize()) + return STATUS_FAILURE; + addMotion(belly_bounce_motion); + + return STATUS_SUCCESS; +} + +void LLPhysicsMotionController::addMotion(LLPhysicsMotion *motion) +{ + addJointState(motion->getJointState()); + mMotions.push_back(motion); +} + +F32 LLPhysicsMotionController::getMinPixelArea() +{ + return MIN_REQUIRED_PIXEL_AREA_BREAST_MOTION; +} + +// Local space means "parameter space". +F32 LLPhysicsMotion::toLocal(const LLVector3 &world) +{ + LLJoint *joint = mJointState->getJoint(); + const LLQuaternion rotation_world = joint->getWorldRotation(); + + LLVector3 dir_world = mMotionDirectionVec * rotation_world; + dir_world.normalize(); + return world * dir_world * mMotionDirectionVec.length(); // dot product +} + +F32 LLPhysicsMotion::calculateVelocity_local(const F32 time_delta) +{ + LLJoint *joint = mJointState->getJoint(); + const LLVector3 position_world = joint->getWorldPosition(); + const LLQuaternion rotation_world = joint->getWorldRotation(); + const LLVector3 last_position_world = mPosition_world; + const LLVector3 velocity_world = (position_world-last_position_world) / time_delta; + const F32 velocity_local = toLocal(velocity_world); + return velocity_local; +} + +F32 LLPhysicsMotion::calculateAcceleration_local(const F32 velocity_local, + const F32 time_delta) +{ + const F32 smoothing = getParamValue("Smoothing"); + const F32 acceleration_local = velocity_local - mVelocityJoint_local; + + const F32 smoothed_acceleration_local = + acceleration_local * 1.0/smoothing + + mAccelerationJoint_local * (smoothing-1.0)/smoothing; + + return smoothed_acceleration_local; +} + +BOOL LLPhysicsMotionController::onUpdate(F32 time, U8* joint_mask) +{ + // Skip if disabled globally. + if (!gSavedSettings.getBOOL("AvatarPhysics")) + { + return TRUE; + } + + if (mCharacter->getSex() != SEX_FEMALE) return TRUE; + + BOOL update_visuals = FALSE; + for (motion_vec_t::iterator iter = mMotions.begin(); + iter != mMotions.end(); + ++iter) + { + LLPhysicsMotion *motion = (*iter); + update_visuals |= motion->onUpdate(time); + } + + if (update_visuals) + mCharacter->updateVisualParams(); + + return TRUE; +} + + +// Return TRUE if character has to update visual params. +BOOL LLPhysicsMotion::onUpdate(F32 time) +{ + // static FILE *mFileWrite = fopen("c:\\temp\\avatar_data.txt","w"); + + if (!mParamUser || !mParamDriven) + return FALSE; + + if (!mLastTime) + { + mLastTime = time; + return FALSE; + } + + //////////////////////////////////////////////////////////////////////////////// + // Get all parameters and settings + // + + const F32 time_delta = time - mLastTime; + if (time_delta > 3.0 || time_delta <= 0.01) + { + mLastTime = time; + return FALSE; + } + + // Higher LOD is better. This controls the granularity + // and frequency of updates for the motions. + const F32 lod_factor = LLVOAvatar::sPhysicsLODFactor; + if (lod_factor == 0) + { + return TRUE; + } + + F32 behavior_mass = getParamValue("Mass"); + F32 behavior_gravity = getParamValue("Gravity"); + F32 behavior_spring = getParamValue("Spring"); + F32 behavior_gain = getParamValue("Gain"); + F32 behavior_damping = getParamValue("Damping"); + F32 behavior_maxspeed = getParamValue("MaxSpeed"); + F32 behavior_drag = getParamValue("Drag"); + + F32 position_user_local = mParamUser->getWeight(); + F32 position_current_local = mPosition_local; + + // + // End parameters and settings + //////////////////////////////////////////////////////////////////////////////// + + + //////////////////////////////////////////////////////////////////////////////// + // Calculate velocity and acceleration in parameter space. + // + + const F32 velocity_joint_local = calculateVelocity_local(time_delta); + const F32 acceleration_joint_local = calculateAcceleration_local(velocity_joint_local, time_delta); + + LLJoint *joint = mJointState->getJoint(); + + // + // End velocity and acceleration + //////////////////////////////////////////////////////////////////////////////// + + + //////////////////////////////////////////////////////////////////////////////// + // Calculate the total force + // + + // Spring force is a restoring force towards the original user-set breast position. + // F = kx + const F32 spring_length = position_current_local - position_user_local; + const F32 force_spring = -spring_length * behavior_spring; + + // Acceleration is the force that comes from the change in velocity of the torso. + // F = ma + const F32 force_accel = behavior_gain * (acceleration_joint_local * behavior_mass); + + // Gravity always points downward in world space. + // F = mg + const LLVector3 gravity_world(0,0,1); + const F32 force_gravity = behavior_gain * (toLocal(gravity_world) * behavior_gravity * behavior_mass); + + // Damping is a restoring force that opposes the current velocity. + // F = -kv + const F32 force_damping = -behavior_damping * mVelocity_local; + + // Drag is a force imparted by velocity (intuitively it is similar to wind resistance) + // F = .5kv^2 + const F32 force_drag = .5*behavior_drag*velocity_joint_local*velocity_joint_local*llsgn(velocity_joint_local); + + const F32 force_net = (force_accel + + force_gravity + + force_spring + + force_damping + + force_drag); + + // + // End total force + //////////////////////////////////////////////////////////////////////////////// + + + //////////////////////////////////////////////////////////////////////////////// + // Calculate new params + // + + // Calculate the new acceleration based on the net force. + // a = F/m + const F32 acceleration_new_local = force_net / behavior_mass; + F32 velocity_new_local = mVelocity_local + acceleration_new_local; + velocity_new_local = llclamp(velocity_new_local, + -behavior_maxspeed*100.0f, behavior_maxspeed*100.0f); + + // Temporary debugging setting to cause all avatars to move, for profiling purposes. + if (gSavedSettings.getBOOL("AvatarPhysicsTest")) + { + velocity_new_local = sin(time*4.0)*5.0; + } + // Calculate the new parameters and clamp them to the min/max ranges. + F32 position_new_local = position_current_local + velocity_new_local*time_delta; + position_new_local = llclamp(position_new_local, + mPositionMin_local, mPositionMax_local); + + // Set the new parameters. + // If the param is disabled, just set the param to the user value. + if (behavior_maxspeed == 0) + { + position_new_local = position_user_local; + } + mCharacter->setVisualParamWeight(mParamDriven, + position_new_local, + FALSE); + + // + // End calculate new params + //////////////////////////////////////////////////////////////////////////////// + + //////////////////////////////////////////////////////////////////////////////// + // Conditionally update the visual params + // + + // Updating the visual params (i.e. what the user sees) is fairly expensive. + // So only update if the params have changed enough, and also take into account + // the graphics LOD settings. + + BOOL update_visuals = FALSE; + + // For non-self, if the avatar is small enough visually, then don't update. + const F32 area_for_max_settings = 0.0; + const F32 area_for_min_settings = 1400.0; + const F32 area_for_this_setting = area_for_max_settings + (area_for_min_settings-area_for_max_settings)*(1.0-lod_factor); + const F32 pixel_area = fsqrtf(mCharacter->getPixelArea()); + + const BOOL is_self = (dynamic_cast(mCharacter) != NULL); + if ((pixel_area > area_for_this_setting) || is_self) + { + // If the parameter hasn't changed enough, then don't update. + const F32 position_diff_local = llabs(mPositionLastUpdate_local-position_new_local); + const F32 min_delta = (1.0-lod_factor)*(mPositionMax_local-mPositionMin_local)/2.0; + if (llabs(position_diff_local) > min_delta) + { + update_visuals = TRUE; + mPositionLastUpdate_local = position_new_local; + } + } + + update_visuals = TRUE; + mPositionLastUpdate_local = position_new_local; + + // + // End update visual params + //////////////////////////////////////////////////////////////////////////////// + + mVelocityJoint_local = velocity_joint_local; + + mVelocity_local = velocity_new_local; + mAccelerationJoint_local = acceleration_joint_local; + mPosition_local = position_new_local; + + mPosition_world = joint->getWorldPosition(); + mLastTime = time; + + /* + if (mFileWrite != NULL && is_self) + { + fprintf(mFileWrite,"%f\t%f\t%f \t\t%f \t\t%f\t%f\t%f\t \t\t%f\t%f\t%f\t%f\t%f \t\t%f\t%f\t%f\n", + position_new_local, + velocity_new_local, + acceleration_new_local, + + time_delta, + + mPosition_world[0], + mPosition_world[1], + mPosition_world[2], + + force_net, + force_spring, + force_accel, + force_damping, + force_drag, + + spring_length, + velocity_joint_local, + acceleration_joint_local + ); + } + */ + + return update_visuals; +} + diff --git a/indra/newview/llphysicsmotion.h b/indra/newview/llphysicsmotion.h new file mode 100644 index 0000000000..0c0087d269 --- /dev/null +++ b/indra/newview/llphysicsmotion.h @@ -0,0 +1,124 @@ +/** + * @file llphysicsmotion.h + * @brief Implementation of LLPhysicsMotion class. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLPHYSICSMOTIONCONTROLLER_H +#define LL_LLPHYSICSMOTIONCONTROLLER_H + +//----------------------------------------------------------------------------- +// Header files +//----------------------------------------------------------------------------- +#include "llmotion.h" +#include "llframetimer.h" + +#define PHYSICS_MOTION_FADEIN_TIME 1.0f +#define PHYSICS_MOTION_FADEOUT_TIME 1.0f + +class LLPhysicsMotion; + +//----------------------------------------------------------------------------- +// class LLPhysicsMotion +//----------------------------------------------------------------------------- +class LLPhysicsMotionController : + public LLMotion +{ +public: + // Constructor + LLPhysicsMotionController(const LLUUID &id); + + // Destructor + virtual ~LLPhysicsMotionController(); + +public: + //------------------------------------------------------------------------- + // functions to support MotionController and MotionRegistry + //------------------------------------------------------------------------- + + // static constructor + // all subclasses must implement such a function and register it + static LLMotion *create(const LLUUID &id) { return new LLPhysicsMotionController(id); } + +public: + //------------------------------------------------------------------------- + // animation callbacks to be implemented by subclasses + //------------------------------------------------------------------------- + + // motions must specify whether or not they loop + virtual BOOL getLoop() { return TRUE; } + + // motions must report their total duration + virtual F32 getDuration() { return 0.0; } + + // motions must report their "ease in" duration + virtual F32 getEaseInDuration() { return PHYSICS_MOTION_FADEIN_TIME; } + + // motions must report their "ease out" duration. + virtual F32 getEaseOutDuration() { return PHYSICS_MOTION_FADEOUT_TIME; } + + // called to determine when a motion should be activated/deactivated based on avatar pixel coverage + virtual F32 getMinPixelArea(); + + // motions must report their priority + virtual LLJoint::JointPriority getPriority() { return LLJoint::MEDIUM_PRIORITY; } + + virtual LLMotionBlendType getBlendType() { return ADDITIVE_BLEND; } + + // run-time (post constructor) initialization, + // called after parameters have been set + // must return true to indicate success and be available for activation + virtual LLMotionInitStatus onInitialize(LLCharacter *character); + + // called when a motion is activated + // must return TRUE to indicate success, or else + // it will be deactivated + virtual BOOL onActivate(); + + // called per time step + // must return TRUE while it is active, and + // must return FALSE when the motion is completed. + virtual BOOL onUpdate(F32 time, U8* joint_mask); + + // called when a motion is deactivated + virtual void onDeactivate(); + + LLCharacter* getCharacter() { return mCharacter; } + +protected: + void addMotion(LLPhysicsMotion *motion); +private: + LLCharacter* mCharacter; + + typedef std::vector motion_vec_t; + motion_vec_t mMotions; +}; + +#endif // LL_LLPHYSICSMOTION_H + diff --git a/indra/newview/llpolymesh.cpp b/indra/newview/llpolymesh.cpp index 2942f4befb..4541fa71d5 100644 --- a/indra/newview/llpolymesh.cpp +++ b/indra/newview/llpolymesh.cpp @@ -602,12 +602,35 @@ BOOL LLPolyMeshSharedData::loadMesh( const std::string& fileName ) } mMorphData.insert(morph_data); - /* - if (std::string(morphName) == "Breast_Gravity") + + if (!strcmp(morphName, "Big_Belly_Torso")) + { + LLPolyMorphData* belly_data = new LLPolyMorphData(*morph_data); + belly_data->mName = std::string("Belly_Gravity"); + for (U32 v=0; v < belly_data->mNumIndices; v++) + { + // llinfos << "Coord: " << v << "\t" << belly_data->mCoords[v] << llendl; + belly_data->mCoords[v][0] = 0; + belly_data->mCoords[v][1] = 0; + belly_data->mCoords[v][2] = 0.01F; + } + mMorphData.insert(belly_data); + } + + if (!strcmp(morphName, "Small_Butt")) { - LLPolyMorphData *morph_data_clone = new LLPolyMorphData(std::string(morphName)); + llinfos << "Reading small butt" << llendl; + LLPolyMorphData* butt_data = new LLPolyMorphData(*morph_data); + butt_data->mName = std::string("Butt_Gravity"); + for (U32 v=0; v < butt_data->mNumIndices; v++) + { + // llinfos << "Coord: " << v << "\t" << butt_data->mCoords[v] << llendl; + butt_data->mCoords[v][0] = 0; + butt_data->mCoords[v][1] = 0; + butt_data->mCoords[v][2] = 0.01F; + } + mMorphData.insert(butt_data); } - */ } S32 numRemaps; diff --git a/indra/newview/llpolymorph.cpp b/indra/newview/llpolymorph.cpp index ec41ef08f5..5a67fd482a 100644 --- a/indra/newview/llpolymorph.cpp +++ b/indra/newview/llpolymorph.cpp @@ -59,6 +59,37 @@ LLPolyMorphData::LLPolyMorphData(const std::string& morph_name) mMesh = NULL; } +LLPolyMorphData::LLPolyMorphData(const LLPolyMorphData &rhs) : + mName(rhs.mName), + mNumIndices(rhs.mNumIndices), + mTotalDistortion(rhs.mTotalDistortion), + mAvgDistortion(rhs.mAvgDistortion), + mMaxDistortion(rhs.mMaxDistortion), + mVertexIndices(NULL), + mCoords(NULL), + mNormals(NULL), + mBinormals(NULL), + mTexCoords(NULL) +{ + const S32 numVertices = mNumIndices; + + mCoords = new LLVector3[numVertices]; + mNormals = new LLVector3[numVertices]; + mBinormals = new LLVector3[numVertices]; + mTexCoords = new LLVector2[numVertices]; + mVertexIndices = new U32[numVertices]; + + for (S32 v=0; v < numVertices; v++) + { + mCoords[v] = rhs.mCoords[v]; + mNormals[v] = rhs.mNormals[v]; + mBinormals[v] = rhs.mBinormals[v]; + mTexCoords[v] = rhs.mTexCoords[v]; + mVertexIndices[v] = rhs.mVertexIndices[v]; + } +} + + //----------------------------------------------------------------------------- // ~LLPolyMorphData() //----------------------------------------------------------------------------- diff --git a/indra/newview/llpolymorph.h b/indra/newview/llpolymorph.h index bc111882b7..8a024f2e9e 100644 --- a/indra/newview/llpolymorph.h +++ b/indra/newview/llpolymorph.h @@ -46,6 +46,7 @@ class LLPolyMorphData public: LLPolyMorphData(const std::string& morph_name); ~LLPolyMorphData(); + LLPolyMorphData(const LLPolyMorphData &rhs); BOOL loadBinary(LLFILE* fp, LLPolyMeshSharedData *mesh); const std::string& getName() { return mName; } diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 3476dc80e8..2c5e728c87 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -48,7 +48,7 @@ #include "llanimationstates.h" #include "llavatarnamecache.h" #include "llavatarpropertiesprocessor.h" -#include "llbreastmotion.h" +#include "llphysicsmotion.h" #include "llviewercontrol.h" #include "llcallingcard.h" // IDEVO for LLAvatarTracker #include "lldrawpoolavatar.h" @@ -126,7 +126,7 @@ const LLUUID ANIM_AGENT_HEAD_ROT = LLUUID("e6e8d1dd-e643-fff7-b238-c6b4b056a68d" const LLUUID ANIM_AGENT_PELVIS_FIX = LLUUID("0c5dd2a2-514d-8893-d44d-05beffad208b"); //"pelvis_fix" const LLUUID ANIM_AGENT_TARGET = LLUUID("0e4896cb-fba4-926c-f355-8720189d5b55"); //"target" const LLUUID ANIM_AGENT_WALK_ADJUST = LLUUID("829bc85b-02fc-ec41-be2e-74cc6dd7215d"); //"walk_adjust" -const LLUUID ANIM_AGENT_BREAST_MOTION = LLUUID("7360e029-3cb8-ebc4-863e-212df440d987"); //"breast_motion" +const LLUUID ANIM_AGENT_PHYSICS_MOTION = LLUUID("7360e029-3cb8-ebc4-863e-212df440d987"); //"physics_motion" //----------------------------------------------------------------------------- @@ -1149,7 +1149,7 @@ void LLVOAvatar::initClass() gAnimLibrary.animStateSetString(ANIM_AGENT_BODY_NOISE,"body_noise"); gAnimLibrary.animStateSetString(ANIM_AGENT_BREATHE_ROT,"breathe_rot"); - gAnimLibrary.animStateSetString(ANIM_AGENT_BREAST_MOTION,"breast_motion"); + gAnimLibrary.animStateSetString(ANIM_AGENT_PHYSICS_MOTION,"physics_motion"); gAnimLibrary.animStateSetString(ANIM_AGENT_EDITING,"editing"); gAnimLibrary.animStateSetString(ANIM_AGENT_EYE,"eye"); gAnimLibrary.animStateSetString(ANIM_AGENT_FLY_ADJUST,"fly_adjust"); @@ -1288,7 +1288,7 @@ void LLVOAvatar::initInstance(void) // motions without a start/stop bit registerMotion( ANIM_AGENT_BODY_NOISE, LLBodyNoiseMotion::create ); registerMotion( ANIM_AGENT_BREATHE_ROT, LLBreatheMotionRot::create ); - registerMotion( ANIM_AGENT_BREAST_MOTION, LLBreastMotion::create ); + registerMotion( ANIM_AGENT_PHYSICS_MOTION, LLPhysicsMotionController::create ); registerMotion( ANIM_AGENT_EDITING, LLEditingMotion::create ); registerMotion( ANIM_AGENT_EYE, LLEyeMotion::create ); registerMotion( ANIM_AGENT_FEMALE_WALK, LLKeyframeWalkMotion::create ); @@ -1702,7 +1702,7 @@ void LLVOAvatar::startDefaultMotions() startMotion( ANIM_AGENT_EYE ); startMotion( ANIM_AGENT_BODY_NOISE ); startMotion( ANIM_AGENT_BREATHE_ROT ); - startMotion( ANIM_AGENT_BREAST_MOTION ); + startMotion( ANIM_AGENT_PHYSICS_MOTION ); startMotion( ANIM_AGENT_HAND_MOTION ); startMotion( ANIM_AGENT_PELVIS_FIX ); diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index f5f90b2912..3659fb055f 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -50,7 +50,7 @@ extern const LLUUID ANIM_AGENT_BODY_NOISE; extern const LLUUID ANIM_AGENT_BREATHE_ROT; -extern const LLUUID ANIM_AGENT_BREAST_MOTION; +extern const LLUUID ANIM_AGENT_PHYSICS_MOTION; extern const LLUUID ANIM_AGENT_EDITING; extern const LLUUID ANIM_AGENT_EYE; extern const LLUUID ANIM_AGENT_FLY_ADJUST; diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 30de6d14c6..3c7d7d1777 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2530,6 +2530,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. Bushy Eyebrows Bushy Hair Butt Size +Butt Gravity Bustle Skirt No Bustle More Bustle -- cgit v1.2.3 From b260e89eef8d3c4a0a06419697f822de1f53f2a9 Mon Sep 17 00:00:00 2001 From: Andrew de Laix Date: Thu, 17 Mar 2011 21:48:47 +0000 Subject: package .so links needed by linux webkit plugin. --- indra/newview/viewer_manifest.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index f600cb42b0..b48b0e7a3a 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -931,12 +931,18 @@ class Linux_i686Manifest(LinuxManifest): super(Linux_i686Manifest, self).construct() if self.prefix("../packages/lib/release", dst="lib"): + self.path("libapr-1.so") + self.path("libapr-1.so.0") self.path("libapr-1.so.0.4.2") + self.path("libaprutil-1.so") + self.path("libaprutil-1.so.0") self.path("libaprutil-1.so.0.3.10") self.path("libbreakpad_client.so.0.0.0") self.path("libbreakpad_client.so.0") self.path("libbreakpad_client.so") self.path("libdb-5.1.so") + self.path("libdb-5.so") + self.path("libdb.so") self.path("libcrypto.so.0.9.8") self.path("libexpat.so.1.5.2") self.path("libssl.so.0.9.8") -- cgit v1.2.3 From b3e444c74e0f31ba9d63d7bed934f017bf2499df Mon Sep 17 00:00:00 2001 From: callum Date: Thu, 17 Mar 2011 17:18:58 -0700 Subject: SOCIAL-634 FIX Error condition content for Destination Guide, Avatar Picker, and Help if S3 content or web content is not available. (Included refs to new LLQtWebKit that supports functionality) --- indra/llplugin/llpluginclassmedia.cpp | 16 ++++++---------- indra/llplugin/llpluginclassmedia.h | 5 ++++- indra/llplugin/llpluginclassmediaowner.h | 3 ++- indra/media_plugins/webkit/media_plugin_webkit.cpp | 18 +++++++++--------- indra/newview/app_settings/settings.xml | 11 +++++++++++ indra/newview/llfloaterwebcontent.cpp | 6 ++++++ indra/newview/llmediactrl.cpp | 16 ---------------- indra/newview/llmediactrl.h | 4 ---- install.xml | 8 ++++---- 9 files changed, 42 insertions(+), 45 deletions(-) diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp index 26a20cede8..57f91a57ca 100644 --- a/indra/llplugin/llpluginclassmedia.cpp +++ b/indra/llplugin/llpluginclassmedia.cpp @@ -146,6 +146,7 @@ void LLPluginClassMedia::reset() mClickURL.clear(); mClickTarget.clear(); mClickUUID.clear(); + mStatusCode = 0; // media_time class mCurrentTime = 0.0f; @@ -1027,6 +1028,11 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message) mClickTarget.clear(); mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_CLICK_LINK_NOFOLLOW); } + else if(message_name == "navigate_error_page") + { + mStatusCode = message.getValueS32("status_code"); + mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_NAVIGATE_ERROR_PAGE); + } else if(message_name == "cookie_set") { if(mOwner) @@ -1192,16 +1198,6 @@ void LLPluginClassMedia::browse_back() sendMessage(message); } -void LLPluginClassMedia::set_status_redirect(int code, const std::string &url) -{ - LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "set_status_redirect"); - - message.setValueS32("code", code); - message.setValue("url", url); - - sendMessage(message); -} - void LLPluginClassMedia::setBrowserUserAgent(const std::string& user_agent) { LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "set_user_agent"); diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h index 618e928a08..a940633b88 100644 --- a/indra/llplugin/llpluginclassmedia.h +++ b/indra/llplugin/llpluginclassmedia.h @@ -199,7 +199,6 @@ public: void browse_reload(bool ignore_cache = false); void browse_forward(); void browse_back(); - void set_status_redirect(int code, const std::string &url); void setBrowserUserAgent(const std::string& user_agent); void proxyWindowOpened(const std::string &target, const std::string &uuid); void proxyWindowClosed(const std::string &uuid); @@ -232,6 +231,9 @@ public: // This is valid during MEDIA_EVENT_CLICK_LINK_HREF and MEDIA_EVENT_GEOMETRY_CHANGE std::string getClickUUID() const { return mClickUUID; }; + + // This is valid after MEDIA_EVENT_NAVIGATE_ERROR_PAGE + S32 getStatusCode() const { return mStatusCode; }; // These are valid during MEDIA_EVENT_GEOMETRY_CHANGE S32 getGeometryX() const { return mGeometryX; }; @@ -384,6 +386,7 @@ protected: S32 mGeometryY; S32 mGeometryWidth; S32 mGeometryHeight; + S32 mStatusCode; std::string mAuthURL; std::string mAuthRealm; std::string mHoverText; diff --git a/indra/llplugin/llpluginclassmediaowner.h b/indra/llplugin/llpluginclassmediaowner.h index 42e93cc6d7..5a4fb1ce90 100644 --- a/indra/llplugin/llpluginclassmediaowner.h +++ b/indra/llplugin/llpluginclassmediaowner.h @@ -52,12 +52,13 @@ public: MEDIA_EVENT_STATUS_TEXT_CHANGED, // browser has updated the status text MEDIA_EVENT_NAME_CHANGED, // browser has updated the name of the media (typically tag) MEDIA_EVENT_LOCATION_CHANGED, // browser location (URL) has changed (maybe due to internal navagation/frames/etc) + MEDIA_EVENT_NAVIGATE_ERROR_PAGE, // browser navigated to a page that resulted in an HTTP error MEDIA_EVENT_CLICK_LINK_HREF, // I'm not entirely sure what the semantics of these two are MEDIA_EVENT_CLICK_LINK_NOFOLLOW, MEDIA_EVENT_CLOSE_REQUEST, // The plugin requested its window be closed (currently hooked up to javascript window.close in webkit) MEDIA_EVENT_PICK_FILE_REQUEST, // The plugin wants the user to pick a file MEDIA_EVENT_GEOMETRY_CHANGE, // The plugin requested its window geometry be changed (per the javascript window interface) - + MEDIA_EVENT_PLUGIN_FAILED_LAUNCH, // The plugin failed to launch MEDIA_EVENT_PLUGIN_FAILED, // The plugin died unexpectedly diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp index d6f8ae3e16..c1bc9adec0 100644 --- a/indra/media_plugins/webkit/media_plugin_webkit.cpp +++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp @@ -490,6 +490,15 @@ private: } } + //////////////////////////////////////////////////////////////////////////////// + // virtual + void onNavigateErrorPage(const EventType& event) + { + LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_error_page"); + message.setValueS32("status_code", event.getIntValue()); + sendMessage(message); + } + //////////////////////////////////////////////////////////////////////////////// // virtual void onLocationChange(const EventType& event) @@ -1225,15 +1234,6 @@ void MediaPluginWebKit::receiveMessage(const char *message_string) { LLQtWebKit::getInstance()->userAction( mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_BACK ); } - else if(message_name == "set_status_redirect") - { - int code = message_in.getValueS32("code"); - std::string url = message_in.getValue("url"); - if ( 404 == code ) // browser lib only supports 404 right now - { - LLQtWebKit::getInstance()->set404RedirectUrl( mBrowserWindowId, url ); - }; - } else if(message_name == "set_user_agent") { mUserAgent = message_in.getValue("user_agent"); diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 6a89f5681d..c626538808 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -12586,5 +12586,16 @@ <key>Value</key> <integer>1</integer> </map> + <key>WebContentFloaterErrorURL</key> + <map> + <key>Comment</key> + <string>URL to navigate to if the Web content floater hits a page with a 400-499 HTTP status code</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/damballah/404.html</string> + </map> </map> </llsd> diff --git a/indra/newview/llfloaterwebcontent.cpp b/indra/newview/llfloaterwebcontent.cpp index 058567492b..76fb985b39 100644 --- a/indra/newview/llfloaterwebcontent.cpp +++ b/indra/newview/llfloaterwebcontent.cpp @@ -328,6 +328,12 @@ void LLFloaterWebContent::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent const std::string link = self->getHoverLink(); mStatusBarText->setText( link ); } + else if(event == MEDIA_EVENT_NAVIGATE_ERROR_PAGE ) + { + std::string redirect_url = gSavedSettings.getString("WebContentFloaterErrorURL"); + mWebBrowser->navigateTo(redirect_url, "text/html"); + set_current_url(redirect_url); + } } void LLFloaterWebContent::set_current_url(const std::string& url) diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index 9493fddf50..24038d0ee6 100644 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -501,22 +501,6 @@ bool LLMediaCtrl::canNavigateForward() return false; } -//////////////////////////////////////////////////////////////////////////////// -// -void LLMediaCtrl::set404RedirectUrl( std::string redirect_url ) -{ - if(mMediaSource && mMediaSource->hasMedia()) - mMediaSource->getMediaPlugin()->set_status_redirect( 404, redirect_url ); -} - -//////////////////////////////////////////////////////////////////////////////// -// -void LLMediaCtrl::clr404RedirectUrl() -{ - if(mMediaSource && mMediaSource->hasMedia()) - mMediaSource->getMediaPlugin()->set_status_redirect(404, ""); -} - //////////////////////////////////////////////////////////////////////////////// // void LLMediaCtrl::clearCache() diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h index 38a74f90d3..7a28b0986d 100644 --- a/indra/newview/llmediactrl.h +++ b/indra/newview/llmediactrl.h @@ -113,10 +113,6 @@ public: void setTarget(const std::string& target); - // set/clear URL to visit when a 404 page is reached - void set404RedirectUrl( std::string redirect_url ); - void clr404RedirectUrl(); - // Clear the browser cache when the instance gets loaded void clearCache(); diff --git a/install.xml b/install.xml index c91bec8535..e05c93b707 100644 --- a/install.xml +++ b/install.xml @@ -981,9 +981,9 @@ anguage Infrstructure (CLI) international standard</string> <key>darwin</key> <map> <key>md5sum</key> - <string>13f9be04ba029d19f822abdcb755c700</string> + <string>a5fb7db2c7722fa0cf0a02ee535a97a0</string> <key>url</key> - <uri>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/llqtwebkit-darwin-4.7.1-20110302.tar.bz2</uri> + <uri>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/llqtwebkit-darwin-qt4.7.1-20110317.tar.bz2</uri> </map> <key>linux</key> <map> @@ -995,9 +995,9 @@ anguage Infrstructure (CLI) international standard</string> <key>windows</key> <map> <key>md5sum</key> - <string>7cc9626ff4ac035f8605c996d18ea6a9</string> + <string>c5344b115345770080fc1f6d2a0cfbd7</string> <key>url</key> - <uri>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/llqtwebkit-windows-qt4.7.1-20110302.tar.bz2</uri> + <uri>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/llqtwebkit-windows-qt4.7.1-20110317.tar.bz2</uri> </map> </map> </map> -- cgit v1.2.3 From efc57ea349d634d2bef1a554a925bea60f26f307 Mon Sep 17 00:00:00 2001 From: callum <none@none> Date: Thu, 17 Mar 2011 18:50:44 -0700 Subject: Fix for Mac specific compiler error. All enumerants of an enum have to be present in a switch statement if there is no default. --- indra/newview/llmediactrl.cpp | 6 ++++++ indra/newview/llviewerparcelmedia.cpp | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index 24038d0ee6..376e38ade3 100644 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -960,6 +960,12 @@ void LLMediaCtrl::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) }; break; + case MEDIA_EVENT_NAVIGATE_ERROR_PAGE: + { + LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_NAVIGATE_ERROR_PAGE" << LL_ENDL; + }; + break; + case MEDIA_EVENT_CLICK_LINK_HREF: { LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_CLICK_LINK_HREF, target is \"" << self->getClickTarget() << "\", uri is " << self->getClickURL() << LL_ENDL; diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp index 40f0b43313..dfa35edef4 100644 --- a/indra/newview/llviewerparcelmedia.cpp +++ b/indra/newview/llviewerparcelmedia.cpp @@ -539,6 +539,12 @@ void LLViewerParcelMedia::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent }; break; + case MEDIA_EVENT_NAVIGATE_ERROR_PAGE: + { + LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_NAVIGATE_ERROR_PAGE" << LL_ENDL; + }; + break; + case MEDIA_EVENT_CLICK_LINK_HREF: { LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_CLICK_LINK_HREF, target is \"" << self->getClickTarget() << "\", uri is " << self->getClickURL() << LL_ENDL; -- cgit v1.2.3 From ff353a4194810d057d3e57b0b12665e133a22093 Mon Sep 17 00:00:00 2001 From: callum <none@none> Date: Thu, 17 Mar 2011 19:28:13 -0700 Subject: SOCIAL-634 REFIX Error condition content for Destination Guide, Avatar Picker, and Help if S3 content or web content is not available. (Included refs to new (newer) LLQtWebKit that supports functionality) --- install.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install.xml b/install.xml index e05c93b707..9d18848076 100644 --- a/install.xml +++ b/install.xml @@ -981,7 +981,7 @@ anguage Infrstructure (CLI) international standard</string> <key>darwin</key> <map> <key>md5sum</key> - <string>a5fb7db2c7722fa0cf0a02ee535a97a0</string> + <string>9346c475a37e3f11ea701c6ebd12d736</string> <key>url</key> <uri>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/llqtwebkit-darwin-qt4.7.1-20110317.tar.bz2</uri> </map> @@ -995,7 +995,7 @@ anguage Infrstructure (CLI) international standard</string> <key>windows</key> <map> <key>md5sum</key> - <string>c5344b115345770080fc1f6d2a0cfbd7</string> + <string>1e66b1ecab911a60ba50b59361ef62e1</string> <key>url</key> <uri>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/llqtwebkit-windows-qt4.7.1-20110317.tar.bz2</uri> </map> -- cgit v1.2.3 From 28eaade69b4b330db7a9dfea528cc4f0a3998841 Mon Sep 17 00:00:00 2001 From: Merov Linden <merov@lindenlab.com> Date: Thu, 17 Mar 2011 22:51:23 -0700 Subject: Autobuild: Fix Mac building failure: c-ares linking of mac_updater --- indra/mac_updater/CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/indra/mac_updater/CMakeLists.txt b/indra/mac_updater/CMakeLists.txt index a4a6b50c6c..00dcedecaa 100644 --- a/indra/mac_updater/CMakeLists.txt +++ b/indra/mac_updater/CMakeLists.txt @@ -5,6 +5,7 @@ project(mac_updater) include(00-Common) include(OpenSSL) include(CURL) +include(CARes) include(LLCommon) include(LLVFS) include(Linking) @@ -12,6 +13,8 @@ include(Linking) include_directories( ${LLCOMMON_INCLUDE_DIRS} ${LLVFS_INCLUDE_DIRS} + ${CURL_INCLUDE_DIRS} + ${CARES_INCLUDE_DIRS} ) set(mac_updater_SOURCE_FILES @@ -53,6 +56,7 @@ target_link_libraries(mac-updater ${OPENSSL_LIBRARIES} ${CRYPTO_LIBRARIES} ${CURL_LIBRARIES} + ${CARES_LIBRARIES} ${LLCOMMON_LIBRARIES} ) -- cgit v1.2.3 From 3b1dee9abf5e4e220c325438f2da125937d584c1 Mon Sep 17 00:00:00 2001 From: Wolfpup Lowenhar <wolfpup67@earthlink.net> Date: Fri, 18 Mar 2011 08:05:36 -0400 Subject: OPEN-1: OPEN-37: Needed changes in autobuild.xml for OpenSource Developers to be able to use VS2010 Autobuild --- autobuild.xml | 133 +++++++++++++++++++++++++++++++++++++++++++++----- doc/contributions.txt | 2 + 2 files changed, 124 insertions(+), 11 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index ba70320d0c..f133c8d07c 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1764,10 +1764,15 @@ <key>name</key> <string>Release</string> </map> + <!-- OPEN-1 WORKAROUND begin - to be removed when VC express is detected correctly --> <key>VCexpressRelWithDebInfo</key> <map> <key>configure</key> <map> + <key>arguments</key> + <array> + <string>../indra</string> + </array> <key>command</key> <string>cmake</string> <key>options</key> @@ -1781,6 +1786,53 @@ <key>name</key> <string>VCexpressRelWithDebInfo</string> </map> + <!-- OPEN-1 WORKAROUND end --> + <!-- OPEN-1a WORKAROUND begin - to be removed when VC 2010 is detected correctly --> + <key>VC10msbuildRelWithDebInfo</key> + <map> + <key>configure</key> + <map> + <key>arguments</key> + <array> + <string>../indra</string> + </array> + <key>command</key> + <string>cmake</string> + <key>options</key> + <array> + <string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string> + <string>-DUNATTENDED:BOOL=OFF</string> + <string>-DWORD_SIZE:STRING=32</string> + <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> + </array> + </map> + <key>name</key> + <string>VC10msbuildRelWithDebInfo</string> + </map> + <!-- OPEN-1a WORKAROUND end --> + <!-- OPEN-1a Release WORKAROUND begin - to be removed when VC 2010 is detected correctly --> + <key>VC10msbuildRelease</key> + <map> + <key>configure</key> + <map> + <key>arguments</key> + <array> + <string>../indra</string> + </array> + <key>command</key> + <string>cmake</string> + <key>options</key> + <array> + <string>-DCMAKE_BUILD_TYPE:STRING=Release</string> + <string>-DUNATTENDED:BOOL=OFF</string> + <string>-DWORD_SIZE:STRING=32</string> + <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> + </array> + </map> + <key>name</key> + <string>VC10msbuildRelease</string> + </map> + <!-- OPEN-1a Release WORKAROUND end --> </map> <key>name</key> <string>common</string> @@ -2724,10 +2776,15 @@ <key>name</key> <string>Release</string> </map> + <!-- OPEN-1 WORKAROUND begin - to be removed when VC express is detected correctly --> <key>VCexpressRelWithDebInfo</key> <map> <key>build</key> <map> + <key>arguments</key> + <array> + <string>"RelWithDebInfo|Win32"</string> + </array> <key>command</key> <string>vcbuild.exe</string> <key>options</key> @@ -2738,30 +2795,84 @@ </map> <key>configure</key> <map> - <key>arguments</key> + <key>options</key> + <array> + <string>-G</string> + <string>"Visual Studio 8 2005"</string> + <string>-DSTANDALONE:BOOL=FALSE</string> + <string>-DINSTALL_PROPRIETARY=FALSE</string> + <string>-DFMOD=FALSE</string> + </array> + </map> + <key>name</key> + <string>VCexpressRelWithDebInfo</string> + </map> + <!-- OPEN-1 WORKAROUND end --> + <!-- OPEN-1a WORKAROUND begin - to be removed when VC 2010 is detected correctly --> + <key>VC10msbuildRelWithDebInfo</key> + <map> + <key>build</key> + <map> + <key>command</key> + <string>msbuild.exe</string> + <key>options</key> <array> - <string>..\indra</string> - <string>&&</string> - <string>..\indra\tools\vstool\VSTool.exe</string> - <string>--solution</string> <string>SecondLife.sln</string> - <string>--config</string> - <string>Release</string> - <string>--startup</string> - <string>secondlife-bin</string> + <string>/verbosity:minimal</string> + <string>/t:build</string> + <string>/p:Configuration=RelWithDebInfo</string> + <string>/p:Platform=Win32</string> + <string>/p:"VCBuildAdditionalOptions= /useenv"</string> + <string>/p:"VCBuildAdditionalOptions= /incremental"</string> + </array> + </map> + <key>configure</key> + <map> + <key>options</key> + <array> + <string>-G</string> + <string>"Visual Studio 10"</string> + <string>-DSTANDALONE:BOOL=FALSE</string> + <string>-DINSTALL_PROPRIETARY=FALSE</string> + <string>-DFMOD=FALSE</string> </array> + </map> + <key>name</key> + <string>VC10msbuildRelWithDebInfo</string> + </map> + <!-- OPEN-1a WORKAROUND end --> + <!-- OPEN-1a Release WORKAROUND begin - to be removed when VC 2010 is detected correctly --> + <key>VC10msbuildRelease</key> + <map> + <key>build</key> + <map> + <key>command</key> + <string>msbuild.exe</string> + <key>options</key> + <array> + <string>SecondLife.sln</string> + <string>/t:build</string> + <string>/p:Configuration=Release</string> + <string>/p:Platform=Win32</string> + <string>/p:"VCBuildAdditionalOptions= /useenv"</string> + <string>/p:"VCBuildAdditionalOptions= /incremental"</string> + </array> + </map> + <key>configure</key> + <map> <key>options</key> <array> <string>-G</string> - <string>"Visual Studio 8 2005"</string> + <string>"Visual Studio 10"</string> <string>-DSTANDALONE:BOOL=FALSE</string> <string>-DINSTALL_PROPRIETARY=FALSE</string> <string>-DFMOD=FALSE</string> </array> </map> <key>name</key> - <string>VCexpressRelWithDebInfo</string> + <string>VC10msbuildRelease</string> </map> + <!-- OPEN-1a WORKAROUND end --> </map> <key>name</key> <string>windows</string> diff --git a/doc/contributions.txt b/doc/contributions.txt index a947b922ab..9caed38d30 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -833,6 +833,8 @@ Whoops Babii Wilton Lundquist VWR-7682 WolfPup Lowenhar + OPEN-1 + OPEN-37 SNOW-622 SNOW-772 STORM-102 -- cgit v1.2.3 From cd48598333af1b28e8e5f648feaa9ec3c01c13b0 Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Fri, 18 Mar 2011 08:25:29 -0400 Subject: configure oz_viewer-autobuild2010 for separate debug builds on windows --- BuildParams | 1 + 1 file changed, 1 insertion(+) diff --git a/BuildParams b/BuildParams index e162b9bdf2..fe6e77151a 100644 --- a/BuildParams +++ b/BuildParams @@ -156,6 +156,7 @@ media.build_viewer_update_version_manager = false # ================ oz_viewer-devreview.build_debug_release_separately = true +oz_viewer-autobuild2010.build_debug_release_separately = true # ======================================== # enus -- cgit v1.2.3 From c754a7c0000d6f1defd58d7e8b4587d46ee1defe Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Fri, 18 Mar 2011 10:16:03 -0400 Subject: Enabling for belly vertical motion. --- indra/newview/character/avatar_lad.xml | 80 ++++++++++++++++++++++++---------- indra/newview/llphysicsmotion.cpp | 4 +- indra/newview/llpolymesh.cpp | 31 +++++++++++-- 3 files changed, 85 insertions(+), 30 deletions(-) diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index c4117da893..6dbda4fd16 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -3795,10 +3795,10 @@ </param> <param - id="1091" + id="1092" group="0" - name="Belly_Gravity" - label="Belly Gravity" + name="Big_Belly_Torso_Gravity" + label="Big Belly Torso Gravity" wearable="shape" edit_group="driven" label_min="Up" @@ -4405,6 +4405,18 @@ <param_morph /> </param> + <param + id="1093" + group="1" + name="Big_Belly_Legs_Gravity" + wearable="shape" + edit_group="driven" + value_min="-2" + value_max="2"> + <param_morph /> + </param> + + <param id="151" group="1" @@ -5173,6 +5185,19 @@ <param_morph /> </param> + <param + id="1094" + group="1" + name="skirt_belly_gravity" + wearable="skirt" + edit_group="driven" + cross_wearable="true" + label="big belly skirt gravity" + value_min="0" + value_max="1"> + <param_morph /> + </param> + <param id="850" group="1" @@ -9407,27 +9432,6 @@ render_pass="bump"> </param_driver> </param> - <param - id="1092" - group="0" - name="Belly_Gravity_Driver" - label="Belly Gravity" - wearable="shape" - edit_group="shape_torso" - edit_group_order="14" - label_min="Less" - label_max="More" - value_default="0" - value_min="-2" - value_max="2" - camera_elevation=".3" - camera_distance=".8"> - <param_driver> - <driven - id="1090" /> - </param_driver> - </param> - <param id="828" group="0" @@ -10151,6 +10155,34 @@ render_pass="bump"> </param_driver> </param> + <param + id="1091" + group="0" + wearable="shape" + edit_group="shape_torso" + edit_group_order="14" + name="Belly_Gravity" + label="Belly Gravity" + label_min="Small" + label_max="Big" + value_min="0" + value_max="1" + value_default="0" + camera_distance="1.4" + camera_angle="30" + camera_elevation=".2"> + <param_driver> + <driven + id="1092" /> + + <driven + id="1093" /> + + <driven + id="1094" /> + </param_driver> + </param> + <param id="637" group="0" diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 9043894009..5de1f7e145 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -263,10 +263,10 @@ LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter controllers_belly_bounce["Gain"] = "Breast_Physics_UpDown_Gain"; LLPhysicsMotion *belly_bounce_motion = new LLPhysicsMotion("Big_Belly_Torso", - "Belly Size", + "Belly_Gravity", "mChest", character, - LLVector3(-0.005f,0,0), + LLVector3(0,0,.25f), controllers_belly_bounce); if (!belly_bounce_motion->initialize()) return STATUS_FAILURE; diff --git a/indra/newview/llpolymesh.cpp b/indra/newview/llpolymesh.cpp index 4541fa71d5..08813e6a98 100644 --- a/indra/newview/llpolymesh.cpp +++ b/indra/newview/llpolymesh.cpp @@ -606,10 +606,35 @@ BOOL LLPolyMeshSharedData::loadMesh( const std::string& fileName ) if (!strcmp(morphName, "Big_Belly_Torso")) { LLPolyMorphData* belly_data = new LLPolyMorphData(*morph_data); - belly_data->mName = std::string("Belly_Gravity"); + belly_data->mName = std::string("Big_Belly_Torso_Gravity"); + for (U32 v=0; v < belly_data->mNumIndices; v++) + { + belly_data->mCoords[v][0] = 0; + belly_data->mCoords[v][1] = 0; + belly_data->mCoords[v][2] = 0.01F; + } + mMorphData.insert(belly_data); + } + + if (!strcmp(morphName, "Big_Belly_Legs")) + { + LLPolyMorphData* belly_data = new LLPolyMorphData(*morph_data); + belly_data->mName = std::string("Big_Belly_Legs_Gravity"); + for (U32 v=0; v < belly_data->mNumIndices; v++) + { + belly_data->mCoords[v][0] = 0; + belly_data->mCoords[v][1] = 0; + belly_data->mCoords[v][2] = 0.01F; + } + mMorphData.insert(belly_data); + } + + if (!strcmp(morphName, "skirt_belly")) + { + LLPolyMorphData* belly_data = new LLPolyMorphData(*morph_data); + belly_data->mName = std::string("skirt_belly_gravity"); for (U32 v=0; v < belly_data->mNumIndices; v++) { - // llinfos << "Coord: " << v << "\t" << belly_data->mCoords[v] << llendl; belly_data->mCoords[v][0] = 0; belly_data->mCoords[v][1] = 0; belly_data->mCoords[v][2] = 0.01F; @@ -619,12 +644,10 @@ BOOL LLPolyMeshSharedData::loadMesh( const std::string& fileName ) if (!strcmp(morphName, "Small_Butt")) { - llinfos << "Reading small butt" << llendl; LLPolyMorphData* butt_data = new LLPolyMorphData(*morph_data); butt_data->mName = std::string("Butt_Gravity"); for (U32 v=0; v < butt_data->mNumIndices; v++) { - // llinfos << "Coord: " << v << "\t" << butt_data->mCoords[v] << llendl; butt_data->mCoords[v][0] = 0; butt_data->mCoords[v][1] = 0; butt_data->mCoords[v][2] = 0.01F; -- cgit v1.2.3 From 9560faa1496790334becbe819b6ced6f5b17cf97 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Fri, 18 Mar 2011 10:31:38 -0400 Subject: Comments. --- indra/newview/llphysicsmotion.cpp | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 5de1f7e145..01b3ebe1f0 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -59,7 +59,30 @@ inline F64 llsgn(const F64 a) class LLPhysicsMotion { public: - LLPhysicsMotion(const std::string ¶m_user_name, + /* + param_user_name: The param (if any) that the user sees and controls. This is what + the particular body part would look like without physics. For example, it may be + the breast gravity. This param's value should will not be altered, and is only + used as a reference point for the rest position of the body party. This is usually + a driver param and the param that physics is altering is the driven param. + If this is left blank, that means that the physics is affecting a param that is + not exposed to the user. + + param_driven_name: The param whose value is actually set by the physics. + + joint_name: The joint that the body part is attached to. The joint is + used to determine the orientation (rotation) of the body part. + + character: The avatar that this physics affects. + + motion_direction_vec: The direction (in world coordinates) that determines the + motion. For example, (0,0,1) is up-down, and means that up-down motion is what + determines how this joint moves. + + controllers: The various settings (e.g. spring force, mass) that determine how + the body part behaves. + */ + LLPhysicsMotion(const std::string ¶m_user_name, const std::string ¶m_driven_name, const std::string &joint_name, LLCharacter *character, -- cgit v1.2.3 From dd8c9eb98a86b3d3716719b739480c562f72c880 Mon Sep 17 00:00:00 2001 From: brad kittenbrink <brad@lindenlab.com> Date: Fri, 18 Mar 2011 12:24:04 -0400 Subject: Removal of dbghelp cruft. Reviewed by alain and nat. --- autobuild.xml | 24 ------------------------ indra/cmake/Copy3rdPartyLibs.cmake | 1 - indra/newview/CMakeLists.txt | 3 --- indra/newview/viewer_manifest.py | 4 ---- indra/win_crash_logger/llcrashloggerwindows.cpp | 1 - 5 files changed, 33 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 06f37044e9..76cec04ab0 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -291,30 +291,6 @@ </map> </map> </map> - <key>dbghelp</key> - <map> - <key>license</key> - <string>MSDTW</string> - <key>license_file</key> - <string>LICENSES/dbghelp.txt</string> - <key>name</key> - <string>dbghelp</string> - <key>platforms</key> - <map> - <key>windows</key> - <map> - <key>archive</key> - <map> - <key>hash</key> - <string>c5d28b13ce16a46f2e35eb133f7d92e8</string> - <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/dbghelp-6.11.1.404-windows-20101011.tar.bz2</string> - </map> - <key>name</key> - <string>windows</string> - </map> - </map> - </map> <key>dbusglib</key> <map> <key>license</key> diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index e2b7d3b888..4698116022 100644 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -47,7 +47,6 @@ if(WINDOWS) libapr-1.dll libaprutil-1.dll libapriconv-1.dll - dbghelp.dll ssleay32.dll libeay32.dll ) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 4c8b3e84a2..0e407d92d3 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1289,8 +1289,6 @@ if (WINDOWS) if (INTEL_MEMOPS_LIBRARY) list(APPEND viewer_LIBRARIES ${INTEL_MEMOPS_LIBRARY}) endif (INTEL_MEMOPS_LIBRARY) - - use_prebuilt_binary(dbghelp) endif (WINDOWS) # Add the xui files. This is handy for searching for xui elements @@ -1499,7 +1497,6 @@ if (WINDOWS) ${CMAKE_CURRENT_SOURCE_DIR}/licenses-win32.txt ${CMAKE_CURRENT_SOURCE_DIR}/featuretable.txt ${CMAKE_CURRENT_SOURCE_DIR}/featuretable_xp.txt - ${ARCH_PREBUILT_DIRS_RELEASE}/dbghelp.dll ${ARCH_PREBUILT_DIRS_RELEASE}/libeay32.dll ${ARCH_PREBUILT_DIRS_RELEASE}/qtcore4.dll ${ARCH_PREBUILT_DIRS_RELEASE}/qtgui4.dll diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index b48b0e7a3a..80e47125a0 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -306,10 +306,6 @@ class WindowsManifest(ViewerManifest): self.path("ssleay32.dll") self.path("libeay32.dll") - # For use in crash reporting (generates minidumps) - if self.args['configuration'].lower() != 'debug': - self.path("dbghelp.dll") - # For google-perftools tcmalloc allocator. try: if self.args['configuration'].lower() == 'debug': diff --git a/indra/win_crash_logger/llcrashloggerwindows.cpp b/indra/win_crash_logger/llcrashloggerwindows.cpp index 354b7e6cc3..51ff754c27 100644 --- a/indra/win_crash_logger/llcrashloggerwindows.cpp +++ b/indra/win_crash_logger/llcrashloggerwindows.cpp @@ -34,7 +34,6 @@ #include "boost/tokenizer.hpp" -#include "dbghelp.h" #include "indra_constants.h" // CRASH_BEHAVIOR_ASK, CRASH_SETTING_NAME #include "llerror.h" #include "llfile.h" -- cgit v1.2.3 From 6e0a9fb9fbd317b7b9b03d5d7e8eb4bd96200d3a Mon Sep 17 00:00:00 2001 From: brad kittenbrink <brad@lindenlab.com> Date: Fri, 18 Mar 2011 12:28:08 -0400 Subject: Added passing of viewer_channel to the autobuild configure line. --- build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sh b/build.sh index 625a09009b..9248c1f628 100755 --- a/build.sh +++ b/build.sh @@ -51,7 +51,7 @@ pre_build() { local variant="$1" begin_section "Pre$variant" - "$AUTOBUILD" configure -c $variant -- -DPACKAGE:BOOL=ON -DRELEASE_CRASH_REPORTING:BOOL=ON -DUSE_PRECOMPILED_HEADERS=FALSE + "$AUTOBUILD" configure -c $variant -- -DPACKAGE:BOOL=ON -DRELEASE_CRASH_REPORTING:BOOL=ON -DUSE_PRECOMPILED_HEADERS=FALSE -DVIEWER_CHANNEL:STRING="$viewer_channel" end_section "Pre$variant" } -- cgit v1.2.3 From f5b33904e6eb0c6eca59f3b03be7666cff5bb49a Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Fri, 18 Mar 2011 12:44:57 -0400 Subject: add upload of version-independent quicklinks --- build.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/build.sh b/build.sh index e302d95e76..270dede0dc 100755 --- a/build.sh +++ b/build.sh @@ -248,6 +248,7 @@ then succeeded=$build_coverity else upload_item installer "$package" binary/octet-stream + upload_item quicklink "$package" binary/octet-stream # Upload crash reporter files. case "$last_built_variant" in -- cgit v1.2.3 From c54d5353a6986c2cb5e2b053164052de82088ac5 Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Fri, 18 Mar 2011 12:46:16 -0400 Subject: add build name parameters --- BuildParams | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/BuildParams b/BuildParams index fe6e77151a..aa6c935b7f 100644 --- a/BuildParams +++ b/BuildParams @@ -156,7 +156,7 @@ media.build_viewer_update_version_manager = false # ================ oz_viewer-devreview.build_debug_release_separately = true -oz_viewer-autobuild2010.build_debug_release_separately = true +oz_ # ======================================== # enus @@ -193,6 +193,10 @@ viewer-asset-delivery-metrics.build_server_tests = false #============================================================================== # autobuild viewers #============================================================================== +viewer-autobuild2010.build_debug_release_separately = true +viewer-autobuild2010.viewer_channel = "Project Viewer - VS2010" +viewer-autobuild2010.login_channel = "Project Viewer - VS2010" +viewer-autobuild2010.viewer_grid = agni viewer-autobuild.build_link_parallel = false #======================================== -- cgit v1.2.3 From 6683b6edd5d32da51e7bbfbbec0f2fe68a78596f Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Fri, 18 Mar 2011 11:38:47 -0700 Subject: SOCIAL-760 FIX Make click-drag camera rotation more stable --- indra/newview/lltoolpie.cpp | 122 ++++++++++++++++++++++++++------------------ 1 file changed, 73 insertions(+), 49 deletions(-) diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index 9549f180df..a84346ab84 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -1709,8 +1709,13 @@ void LLToolPie::showVisualContextMenuEffect() effectp->setDuration(0.25f); } +typedef enum e_near_far +{ + NEAR_INTERSECTION, + FAR_INTERSECTION +} ENearFar; -bool intersect_ray_with_sphere( const LLVector3& ray_pt, const LLVector3& ray_dir, const LLVector3& sphere_center, F32 sphere_radius, LLVector3& intersection_pt) +bool intersect_ray_with_sphere( const LLVector3& ray_pt, const LLVector3& ray_dir, const LLVector3& sphere_center, F32 sphere_radius, e_near_far near_far, LLVector3& intersection_pt) { // do ray/sphere intersection by solving quadratic equation LLVector3 sphere_to_ray_start_vec = ray_pt - sphere_center; @@ -1718,10 +1723,11 @@ bool intersect_ray_with_sphere( const LLVector3& ray_pt, const LLVector3& ray_di F32 C = sphere_to_ray_start_vec.lengthSquared() - (sphere_radius * sphere_radius); F32 discriminant = B*B - 4.f*C; - if (discriminant > 0.f) + if (discriminant >= 0.f) { // intersection detected, now find closest one F32 t0 = (-B - sqrtf(discriminant)) / 2.f; - if (t0 > 0.f) + + if (t0 > 0.f && near_far == NEAR_INTERSECTION) { intersection_pt = ray_pt + ray_dir * t0; } @@ -1732,8 +1738,10 @@ bool intersect_ray_with_sphere( const LLVector3& ray_pt, const LLVector3& ray_di } return true; } - - return false; + else + { // no intersection + return false; + } } void LLToolPie::startCameraSteering() @@ -1786,64 +1794,80 @@ void LLToolPie::startCameraSteering() void LLToolPie::steerCameraWithMouse(S32 x, S32 y) { - const F32 MIN_ROTATION_RADIUS_FRACTION = 0.2f; - + const LLViewerCamera& camera = LLViewerCamera::instance(); + const LLCoordFrame& rotation_frame = gAgent.getFrameAgent(); const LLVector3 pick_pos = gAgent.getPosAgentFromGlobal(mSteerPick.mPosGlobal); - const LLVector3 rotation_center = gAgent.getFrameAgent().getOrigin(); - // FIXME: get this to work with camera tilt (i.e. sitting on a rotating object) - const LLVector3 rotation_up_axis(LLVector3::z_axis); - - LLVector3 object_rotation_center = rotation_center + parallel_component(pick_pos - rotation_center, rotation_up_axis); - F32 min_rotation_radius = MIN_ROTATION_RADIUS_FRACTION * dist_vec(rotation_center, LLViewerCamera::instance().getOrigin());; - F32 pick_distance_from_rotation_center = llclamp(dist_vec(pick_pos, object_rotation_center), min_rotation_radius, F32_MAX); + const LLVector3 pick_rotation_center = rotation_frame.getOrigin() + parallel_component(pick_pos - rotation_frame.getOrigin(), rotation_frame.getUpAxis()); + const F32 MIN_ROTATION_RADIUS_FRACTION = 0.2f; + const F32 min_rotation_radius = MIN_ROTATION_RADIUS_FRACTION * dist_vec(pick_rotation_center, camera.getOrigin());; + const F32 pick_distance_from_rotation_center = llclamp(dist_vec(pick_pos, pick_rotation_center), min_rotation_radius, F32_MAX); + const LLVector3 camera_to_rotation_center = pick_rotation_center - camera.getOrigin(); + const LLVector3 adjusted_camera_pos = LLViewerCamera::instance().getOrigin() + projected_vec(camera_to_rotation_center, rotation_frame.getUpAxis()); + const F32 camera_distance_from_rotation_center = dist_vec(adjusted_camera_pos, pick_rotation_center); - LLVector3 mouse_ray = orthogonal_component(gViewerWindow->mouseDirectionGlobal(x, y), rotation_up_axis); + LLVector3 mouse_ray = orthogonal_component(gViewerWindow->mouseDirectionGlobal(x, y), rotation_frame.getUpAxis()); mouse_ray.normalize(); - LLVector3 old_mouse_ray = orthogonal_component(gViewerWindow->mouseDirectionGlobal(mMouseSteerX, mMouseSteerY), rotation_up_axis); + LLVector3 old_mouse_ray = orthogonal_component(gViewerWindow->mouseDirectionGlobal(mMouseSteerX, mMouseSteerY), rotation_frame.getUpAxis()); old_mouse_ray.normalize(); - LLVector3 camera_pos = gAgentCamera.getCameraPositionAgent(); - LLVector3 camera_to_rotation_center = object_rotation_center - camera_pos; - LLVector3 adjusted_camera_pos = camera_pos + projected_vec(camera_to_rotation_center, rotation_up_axis); - LLVector3 rotation_fwd_axis = LLViewerCamera::instance().getAtAxis() - projected_vec(LLViewerCamera::instance().getAtAxis(), rotation_up_axis); - rotation_fwd_axis.normalize(); - F32 pick_dist = dist_vec(pick_pos, adjusted_camera_pos); - + F32 yaw_angle; + F32 old_yaw_angle; LLVector3 mouse_on_sphere; - bool mouse_hit_sphere = intersect_ray_with_sphere(adjusted_camera_pos + (mouse_ray * pick_dist * 1.1f), - -1.f * mouse_ray, - object_rotation_center, - pick_distance_from_rotation_center, - mouse_on_sphere); - LLVector3 old_mouse_on_sphere; - intersect_ray_with_sphere(adjusted_camera_pos + (old_mouse_ray * pick_dist * 1.1f), - -1.f * old_mouse_ray, - object_rotation_center, - pick_distance_from_rotation_center, - old_mouse_on_sphere); - if (mouse_hit_sphere) + if (intersect_ray_with_sphere( + adjusted_camera_pos, + mouse_ray, + pick_rotation_center, + pick_distance_from_rotation_center, + FAR_INTERSECTION, + mouse_on_sphere)) { - // calculate rotation frame in screen space - LLVector3 screen_rotation_up_axis = orthogonal_component(rotation_up_axis, LLViewerCamera::instance().getAtAxis()); - screen_rotation_up_axis.normalize(); - - LLVector3 screen_rotation_left_axis = screen_rotation_up_axis % LLViewerCamera::instance().getAtAxis(); + LLVector3 mouse_sphere_offset = mouse_on_sphere - pick_rotation_center; + yaw_angle = atan2f(mouse_sphere_offset * rotation_frame.getLeftAxis(), mouse_sphere_offset * rotation_frame.getAtAxis()); + } + else + { + yaw_angle = F_PI_BY_TWO + asinf(pick_distance_from_rotation_center / camera_distance_from_rotation_center); + if (mouse_ray * rotation_frame.getLeftAxis() < 0.f) + { + yaw_angle *= -1.f; + } + } - LLVector3 rotation_furthest_pt = object_rotation_center + pick_distance_from_rotation_center * rotation_fwd_axis; - F32 mouse_lateral_distance = llclamp(((mouse_on_sphere - rotation_furthest_pt) * screen_rotation_left_axis) / pick_distance_from_rotation_center, -1.f, 1.f); - F32 old_mouse_lateral_distance = llclamp(((old_mouse_on_sphere - rotation_furthest_pt) * screen_rotation_left_axis) / pick_distance_from_rotation_center, -1.f, 1.f); + if (intersect_ray_with_sphere( + adjusted_camera_pos, + old_mouse_ray, + pick_rotation_center, + pick_distance_from_rotation_center, + FAR_INTERSECTION, + old_mouse_on_sphere)) + { + LLVector3 mouse_sphere_offset = old_mouse_on_sphere - pick_rotation_center; + old_yaw_angle = atan2f(mouse_sphere_offset * rotation_frame.getLeftAxis(), mouse_sphere_offset * rotation_frame.getAtAxis()); + } + else + { + old_yaw_angle = F_PI_BY_TWO + asinf(pick_distance_from_rotation_center / camera_distance_from_rotation_center); - F32 yaw_angle = asinf(mouse_lateral_distance); - F32 old_yaw_angle = asinf(old_mouse_lateral_distance); + if (mouse_ray * rotation_frame.getLeftAxis() < 0.f) + { + old_yaw_angle *= -1.f; + } + } - F32 delta_angle = yaw_angle - old_yaw_angle; - if (!mClockwise) delta_angle *= -1.f; + const F32 delta_angle = yaw_angle - old_yaw_angle; + if (mClockwise) + { gAgent.yaw(delta_angle); - mMouseSteerX = x; - mMouseSteerY = y; } + else + { + gAgent.yaw(-delta_angle); + } + + mMouseSteerX = x; + mMouseSteerY = y; } -- cgit v1.2.3 From df2e9b85f08a752baef3ba7fe7165f1da1e89545 Mon Sep 17 00:00:00 2001 From: "Andrew A. de Laix" <alain@lindenlab.com> Date: Fri, 18 Mar 2011 11:49:44 -0700 Subject: update archives to permanent S3 locations. --- autobuild.xml | 116 +++++++++++++++++++++++++++++----------------------------- 1 file changed, 58 insertions(+), 58 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 76cec04ab0..dc54f49a31 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -68,7 +68,7 @@ <key>hash</key> <string>69ae3b1c9cdb0ebc0d0e1ac8413e3eb7</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-sdl/rev/223253/arch/Linux/installer/SDL-1.2.14-linux-20110309.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/SDL-1.2.14-linux-20110309.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -92,7 +92,7 @@ <key>hash</key> <string>9868bfa0b6954e4884c49c6f30068c80</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-apr/rev/221588/arch/Darwin/installer/apr_suite-1.4.2-darwin-20110217.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/apr_suite-1.4.2-darwin-20110217.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -104,7 +104,7 @@ <key>hash</key> <string>ff62946c518a247c86e1066c1e9a5855</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-apr/rev/223260/arch/Linux/installer/apr_suite-1.4.2-linux-20110309.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/apr_suite-1.4.2-linux-20110309.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -116,7 +116,7 @@ <key>hash</key> <string>73785c200a5b4ef74a1230b028bb680d</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-apr/rev/221588/arch/CYGWIN/installer/apr_suite-1.4.2-windows-20110217.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/apr_suite-1.4.2-windows-20110217.tar.bz2</string> </map> <key>name</key> <string>windows</string> @@ -140,7 +140,7 @@ <key>hash</key> <string>e6caaeea16131e1f2343ecd7765e3147</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-ares/rev/220963/arch/Darwin/installer/ares-1.7.1-darwin-20110217.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.7.1-darwin-20110217.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -200,7 +200,7 @@ <key>hash</key> <string>a34e7fffdb94a6a4d8a2966b1f216da3</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-boost/rev/223302/arch/Linux/installer/boost-1.45.0-linux-20110310.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.45.0-linux-20110310.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -212,7 +212,7 @@ <key>hash</key> <string>98be22c8833aa2bca184b9fa09fbb82b</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-boost/rev/219456/arch/CYGWIN/installer/boost-1.45.0-windows-20110124.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.45.0-windows-20110124.tar.bz2</string> </map> <key>name</key> <string>windows</string> @@ -236,7 +236,7 @@ <key>hash</key> <string>aaea644191807f51051cefa2fac11069</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-curl/rev/224181/arch/Darwin/installer/curl-7.21.1-darwin-20110316.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.21.1-darwin-20110316.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -248,7 +248,7 @@ <key>hash</key> <string>2d9377951d99a1aa4735cea8d4b5aa71</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-curl/rev/224181/arch/Linux/installer/curl-7.21.1-linux-20110316.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.21.1-linux-20110316.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -260,7 +260,7 @@ <key>hash</key> <string>fea96aa2a7d513397317194f3d6c979b</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-curl/rev/220996/arch/CYGWIN/installer/curl-7.21.1-windows-20110211.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.21.1-windows-20110211.tar.bz2</string> </map> <key>name</key> <string>windows</string> @@ -284,7 +284,7 @@ <key>hash</key> <string>8f57c413e0786681cbcb9ed2fb8a6d37</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-db/rev/223263/arch/Linux/installer/db-5.1.25-linux-20110309.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/db-5.1.25-linux-20110309.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -380,7 +380,7 @@ <key>hash</key> <string>e72db1bda49b205ebdf4945d4ed2b8f8</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-expat/rev/221208/arch/CYGWIN/installer/expat-2.0.1-windows-20110215.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/expat-2.0.1-windows-20110215.tar.bz2</string> </map> <key>name</key> <string>windows</string> @@ -404,7 +404,7 @@ <key>hash</key> <string>61ead113e6479452e6b690c84b4e9d30</string> <key>url</key> - <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-fmod-private/rev/221852/arch/Darwin/installer/fmod-3.75-darwin-20110222.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/fmod-3.75-darwin-20110222.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -416,7 +416,7 @@ <key>hash</key> <string>0c61d643db54d2e5999be8254569d8b3</string> <key>url</key> - <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-fmod-private/rev/221852/arch/Linux/installer/fmod-3.75-linux-20110223.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/fmod-3.75-linux-20110223.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -428,7 +428,7 @@ <key>hash</key> <string>d9a9a6ad86895353bcd63374a4c1a91d</string> <key>url</key> - <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-fmod-private/rev/221852/arch/CYGWIN/installer/fmod-3.75-windows-20110222.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/fmod-3.75-windows-20110222.tar.bz2</string> </map> <key>name</key> <string>windows</string> @@ -452,7 +452,7 @@ <key>hash</key> <string>d8b08b657247566bde5fd853c7622478</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-fontconfig/rev/223389/arch/Linux/installer/fontconfig-2.8.0-linux-20110311.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/fontconfig-2.8.0-linux-20110311.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -500,7 +500,7 @@ <key>hash</key> <string>c0eacb6348e032fbc69cfdc4bd215ee4</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-freetype/rev/222819/arch/Darwin/installer/freetype-2.4.4-darwin-20110307.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.4.4-darwin-20110307.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -512,7 +512,7 @@ <key>hash</key> <string>9b58d1a9c15807a1301e42a313641010</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-freetype/rev/223377/arch/Linux/installer/freetype-2.4.4-linux-20110310.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.4.4-linux-20110310.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -524,7 +524,7 @@ <key>hash</key> <string>271349827b939406162ce42e42cd18e0</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-freetype/rev/221707/arch/CYGWIN/installer/freetype-2.4.4-windows-20110218.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.4.4-windows-20110218.tar.bz2</string> </map> <key>name</key> <string>windows</string> @@ -596,7 +596,7 @@ <key>hash</key> <string>bd2f84ef8bd308570e2e532a371dc2ef</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-glui/rev/221069/arch/Darwin/installer/glui-2.36-darwin-20110309.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glui-2.36-darwin-20110309.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -608,7 +608,7 @@ <key>hash</key> <string>e006635a741420a15f40bbdac13bd8d7</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-glui/rev/221069/arch/CYGWIN/installer/glui-2.36-windows-20110214.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glui-2.36-windows-20110214.tar.bz2</string> </map> <key>name</key> <string>windows</string> @@ -632,7 +632,7 @@ <key>hash</key> <string>cf513fc2eec4a414cc804cf408932a45</string> <key>url</key> - <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-google-perftools/rev/224046/arch/Linux/installer/google_perftools-1.7-linux-20110315.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google_perftools-1.7-linux-20110315.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -668,7 +668,7 @@ <key>hash</key> <string>21babc394dbf8572830f2e85adec7b9f</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-breakpad/rev/220211/arch/Darwin/installer/google_breakpad-0.0.0-rev599-darwin-20110202.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google_breakpad-0.0.0-rev599-darwin-20110202.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -680,7 +680,7 @@ <key>hash</key> <string>204b02a9480c411232255798839431a2</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-breakpad/rev/223427/arch/Linux/installer/google_breakpad-0.0.0-rev599-linux-20110311.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google_breakpad-0.0.0-rev599-linux-20110311.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -692,7 +692,7 @@ <key>hash</key> <string>627c51136e14e64c5d39933f3abd3bdf</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-breakpad/rev/220211/arch/CYGWIN/installer/google_breakpad-0.0.0-rev599-windows-20110218.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google_breakpad-0.0.0-rev599-windows-20110218.tar.bz2</string> </map> <key>name</key> <string>windows</string> @@ -740,7 +740,7 @@ <key>hash</key> <string>212701468920519f3989677cea9ca4f1</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-mock/rev/222036/arch/CYGWIN/installer/gmock-1.5.0-windows-20110224.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gmock-1.5.0-windows-20110224.tar.bz2</string> </map> <key>name</key> <string>windows</string> @@ -824,7 +824,7 @@ <key>hash</key> <string>71bd6efbf508e1f2e7d98a6195a93e9e</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-jpeglib/rev/222232/arch/Darwin/installer/jpeglib-8c-darwin-20110228.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-8c-darwin-20110228.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -836,7 +836,7 @@ <key>hash</key> <string>fa1073ef1181f27e6bc01d571366070b</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-jpeglib/rev/222826/arch/Linux/installer/jpeglib-8c-linux-20110307.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-8c-linux-20110307.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -848,7 +848,7 @@ <key>hash</key> <string>a202ec58cef9097c94acfa958ed6da8d</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-jpeglib/rev/221594/arch/CYGWIN/installer/jpeglib-8c-windows-20110217.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-8c-windows-20110217.tar.bz2</string> </map> <key>name</key> <string>windows</string> @@ -872,7 +872,7 @@ <key>hash</key> <string>de8b96120c274e052abb4f692861be46</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-jsoncpp/rev/220079/arch/Darwin/installer/jsoncpp-0.5.0-darwin-20110131.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jsoncpp-0.5.0-darwin-20110131.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -884,7 +884,7 @@ <key>hash</key> <string>840cd9455638c0ea52c613cfddd07d5b</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-jsoncpp/rev/223959/arch/Linux/installer/jsoncpp-0.5.0-linux-20110315.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jsoncpp-0.5.0-linux-20110315.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -896,7 +896,7 @@ <key>hash</key> <string>afff2018e6a887c281b072eecdd9343e</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-jsoncpp/rev/220579/arch/CYGWIN/installer/jsoncpp-0.5.0-windows-20110208.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jsoncpp-0.5.0-windows-20110208.tar.bz2</string> </map> <key>name</key> <string>windows</string> @@ -920,7 +920,7 @@ <key>hash</key> <string>d91e1f483209cd3eba04135c6a59e829</string> <key>url</key> - <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-kdu-private/rev/221672/arch/Darwin/installer/kdu-6.4.1-darwin-20110218.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/kdu-6.4.1-darwin-20110218.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -932,7 +932,7 @@ <key>hash</key> <string>fbf8a4f78dff986d7c16b3a0437e033e</string> <key>url</key> - <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-kdu-private/rev/223538/arch/Linux/installer/kdu-6.4.1-linux-20110311.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/kdu-6.4.1-linux-20110311.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -944,7 +944,7 @@ <key>hash</key> <string>6cd9f36465ef73a3df34bf2b3bba2ced</string> <key>url</key> - <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-kdu-private/rev/221672/arch/CYGWIN/installer/kdu-6.4.1-windows-20110218.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/kdu-6.4.1-windows-20110218.tar.bz2</string> </map> <key>name</key> <string>windows</string> @@ -968,7 +968,7 @@ <key>hash</key> <string>6fe1adf12d98bce9111f60ee762007b9</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-libpng/rev/221851/arch/Darwin/installer/libpng-1.5.1-darwin-20110222.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.5.1-darwin-20110222.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -980,7 +980,7 @@ <key>hash</key> <string>0681ab7e1988dfdbdad7dd9edb7760ee</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-libpng/rev/221851/arch/Linux/installer/libpng-1.5.1-linux-20110223.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.5.1-linux-20110223.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -992,7 +992,7 @@ <key>hash</key> <string>735a955e6442733e2342ab12c1087488</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-libpng/rev/221747/arch/CYGWIN/installer/libpng-1.5.1-windows-20110221.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.5.1-windows-20110221.tar.bz2</string> </map> <key>name</key> <string>windows</string> @@ -1016,7 +1016,7 @@ <key>hash</key> <string>873e8e99d29711df2efa30646dca1795</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-libuuid/rev/223995/arch/Linux/installer/uuid-1.6.2-linux-20110315.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/uuid-1.6.2-linux-20110315.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -1064,7 +1064,7 @@ <key>hash</key> <string>0326cb770c7ff995cf822fb330ae9d0c</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llqtwebkit/rev/223111/arch/Darwin/installer/llqtwebkit-4.7.1-darwin-20110308.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-4.7.1-darwin-20110308.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -1076,7 +1076,7 @@ <key>hash</key> <string>f53e2a255d4c4039203de3e4640a2d41</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llqtwebkit/rev/223655/arch/Linux/installer/llqtwebkit-4.7.1-linux-20110314.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-4.7.1-linux-20110314.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -1088,7 +1088,7 @@ <key>hash</key> <string>7865b9c3a5d9f9424af56d5d05b82de9</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/alain_llqtwebkit/rev/220864/arch/CYGWIN/installer/llqtwebkit-4.7.1-windows-20110210.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-4.7.1-windows-20110210.tar.bz2</string> </map> <key>name</key> <string>windows</string> @@ -1136,7 +1136,7 @@ <key>hash</key> <string>674d37d2ba76a2df7f18c47bf50b5d03</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-libndofdev/rev/223177/arch/Darwin/installer/libndofdev-0.1-darwin-20110308.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libndofdev-0.1-darwin-20110308.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -1160,7 +1160,7 @@ <key>hash</key> <string>3a4bec9562ed6ac53e85abcb1afc5fc0</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-libndofdev/rev/221922/arch/CYGWIN/installer/libndofdev-0.1-windows-20110223.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libndofdev-0.1-windows-20110223.tar.bz2</string> </map> <key>name</key> <string>windows</string> @@ -1184,7 +1184,7 @@ <key>hash</key> <string>57f32a1a670f06a4dc036eb1164ad9d7</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-ogvorbis/rev/221801/arch/Darwin/installer/ogg_vorbis-1.1.3-1.2.0-darwin-20110222.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg_vorbis-1.1.3-1.2.0-darwin-20110222.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -1196,7 +1196,7 @@ <key>hash</key> <string>17c000ceef32c0623d038b4c73791bee</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-ogvorbis/rev/222841/arch/Linux/installer/ogg_vorbis-1.1.3-1.2.0-linux-20110307.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg_vorbis-1.1.3-1.2.0-linux-20110307.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -1208,7 +1208,7 @@ <key>hash</key> <string>c8fccf7eeb25fd45cb7e04399c0b83ee</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-ogvorbis/rev/221801/arch/CYGWIN/installer/ogg_vorbis-1.1.3-1.2.0-windows-20110222.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg_vorbis-1.1.3-1.2.0-windows-20110222.tar.bz2</string> </map> <key>name</key> <string>windows</string> @@ -1232,7 +1232,7 @@ <key>hash</key> <string>facee34b8bd57ad602157e65a5af1a49</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-openssl/rev/220986/arch/Darwin/installer/openssl-0.9.8q-darwin-20110211.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openssl-0.9.8q-darwin-20110211.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -1282,7 +1282,7 @@ <key>hash_algorithm</key> <string>md5</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-openal/rev/223977/arch/Linux/installer/openal-1.12.854-1.1.0-linux-20110315.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openal-1.12.854-1.1.0-linux-20110315.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -1294,7 +1294,7 @@ <key>hash</key> <string>04df406f3e5d04cf176660bdac66c3a1</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-openal/rev/222391/arch/CYGWIN/installer/openal-1.12.854-1.1.0-windows-20110301.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openal-1.12.854-1.1.0-windows-20110301.tar.bz2</string> </map> <key>name</key> <string>windows</string> @@ -1320,7 +1320,7 @@ <key>hash</key> <string>4be51c7cca7d84831e30b63279df7ae5</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-openjpeg/rev/222548/arch/Darwin/installer/openjpeg-1.4-darwin-20110302.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.4-darwin-20110302.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -1332,7 +1332,7 @@ <key>hash</key> <string>fb2382014c79e0049746e4e29bd834f9</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-openjpeg/rev/223705/arch/Linux/installer/openjpeg-1.4-linux-20110314.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.4-linux-20110314.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -1344,7 +1344,7 @@ <key>hash</key> <string>ca5765af55f798724d601720afdf6953</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-openjpeg/rev/222548/arch/CYGWIN/installer/openjpeg-1.4-windows-20110302.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.4-windows-20110302.tar.bz2</string> </map> <key>name</key> <string>windows</string> @@ -1368,7 +1368,7 @@ <key>hash</key> <string>2172379794217d0ffba0db09b2ac17bf</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-pth/rev/222617/arch/Darwin/installer/pth-2.0.7-darwin-20110303.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/pth-2.0.7-darwin-20110303.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -1488,7 +1488,7 @@ <key>hash</key> <string>a3e0fb4b4a51b01690a99747a1cca531</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-xmlrpc-epi/rev/222889/arch/Darwin/installer/xmlrpc_epi-0.54.1-darwin-20110307.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/xmlrpc_epi-0.54.1-darwin-20110307.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -1500,7 +1500,7 @@ <key>hash</key> <string>174ab797440157956eda7061dae37564</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-xmlrpc-epi/rev/223735/arch/Linux/installer/xmlrpc_epi-0.54.1-linux-20110314.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/xmlrpc_epi-0.54.1-linux-20110314.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -1512,7 +1512,7 @@ <key>hash</key> <string>5181d1a8f2516928ac064d72acf164a4</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-xmlrpc-epi/rev/222021/arch/CYGWIN/installer/xmlrpc_epi-0.54.1-windows-20110224.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/xmlrpc_epi-0.54.1-windows-20110224.tar.bz2</string> </map> <key>name</key> <string>windows</string> @@ -1536,7 +1536,7 @@ <key>hash</key> <string>49b8de20f3bb43537f51311894a72de1</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-zlib/rev/220983/arch/Darwin/installer/zlib-1.2.5-darwin-20110211.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/zlib-1.2.5-darwin-20110211.tar.bz2</string> </map> <key>name</key> <string>darwin</string> -- cgit v1.2.3 From d55f816fb15eab67abb72997b2eb589fff16f4ee Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Fri, 18 Mar 2011 14:54:30 -0400 Subject: Some code cleanup. Changed equations to occur in normalized (0,1) space instead of parameter space. --- indra/newview/character/avatar_lad.xml | 42 +++---- indra/newview/lldriverparam.h | 2 + indra/newview/llphysicsmotion.cpp | 199 +++++++++++++++++++++------------ 3 files changed, 153 insertions(+), 90 deletions(-) diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index 6dbda4fd16..0fc62ccaf1 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -9142,9 +9142,9 @@ render_pass="bump"> edit_group="physics" label_min="Less" label_max="More" - value_default="2" - value_min="1" - value_max="5" + value_default=".2" + value_min=".1" + value_max=".5" camera_elevation=".3" camera_distance=".8"> <param_driver /> @@ -9180,7 +9180,7 @@ render_pass="bump"> label_max="More" value_default="0" value_min="0" - value_max="1" + value_max="100" camera_elevation=".3" camera_distance=".8"> <param_driver /> @@ -9215,7 +9215,7 @@ render_pass="bump"> label_min="Less" label_max="More" value_default="10" - value_min="1" + value_min="0" value_max="100" camera_elevation=".3" camera_distance=".8"> @@ -9232,9 +9232,9 @@ render_pass="bump"> edit_group="physics" label_min="Less" label_max="More" - value_default=".5" + value_default=".05" value_min="0" - value_max="1" + value_max=".1" camera_elevation=".3" camera_distance=".8"> <param_driver /> @@ -9250,9 +9250,9 @@ render_pass="bump"> edit_group="physics" label_min="Less" label_max="More" - value_default=".1" + value_default=".15" value_min="0" - value_max="1" + value_max=".5" camera_elevation=".3" camera_distance=".8"> <param_driver /> @@ -9268,7 +9268,7 @@ render_pass="bump"> edit_group="physics" label_min="Less" label_max="More" - value_default="0" + value_default="10" value_min="0" value_max="10" camera_elevation=".3" @@ -9287,9 +9287,9 @@ render_pass="bump"> edit_group="physics" label_min="Less" label_max="More" - value_default="1.5" + value_default=".1" value_min="0" - value_max="10" + value_max="1" camera_elevation=".3" camera_distance=".8"> <param_driver /> @@ -9305,8 +9305,8 @@ render_pass="bump"> edit_group="physics" label_min="Less" label_max="More" - value_default="50" - value_min="1" + value_default="10" + value_min="0" value_max="100" camera_elevation=".3" camera_distance=".8"> @@ -9323,9 +9323,9 @@ render_pass="bump"> edit_group="physics" label_min="Less" label_max="More" - value_default=".1" + value_default=".05" value_min="0" - value_max="1" + value_max=".1" camera_elevation=".3" camera_distance=".8"> <param_driver /> @@ -9341,9 +9341,9 @@ render_pass="bump"> edit_group="physics" label_min="Less" label_max="More" - value_default=".1" + value_default=".15" value_min="0" - value_max="1" + value_max=".5" camera_elevation=".3" camera_distance=".8"> <param_driver /> @@ -9359,7 +9359,7 @@ render_pass="bump"> edit_group="physics" label_min="Less" label_max="More" - value_default="1" + value_default="10" value_min="0" value_max="10" camera_elevation=".3" @@ -9378,7 +9378,7 @@ render_pass="bump"> edit_group_order="7" label_min="Less" label_max="More" - value_default="10" + value_default="0" value_min="-1.5" value_max="2" camera_elevation=".3" @@ -9400,7 +9400,7 @@ render_pass="bump"> edit_group_order="8" label_min="Less" label_max="More" - value_default="10" + value_default="0" value_min="-.3" value_max="1.3" camera_elevation=".3" diff --git a/indra/newview/lldriverparam.h b/indra/newview/lldriverparam.h index a0e45cf5e5..fb1b44458c 100644 --- a/indra/newview/lldriverparam.h +++ b/indra/newview/lldriverparam.h @@ -30,6 +30,7 @@ #include "llviewervisualparam.h" #include "llwearabletype.h" +class LLPhysicsMotion; class LLVOAvatar; class LLWearable; @@ -76,6 +77,7 @@ protected: class LLDriverParam : public LLViewerVisualParam { + friend class LLPhysicsMotion; // physics motion needs to access driven params directly. public: LLDriverParam(LLVOAvatar *avatarp); LLDriverParam(LLWearable *wearablep); diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 01b3ebe1f0..eb128e043c 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -46,6 +46,7 @@ #include "llvoavatarself.h" typedef std::map<std::string, std::string> controller_map_t; +typedef std::map<std::string, F32> default_controller_map_t; #define MIN_REQUIRED_PIXEL_AREA_BREAST_MOTION 0.f; @@ -56,19 +57,30 @@ inline F64 llsgn(const F64 a) return -1; } +/* + At a high level, this works by setting temporary parameters that are not stored + in the avatar's list of params, and are not conveyed to other users. We accomplish + this by creating some new temporary driven params inside avatar_lad that are then driven + by the actual params that the user sees and sets. For example, in the old system, + the user sets a param called breast bouyancy, which controls the Z value of the breasts. + In our new system, the user still sets the breast bouyancy, but that param is redefined + as a driver param so that it affects ... +*/ + class LLPhysicsMotion { public: /* param_user_name: The param (if any) that the user sees and controls. This is what - the particular body part would look like without physics. For example, it may be + the particular property would look like without physics. For example, it may be the breast gravity. This param's value should will not be altered, and is only used as a reference point for the rest position of the body party. This is usually - a driver param and the param that physics is altering is the driven param. - If this is left blank, that means that the physics is affecting a param that is - not exposed to the user. + a driver param and the param(s) that physics is altering are the driven params. - param_driven_name: The param whose value is actually set by the physics. + param_driven_name: The param whose value is actually set by the physics. If you + leave this blank (which should suffice normally), the physics will assume that + param_user_name is a driver param and will set the params that the driver is + in charge of (i.e. the "driven" params). joint_name: The joint that the body part is attached to. The joint is used to determine the orientation (rotation) of the body part. @@ -100,9 +112,7 @@ public: mLastTime(0), mPosition_local(0), mVelocityJoint_local(0), - mPositionLastUpdate_local(0), - mPositionMin_local(0), - mPositionMax_local(0) + mPositionLastUpdate_local(0) { mJointState = new LLJointState; } @@ -123,17 +133,18 @@ protected: const controller_map_t::const_iterator& entry = mParamControllers.find(controller_key); if (entry == mParamControllers.end()) { - return 1.0; + return sDefaultController[controller_key]; } const std::string& param_name = (*entry).second.c_str(); return mCharacter->getVisualParamWeight(param_name.c_str()); } + void setParamValue(LLViewerVisualParam *param, + const F32 new_value_local); F32 toLocal(const LLVector3 &world); F32 calculateVelocity_local(const F32 time_delta); F32 calculateAcceleration_local(F32 velocity_local, const F32 time_delta); - private: const std::string mParamDrivenName; const std::string mParamUserName; @@ -146,8 +157,6 @@ private: F32 mVelocity_local; // How fast the param is moving F32 mPositionLastUpdate_local; - F32 mPositionMin_local; - F32 mPositionMax_local; LLVector3 mPosition_world; LLViewerVisualParam *mParamUser; @@ -158,10 +167,25 @@ private: LLCharacter *mCharacter; F32 mLastTime; - + + static default_controller_map_t sDefaultController; }; +default_controller_map_t initDefaultController() +{ + default_controller_map_t controller; + controller["Mass"] = 2.0f; + controller["Smoothing"] = 2.0f; + controller["Gravity"] = 0.0f; + controller["Damping"] = .5f; + controller["Drag"] = 0.1f; + controller["MaxSpeed"] = 10.0f; + controller["Spring"] = 1.0f; + controller["Gain"] = 10.0f; + return controller; +} +default_controller_map_t LLPhysicsMotion::sDefaultController = initDefaultController(); BOOL LLPhysicsMotion::initialize() { @@ -170,15 +194,13 @@ BOOL LLPhysicsMotion::initialize() mJointState->setUsage(LLJointState::ROT); mParamUser = (LLViewerVisualParam*)mCharacter->getVisualParam(mParamUserName.c_str()); - mParamDriven = (LLViewerVisualParam*)mCharacter->getVisualParam(mParamDrivenName.c_str()); - if ((mParamUser == NULL) || - (mParamDriven == NULL)) + if (mParamDrivenName != "") + mParamDriven = (LLViewerVisualParam*)mCharacter->getVisualParam(mParamDrivenName.c_str()); + if (mParamUser == NULL) { - llinfos << "Failure reading in either of both of [ " << mParamUserName << " : " << mParamDrivenName << " ]" << llendl; + llinfos << "Failure reading in [ " << mParamUserName << " ]" << llendl; return FALSE; } - mPositionMin_local = mParamDriven->getMinWeight(); - mPositionMax_local = mParamDriven->getMaxWeight(); return TRUE; } @@ -226,7 +248,7 @@ LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter controllers_cleavage["Gain"] = "Breast_Physics_Side_Gain"; LLPhysicsMotion *cleavage_motion = new LLPhysicsMotion("Breast_Female_Cleavage_Driver", - "Breast_Female_Cleavage", + "", "mChest", character, LLVector3(-1,0,0), @@ -246,7 +268,7 @@ LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter controllers_bounce["Gain"] = "Breast_Physics_UpDown_Gain"; LLPhysicsMotion *bounce_motion = new LLPhysicsMotion("Breast_Gravity_Driver", - "Breast_Gravity", + "", "mChest", character, LLVector3(0,0,1), @@ -259,14 +281,13 @@ LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter controllers_butt_bounce["Mass"] = "Breast_Physics_Mass"; controllers_butt_bounce["Smoothing"] = "Breast_Physics_Smoothing"; controllers_butt_bounce["Gravity"] = "Breast_Physics_Gravity"; - controllers_butt_bounce["Damping"] = "Breast_Physics_Side_Damping"; - controllers_butt_bounce["Drag"] = "Breast_Physics_Side_Drag"; - controllers_butt_bounce["MaxSpeed"] = "Breast_Physics_Side_Max_Velocity"; - controllers_butt_bounce["Spring"] = "Breast_Physics_Side_Spring"; - controllers_butt_bounce["Gain"] = "Breast_Physics_Side_Gain"; - + controllers_butt_bounce["Damping"] = "Breast_Physics_UpDown_Damping"; + controllers_butt_bounce["Drag"] = "Breast_Physics_UpDown_Drag"; + controllers_butt_bounce["MaxSpeed"] = "Breast_Physics_UpDown_Max_Velocity"; + controllers_butt_bounce["Spring"] = "Breast_Physics_UpDown_Spring"; + controllers_butt_bounce["Gain"] = "Breast_Physics_UpDown_Gain"; LLPhysicsMotion *butt_bounce_motion = new LLPhysicsMotion("Butt_Gravity_Driver", - "Butt_Gravity", + "", "mPelvis", character, LLVector3(0,0,-1), @@ -284,13 +305,12 @@ LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter controllers_belly_bounce["MaxSpeed"] = "Breast_Physics_UpDown_Max_Velocity"; controllers_belly_bounce["Spring"] = "Breast_Physics_UpDown_Spring"; controllers_belly_bounce["Gain"] = "Breast_Physics_UpDown_Gain"; - - LLPhysicsMotion *belly_bounce_motion = new LLPhysicsMotion("Big_Belly_Torso", - "Belly_Gravity", - "mChest", - character, - LLVector3(0,0,.25f), - controllers_belly_bounce); + LLPhysicsMotion *belly_bounce_motion = new LLPhysicsMotion("Belly_Gravity", + "", + "mChest", + character, + LLVector3(0,0,1), + controllers_belly_bounce); if (!belly_bounce_motion->initialize()) return STATUS_FAILURE; addMotion(belly_bounce_motion); @@ -375,7 +395,7 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) { // static FILE *mFileWrite = fopen("c:\\temp\\avatar_data.txt","w"); - if (!mParamUser || !mParamDriven) + if (!mParamUser) return FALSE; if (!mLastTime) @@ -403,16 +423,24 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) return TRUE; } - F32 behavior_mass = getParamValue("Mass"); - F32 behavior_gravity = getParamValue("Gravity"); - F32 behavior_spring = getParamValue("Spring"); - F32 behavior_gain = getParamValue("Gain"); - F32 behavior_damping = getParamValue("Damping"); - F32 behavior_maxspeed = getParamValue("MaxSpeed"); - F32 behavior_drag = getParamValue("Drag"); + LLJoint *joint = mJointState->getJoint(); + + const F32 behavior_mass = getParamValue("Mass"); + const F32 behavior_gravity = getParamValue("Gravity"); + const F32 behavior_spring = getParamValue("Spring"); + const F32 behavior_gain = getParamValue("Gain"); + const F32 behavior_damping = getParamValue("Damping"); + const F32 behavior_maxspeed = getParamValue("MaxSpeed"); + const F32 behavior_drag = getParamValue("Drag"); + + F32 position_current_local = mPosition_local; // Normalized [0,1] range + // Normalize the param position to be from [0,1]. + // We have to use normalized values because there may be more than one driven param, + // and each of these driven params may have its own range. + // This means we'll do all our calculations in normalized [0,1] local coordinates. F32 position_user_local = mParamUser->getWeight(); - F32 position_current_local = mPosition_local; + position_user_local = (position_user_local - mParamUser->getMinWeight()) / (mParamUser->getMaxWeight() - mParamUser->getMinWeight()); // // End parameters and settings @@ -426,8 +454,6 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) const F32 velocity_joint_local = calculateVelocity_local(time_delta); const F32 acceleration_joint_local = calculateAcceleration_local(velocity_joint_local, time_delta); - LLJoint *joint = mJointState->getJoint(); - // // End velocity and acceleration //////////////////////////////////////////////////////////////////////////////// @@ -486,21 +512,46 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) { velocity_new_local = sin(time*4.0)*5.0; } - // Calculate the new parameters and clamp them to the min/max ranges. - F32 position_new_local = position_current_local + velocity_new_local*time_delta; - position_new_local = llclamp(position_new_local, - mPositionMin_local, mPositionMax_local); - - // Set the new parameters. - // If the param is disabled, just set the param to the user value. - if (behavior_maxspeed == 0) + // Calculate the new parameters, or remain unchanged if max speed is 0. + const F32 position_new_local = (behavior_maxspeed != 0) ? + (position_current_local + velocity_new_local*time_delta) : + position_user_local; + + const F32 position_new_local_clamped = llclamp(position_new_local, + 0.0f, + 1.0f); + + // Set the new param. + // 1. If the user has specified a param target, use that. + // 2. If the param is a driver param, set the param(s) that it drives. + // 3. Otherwise, set the param directly (don't do this if the param is a user-editable param!) + // If a specific param has been declared, then set that one. + // Otherwise, assume that the param is a driver param, and + // set the params that it drives. + if (mParamDriven) { - position_new_local = position_user_local; + setParamValue(mParamDriven,position_new_local_clamped); } - mCharacter->setVisualParamWeight(mParamDriven, - position_new_local, - FALSE); - + else + { + LLDriverParam *driver_param = dynamic_cast<LLDriverParam *>(mParamUser); + if (driver_param) + { + for (LLDriverParam::entry_list_t::iterator iter = driver_param->mDriven.begin(); + iter != driver_param->mDriven.end(); + ++iter) + { + LLDrivenEntry &entry = (*iter); + LLViewerVisualParam *driven_param = entry.mParam; + setParamValue(driven_param,position_new_local_clamped); + } + } + else + { + setParamValue(mParamUser,position_new_local_clamped); + } + } + // // End calculate new params //////////////////////////////////////////////////////////////////////////////// @@ -508,7 +559,7 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) //////////////////////////////////////////////////////////////////////////////// // Conditionally update the visual params // - + // Updating the visual params (i.e. what the user sees) is fairly expensive. // So only update if the params have changed enough, and also take into account // the graphics LOD settings. @@ -520,13 +571,12 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) const F32 area_for_min_settings = 1400.0; const F32 area_for_this_setting = area_for_max_settings + (area_for_min_settings-area_for_max_settings)*(1.0-lod_factor); const F32 pixel_area = fsqrtf(mCharacter->getPixelArea()); - + const BOOL is_self = (dynamic_cast<LLVOAvatarSelf *>(mCharacter) != NULL); if ((pixel_area > area_for_this_setting) || is_self) { - // If the parameter hasn't changed enough, then don't update. - const F32 position_diff_local = llabs(mPositionLastUpdate_local-position_new_local); - const F32 min_delta = (1.0-lod_factor)*(mPositionMax_local-mPositionMin_local)/2.0; + const F32 position_diff_local = llabs(mPositionLastUpdate_local-position_new_local_clamped); + const F32 min_delta = (1.0f-lod_factor)*4.0f; // Magic number 2.0f, can change this if experimentally something works better. if (llabs(position_diff_local) > min_delta) { update_visuals = TRUE; @@ -534,9 +584,6 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) } } - update_visuals = TRUE; - mPositionLastUpdate_local = position_new_local; - // // End update visual params //////////////////////////////////////////////////////////////////////////////// @@ -551,6 +598,7 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) mLastTime = time; /* + // Write out debugging info into a spreadsheet. if (mFileWrite != NULL && is_self) { fprintf(mFileWrite,"%f\t%f\t%f \t\t%f \t\t%f\t%f\t%f\t \t\t%f\t%f\t%f\t%f\t%f \t\t%f\t%f\t%f\n", @@ -577,6 +625,19 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) } */ - return update_visuals; + return TRUE; +} + +// Range of new_value_local is assumed to be [0 , 1] normalized. +void LLPhysicsMotion::setParamValue(LLViewerVisualParam *param, + F32 new_value_normalized) +{ + const F32 value_min_local = param->getMinWeight(); + const F32 value_max_local = param->getMaxWeight(); + + const F32 new_value_local = value_min_local + (value_max_local-value_min_local) * new_value_normalized; + + mCharacter->setVisualParamWeight(param, + new_value_local, + FALSE); } - -- cgit v1.2.3 From 86613fd388d7985abc814ee8ee52da54fd74779e Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Fri, 18 Mar 2011 16:04:28 -0400 Subject: Variety of fixes for param ranges. Turned off normal/binormal effects for morphing. Fixed issue where updates were always being sent even if below the change threshold. --- indra/newview/character/avatar_lad.xml | 18 +++++----- indra/newview/llphysicsmotion.cpp | 6 ++-- indra/newview/llpolymesh.cpp | 64 +++++++++++++++++++--------------- 3 files changed, 48 insertions(+), 40 deletions(-) diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index 0fc62ccaf1..727a9e7fc4 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -9180,7 +9180,7 @@ render_pass="bump"> label_max="More" value_default="0" value_min="0" - value_max="100" + value_max="1" camera_elevation=".3" camera_distance=".8"> <param_driver /> @@ -9196,9 +9196,9 @@ render_pass="bump"> edit_group="physics" label_min="Less" label_max="More" - value_default="3" + value_default=".1" value_min="0" - value_max="10" + value_max="1" camera_elevation=".3" camera_distance=".8"> <param_driver /> @@ -9215,7 +9215,7 @@ render_pass="bump"> label_min="Less" label_max="More" value_default="10" - value_min="0" + value_min="1" value_max="100" camera_elevation=".3" camera_distance=".8"> @@ -9268,9 +9268,9 @@ render_pass="bump"> edit_group="physics" label_min="Less" label_max="More" - value_default="10" + value_default=".1" value_min="0" - value_max="10" + value_max=".1" camera_elevation=".3" camera_distance=".8"> <param_driver /> @@ -9306,7 +9306,7 @@ render_pass="bump"> label_min="Less" label_max="More" value_default="10" - value_min="0" + value_min="1" value_max="100" camera_elevation=".3" camera_distance=".8"> @@ -9359,9 +9359,9 @@ render_pass="bump"> edit_group="physics" label_min="Less" label_max="More" - value_default="10" + value_default=".1" value_min="0" - value_max="10" + value_max=".1" camera_elevation=".3" camera_distance=".8"> <param_driver /> diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index eb128e043c..c9a75784e1 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -309,7 +309,7 @@ LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter "", "mChest", character, - LLVector3(0,0,1), + LLVector3(0,0,-1), controllers_belly_bounce); if (!belly_bounce_motion->initialize()) return STATUS_FAILURE; @@ -337,7 +337,7 @@ F32 LLPhysicsMotion::toLocal(const LLVector3 &world) LLVector3 dir_world = mMotionDirectionVec * rotation_world; dir_world.normalize(); - return world * dir_world * mMotionDirectionVec.length(); // dot product + return world * dir_world; } F32 LLPhysicsMotion::calculateVelocity_local(const F32 time_delta) @@ -625,7 +625,7 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) } */ - return TRUE; + return update_visuals; } // Range of new_value_local is assumed to be [0 , 1] normalized. diff --git a/indra/newview/llpolymesh.cpp b/indra/newview/llpolymesh.cpp index 08813e6a98..4118401a4c 100644 --- a/indra/newview/llpolymesh.cpp +++ b/indra/newview/llpolymesh.cpp @@ -605,54 +605,62 @@ BOOL LLPolyMeshSharedData::loadMesh( const std::string& fileName ) if (!strcmp(morphName, "Big_Belly_Torso")) { - LLPolyMorphData* belly_data = new LLPolyMorphData(*morph_data); - belly_data->mName = std::string("Big_Belly_Torso_Gravity"); - for (U32 v=0; v < belly_data->mNumIndices; v++) + LLPolyMorphData* cloned_morph_data = new LLPolyMorphData(*morph_data); + cloned_morph_data->mName = std::string("Big_Belly_Torso_Gravity"); + for (U32 v=0; v < morph_data->mNumIndices; v++) { - belly_data->mCoords[v][0] = 0; - belly_data->mCoords[v][1] = 0; - belly_data->mCoords[v][2] = 0.01F; + cloned_morph_data->mCoords[v][0] = 0; + cloned_morph_data->mCoords[v][1] = 0; + cloned_morph_data->mCoords[v][2] = 0.01F; + cloned_morph_data->mNormals[v] = LLVector3(0,0,0); + cloned_morph_data->mBinormals[v] = LLVector3(0,0,0); } - mMorphData.insert(belly_data); + mMorphData.insert(cloned_morph_data); } if (!strcmp(morphName, "Big_Belly_Legs")) { - LLPolyMorphData* belly_data = new LLPolyMorphData(*morph_data); - belly_data->mName = std::string("Big_Belly_Legs_Gravity"); - for (U32 v=0; v < belly_data->mNumIndices; v++) + LLPolyMorphData* cloned_morph_data = new LLPolyMorphData(*morph_data); + cloned_morph_data->mName = std::string("Big_Belly_Legs_Gravity"); + for (U32 v=0; v < cloned_morph_data->mNumIndices; v++) { - belly_data->mCoords[v][0] = 0; - belly_data->mCoords[v][1] = 0; - belly_data->mCoords[v][2] = 0.01F; + cloned_morph_data->mCoords[v][0] = 0; + cloned_morph_data->mCoords[v][1] = 0; + cloned_morph_data->mCoords[v][2] = 0.01F; + cloned_morph_data->mNormals[v] = LLVector3(0,0,0); + cloned_morph_data->mBinormals[v] = LLVector3(0,0,0); } - mMorphData.insert(belly_data); + mMorphData.insert(cloned_morph_data); } if (!strcmp(morphName, "skirt_belly")) { - LLPolyMorphData* belly_data = new LLPolyMorphData(*morph_data); - belly_data->mName = std::string("skirt_belly_gravity"); - for (U32 v=0; v < belly_data->mNumIndices; v++) + LLPolyMorphData* cloned_morph_data = new LLPolyMorphData(*morph_data); + cloned_morph_data->mName = std::string("skirt_belly_gravity"); + for (U32 v=0; v < cloned_morph_data->mNumIndices; v++) { - belly_data->mCoords[v][0] = 0; - belly_data->mCoords[v][1] = 0; - belly_data->mCoords[v][2] = 0.01F; + cloned_morph_data->mCoords[v][0] = 0; + cloned_morph_data->mCoords[v][1] = 0; + cloned_morph_data->mCoords[v][2] = 0.01F; + cloned_morph_data->mNormals[v] = LLVector3(0,0,0); + cloned_morph_data->mBinormals[v] = LLVector3(0,0,0); } - mMorphData.insert(belly_data); + mMorphData.insert(cloned_morph_data); } if (!strcmp(morphName, "Small_Butt")) { - LLPolyMorphData* butt_data = new LLPolyMorphData(*morph_data); - butt_data->mName = std::string("Butt_Gravity"); - for (U32 v=0; v < butt_data->mNumIndices; v++) + LLPolyMorphData* cloned_morph_data = new LLPolyMorphData(*morph_data); + cloned_morph_data->mName = std::string("Butt_Gravity"); + for (U32 v=0; v < cloned_morph_data->mNumIndices; v++) { - butt_data->mCoords[v][0] = 0; - butt_data->mCoords[v][1] = 0; - butt_data->mCoords[v][2] = 0.01F; + cloned_morph_data->mCoords[v][0] = 0; + cloned_morph_data->mCoords[v][1] = 0; + cloned_morph_data->mCoords[v][2] = 0.01F; + cloned_morph_data->mNormals[v] = LLVector3(0,0,0); + cloned_morph_data->mBinormals[v] = LLVector3(0,0,0); } - mMorphData.insert(butt_data); + mMorphData.insert(cloned_morph_data); } } -- cgit v1.2.3 From 53a944f2859d07eceed2a01a6b4f7339c0c591d9 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Fri, 18 Mar 2011 18:02:27 -0400 Subject: Set default parameters. Renamed various parameters. --- indra/newview/character/avatar_lad.xml | 194 ++++++++++++++++++++----- indra/newview/llphysicsmotion.cpp | 53 ++++--- indra/newview/llpolymesh.cpp | 8 +- indra/newview/skins/default/xui/en/strings.xml | 16 +- 4 files changed, 200 insertions(+), 71 deletions(-) diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index 727a9e7fc4..08102332d0 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -3796,18 +3796,13 @@ <param id="1092" - group="0" - name="Big_Belly_Torso_Gravity" - label="Big Belly Torso Gravity" + group="1" + name="Belly_Torso_Physics_UpDown_Driven" wearable="shape" edit_group="driven" - label_min="Up" - label_max="Down" value_default="0" value_min="-2" - value_max="2" - camera_elevation=".3" - camera_distance=".8"> + value_max="2"> <param_morph /> </param> @@ -4065,16 +4060,11 @@ group="0" sex="female" name="Breast_Gravity" - label="Breast Buoyancy" wearable="shape" edit_group="driven" - label_min="Less Gravity" - label_max="More Gravity" value_default="0" value_min="-1.5" - value_max="2" - camera_elevation=".3" - camera_distance=".8"> + value_max="2"> <param_morph /> </param> @@ -4083,16 +4073,11 @@ group="0" sex="female" name="Breast_Female_Cleavage" - label="Breast Cleavage" wearable="shape" edit_group="driven" - label_min="Separate" - label_max="Join" value_default="0" value_min="-.3" - value_max="1.3" - camera_elevation=".3" - camera_distance=".8"> + value_max="1.3"> <param_morph /> </param> @@ -4408,7 +4393,7 @@ <param id="1093" group="1" - name="Big_Belly_Legs_Gravity" + name="Belly_Legs_Physics_UpDown_Driven" wearable="shape" edit_group="driven" value_min="-2" @@ -4458,8 +4443,7 @@ <param id="1089" group="0" - name="Butt_Gravity" - label="Butt Gravity" + name="Butt_Physics_UpDown_Driven" wearable="shape" edit_group="driven" label_min="Separate" @@ -5188,11 +5172,10 @@ <param id="1094" group="1" - name="skirt_belly_gravity" + name="Belly_Skirt_Physics_UpDown_Driven" wearable="skirt" edit_group="driven" cross_wearable="true" - label="big belly skirt gravity" value_min="0" value_max="1"> <param_morph /> @@ -9371,8 +9354,8 @@ render_pass="bump"> id="507" group="0" sex="female" - name="Breast_Gravity_Driver" - label="Breast Buoyancy" + name="Breast_Physics_UpDown_Controller" + label="Breast Physics UpDown Controller" wearable="shape" edit_group="shape_torso" edit_group_order="7" @@ -9393,8 +9376,8 @@ render_pass="bump"> id="684" group="0" sex="female" - name="Breast_Female_Cleavage_Driver" - label="Breast Cleavage" + name="Breast_Physics_Side_Controller" + label="Breast Physics Side Controller" wearable="shape" edit_group="shape_torso" edit_group_order="8" @@ -9414,8 +9397,8 @@ render_pass="bump"> <param id="1090" group="0" - name="Butt_Gravity_Driver" - label="Butt Gravity" + name="Butt_Physics_UpDown_Controller" + label="Butt Physics UpDown Controller" wearable="shape" edit_group="shape_legs" edit_group_order="7" @@ -10161,11 +10144,11 @@ render_pass="bump"> wearable="shape" edit_group="shape_torso" edit_group_order="14" - name="Belly_Gravity" - label="Belly Gravity" - label_min="Small" - label_max="Big" - value_min="0" + name="Belly_Physics_UpDown_Controller" + label="Belly Physics UpDown Controller" + label_min="Down" + label_max="Up" + value_min="-1" value_max="1" value_default="0" camera_distance="1.4" @@ -10174,15 +10157,150 @@ render_pass="bump"> <param_driver> <driven id="1092" /> - <driven id="1093" /> - <driven id="1094" /> </param_driver> </param> + <param + id="1095" + group="0" + name="Belly_Physics_UpDown_Spring" + label="Belly Physics UpDown Spring" + wearable="physics" + edit_group="physics" + label_min="Less" + label_max="More" + value_default=".1" + value_min="0" + value_max="1" + camera_elevation=".3" + camera_distance=".8"> + <param_driver /> + </param> + + <param + id="1096" + group="0" + name="Belly_Physics_UpDown_Gain" + label="Belly Physics UpDown Gain" + wearable="physics" + edit_group="physics" + label_min="Less" + label_max="More" + value_default="10" + value_min="1" + value_max="100" + camera_elevation=".3" + camera_distance=".8"> + <param_driver /> + </param> + + <param + id="1097" + group="0" + name="Belly_Physics_UpDown_Damping" + label="Belly Physics UpDown Damping" + wearable="physics" + edit_group="physics" + label_min="Less" + label_max="More" + value_default=".05" + value_min="0" + value_max=".1" + camera_elevation=".3" + camera_distance=".8"> + <param_driver /> + </param> + + <param + id="1098" + group="0" + name="Belly_Physics_UpDown_Max_Velocity" + label="Belly Physics UpDown Max Speed" + wearable="physics" + edit_group="physics" + label_min="Less" + label_max="More" + value_default=".1" + value_min="0" + value_max=".1" + camera_elevation=".3" + camera_distance=".8"> + <param_driver /> + </param> + + <param + id="1100" + group="0" + name="Butt_Physics_UpDown_Spring" + label="Butt Physics UpDown Spring" + wearable="physics" + edit_group="physics" + label_min="Less" + label_max="More" + value_default=".1" + value_min="0" + value_max="1" + camera_elevation=".3" + camera_distance=".8"> + <param_driver /> + </param> + + <param + id="1101" + group="0" + name="Butt_Physics_UpDown_Gain" + label="Butt Physics UpDown Gain" + wearable="physics" + edit_group="physics" + label_min="Less" + label_max="More" + value_default="10" + value_min="1" + value_max="100" + camera_elevation=".3" + camera_distance=".8"> + <param_driver /> + </param> + + <param + id="1102" + group="0" + name="Butt_Physics_UpDown_Damping" + label="Butt Physics UpDown Damping" + wearable="physics" + edit_group="physics" + label_min="Less" + label_max="More" + value_default=".05" + value_min="0" + value_max=".1" + camera_elevation=".3" + camera_distance=".8"> + <param_driver /> + </param> + + <param + id="1103" + group="0" + name="Butt_Physics_UpDown_Max_Velocity" + label="Butt Physics UpDown Max Speed" + wearable="physics" + edit_group="physics" + label_min="Less" + label_max="More" + value_default=".1" + value_min="0" + value_max=".1" + camera_elevation=".3" + camera_distance=".8"> + <param_driver /> + </param> + + <param id="637" group="0" diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index c9a75784e1..094faf4d97 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -174,13 +174,13 @@ private: default_controller_map_t initDefaultController() { default_controller_map_t controller; - controller["Mass"] = 2.0f; + controller["Mass"] = 0.2f; controller["Smoothing"] = 2.0f; controller["Gravity"] = 0.0f; - controller["Damping"] = .5f; - controller["Drag"] = 0.1f; - controller["MaxSpeed"] = 10.0f; - controller["Spring"] = 1.0f; + controller["Damping"] = .05f; + controller["Drag"] = 0.15f; + controller["MaxSpeed"] = 0.1f; + controller["Spring"] = 0.1f; controller["Gain"] = 10.0f; return controller; } @@ -247,7 +247,7 @@ LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter controllers_cleavage["Spring"] = "Breast_Physics_Side_Spring"; controllers_cleavage["Gain"] = "Breast_Physics_Side_Gain"; - LLPhysicsMotion *cleavage_motion = new LLPhysicsMotion("Breast_Female_Cleavage_Driver", + LLPhysicsMotion *cleavage_motion = new LLPhysicsMotion("Breast_Physics_Side_Controller", "", "mChest", character, @@ -267,52 +267,53 @@ LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter controllers_bounce["Spring"] = "Breast_Physics_UpDown_Spring"; controllers_bounce["Gain"] = "Breast_Physics_UpDown_Gain"; - LLPhysicsMotion *bounce_motion = new LLPhysicsMotion("Breast_Gravity_Driver", + LLPhysicsMotion *bounce_motion = new LLPhysicsMotion("Breast_Physics_UpDown_Controller", "", "mChest", character, LLVector3(0,0,1), controllers_bounce); if (!bounce_motion->initialize()) + { + llassert_always(FALSE); return STATUS_FAILURE; + } addMotion(bounce_motion); controller_map_t controllers_butt_bounce; - controllers_butt_bounce["Mass"] = "Breast_Physics_Mass"; - controllers_butt_bounce["Smoothing"] = "Breast_Physics_Smoothing"; - controllers_butt_bounce["Gravity"] = "Breast_Physics_Gravity"; - controllers_butt_bounce["Damping"] = "Breast_Physics_UpDown_Damping"; - controllers_butt_bounce["Drag"] = "Breast_Physics_UpDown_Drag"; - controllers_butt_bounce["MaxSpeed"] = "Breast_Physics_UpDown_Max_Velocity"; - controllers_butt_bounce["Spring"] = "Breast_Physics_UpDown_Spring"; - controllers_butt_bounce["Gain"] = "Breast_Physics_UpDown_Gain"; - LLPhysicsMotion *butt_bounce_motion = new LLPhysicsMotion("Butt_Gravity_Driver", + controllers_butt_bounce["Damping"] = "Butt_Physics_Updown_Damping"; + controllers_butt_bounce["MaxSpeed"] = "Butt_Physics_Updown_Max_Velocity"; + controllers_butt_bounce["Spring"] = "Butt_Physics_Updown_Spring"; + controllers_butt_bounce["Gain"] = "Butt_Physics_Updown_Gain"; + LLPhysicsMotion *butt_bounce_motion = new LLPhysicsMotion("Butt_Physics_UpDown_Controller", "", "mPelvis", character, LLVector3(0,0,-1), controllers_butt_bounce); if (!butt_bounce_motion->initialize()) + { + llassert_always(FALSE); return STATUS_FAILURE; + } addMotion(butt_bounce_motion); controller_map_t controllers_belly_bounce; - controllers_belly_bounce["Mass"] = "Breast_Physics_Mass"; - controllers_belly_bounce["Smoothing"] = "Breast_Physics_Smoothing"; - controllers_belly_bounce["Gravity"] = "Breast_Physics_Gravity"; - controllers_belly_bounce["Damping"] = "Breast_Physics_UpDown_Damping"; - controllers_belly_bounce["Drag"] = "Breast_Physics_UpDown_Drag"; - controllers_belly_bounce["MaxSpeed"] = "Breast_Physics_UpDown_Max_Velocity"; - controllers_belly_bounce["Spring"] = "Breast_Physics_UpDown_Spring"; - controllers_belly_bounce["Gain"] = "Breast_Physics_UpDown_Gain"; - LLPhysicsMotion *belly_bounce_motion = new LLPhysicsMotion("Belly_Gravity", + controllers_belly_bounce["Damping"] = "Belly_Physics_Updown_Damping"; + controllers_belly_bounce["MaxSpeed"] = "Belly_Physics_Updown_Max_Velocity"; + controllers_belly_bounce["Spring"] = "Belly_Physics_Updown_Spring"; + controllers_belly_bounce["Gain"] = "Belly_Physics_Updown_Gain"; + LLPhysicsMotion *belly_bounce_motion = new LLPhysicsMotion("Belly_Physics_UpDown_Controller", "", "mChest", character, LLVector3(0,0,-1), controllers_belly_bounce); if (!belly_bounce_motion->initialize()) + { + llassert_always(FALSE); return STATUS_FAILURE; + } addMotion(belly_bounce_motion); return STATUS_SUCCESS; @@ -372,8 +373,6 @@ BOOL LLPhysicsMotionController::onUpdate(F32 time, U8* joint_mask) return TRUE; } - if (mCharacter->getSex() != SEX_FEMALE) return TRUE; - BOOL update_visuals = FALSE; for (motion_vec_t::iterator iter = mMotions.begin(); iter != mMotions.end(); diff --git a/indra/newview/llpolymesh.cpp b/indra/newview/llpolymesh.cpp index 4118401a4c..b145b65bac 100644 --- a/indra/newview/llpolymesh.cpp +++ b/indra/newview/llpolymesh.cpp @@ -606,7 +606,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const std::string& fileName ) if (!strcmp(morphName, "Big_Belly_Torso")) { LLPolyMorphData* cloned_morph_data = new LLPolyMorphData(*morph_data); - cloned_morph_data->mName = std::string("Big_Belly_Torso_Gravity"); + cloned_morph_data->mName = std::string("Belly_Torso_Physics_UpDown_Driven"); for (U32 v=0; v < morph_data->mNumIndices; v++) { cloned_morph_data->mCoords[v][0] = 0; @@ -621,7 +621,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const std::string& fileName ) if (!strcmp(morphName, "Big_Belly_Legs")) { LLPolyMorphData* cloned_morph_data = new LLPolyMorphData(*morph_data); - cloned_morph_data->mName = std::string("Big_Belly_Legs_Gravity"); + cloned_morph_data->mName = std::string("Belly_Legs_Physics_UpDown_Driven"); for (U32 v=0; v < cloned_morph_data->mNumIndices; v++) { cloned_morph_data->mCoords[v][0] = 0; @@ -636,7 +636,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const std::string& fileName ) if (!strcmp(morphName, "skirt_belly")) { LLPolyMorphData* cloned_morph_data = new LLPolyMorphData(*morph_data); - cloned_morph_data->mName = std::string("skirt_belly_gravity"); + cloned_morph_data->mName = std::string("Belly_Skirt_Physics_UpDown_Driven"); for (U32 v=0; v < cloned_morph_data->mNumIndices; v++) { cloned_morph_data->mCoords[v][0] = 0; @@ -651,7 +651,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const std::string& fileName ) if (!strcmp(morphName, "Small_Butt")) { LLPolyMorphData* cloned_morph_data = new LLPolyMorphData(*morph_data); - cloned_morph_data->mName = std::string("Butt_Gravity"); + cloned_morph_data->mName = std::string("Butt_Physics_UpDown_Driven"); for (U32 v=0; v < cloned_morph_data->mNumIndices; v++) { cloned_morph_data->mCoords[v][0] = 0; diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 3c7d7d1777..e5d52b03e5 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2500,8 +2500,8 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="Body Thin">Body Thin</string> <string name="Bow Legged">Bow Legged</string> -<string name="Breast Buoyancy">Breast Buoyancy</string> -<string name="Breast Cleavage">Breast Cleavage</string> +<string name="Breast Physics Updown Controller">Breast Buoyancy</string> +<string name="Breast Physics Side Controller">Breast Cleavage</string> <string name="Breast Size">Breast Size</string> <string name="Bridge Width">Bridge Width</string> <string name="Broad">Broad</string> @@ -2527,6 +2527,18 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="Breast Physics UpDown Drag">Breast UpDown Drag</string> <string name="Breast Physics UpDown Max Speed">Breast UpDown Max Speed</string> +<string name="Belly Physics UpDown Controller">Belly Updown Bounce</string> +<string name="Belly Physics UpDown Spring">Belly Updown Spring</string> +<string name="Belly Physics UpDown Gain">Belly Updown Gain</string> +<string name="Belly Physics UpDown Damping">Belly Updown Damping</string> +<string name="Belly Physics UpDown Max Speed">Belly Updown Max Speed</string> + +<string name="Butt Physics UpDown Controller">Butt UpDown Bounce</string> +<string name="Butt Physics UpDown Spring">Butt UpDown Spring</string> +<string name="Butt Physics UpDown Gain">Butt UpDown Gain</string> +<string name="Butt Physics UpDown Damping">Butt UpDown Damping</string> +<string name="Butt Physics UpDown Max Speed">Butt UpDown Max Speed</string> + <string name="Bushy Eyebrows">Bushy Eyebrows</string> <string name="Bushy Hair">Bushy Hair</string> <string name="Butt Size">Butt Size</string> -- cgit v1.2.3 From f2b65e07d0446e8db43b588a3c9e7fa93b7bcebe Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Fri, 18 Mar 2011 18:06:10 -0400 Subject: Took out unnecessary Butt Physics parameter. --- indra/newview/character/avatar_lad.xml | 23 +---------------------- indra/newview/llpolymesh.cpp | 2 +- 2 files changed, 2 insertions(+), 23 deletions(-) diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index 08102332d0..1c3f87373c 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -4443,7 +4443,7 @@ <param id="1089" group="0" - name="Butt_Physics_UpDown_Driven" + name="Butt_Physics_UpDown_Controller" wearable="shape" edit_group="driven" label_min="Separate" @@ -9394,27 +9394,6 @@ render_pass="bump"> </param_driver> </param> - <param - id="1090" - group="0" - name="Butt_Physics_UpDown_Controller" - label="Butt Physics UpDown Controller" - wearable="shape" - edit_group="shape_legs" - edit_group_order="7" - label_min="Less" - label_max="More" - value_default="0" - value_min="-2" - value_max="2" - camera_elevation=".3" - camera_distance=".8"> - <param_driver> - <driven - id="1089" /> - </param_driver> - </param> - <param id="828" group="0" diff --git a/indra/newview/llpolymesh.cpp b/indra/newview/llpolymesh.cpp index b145b65bac..f287202ff1 100644 --- a/indra/newview/llpolymesh.cpp +++ b/indra/newview/llpolymesh.cpp @@ -651,7 +651,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const std::string& fileName ) if (!strcmp(morphName, "Small_Butt")) { LLPolyMorphData* cloned_morph_data = new LLPolyMorphData(*morph_data); - cloned_morph_data->mName = std::string("Butt_Physics_UpDown_Driven"); + cloned_morph_data->mName = std::string("Butt_Physics_UpDown_Controller"); for (U32 v=0; v < cloned_morph_data->mNumIndices; v++) { cloned_morph_data->mCoords[v][0] = 0; -- cgit v1.2.3 From fc207f935a8d18e7927277f1aa713eb36cc36587 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Fri, 18 Mar 2011 18:19:25 -0400 Subject: Fixed params for belly morph. Incorrect params were causing distortion in texture maps. --- indra/newview/character/avatar_lad.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index 1c3f87373c..b839d64980 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -3801,8 +3801,8 @@ wearable="shape" edit_group="driven" value_default="0" - value_min="-2" - value_max="2"> + value_min="0" + value_max="1"> <param_morph /> </param> @@ -4396,8 +4396,8 @@ name="Belly_Legs_Physics_UpDown_Driven" wearable="shape" edit_group="driven" - value_min="-2" - value_max="2"> + value_min="0" + value_max="1"> <param_morph /> </param> -- cgit v1.2.3 From 49e449e3a6ea08a969a214ffb7c66ac9607e2732 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Fri, 18 Mar 2011 18:59:59 -0400 Subject: Added more belly bounce. Added butt driver param back in. --- indra/newview/character/avatar_lad.xml | 23 ++++++++++++++++++++++- indra/newview/llphysicsmotion.cpp | 11 +++-------- indra/newview/llpolymesh.cpp | 8 ++++---- 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index b839d64980..58fe82da9e 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -4443,7 +4443,7 @@ <param id="1089" group="0" - name="Butt_Physics_UpDown_Controller" + name="Butt_Physics_UpDown_Driven" wearable="shape" edit_group="driven" label_min="Separate" @@ -9350,6 +9350,27 @@ render_pass="bump"> <param_driver /> </param> + <param + id="1090" + group="0" + wearable="shape" + edit_group="shape_legs" + edit_group_order="14" + name="Butt_Physics_UpDown_Controller" + label="Butt Physics UpDown Controller" + label_min="Down" + label_max="Up" + value_min="-1" + value_max="1" + value_default="0" + camera_elevation=".3" + camera_distance=".8"> + <param_driver> + <driven + id="1089" /> + </param_driver> + </param> + <param id="507" group="0" diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 094faf4d97..393120be40 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -64,7 +64,8 @@ inline F64 llsgn(const F64 a) by the actual params that the user sees and sets. For example, in the old system, the user sets a param called breast bouyancy, which controls the Z value of the breasts. In our new system, the user still sets the breast bouyancy, but that param is redefined - as a driver param so that it affects ... + as a driver param so that affects a new temporary driven param that the bounce is applied + to. */ class LLPhysicsMotion @@ -521,9 +522,6 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) 1.0f); // Set the new param. - // 1. If the user has specified a param target, use that. - // 2. If the param is a driver param, set the param(s) that it drives. - // 3. Otherwise, set the param directly (don't do this if the param is a user-editable param!) // If a specific param has been declared, then set that one. // Otherwise, assume that the param is a driver param, and // set the params that it drives. @@ -534,6 +532,7 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) else { LLDriverParam *driver_param = dynamic_cast<LLDriverParam *>(mParamUser); + llassert_always(driver_param); if (driver_param) { for (LLDriverParam::entry_list_t::iterator iter = driver_param->mDriven.begin(); @@ -545,10 +544,6 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) setParamValue(driven_param,position_new_local_clamped); } } - else - { - setParamValue(mParamUser,position_new_local_clamped); - } } // diff --git a/indra/newview/llpolymesh.cpp b/indra/newview/llpolymesh.cpp index f287202ff1..626b7ca1eb 100644 --- a/indra/newview/llpolymesh.cpp +++ b/indra/newview/llpolymesh.cpp @@ -611,7 +611,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const std::string& fileName ) { cloned_morph_data->mCoords[v][0] = 0; cloned_morph_data->mCoords[v][1] = 0; - cloned_morph_data->mCoords[v][2] = 0.01F; + cloned_morph_data->mCoords[v][2] = 0.05F; cloned_morph_data->mNormals[v] = LLVector3(0,0,0); cloned_morph_data->mBinormals[v] = LLVector3(0,0,0); } @@ -626,7 +626,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const std::string& fileName ) { cloned_morph_data->mCoords[v][0] = 0; cloned_morph_data->mCoords[v][1] = 0; - cloned_morph_data->mCoords[v][2] = 0.01F; + cloned_morph_data->mCoords[v][2] = 0.05F; cloned_morph_data->mNormals[v] = LLVector3(0,0,0); cloned_morph_data->mBinormals[v] = LLVector3(0,0,0); } @@ -641,7 +641,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const std::string& fileName ) { cloned_morph_data->mCoords[v][0] = 0; cloned_morph_data->mCoords[v][1] = 0; - cloned_morph_data->mCoords[v][2] = 0.01F; + cloned_morph_data->mCoords[v][2] = 0.05F; cloned_morph_data->mNormals[v] = LLVector3(0,0,0); cloned_morph_data->mBinormals[v] = LLVector3(0,0,0); } @@ -651,7 +651,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const std::string& fileName ) if (!strcmp(morphName, "Small_Butt")) { LLPolyMorphData* cloned_morph_data = new LLPolyMorphData(*morph_data); - cloned_morph_data->mName = std::string("Butt_Physics_UpDown_Controller"); + cloned_morph_data->mName = std::string("Butt_Physics_UpDown_Driven"); for (U32 v=0; v < cloned_morph_data->mNumIndices; v++) { cloned_morph_data->mCoords[v][0] = 0; -- cgit v1.2.3 From 9923f403226d6c014cb40149c2e31b2fce988803 Mon Sep 17 00:00:00 2001 From: Merov Linden <merov@lindenlab.com> Date: Fri, 18 Mar 2011 16:23:55 -0700 Subject: Autobuild : fixed merge errors in json hash codes --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index c26afea6f3..108e6dc429 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -870,7 +870,7 @@ <key>archive</key> <map> <key>hash</key> - <string>22c2ab6ef046c0c1f6cf674297f3e8ef</string> + <string>de8b96120c274e052abb4f692861be46</string> <key>url</key> <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jsoncpp-0.5.0-darwin-20110131.tar.bz2</string> </map> @@ -894,7 +894,7 @@ <key>archive</key> <map> <key>hash</key> - <string>0959e349c4f7c0b33539269502486737</string> + <string>afff2018e6a887c281b072eecdd9343e</string> <key>url</key> <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jsoncpp-0.5.0-windows-20110208.tar.bz2</string> </map> -- cgit v1.2.3 From b6ec94a73b50f240a0c29998f90be2ff9322c7f6 Mon Sep 17 00:00:00 2001 From: brad kittenbrink <brad@lindenlab.com> Date: Fri, 18 Mar 2011 19:30:59 -0400 Subject: Fix for broken escaping of viewer_channel variable at configuration time. --- build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sh b/build.sh index 9248c1f628..45c3b622fb 100755 --- a/build.sh +++ b/build.sh @@ -51,7 +51,7 @@ pre_build() { local variant="$1" begin_section "Pre$variant" - "$AUTOBUILD" configure -c $variant -- -DPACKAGE:BOOL=ON -DRELEASE_CRASH_REPORTING:BOOL=ON -DUSE_PRECOMPILED_HEADERS=FALSE -DVIEWER_CHANNEL:STRING="$viewer_channel" + "$AUTOBUILD" configure -c $variant -- -DPACKAGE:BOOL=ON -DRELEASE_CRASH_REPORTING:BOOL=ON -DUSE_PRECOMPILED_HEADERS=FALSE "-DVIEWER_CHANNEL:STRING=\"$viewer_channel\"" "-DVIEWER_LOGIN_CHANNEL:STRING=\"$viewer_login_channel\"" end_section "Pre$variant" } -- cgit v1.2.3 From 9f2a04f217d54344360edc554456d9804e17eeb7 Mon Sep 17 00:00:00 2001 From: brad kittenbrink <brad@lindenlab.com> Date: Fri, 18 Mar 2011 19:35:25 -0400 Subject: Disabled redundant configuration step during the build in build.sh. --- build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sh b/build.sh index 45c3b622fb..532d191572 100755 --- a/build.sh +++ b/build.sh @@ -61,7 +61,7 @@ build() if $build_viewer then begin_section "Viewer$variant" - if "$AUTOBUILD" build -c $variant + if "$AUTOBUILD" build --no-configure -c $variant then echo true >"$build_dir"/build_ok else -- cgit v1.2.3 From 6991eafce8545b4a435913cecda89f6b7f3fd369 Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Fri, 18 Mar 2011 19:44:54 -0400 Subject: disable parallel linking in autobuild2010 --- BuildParams | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/BuildParams b/BuildParams index aa6c935b7f..502abcf58d 100644 --- a/BuildParams +++ b/BuildParams @@ -155,8 +155,7 @@ media.build_viewer_update_version_manager = false # oz # ================ -oz_viewer-devreview.build_debug_release_separately = true -oz_ +viewer-devreview.build_debug_release_separately = true # ======================================== # enus @@ -197,7 +196,7 @@ viewer-autobuild2010.build_debug_release_separately = true viewer-autobuild2010.viewer_channel = "Project Viewer - VS2010" viewer-autobuild2010.login_channel = "Project Viewer - VS2010" viewer-autobuild2010.viewer_grid = agni -viewer-autobuild.build_link_parallel = false +viewer-autobuild2010.build_link_parallel = false #======================================== # VS2010 -- cgit v1.2.3 From 8468670583db601c5feb683de6b27caf74744e45 Mon Sep 17 00:00:00 2001 From: Merov Linden <merov@lindenlab.com> Date: Fri, 18 Mar 2011 16:47:43 -0700 Subject: Autobuild : Fix merge snaffu in Json cmake file --- indra/cmake/JsonCpp.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/cmake/JsonCpp.cmake b/indra/cmake/JsonCpp.cmake index 53801a5737..499b00fb44 100644 --- a/indra/cmake/JsonCpp.cmake +++ b/indra/cmake/JsonCpp.cmake @@ -14,7 +14,7 @@ else (STANDALONE) debug json_vc100debug_libmt.lib optimized json_vc100_libmt) elseif (DARWIN) - set(JSONCPP_LIBRARIES libjson_darwin_libmt.a) + set(JSONCPP_LIBRARIES libjson_linux-gcc-4.0.1_libmt.a) elseif (LINUX) set(JSONCPP_LIBRARIES libjson_linux-gcc-4.1.3_libmt.a) endif (WINDOWS) -- cgit v1.2.3 From 22be29e60f5f45c7d30add3aeb219fef34d4ffec Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Fri, 18 Mar 2011 17:08:03 -0700 Subject: SOCIAL-762 FIX cannot change to advanced mode need separate flags for first run and first login --- indra/newview/app_settings/settings.xml | 15 +++++++++++++-- indra/newview/llappviewer.cpp | 1 + indra/newview/llviewerwindow.cpp | 5 ++--- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index c626538808..888f9c9d7f 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -3198,7 +3198,7 @@ <key>FirstRunThisInstall</key> <map> <key>Comment</key> - <string>Specifies that you have not run the viewer since you installed the latest update</string> + <string>Specifies that you have not run the viewer since you performed a clean install</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -3206,7 +3206,18 @@ <key>Value</key> <integer>1</integer> </map> - <key>FirstSelectedDisabledPopups</key> + <key>FirstLoginThisInstall</key> + <map> + <key>Comment</key> + <string>Specifies that you have not logged in with the viewer since you performed a clean install</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>FirstSelectedDisabledPopups</key> <map> <key>Comment</key> <string>Return false if there is not disabled popup selected in the list of floater preferences popups</string> diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index d0f9cae078..f6fe7ecd01 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -2171,6 +2171,7 @@ bool LLAppViewer::initConfiguration() if (gSavedSettings.getBOOL("FirstRunThisInstall")) { gSavedSettings.setString("SessionSettingsFile", "settings_minimal.xml"); + gSavedSettings.setBOOL("FirstRunThisInstall", FALSE); } if (clp.hasOption("sessionsettings")) diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 0778536d15..6bf363bf68 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1799,12 +1799,11 @@ void LLViewerWindow::initWorldUI() avatar_picker->navigateTo(gSavedSettings.getString("AvatarPickerURL"), "text/html"); } - if (gSavedSettings.getBOOL("FirstRunThisInstall")) + if (gSavedSettings.getBOOL("FirstLoginThisInstall")) { toggle_destination_and_avatar_picker(0); + gSavedSettings.setBOOL("FirstLoginThisInstall", FALSE); } - - gSavedSettings.setBOOL("FirstRunThisInstall", FALSE); } // Destroy the UI -- cgit v1.2.3 From 6ec5177667cb63acff03347e3eb9c6a503822de9 Mon Sep 17 00:00:00 2001 From: Boroondas Gupte <hg@boroon.dasgupta.ch> Date: Sat, 19 Mar 2011 21:07:09 +0100 Subject: OPEN-39: include Tut.cmake for integration tests (fixes "bitpack_test.o: No such file or directory" on standalone) --- doc/contributions.txt | 1 + indra/cmake/LLAddBuildTest.cmake | 1 + 2 files changed, 2 insertions(+) diff --git a/doc/contributions.txt b/doc/contributions.txt index f33af2599d..e8e428bf41 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -176,6 +176,7 @@ Blakar Ogre blino Nakamura VWR-17 Boroondas Gupte + OPEN-39 SNOW-278 SNOW-503 SNOW-510 diff --git a/indra/cmake/LLAddBuildTest.cmake b/indra/cmake/LLAddBuildTest.cmake index 62b764bb30..97300491cc 100644 --- a/indra/cmake/LLAddBuildTest.cmake +++ b/indra/cmake/LLAddBuildTest.cmake @@ -1,6 +1,7 @@ # -*- cmake -*- include(LLTestCommand) include(GoogleMock) +include(Tut) MACRO(LL_ADD_PROJECT_UNIT_TESTS project sources) # Given a project name and a list of sourcefiles (with optional properties on each), -- cgit v1.2.3 From f6961ae23680061674f913eee98b8b12be1d7deb Mon Sep 17 00:00:00 2001 From: Merov Linden <merov@lindenlab.com> Date: Sat, 19 Mar 2011 14:52:08 -0700 Subject: Autobuild : Fix to point all Windows build configs to Visual Studio 10 --- autobuild.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 108e6dc429..1292a02136 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -2478,7 +2478,7 @@ <key>options</key> <array> <string>-G</string> - <string>"Visual Studio 8 2005"</string> + <string>"Visual Studio 10"</string> <string>-DSTANDALONE:BOOL=FALSE</string> <string>-DINSTALL_PROPRIETARY=FALSE</string> <string>-DFMOD=FALSE</string> @@ -2546,7 +2546,7 @@ <key>options</key> <array> <string>-G</string> - <string>"Visual Studio 8 2005"</string> + <string>"Visual Studio 10"</string> <string>-DSTANDALONE:BOOL=FALSE</string> <string>-DINSTALL_PROPRIETARY=FALSE</string> <string>-DFMOD=FALSE</string> @@ -2588,7 +2588,7 @@ <key>options</key> <array> <string>-G</string> - <string>"Visual Studio 8 2005"</string> + <string>"Visual Studio 10"</string> <string>-DSTANDALONE:BOOL=TRUE</string> <string>-DINSTALL_PROPRIETARY=FALSE</string> <string>-DFMOD=FALSE</string> @@ -2622,7 +2622,7 @@ <key>options</key> <array> <string>-G</string> - <string>"Visual Studio 8 2005"</string> + <string>"Visual Studio 10"</string> <string>-DSTANDALONE:BOOL=TRUE</string> <string>-DINSTALL_PROPRIETARY=FALSE</string> <string>-DFMOD=FALSE</string> @@ -2656,7 +2656,7 @@ <key>options</key> <array> <string>-G</string> - <string>"Visual Studio 8 2005"</string> + <string>"Visual Studio 10"</string> <string>-DSTANDALONE:BOOL=TRUE</string> <string>-DINSTALL_PROPRIETARY=FALSE</string> <string>-DFMOD=FALSE</string> @@ -2774,7 +2774,7 @@ <key>options</key> <array> <string>-G</string> - <string>"Visual Studio 8 2005"</string> + <string>"Visual Studio 10"</string> <string>-DSTANDALONE:BOOL=FALSE</string> <string>-DINSTALL_PROPRIETARY=FALSE</string> <string>-DFMOD=FALSE</string> -- cgit v1.2.3 From 819c7f0dd21b8b819cdc70686682e31cadf155d6 Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Sun, 20 Mar 2011 07:48:29 -0400 Subject: document contributions from Nicky Perian --- doc/contributions.txt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/contributions.txt b/doc/contributions.txt index d6c0bc3ad5..998fed9cfb 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -1,8 +1,7 @@ Linden Lab would like to acknowledge source code contributions from the following residents. The Second Life resident name is given below, along with the issue identifier corresponding to the patches we've -received from them. To see more about these contributions, visit the -browsable version: http://wiki.secondlife.com/wiki/Source_contributions +received from them. Able Whitman VWR-650 @@ -577,6 +576,9 @@ Nicholaz Beresford VWR-2412 VWR-2682 VWR-2684 +Nicky Perian + OPEN-1 + OPEN-1087 Nounouch Hapmouche VWR-238 Patric Mills -- cgit v1.2.3 From 2e7771d9866a5006c8423064ca30bb654b143fef Mon Sep 17 00:00:00 2001 From: Tofu Buzzard <no-email> Date: Sun, 20 Mar 2011 15:20:02 +0000 Subject: subtler SSAO / better worst-case. --- indra/newview/app_settings/settings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index f56882b91e..c6317e1a1d 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -7274,7 +7274,7 @@ <string>Vector3</string> <key>Value</key> <array> - <real>0.70</real> + <real>0.80</real> <real>1.00</real> <real>0.00</real> </array> -- cgit v1.2.3 From fb862afc8b9b48ebcd3902f3324cb60c9af623d4 Mon Sep 17 00:00:00 2001 From: Tofu Buzzard <no-email> Date: Sun, 20 Mar 2011 15:48:01 +0000 Subject: revert a bunch of stuff from my local repo so this can go in minimally. --- indra/llmath/llvolume.cpp | 2 +- indra/llprimitive/llmodel.cpp | 2 +- indra/llui/CMakeLists.txt | 4 ++-- indra/newview/llfloatersearch.cpp | 14 +++++++------- indra/newview/llfloatersearch.h | 2 ++ indra/newview/llmeshrepository.cpp | 8 ++++---- install.xml | 4 ++-- 7 files changed, 19 insertions(+), 17 deletions(-) diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index dabec6390d..c4be176353 100644 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -1898,7 +1898,7 @@ BOOL LLVolume::generate() // Split is a parameter to LLProfile::generate that tesselates edges on the profile // to prevent lighting and texture interpolation errors on triangles that are // stretched due to twisting or scaling on the path. - S32 split = 0;//(S32) ((mDetail)*0.66f); + S32 split = (S32) ((mDetail)*0.66f); if (mParams.getPathParams().getCurveType() == LL_PCODE_PATH_LINE && (mParams.getPathParams().getScale().mV[0] != 1.0f || diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp index 2284ca0bee..eed82f924b 100755 --- a/indra/llprimitive/llmodel.cpp +++ b/indra/llprimitive/llmodel.cpp @@ -66,7 +66,7 @@ LLModel::~LLModel() { if (mDecompID >= 0) { -// LLConvexDecomposition::getInstance()->deleteDecomposition(mDecompID); + LLConvexDecomposition::getInstance()->deleteDecomposition(mDecompID); } } diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt index 3e94a4738b..684e393cba 100644 --- a/indra/llui/CMakeLists.txt +++ b/indra/llui/CMakeLists.txt @@ -245,11 +245,11 @@ target_link_libraries(llui ) # Add tests -if (0 AND LL_TESTS) +if (LL_TESTS) include(LLAddBuildTest) SET(llui_TEST_SOURCE_FILES llurlmatch.cpp llurlentry.cpp ) LL_ADD_PROJECT_UNIT_TESTS(llui "${llui_TEST_SOURCE_FILES}") -endif (0 AND LL_TESTS) +endif (LL_TESTS) \ No newline at end of file diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp index 1e321674a7..2041fac8d8 100644 --- a/indra/newview/llfloatersearch.cpp +++ b/indra/newview/llfloatersearch.cpp @@ -103,14 +103,14 @@ BOOL LLFloaterSearch::postBuild() void LLFloaterSearch::onOpen(const LLSD& key) { - if ( (key.has("category")) || ((mBrowser) && (mBrowser->getCurrentNavUrl().empty())) ) - { - // new search triggered - blank the page while loading, instead of - // temporarily showing stale results - mBrowser->navigateTo("about:blank"); + search(key); +} - search(key); - } +void LLFloaterSearch::onClose(bool app_quitting) +{ + // tear down the web view so we don't show the previous search + // result when the floater is opened next time + destroy(); } void LLFloaterSearch::handleMediaEvent(LLPluginClassMedia *self, EMediaEvent event) diff --git a/indra/newview/llfloatersearch.h b/indra/newview/llfloatersearch.h index 615c099d0d..ba4dc4c0fa 100644 --- a/indra/newview/llfloatersearch.h +++ b/indra/newview/llfloatersearch.h @@ -53,6 +53,8 @@ public: /// see search() for details on the key parameter. /*virtual*/ void onOpen(const LLSD& key); + /*virtual*/ void onClose(bool app_quitting); + /// perform a search with the specific search term. /// The key should be a map that can contain the following keys: /// - "id": specifies the text phrase to search for diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 986b8cd509..93e773d33b 100755 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -3532,7 +3532,7 @@ void LLPhysicsDecomp::run() if (!stages) { - //num_stages = decomp->getStages(&stages); + num_stages = decomp->getStages(&stages); } for (S32 i = 0; i < num_stages; i++) @@ -3554,9 +3554,9 @@ void LLPhysicsDecomp::run() S32& id = *(mCurRequest->mDecompID); if (id == -1) { - //decomp->genDecomposition(id); + decomp->genDecomposition(id); } - //decomp->bindDecomposition(id); + decomp->bindDecomposition(id); if (mCurRequest->mStage == "single_hull") { @@ -3569,7 +3569,7 @@ void LLPhysicsDecomp::run() } } - //decomp->quitThread(); + decomp->quitThread(); if (mSignal->isLocked()) { //let go of mSignal's associated mutex diff --git a/install.xml b/install.xml index 096921a823..1bc6746223 100755 --- a/install.xml +++ b/install.xml @@ -306,9 +306,9 @@ <key>linux</key> <map> <key>md5sum</key> - <string>a20e73f2e7d6a032ff25a5161b1b7394</string> + <string>9c9b629b62bf874d550c430ad678dc04</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.20.1-linux-20100527.tar.bz2</uri> + <uri>https://s3.amazonaws.com/automated-builds-secondlife-com/hg/repo/brad_curl-autobuild/rev/216961/arch/Linux/installer/curl-7.21.1-linux-20101215.tar.bz2</uri> </map> <key>linux64</key> <map> -- cgit v1.2.3 From d693c4f6e2f581cd9c82d5526115a5bbd072a8c2 Mon Sep 17 00:00:00 2001 From: Tofu Buzzard <no-email> Date: Sun, 20 Mar 2011 15:52:01 +0000 Subject: undo another local change. --- indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl b/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl index f4f6ee95d0..e3c15a2ab2 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl @@ -16,5 +16,5 @@ void main() vec4 col = texture2D(diffuseMap, gl_TexCoord[0].xy); gl_FragData[0] = vec4(col.rgb, col.a * 0.005); gl_FragData[1] = texture2D(specularMap, gl_TexCoord[0].xy); - gl_FragData[2] = texture2D(normalMap, gl_TexCoord[0].xy); + gl_FragData[2] = vec4(texture2D(normalMap, gl_TexCoord[0].xy).xyz, 0.0); } -- cgit v1.2.3 From 7e7ff13b49f6f806a385bd92d675123ff7db7232 Mon Sep 17 00:00:00 2001 From: Tofu Buzzard <no-email> Date: Sun, 20 Mar 2011 15:58:34 +0000 Subject: Disable auto-glow again, though leave my other tweaks in place for those who might turn it on. --- indra/newview/app_settings/settings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index c6317e1a1d..f715272681 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -8276,7 +8276,7 @@ <key>Type</key> <string>F32</string> <key>Value</key> - <real>0.81</real> + <real>9999</real> </map> <key>RenderGlowResolutionPow</key> <map> -- cgit v1.2.3 From 2d43a5231dc700398aed32a0ed03bc7e68407bdd Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Mon, 21 Mar 2011 09:33:51 -0400 Subject: fix DOS line endings --- indra/llmath/tests/m3math_test.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/indra/llmath/tests/m3math_test.cpp b/indra/llmath/tests/m3math_test.cpp index baff5a2d45..1ca2b005d9 100644 --- a/indra/llmath/tests/m3math_test.cpp +++ b/indra/llmath/tests/m3math_test.cpp @@ -36,11 +36,11 @@ #include "../v3dmath.h" #include "../test/lltut.h" - -#if LL_WINDOWS -// disable unreachable code warnings caused by usage of skip. -#pragma warning(disable: 4702) -#endif + +#if LL_WINDOWS +// disable unreachable code warnings caused by usage of skip. +#pragma warning(disable: 4702) +#endif #if LL_WINDOWS // disable unreachable code warnings caused by usage of skip. -- cgit v1.2.3 From ed2222be5d33cb4216e6826507ae1d06e9781253 Mon Sep 17 00:00:00 2001 From: Paul ProductEngine <pguslisty@productengine.com> Date: Mon, 21 Mar 2011 17:50:59 +0200 Subject: STORM-399 FIXED Users that has chatted within chat range of the user in-world are not added to Recent tab - Add sender(only avatar) to the recent people list just after message appears in nearby chat --- indra/newview/llnearbychathandler.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp index de5439e4e0..f595773bb6 100644 --- a/indra/newview/llnearbychathandler.cpp +++ b/indra/newview/llnearbychathandler.cpp @@ -523,6 +523,10 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args) && chat_msg.mFromID != gAgentID) { LLFirstUse::otherAvatarChatFirst(); + + // Add sender to the recent people list. + LLRecentPeople::instance().add(chat_msg.mFromID); + } if( nearby_chat->getVisible() -- cgit v1.2.3 From 717d81daa7f42d18ca37eb738ceacfe2b9c1a09a Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Mon, 21 Mar 2011 12:04:31 -0400 Subject: Added left-right butt control. Did a bunch of code cleanup. --- indra/newview/character/avatar_lad.xml | 39 ++++++- indra/newview/llphysicsmotion.cpp | 136 ++++++++++++++----------- indra/newview/llpolymesh.cpp | 82 +++++++-------- indra/newview/skins/default/xui/en/strings.xml | 1 + 4 files changed, 154 insertions(+), 104 deletions(-) diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index 58fe82da9e..69512cdf34 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -4456,6 +4456,22 @@ <param_morph /> </param> + <param + id="1090" + group="0" + name="Butt_Physics_LeftRight_Driven" + wearable="shape" + edit_group="driven" + label_min="Separate" + label_max="Join" + value_default="0" + value_min="-2" + value_max="2" + camera_elevation=".3" + camera_distance=".8"> + <param_morph /> + </param> + <param id="152" group="1" @@ -9351,7 +9367,7 @@ render_pass="bump"> </param> <param - id="1090" + id="1104" group="0" wearable="shape" edit_group="shape_legs" @@ -9371,6 +9387,27 @@ render_pass="bump"> </param_driver> </param> + <param + id="1105" + group="0" + wearable="shape" + edit_group="shape_legs" + edit_group_order="15" + name="Butt_Physics_LeftRight_Controller" + label="Butt Physics LeftRight Controller" + label_min="Down" + label_max="Up" + value_min="-1" + value_max="1" + value_default="0" + camera_elevation=".3" + camera_distance=".8"> + <param_driver> + <driven + id="1090" /> + </param_driver> + </param> + <param id="507" group="0" diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 393120be40..87e062a881 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -238,85 +238,103 @@ LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter mMotions.clear(); - controller_map_t controllers_cleavage; - controllers_cleavage["Mass"] = "Breast_Physics_Mass"; - controllers_cleavage["Smoothing"] = "Breast_Physics_Smoothing"; - controllers_cleavage["Gravity"] = "Breast_Physics_Gravity"; - controllers_cleavage["Damping"] = "Breast_Physics_Side_Damping"; - controllers_cleavage["Drag"] = "Breast_Physics_Side_Drag"; - controllers_cleavage["MaxSpeed"] = "Breast_Physics_Side_Max_Velocity"; - controllers_cleavage["Spring"] = "Breast_Physics_Side_Spring"; - controllers_cleavage["Gain"] = "Breast_Physics_Side_Gain"; - - LLPhysicsMotion *cleavage_motion = new LLPhysicsMotion("Breast_Physics_Side_Controller", - "", - "mChest", - character, - LLVector3(-1,0,0), - controllers_cleavage); - if (!cleavage_motion->initialize()) + controller_map_t controller_breast_inout; + controller_breast_inout["Mass"] = "Breast_Physics_Mass"; + controller_breast_inout["Smoothing"] = "Breast_Physics_Smoothing"; + controller_breast_inout["Gravity"] = "Breast_Physics_Gravity"; + controller_breast_inout["Damping"] = "Breast_Physics_Side_Damping"; + controller_breast_inout["Drag"] = "Breast_Physics_Side_Drag"; + controller_breast_inout["MaxSpeed"] = "Breast_Physics_Side_Max_Velocity"; + controller_breast_inout["Spring"] = "Breast_Physics_Side_Spring"; + controller_breast_inout["Gain"] = "Breast_Physics_Side_Gain"; + + LLPhysicsMotion *motion_breast_inout = new LLPhysicsMotion("Breast_Physics_Side_Controller", + "", + "mChest", + character, + LLVector3(-1,0,0), + controller_breast_inout); + if (!motion_breast_inout->initialize()) return STATUS_FAILURE; - addMotion(cleavage_motion); - - controller_map_t controllers_bounce; - controllers_bounce["Mass"] = "Breast_Physics_Mass"; - controllers_bounce["Smoothing"] = "Breast_Physics_Smoothing"; - controllers_bounce["Gravity"] = "Breast_Physics_Gravity"; - controllers_bounce["Damping"] = "Breast_Physics_UpDown_Damping"; - controllers_bounce["Drag"] = "Breast_Physics_UpDown_Drag"; - controllers_bounce["MaxSpeed"] = "Breast_Physics_UpDown_Max_Velocity"; - controllers_bounce["Spring"] = "Breast_Physics_UpDown_Spring"; - controllers_bounce["Gain"] = "Breast_Physics_UpDown_Gain"; - - LLPhysicsMotion *bounce_motion = new LLPhysicsMotion("Breast_Physics_UpDown_Controller", - "", - "mChest", - character, - LLVector3(0,0,1), - controllers_bounce); - if (!bounce_motion->initialize()) + addMotion(motion_breast_inout); + + controller_map_t controller_breast_updown; + controller_breast_updown["Mass"] = "Breast_Physics_Mass"; + controller_breast_updown["Smoothing"] = "Breast_Physics_Smoothing"; + controller_breast_updown["Gravity"] = "Breast_Physics_Gravity"; + controller_breast_updown["Damping"] = "Breast_Physics_UpDown_Damping"; + controller_breast_updown["Drag"] = "Breast_Physics_UpDown_Drag"; + controller_breast_updown["MaxSpeed"] = "Breast_Physics_UpDown_Max_Velocity"; + controller_breast_updown["Spring"] = "Breast_Physics_UpDown_Spring"; + controller_breast_updown["Gain"] = "Breast_Physics_UpDown_Gain"; + + LLPhysicsMotion *motion_breast_updown = new LLPhysicsMotion("Breast_Physics_UpDown_Controller", + "", + "mChest", + character, + LLVector3(0,0,1), + controller_breast_updown); + if (!motion_breast_updown->initialize()) { llassert_always(FALSE); return STATUS_FAILURE; } - addMotion(bounce_motion); - - controller_map_t controllers_butt_bounce; - controllers_butt_bounce["Damping"] = "Butt_Physics_Updown_Damping"; - controllers_butt_bounce["MaxSpeed"] = "Butt_Physics_Updown_Max_Velocity"; - controllers_butt_bounce["Spring"] = "Butt_Physics_Updown_Spring"; - controllers_butt_bounce["Gain"] = "Butt_Physics_Updown_Gain"; - LLPhysicsMotion *butt_bounce_motion = new LLPhysicsMotion("Butt_Physics_UpDown_Controller", + addMotion(motion_breast_updown); + + controller_map_t controller_butt_updown; + controller_butt_updown["Damping"] = "Butt_Physics_Updown_Damping"; + controller_butt_updown["MaxSpeed"] = "Butt_Physics_Updown_Max_Velocity"; + controller_butt_updown["Spring"] = "Butt_Physics_Updown_Spring"; + controller_butt_updown["Gain"] = "Butt_Physics_Updown_Gain"; + LLPhysicsMotion *motion_butt_updown = new LLPhysicsMotion("Butt_Physics_UpDown_Controller", "", "mPelvis", character, - LLVector3(0,0,-1), - controllers_butt_bounce); - if (!butt_bounce_motion->initialize()) + LLVector3(0,0,1), + controller_butt_updown); + if (!motion_butt_updown->initialize()) { llassert_always(FALSE); return STATUS_FAILURE; } - addMotion(butt_bounce_motion); - - controller_map_t controllers_belly_bounce; - controllers_belly_bounce["Damping"] = "Belly_Physics_Updown_Damping"; - controllers_belly_bounce["MaxSpeed"] = "Belly_Physics_Updown_Max_Velocity"; - controllers_belly_bounce["Spring"] = "Belly_Physics_Updown_Spring"; - controllers_belly_bounce["Gain"] = "Belly_Physics_Updown_Gain"; - LLPhysicsMotion *belly_bounce_motion = new LLPhysicsMotion("Belly_Physics_UpDown_Controller", + addMotion(motion_butt_updown); + + controller_map_t controller_butt_leftright; + controller_butt_leftright["Damping"] = "Butt_Physics_Updown_Damping"; + controller_butt_leftright["MaxSpeed"] = "Butt_Physics_Updown_Max_Velocity"; + controller_butt_leftright["Spring"] = "Butt_Physics_Updown_Spring"; + controller_butt_leftright["Gain"] = "Butt_Physics_Updown_Gain"; + LLPhysicsMotion *motion_butt_leftright = new LLPhysicsMotion("Butt_Physics_LeftRight_Controller", + "", + "mPelvis", + character, + LLVector3(0,1,0), + controller_butt_leftright); + if (!motion_butt_leftright->initialize()) + { + llassert_always(FALSE); + return STATUS_FAILURE; + } + addMotion(motion_butt_leftright); + + controller_map_t controller_belly_updown; + controller_belly_updown["Damping"] = "Belly_Physics_Updown_Damping"; + controller_belly_updown["MaxSpeed"] = "Belly_Physics_Updown_Max_Velocity"; + controller_belly_updown["Spring"] = "Belly_Physics_Updown_Spring"; + controller_belly_updown["Gain"] = "Belly_Physics_Updown_Gain"; + LLPhysicsMotion *motion_belly_updown = new LLPhysicsMotion("Belly_Physics_UpDown_Controller", "", "mChest", character, LLVector3(0,0,-1), - controllers_belly_bounce); - if (!belly_bounce_motion->initialize()) + controller_belly_updown); + if (!motion_belly_updown->initialize()) { llassert_always(FALSE); return STATUS_FAILURE; } - addMotion(belly_bounce_motion); - + addMotion(motion_belly_updown); + return STATUS_SUCCESS; } diff --git a/indra/newview/llpolymesh.cpp b/indra/newview/llpolymesh.cpp index 626b7ca1eb..a28357b4a9 100644 --- a/indra/newview/llpolymesh.cpp +++ b/indra/newview/llpolymesh.cpp @@ -46,6 +46,10 @@ extern LLControlGroup gSavedSettings; // read only +LLPolyMorphData *clone_morph_param(const LLPolyMorphData *src_data, + const LLVector3 &direction, + const std::string &name); + //----------------------------------------------------------------------------- // Global table of loaded LLPolyMeshes //----------------------------------------------------------------------------- @@ -605,62 +609,36 @@ BOOL LLPolyMeshSharedData::loadMesh( const std::string& fileName ) if (!strcmp(morphName, "Big_Belly_Torso")) { - LLPolyMorphData* cloned_morph_data = new LLPolyMorphData(*morph_data); - cloned_morph_data->mName = std::string("Belly_Torso_Physics_UpDown_Driven"); - for (U32 v=0; v < morph_data->mNumIndices; v++) - { - cloned_morph_data->mCoords[v][0] = 0; - cloned_morph_data->mCoords[v][1] = 0; - cloned_morph_data->mCoords[v][2] = 0.05F; - cloned_morph_data->mNormals[v] = LLVector3(0,0,0); - cloned_morph_data->mBinormals[v] = LLVector3(0,0,0); - } - mMorphData.insert(cloned_morph_data); + mMorphData.insert(clone_morph_param(morph_data, + LLVector3(0,0,0.05f), + "Belly_Torso_Physics_UpDown_Driven")); } if (!strcmp(morphName, "Big_Belly_Legs")) { - LLPolyMorphData* cloned_morph_data = new LLPolyMorphData(*morph_data); - cloned_morph_data->mName = std::string("Belly_Legs_Physics_UpDown_Driven"); - for (U32 v=0; v < cloned_morph_data->mNumIndices; v++) - { - cloned_morph_data->mCoords[v][0] = 0; - cloned_morph_data->mCoords[v][1] = 0; - cloned_morph_data->mCoords[v][2] = 0.05F; - cloned_morph_data->mNormals[v] = LLVector3(0,0,0); - cloned_morph_data->mBinormals[v] = LLVector3(0,0,0); - } - mMorphData.insert(cloned_morph_data); + mMorphData.insert(clone_morph_param(morph_data, + LLVector3(0,0,0.05f), + "Belly_Legs_Physics_UpDown_Driven")); } if (!strcmp(morphName, "skirt_belly")) { - LLPolyMorphData* cloned_morph_data = new LLPolyMorphData(*morph_data); - cloned_morph_data->mName = std::string("Belly_Skirt_Physics_UpDown_Driven"); - for (U32 v=0; v < cloned_morph_data->mNumIndices; v++) - { - cloned_morph_data->mCoords[v][0] = 0; - cloned_morph_data->mCoords[v][1] = 0; - cloned_morph_data->mCoords[v][2] = 0.05F; - cloned_morph_data->mNormals[v] = LLVector3(0,0,0); - cloned_morph_data->mBinormals[v] = LLVector3(0,0,0); - } - mMorphData.insert(cloned_morph_data); + mMorphData.insert(clone_morph_param(morph_data, + LLVector3(0,0,0.05f), + "Belly_Skirt_Physics_UpDown_Driven")); } if (!strcmp(morphName, "Small_Butt")) { - LLPolyMorphData* cloned_morph_data = new LLPolyMorphData(*morph_data); - cloned_morph_data->mName = std::string("Butt_Physics_UpDown_Driven"); - for (U32 v=0; v < cloned_morph_data->mNumIndices; v++) - { - cloned_morph_data->mCoords[v][0] = 0; - cloned_morph_data->mCoords[v][1] = 0; - cloned_morph_data->mCoords[v][2] = 0.01F; - cloned_morph_data->mNormals[v] = LLVector3(0,0,0); - cloned_morph_data->mBinormals[v] = LLVector3(0,0,0); - } - mMorphData.insert(cloned_morph_data); + mMorphData.insert(clone_morph_param(morph_data, + LLVector3(0,0,0.01f), + "Butt_Physics_UpDown_Driven")); + } + if (!strcmp(morphName, "Small_Butt")) + { + mMorphData.insert(clone_morph_param(morph_data, + LLVector3(0,0.01f,0), + "Butt_Physics_LeftRight_Driven")); } } @@ -1218,4 +1196,20 @@ void LLPolySkeletalDistortion::apply( ESex avatar_sex ) mLastWeight = mCurWeight; } + +LLPolyMorphData *clone_morph_param(const LLPolyMorphData *src_data, + const LLVector3 &direction, + const std::string &name) +{ + LLPolyMorphData* cloned_morph_data = new LLPolyMorphData(*src_data); + cloned_morph_data->mName = name; + for (U32 v=0; v < cloned_morph_data->mNumIndices; v++) + { + cloned_morph_data->mCoords[v] = direction; + cloned_morph_data->mNormals[v] = LLVector3(0,0,0); + cloned_morph_data->mBinormals[v] = LLVector3(0,0,0); + } + return cloned_morph_data; +} + // End diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index e5d52b03e5..e183b0ba78 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2534,6 +2534,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="Belly Physics UpDown Max Speed">Belly Updown Max Speed</string> <string name="Butt Physics UpDown Controller">Butt UpDown Bounce</string> +<string name="Butt Physics LeftRight Controller">Butt LeftRight Bounce</string> <string name="Butt Physics UpDown Spring">Butt UpDown Spring</string> <string name="Butt Physics UpDown Gain">Butt UpDown Gain</string> <string name="Butt Physics UpDown Damping">Butt UpDown Damping</string> -- cgit v1.2.3 From 77ad0269aca9169dc41bee08ff860373d7715b8c Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Mon, 21 Mar 2011 14:15:41 -0400 Subject: Fixes for physics update thresholds. --- indra/newview/llphysicsmotion.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 87e062a881..2a88a4a2b5 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -588,7 +588,7 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) if ((pixel_area > area_for_this_setting) || is_self) { const F32 position_diff_local = llabs(mPositionLastUpdate_local-position_new_local_clamped); - const F32 min_delta = (1.0f-lod_factor)*4.0f; // Magic number 2.0f, can change this if experimentally something works better. + const F32 min_delta = (1.01f-lod_factor)*0.75f; // 75% is just an experimental magic number. if (llabs(position_diff_local) > min_delta) { update_visuals = TRUE; -- cgit v1.2.3 From 209110d1aa7ee369ccdf68641c3d7f9e558427de Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Mon, 21 Mar 2011 15:39:42 -0400 Subject: Velocity now gets zeroed out if the param is pushed beyond limits. Rescaled the max speed param. --- indra/newview/character/avatar_lad.xml | 24 ++++++++++++------------ indra/newview/llphysicsmotion.cpp | 8 +++++++- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index 69512cdf34..d8f6fd56b3 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -3801,7 +3801,7 @@ wearable="shape" edit_group="driven" value_default="0" - value_min="0" + value_min="-1" value_max="1"> <param_morph /> </param> @@ -4396,7 +4396,7 @@ name="Belly_Legs_Physics_UpDown_Driven" wearable="shape" edit_group="driven" - value_min="0" + value_min="-1" value_max="1"> <param_morph /> </param> @@ -9141,9 +9141,9 @@ render_pass="bump"> edit_group="physics" label_min="Less" label_max="More" - value_default=".2" + value_default=".1" value_min=".1" - value_max=".5" + value_max="1" camera_elevation=".3" camera_distance=".8"> <param_driver /> @@ -9267,9 +9267,9 @@ render_pass="bump"> edit_group="physics" label_min="Less" label_max="More" - value_default=".1" + value_default="0" value_min="0" - value_max=".1" + value_max="10" camera_elevation=".3" camera_distance=".8"> <param_driver /> @@ -9358,9 +9358,9 @@ render_pass="bump"> edit_group="physics" label_min="Less" label_max="More" - value_default=".1" + value_default="0" value_min="0" - value_max=".1" + value_max="10" camera_elevation=".3" camera_distance=".8"> <param_driver /> @@ -10261,9 +10261,9 @@ render_pass="bump"> edit_group="physics" label_min="Less" label_max="More" - value_default=".1" + value_default="0" value_min="0" - value_max=".1" + value_max="10" camera_elevation=".3" camera_distance=".8"> <param_driver /> @@ -10329,9 +10329,9 @@ render_pass="bump"> edit_group="physics" label_min="Less" label_max="More" - value_default=".1" + value_default="0" value_min="0" - value_max=".1" + value_max="10" camera_elevation=".3" camera_distance=".8"> <param_driver /> diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 2a88a4a2b5..48e632280e 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -523,7 +523,7 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) const F32 acceleration_new_local = force_net / behavior_mass; F32 velocity_new_local = mVelocity_local + acceleration_new_local; velocity_new_local = llclamp(velocity_new_local, - -behavior_maxspeed*100.0f, behavior_maxspeed*100.0f); + -behavior_maxspeed, behavior_maxspeed); // Temporary debugging setting to cause all avatars to move, for profiling purposes. if (gSavedSettings.getBOOL("AvatarPhysicsTest")) @@ -535,6 +535,12 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) (position_current_local + velocity_new_local*time_delta) : position_user_local; + // Zero out the velocity if the param is being pushed beyond its limits. + if (position_new_local < 0 || position_new_local > 1) + { + velocity_new_local = 0; + } + const F32 position_new_local_clamped = llclamp(position_new_local, 0.0f, 1.0f); -- cgit v1.2.3 From 45a43256ae71ec7936fc73e3b9c41470a23dd229 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Mon, 21 Mar 2011 16:18:02 -0400 Subject: Fixed skirt-related belly bounce. --- indra/newview/character/avatar_lad.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index d8f6fd56b3..160b8f3408 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -5192,7 +5192,7 @@ wearable="skirt" edit_group="driven" cross_wearable="true" - value_min="0" + value_min="-1" value_max="1"> <param_morph /> </param> -- cgit v1.2.3 From 3f3429fa6854c6462abf3bbabf4af1dbbeb4c337 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed <nat@lindenlab.com> Date: Mon, 21 Mar 2011 17:38:16 -0400 Subject: STORM-1051: Fixup to LLWindowListener per code review. Bug: capturing a const ref to value returned by LLSD::asString() not so good. Bug: LLWindowListener::keyUp() was calling handleTranslatedKeyDown(). In keyDown and keyUp, support keysym lookup (e.g. "TAB") as well as integer keycode. In keyDown, keyUp, mouseDown, mouseUp and mouseMove, support modifier mask by accepting an array of "CONTROL", "SHIFT" etc. strings. State in operation doc strings valid values for button, keycode, keysym, mask. The LLWindowListener(... LLKeyboard*) constructor param gKeyboard is always NULL at the time LLWindowListener is constructed. Eliminate tests and global references to gKeyboard by replacing with a more Feathers-style LLKeyboard* getter function. --- indra/llwindow/llwindow.cpp | 7 +- indra/llwindow/llwindowlistener.cpp | 279 ++++++++++++++++++++++++++---------- indra/llwindow/llwindowlistener.h | 6 +- 3 files changed, 216 insertions(+), 76 deletions(-) diff --git a/indra/llwindow/llwindow.cpp b/indra/llwindow/llwindow.cpp index 2d00c37719..71a5df910d 100644 --- a/indra/llwindow/llwindow.cpp +++ b/indra/llwindow/llwindow.cpp @@ -42,6 +42,7 @@ #include "linked_lists.h" #include "llwindowcallbacks.h" #include "llwindowlistener.h" +#include <boost/lambda/core.hpp> // @@ -117,7 +118,11 @@ LLWindow::LLWindow(LLWindowCallbacks* callbacks, BOOL fullscreen, U32 flags) mFlags(flags), mHighSurrogate(0) { - mListener = new LLWindowListener(callbacks, gKeyboard); + // gKeyboard is still NULL, so it doesn't do LLWindowListener any good to + // pass its value right now. Instead, pass it a nullary function that + // will, when we later need it, return the value of gKeyboard. + // boost::lambda::var() constructs such a functor on the fly. + mListener = new LLWindowListener(callbacks, boost::lambda::var(gKeyboard)); } LLWindow::~LLWindow() diff --git a/indra/llwindow/llwindowlistener.cpp b/indra/llwindow/llwindowlistener.cpp index 22cc12acee..91b99d83c6 100644 --- a/indra/llwindow/llwindowlistener.cpp +++ b/indra/llwindow/llwindowlistener.cpp @@ -31,138 +31,271 @@ #include "llcoord.h" #include "llkeyboard.h" #include "llwindowcallbacks.h" +#include <map> -LLWindowListener::LLWindowListener(LLWindowCallbacks *window, LLKeyboard * keyboard) +LLWindowListener::LLWindowListener(LLWindowCallbacks *window, const KeyboardGetter& kbgetter) : LLEventAPI("LLWindow", "Inject input events into the LLWindow instance"), mWindow(window), - mKeyboard(keyboard) + mKbGetter(kbgetter) { + std::string keySomething = + "Given [\"keysym\"], [\"keycode\"] or [\"char\"], inject the specified "; + std::string keyExplain = + "(integer keycode values, or keysym \"XXXX\" from any KEY_XXXX, in\n" + "http://hg.secondlife.com/viewer-development/src/tip/indra/llcommon/indra_constants.h )"; + std::string mask = + "Specify optional [\"mask\"] as an array containing any of \"CONTROL\", \"ALT\",\n" + "\"SHIFT\" or \"MAC_CONTROL\"; the corresponding modifier bits will be combined\n" + "to form the mask used with the event."; + + std::string mouseSomething = + "Given [\"button\"], [\"x\"] and [\"y\"], inject the given mouse "; + std::string mouseExplain = + "(button values \"LEFT\", \"MIDDLE\", \"RIGHT\")"; + add("keyDown", - "Given [\"keycode\"] or [\"char\"], will inject the given keypress event.", + keySomething + "keypress event.\n" + keyExplain + '\n' + mask, &LLWindowListener::keyDown); add("keyUp", - "Given [\"keycode\"] or [\"char\"], will inject the given key release event.", + keySomething + "key release event.\n" + keyExplain + '\n' + mask, &LLWindowListener::keyUp); add("mouseDown", - "Given [\"button\"], [\"x\"] and [\"y\"], will inject the given mouse click event.", + mouseSomething + "click event.\n" + mouseExplain + '\n' + mask, &LLWindowListener::mouseDown); add("mouseUp", - "Given [\"button\"], [\"x\"] and [\"y\"], will inject the given mouse release event.", + mouseSomething + "release event.\n" + mouseExplain + '\n' + mask, &LLWindowListener::mouseUp); add("mouseMove", - "Given [\"x\"] and [\"y\"], will inject the given mouse movement event.", + std::string("Given [\"x\"] and [\"y\"], inject the given mouse movement event.\n") + + mask, &LLWindowListener::mouseMove); add("mouseScroll", - "Given a number of [\"clicks\"], will inject the given mouse scroll event.", + "Given an integer number of [\"clicks\"], inject the given mouse scroll event.\n" + "(positive clicks moves downward through typical content)", &LLWindowListener::mouseScroll); } -void LLWindowListener::keyDown(LLSD const & evt) +template <typename MAPPED> +class StringLookup { - if(NULL == mKeyboard) - { - // *HACK to handle the fact that LLWindow subclasses have to initialize - // things in an inconvenient order - mKeyboard = gKeyboard; - } +private: + std::string mDesc; + typedef std::map<std::string, MAPPED> Map; + Map mMap; + +public: + StringLookup(const std::string& desc): mDesc(desc) {} - KEY keycode = 0; - if(evt.has("keycode")) + MAPPED lookup(const typename Map::key_type& key) const { - keycode = KEY(evt["keycode"].asInteger()); + typename Map::const_iterator found = mMap.find(key); + if (found == mMap.end()) + { + LL_WARNS("LLWindowListener") << "Unknown " << mDesc << " '" << key << "'" << LL_ENDL; + return MAPPED(); + } + return found->second; } - else + +protected: + void add(const typename Map::key_type& key, const typename Map::mapped_type& value) { - keycode = KEY(evt["char"].asString()[0]); + mMap.insert(typename Map::value_type(key, value)); } +}; - // *TODO - figure out how to handle the mask - mKeyboard->handleTranslatedKeyDown(keycode, 0); -} +// for WhichKeysym. KeyProxy is like the typedef KEY, except that KeyProxy() +// (default-constructed) is guaranteed to have the value KEY_NONE. +class KeyProxy +{ +public: + KeyProxy(KEY k): mKey(k) {} + KeyProxy(): mKey(KEY_NONE) {} + operator KEY() const { return mKey; } -void LLWindowListener::keyUp(LLSD const & evt) +private: + KEY mKey; +}; + +struct WhichKeysym: public StringLookup<KeyProxy> { - if(NULL == mKeyboard) + WhichKeysym(): StringLookup<KeyProxy>("keysym") { - // *HACK to handle the fact that LLWindow subclasses have to initialize - // things in an inconvenient order - mKeyboard = gKeyboard; + add("RETURN", KEY_RETURN); + add("LEFT", KEY_LEFT); + add("RIGHT", KEY_RIGHT); + add("UP", KEY_UP); + add("DOWN", KEY_DOWN); + add("ESCAPE", KEY_ESCAPE); + add("BACKSPACE", KEY_BACKSPACE); + add("DELETE", KEY_DELETE); + add("SHIFT", KEY_SHIFT); + add("CONTROL", KEY_CONTROL); + add("ALT", KEY_ALT); + add("HOME", KEY_HOME); + add("END", KEY_END); + add("PAGE_UP", KEY_PAGE_UP); + add("PAGE_DOWN", KEY_PAGE_DOWN); + add("HYPHEN", KEY_HYPHEN); + add("EQUALS", KEY_EQUALS); + add("INSERT", KEY_INSERT); + add("CAPSLOCK", KEY_CAPSLOCK); + add("TAB", KEY_TAB); + add("ADD", KEY_ADD); + add("SUBTRACT", KEY_SUBTRACT); + add("MULTIPLY", KEY_MULTIPLY); + add("DIVIDE", KEY_DIVIDE); + add("F1", KEY_F1); + add("F2", KEY_F2); + add("F3", KEY_F3); + add("F4", KEY_F4); + add("F5", KEY_F5); + add("F6", KEY_F6); + add("F7", KEY_F7); + add("F8", KEY_F8); + add("F9", KEY_F9); + add("F10", KEY_F10); + add("F11", KEY_F11); + add("F12", KEY_F12); + + add("PAD_UP", KEY_PAD_UP); + add("PAD_DOWN", KEY_PAD_DOWN); + add("PAD_LEFT", KEY_PAD_LEFT); + add("PAD_RIGHT", KEY_PAD_RIGHT); + add("PAD_HOME", KEY_PAD_HOME); + add("PAD_END", KEY_PAD_END); + add("PAD_PGUP", KEY_PAD_PGUP); + add("PAD_PGDN", KEY_PAD_PGDN); + add("PAD_CENTER", KEY_PAD_CENTER); // the 5 in the middle + add("PAD_INS", KEY_PAD_INS); + add("PAD_DEL", KEY_PAD_DEL); + add("PAD_RETURN", KEY_PAD_RETURN); + add("PAD_ADD", KEY_PAD_ADD); // not used + add("PAD_SUBTRACT", KEY_PAD_SUBTRACT); // not used + add("PAD_MULTIPLY", KEY_PAD_MULTIPLY); // not used + add("PAD_DIVIDE", KEY_PAD_DIVIDE); // not used + + add("BUTTON0", KEY_BUTTON0); + add("BUTTON1", KEY_BUTTON1); + add("BUTTON2", KEY_BUTTON2); + add("BUTTON3", KEY_BUTTON3); + add("BUTTON4", KEY_BUTTON4); + add("BUTTON5", KEY_BUTTON5); + add("BUTTON6", KEY_BUTTON6); + add("BUTTON7", KEY_BUTTON7); + add("BUTTON8", KEY_BUTTON8); + add("BUTTON9", KEY_BUTTON9); + add("BUTTON10", KEY_BUTTON10); + add("BUTTON11", KEY_BUTTON11); + add("BUTTON12", KEY_BUTTON12); + add("BUTTON13", KEY_BUTTON13); + add("BUTTON14", KEY_BUTTON14); + add("BUTTON15", KEY_BUTTON15); } +}; +static WhichKeysym keysyms; - KEY keycode = 0; - if(evt.has("keycode")) +struct WhichMask: public StringLookup<MASK> +{ + WhichMask(): StringLookup<MASK>("shift mask") { - keycode = KEY(evt["keycode"].asInteger()); + add("NONE", MASK_NONE); + add("CONTROL", MASK_CONTROL); // Mapped to cmd on Macs + add("ALT", MASK_ALT); + add("SHIFT", MASK_SHIFT); + add("MAC_CONTROL", MASK_MAC_CONTROL); // Un-mapped Ctrl key on Macs, not used on Windows } - else +}; +static WhichMask masks; + +static MASK getMask(const LLSD& event) +{ + MASK mask(MASK_NONE); + LLSD masknames(event["mask"]); + for (LLSD::array_const_iterator ai(masknames.beginArray()), aend(masknames.endArray()); + ai != aend; ++ai) { - keycode = KEY(evt["char"].asString()[0]); + mask |= masks.lookup(*ai); } - - // *TODO - figure out how to handle the mask - mKeyboard->handleTranslatedKeyDown(keycode, 0); + return mask; } -void LLWindowListener::mouseDown(LLSD const & evt) +static KEY getKEY(const LLSD& event) { - LLCoordGL pos(evt["x"].asInteger(), evt["y"].asInteger()); - - std::string const & button = evt["button"].asString(); - - if(button == "LEFT") - { - // *TODO - figure out how to handle the mask - mWindow->handleMouseDown(NULL, pos, 0); - } - else if (button == "RIGHT") + if (event.has("keysym")) { - // *TODO - figure out how to handle the mask - mWindow->handleRightMouseDown(NULL, pos, 0); + return keysyms.lookup(event["keysym"]); } - else if (button == "MIDDLE") + else if (event.has("keycode")) { - // *TODO - figure out how to handle the mask - mWindow->handleMiddleMouseDown(NULL, pos, 0); + return KEY(event["keycode"].asInteger()); } else { - llwarns << "ignoring unknown mous button \"" << button << '\"' << llendl; + return KEY(event["char"].asString()[0]); } } -void LLWindowListener::mouseUp(LLSD const & evt) +void LLWindowListener::keyDown(LLSD const & evt) +{ + mKbGetter()->handleTranslatedKeyDown(getKEY(evt), getMask(evt)); +} + +void LLWindowListener::keyUp(LLSD const & evt) { - LLCoordGL pos(evt["x"].asInteger(), evt["y"].asInteger()); + mKbGetter()->handleTranslatedKeyUp(getKEY(evt), getMask(evt)); +} - std::string const & button = evt["button"].asString(); +// for WhichButton +typedef BOOL (LLWindowCallbacks::*MouseFunc)(LLWindow *, LLCoordGL, MASK); +struct Actions +{ + Actions(const MouseFunc& d, const MouseFunc& u): down(d), up(u), valid(true) {} + Actions(): valid(false) {} + MouseFunc down, up; + bool valid; +}; - if(button == "LEFT") - { - // *TODO - figure out how to handle the mask - mWindow->handleMouseUp(NULL, pos, 0); - } - else if (button == "RIGHT") +struct WhichButton: public StringLookup<Actions> +{ + WhichButton(): StringLookup<Actions>("mouse button") { - // *TODO - figure out how to handle the mask - mWindow->handleRightMouseUp(NULL, pos, 0); + add("LEFT", Actions(&LLWindowCallbacks::handleMouseDown, + &LLWindowCallbacks::handleMouseUp)); + add("RIGHT", Actions(&LLWindowCallbacks::handleRightMouseDown, + &LLWindowCallbacks::handleRightMouseUp)); + add("MIDDLE", Actions(&LLWindowCallbacks::handleMiddleMouseDown, + &LLWindowCallbacks::handleMiddleMouseUp)); } - else if (button == "MIDDLE") +}; +static WhichButton buttons; + +static LLCoordGL getPos(const LLSD& event) +{ + return LLCoordGL(event["x"].asInteger(), event["y"].asInteger()); +} + +void LLWindowListener::mouseDown(LLSD const & evt) +{ + Actions actions(buttons.lookup(evt["button"])); + if (actions.valid) { - // *TODO - figure out how to handle the mask - mWindow->handleMiddleMouseUp(NULL, pos, 0); + (mWindow->*(actions.down))(NULL, getPos(evt), getMask(evt)); } - else +} + +void LLWindowListener::mouseUp(LLSD const & evt) +{ + Actions actions(buttons.lookup(evt["button"])); + if (actions.valid) { - llwarns << "ignoring unknown mous button \"" << button << '\"' << llendl; + (mWindow->*(actions.up))(NULL, getPos(evt), getMask(evt)); } } void LLWindowListener::mouseMove(LLSD const & evt) { - LLCoordGL pos(evt["x"].asInteger(), evt["y"].asInteger()); - - // *TODO - figure out how to handle the mask - mWindow->handleMouseMove(NULL, pos, 0); + mWindow->handleMouseMove(NULL, getPos(evt), getMask(evt)); } void LLWindowListener::mouseScroll(LLSD const & evt) diff --git a/indra/llwindow/llwindowlistener.h b/indra/llwindow/llwindowlistener.h index 5b234c5d1d..74e577ff93 100644 --- a/indra/llwindow/llwindowlistener.h +++ b/indra/llwindow/llwindowlistener.h @@ -28,6 +28,7 @@ #define LL_LLWINDOWLISTENER_H #include "lleventapi.h" +#include <boost/function.hpp> class LLKeyboard; class LLWindowCallbacks; @@ -35,7 +36,8 @@ class LLWindowCallbacks; class LLWindowListener : public LLEventAPI { public: - LLWindowListener(LLWindowCallbacks * window, LLKeyboard * keyboard); + typedef boost::function<LLKeyboard*()> KeyboardGetter; + LLWindowListener(LLWindowCallbacks * window, const KeyboardGetter& kbgetter); void keyDown(LLSD const & evt); void keyUp(LLSD const & evt); @@ -46,7 +48,7 @@ public: private: LLWindowCallbacks * mWindow; - LLKeyboard * mKeyboard; + KeyboardGetter mKbGetter; }; -- cgit v1.2.3 From 980f26fff7137138c2f6a87a43d6f47a1a20b31d Mon Sep 17 00:00:00 2001 From: "Andrew A. de Laix" <alain@lindenlab.com> Date: Tue, 22 Mar 2011 10:34:22 -0700 Subject: update freetype archive on darwin (downgrade to 2.3.9) --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 1292a02136..d76ea8a777 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -498,9 +498,9 @@ <key>archive</key> <map> <key>hash</key> - <string>c0eacb6348e032fbc69cfdc4bd215ee4</string> + <string>f93758faf1d06f1427e0ecb846b17d48</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.4.4-darwin-20110307.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-freetype/rev/224777/arch/Darwin/installer/freetype-2.3.9-darwin-20110322.tar.bz2</string> </map> <key>name</key> <string>darwin</string> -- cgit v1.2.3 From f06a9369e57dd1ed9c39f8cb9b03f4756ae206d8 Mon Sep 17 00:00:00 2001 From: Alain Linden <alain@lindenlab.com> Date: Tue, 22 Mar 2011 10:36:53 -0700 Subject: update freetype archive on windows (downgrad to 2.3.9) --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 1292a02136..9d0f189940 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -522,9 +522,9 @@ <key>archive</key> <map> <key>hash</key> - <string>271349827b939406162ce42e42cd18e0</string> + <string>df9a3c0a572b1f18dce32f5a3caba0ea</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.4.4-windows-20110218.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-freetype/rev/224777/arch/CYGWIN/installer/freetype-2.3.9-windows-20110322.tar.bz2</string> </map> <key>name</key> <string>windows</string> -- cgit v1.2.3 From a57729b9260ce5e711bff47c02ca54ab65eade27 Mon Sep 17 00:00:00 2001 From: callum <none@none> Date: Tue, 22 Mar 2011 13:58:27 -0700 Subject: SOCIAL-634 FIX Error condition content for Destination Guide, Avatar Picker, and Help if S3 content or web content is not available --- indra/newview/app_settings/settings.xml | 4 ++-- indra/newview/llfloaterwebcontent.cpp | 6 ------ indra/newview/llmediactrl.cpp | 16 ++++++++++++++++ indra/newview/llmediactrl.h | 5 +++++ indra/newview/llviewerwindow.cpp | 2 ++ 5 files changed, 25 insertions(+), 8 deletions(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 888f9c9d7f..b82c98fd60 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -12597,10 +12597,10 @@ <key>Value</key> <integer>1</integer> </map> - <key>WebContentFloaterErrorURL</key> + <key>GenericErrorPageURL</key> <map> <key>Comment</key> - <string>URL to navigate to if the Web content floater hits a page with a 400-499 HTTP status code</string> + <string>URL to set as a property on LLMediaControl to navigate to if the a page completes with a 400-499 HTTP status code</string> <key>Persist</key> <integer>1</integer> <key>Type</key> diff --git a/indra/newview/llfloaterwebcontent.cpp b/indra/newview/llfloaterwebcontent.cpp index 76fb985b39..058567492b 100644 --- a/indra/newview/llfloaterwebcontent.cpp +++ b/indra/newview/llfloaterwebcontent.cpp @@ -328,12 +328,6 @@ void LLFloaterWebContent::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent const std::string link = self->getHoverLink(); mStatusBarText->setText( link ); } - else if(event == MEDIA_EVENT_NAVIGATE_ERROR_PAGE ) - { - std::string redirect_url = gSavedSettings.getString("WebContentFloaterErrorURL"); - mWebBrowser->navigateTo(redirect_url, "text/html"); - set_current_url(redirect_url); - } } void LLFloaterWebContent::set_current_url(const std::string& url) diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index 376e38ade3..b8c61068c4 100644 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -73,6 +73,7 @@ LLMediaCtrl::Params::Params() texture_height("texture_height", 1024), caret_color("caret_color"), initial_mime_type("initial_mime_type"), + error_page_url("error_page_url"), media_id("media_id"), trusted_content("trusted_content", false), focus_on_click("focus_on_click", true) @@ -102,6 +103,7 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) : mTextureHeight ( 1024 ), mClearCache(false), mHomePageMimeType(p.initial_mime_type), + mErrorPageURL(p.error_page_url), mTrusted(p.trusted_content), mWindowShade(NULL), mHoverTextChanged(false) @@ -610,6 +612,16 @@ void LLMediaCtrl::setTarget(const std::string& target) } } +void LLMediaCtrl::setErrorPageURL(const std::string& url) +{ + mErrorPageURL = url; +} + +const std::string& LLMediaCtrl::getErrorPageURL() +{ + return mErrorPageURL; +} + //////////////////////////////////////////////////////////////////////////////// // bool LLMediaCtrl::setCaretColor(unsigned int red, unsigned int green, unsigned int blue) @@ -963,6 +975,10 @@ void LLMediaCtrl::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) case MEDIA_EVENT_NAVIGATE_ERROR_PAGE: { LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_NAVIGATE_ERROR_PAGE" << LL_ENDL; + if ( mErrorPageURL.length() > 0 ) + { + navigateTo(mErrorPageURL, "text/html"); + }; }; break; diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h index 7a28b0986d..53b98b7ec8 100644 --- a/indra/newview/llmediactrl.h +++ b/indra/newview/llmediactrl.h @@ -63,6 +63,7 @@ public: Optional<std::string> initial_mime_type; Optional<std::string> media_id; + Optional<std::string> error_page_url; Params(); }; @@ -113,6 +114,9 @@ public: void setTarget(const std::string& target); + void setErrorPageURL(const std::string& url); + const std::string& getErrorPageURL(); + // Clear the browser cache when the instance gets loaded void clearCache(); @@ -175,6 +179,7 @@ public: std::string mHomePageUrl; std::string mHomePageMimeType; std::string mCurrentNavUrl; + std::string mErrorPageURL; std::string mTarget; bool mIgnoreUIScale; bool mAlwaysRefresh; diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 6bf363bf68..b71eebc30f 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1791,11 +1791,13 @@ void LLViewerWindow::initWorldUI() LLMediaCtrl* avatar_picker = avatar_picker_destination_guide_container->findChild<LLMediaCtrl>("avatar_picker_contents"); if (destinations) { + destinations->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL")); destinations->navigateTo(gSavedSettings.getString("DestinationGuideURL"), "text/html"); } if (avatar_picker) { + avatar_picker->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL")); avatar_picker->navigateTo(gSavedSettings.getString("AvatarPickerURL"), "text/html"); } -- cgit v1.2.3 From 1d7518166970da011878c1d76d1a5cb12d7435e4 Mon Sep 17 00:00:00 2001 From: callum <none@none> Date: Tue, 22 Mar 2011 15:27:48 -0700 Subject: SOCIAL-775 FIX Latest version of LLQtWebKit for Mac is 4.7.2 - not 4.7.1 as expected --- install.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install.xml b/install.xml index 9d18848076..9658a4195a 100644 --- a/install.xml +++ b/install.xml @@ -981,9 +981,9 @@ anguage Infrstructure (CLI) international standard</string> <key>darwin</key> <map> <key>md5sum</key> - <string>9346c475a37e3f11ea701c6ebd12d736</string> + <string>f07b063cdc207479b111576dc74127f0</string> <key>url</key> - <uri>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/llqtwebkit-darwin-qt4.7.1-20110317.tar.bz2</uri> + <uri>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/llqtwebkit-darwin-qt4.7.1-20110322.tar.bz2</uri> </map> <key>linux</key> <map> -- cgit v1.2.3 From e8a908373d8efebdd957614da2676e07b574fd1b Mon Sep 17 00:00:00 2001 From: Eli Linden <eli@lindenlab.com> Date: Tue, 22 Mar 2011 16:38:44 -0700 Subject: INTL-30 WIP light viewer Set2 translations and new files for FR, PT, DE --- .../skins/minimal/xui/de/floater_media_browser.xml | 30 ++++++++++++++++++++++ .../skins/minimal/xui/de/floater_web_content.xml | 14 ++++++++++ .../minimal/xui/de/menu_inspect_self_gear.xml | 16 +++++------- .../newview/skins/minimal/xui/de/notifications.xml | 19 ++++++++++++++ .../skins/minimal/xui/de/panel_bottomtray.xml | 8 +++--- .../minimal/xui/de/panel_group_control_panel.xml | 11 ++++++++ indra/newview/skins/minimal/xui/de/panel_login.xml | 4 +-- .../skins/minimal/xui/fr/floater_media_browser.xml | 30 ++++++++++++++++++++++ .../skins/minimal/xui/fr/floater_web_content.xml | 14 ++++++++++ .../minimal/xui/fr/menu_inspect_self_gear.xml | 16 +++++------- .../skins/minimal/xui/fr/menu_people_nearby.xml | 2 +- .../newview/skins/minimal/xui/fr/notifications.xml | 19 ++++++++++++++ .../skins/minimal/xui/fr/panel_bottomtray.xml | 8 +++--- .../minimal/xui/fr/panel_group_control_panel.xml | 11 ++++++++ indra/newview/skins/minimal/xui/fr/panel_login.xml | 4 +-- .../skins/minimal/xui/pt/floater_media_browser.xml | 30 ++++++++++++++++++++++ .../skins/minimal/xui/pt/floater_web_content.xml | 14 ++++++++++ .../minimal/xui/pt/menu_inspect_self_gear.xml | 16 +++++------- .../skins/minimal/xui/pt/menu_people_nearby.xml | 6 ++--- .../newview/skins/minimal/xui/pt/notifications.xml | 19 ++++++++++++++ .../skins/minimal/xui/pt/panel_bottomtray.xml | 8 +++--- .../minimal/xui/pt/panel_group_control_panel.xml | 11 ++++++++ indra/newview/skins/minimal/xui/pt/panel_login.xml | 4 +-- 23 files changed, 265 insertions(+), 49 deletions(-) create mode 100644 indra/newview/skins/minimal/xui/de/floater_media_browser.xml create mode 100644 indra/newview/skins/minimal/xui/de/floater_web_content.xml create mode 100644 indra/newview/skins/minimal/xui/de/notifications.xml create mode 100644 indra/newview/skins/minimal/xui/de/panel_group_control_panel.xml create mode 100644 indra/newview/skins/minimal/xui/fr/floater_media_browser.xml create mode 100644 indra/newview/skins/minimal/xui/fr/floater_web_content.xml create mode 100644 indra/newview/skins/minimal/xui/fr/notifications.xml create mode 100644 indra/newview/skins/minimal/xui/fr/panel_group_control_panel.xml create mode 100644 indra/newview/skins/minimal/xui/pt/floater_media_browser.xml create mode 100644 indra/newview/skins/minimal/xui/pt/floater_web_content.xml create mode 100644 indra/newview/skins/minimal/xui/pt/notifications.xml create mode 100644 indra/newview/skins/minimal/xui/pt/panel_group_control_panel.xml diff --git a/indra/newview/skins/minimal/xui/de/floater_media_browser.xml b/indra/newview/skins/minimal/xui/de/floater_media_browser.xml new file mode 100644 index 0000000000..63cf4a6cba --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/floater_media_browser.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_about" title="MEDIEN-BROWSER"> + <floater.string name="home_page_url"> + http://www.secondlife.com + </floater.string> + <floater.string name="support_page_url"> + http://support.secondlife.com + </floater.string> + <layout_stack name="stack1"> + <layout_panel name="nav_controls"> + <button label="Zurück" name="back"/> + <button label="Vorwärts" name="forward"/> + <button label="Neu laden" name="reload"/> + <button label="Los" name="go"/> + </layout_panel> + <layout_panel name="time_controls"> + <button label="zurück" name="rewind"/> + <button label="anhalten" name="stop"/> + <button label="vorwärts" name="seek"/> + </layout_panel> + <layout_panel name="parcel_owner_controls"> + <button label="Aktuelle Seite an Parzelle senden" name="assign"/> + </layout_panel> + <layout_panel name="external_controls"> + <button label="In meinem Browser öffnen" name="open_browser"/> + <check_box label="Immer in meinem Browser öffnen" name="open_always"/> + <button label="Schließen" name="close"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/minimal/xui/de/floater_web_content.xml b/indra/newview/skins/minimal/xui/de/floater_web_content.xml new file mode 100644 index 0000000000..6ab119eeab --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/floater_web_content.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_web_content" title=""> + <layout_stack name="stack1"> + <layout_panel name="nav_controls"> + <button name="back" tool_tip="Rückwärts"/> + <button name="forward" tool_tip="Vorwärts"/> + <button name="stop" tool_tip="Navigation stoppen"/> + <button name="reload" tool_tip="Seite neu laden"/> + <combo_box name="address" tool_tip="URL hier eingeben"/> + <icon name="media_secure_lock_flag" tool_tip="Sicheres Browsen"/> + <button name="popexternal" tool_tip="Aktuelle URL im Desktop-Browser öffnen"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/minimal/xui/de/menu_inspect_self_gear.xml b/indra/newview/skins/minimal/xui/de/menu_inspect_self_gear.xml index 851a96cc09..19264db598 100644 --- a/indra/newview/skins/minimal/xui/de/menu_inspect_self_gear.xml +++ b/indra/newview/skins/minimal/xui/de/menu_inspect_self_gear.xml @@ -1,10 +1,8 @@ -<?xml version="1.0" encoding="utf-8"?> -<menu name="Gear Menu"> - <menu_item_call label="Hinsetzen" name="sit_down_here"/> - <menu_item_call label="Aufstehen" name="stand_up"/> - <menu_item_call label="Outfit ändern" name="change_outfit"/> - <menu_item_call label="Mein Profil" name="my_profile"/> - <menu_item_call label="Meine Freunde" name="my_friends"/> - <menu_item_call label="Meine Gruppen" name="my_groups"/> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Gear Menu"> + <menu_item_call label="Hinsetzen" name="Sit Down Here"/> + <menu_item_call label="Aufstehen" name="Stand Up"/> + <menu_item_call label="Meine Freunde" name="Friends..."/> + <menu_item_call label="Mein Profil" name="Profile..."/> <menu_item_call label="Fehler in Texturen beseitigen" name="Debug..."/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/de/notifications.xml b/indra/newview/skins/minimal/xui/de/notifications.xml new file mode 100644 index 0000000000..1eee1d1c9b --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/notifications.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<notifications> + <notification name="UserGiveItem"> + [NAME_SLURL] bietet Ihnen [ITEM_SLURL] an. Zur Verwendung dieses Artikels müssen Sie in den erweiterten Modus umschalten, wo Sie den Artikel in Ihrem Inventar finden werden. Um in den erweiterten Modus umzuschalten, beenden Sie die Anwendung, starten Sie sie neu und ändern Sie die Moduseinstellung auf dem Anmeldebildschirm. + <form name="form"> + <button name="Show" text="Artikel behalten"/> + <button name="Discard" text="Artikel ablehnen"/> + <button name="Mute" text="Benutzer blockieren"/> + </form> + </notification> + <notification name="ObjectGiveItem"> + Ein Objekt namens <nolink>[OBJECTFROMNAME]</nolink>, das [NAME_SLURL] gehört, bietet Ihnen [ITEM_SLURL] an. Zur Verwendung dieses Artikels müssen Sie in den erweiterten Modus umschalten, wo Sie den Artikel in Ihrem Inventar finden werden. Um in den erweiterten Modus umzuschalten, beenden Sie die Anwendung, starten Sie sie neu und ändern Sie die Moduseinstellung auf dem Anmeldebildschirm. + <form name="form"> + <button name="Keep" text="Artikel behalten"/> + <button name="Discard" text="Artikel ablehnen"/> + <button name="Mute" text="Objekt blockieren"/> + </form> + </notification> +</notifications> diff --git a/indra/newview/skins/minimal/xui/de/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/de/panel_bottomtray.xml index ea7cccbdf8..a4d80921ec 100644 --- a/indra/newview/skins/minimal/xui/de/panel_bottomtray.xml +++ b/indra/newview/skins/minimal/xui/de/panel_bottomtray.xml @@ -11,10 +11,10 @@ <bottomtray_button label="Ansicht" name="camera_btn" tool_tip="Kamerasteuerung anzeigen/ausblenden"/> </layout_panel> <layout_panel name="avatar_and_destinations_panel"> - <radio_group name="avatar_and_destination_btns"> - <radio_item name="destination_btn" value="0"/> - <radio_item name="avatar_btn" value="1"/> - </radio_group> + <bottomtray_button label="Ziele" name="destination_btn" tool_tip="Zeigt Leutefenster an"/> + </layout_panel> + <layout_panel name="avatar_and_destinations_panel"> + <bottomtray_button label="Mein Avatar" name="avatar_btn"/> </layout_panel> <layout_panel name="people_panel"> <bottomtray_button label="Leute" name="show_people_button" tool_tip="Zeigt Leutefenster an"/> diff --git a/indra/newview/skins/minimal/xui/de/panel_group_control_panel.xml b/indra/newview/skins/minimal/xui/de/panel_group_control_panel.xml new file mode 100644 index 0000000000..81e6040f84 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/panel_group_control_panel.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <layout_stack name="vertical_stack"> + <layout_panel name="end_call_btn_panel"> + <button label="Anruf beenden" name="end_call_btn"/> + </layout_panel> + <layout_panel name="voice_ctrls_btn_panel"> + <button label="Voice-Steuerung öffnen" name="voice_ctrls_btn"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/de/panel_login.xml b/indra/newview/skins/minimal/xui/de/panel_login.xml index dff70d6994..2e82453aab 100644 --- a/indra/newview/skins/minimal/xui/de/panel_login.xml +++ b/indra/newview/skins/minimal/xui/de/panel_login.xml @@ -20,8 +20,8 @@ <text name="mode_selection_text"> Modus: </text> - <combo_box name="mode_combo"> - <combo_box.item label="Einfach (Standard)" name="Basic"/> + <combo_box name="mode_combo" tool_tip="Wählen Sie den gewünschten Modus aus. Basis: schnelles, einfaches Erkunden und Chatten. Erweitert: Zugriff auf zusätzliche Funktionen."> + <combo_box.item label="Basis" name="Basic"/> <combo_box.item label="Erweitert" name="Advanced"/> </combo_box> </layout_panel> diff --git a/indra/newview/skins/minimal/xui/fr/floater_media_browser.xml b/indra/newview/skins/minimal/xui/fr/floater_media_browser.xml new file mode 100644 index 0000000000..ba171c6363 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/floater_media_browser.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_about" title="NAVIGATEUR DE MÉDIAS"> + <floater.string name="home_page_url"> + http://www.secondlife.com + </floater.string> + <floater.string name="support_page_url"> + http://support.secondlife.com + </floater.string> + <layout_stack name="stack1"> + <layout_panel name="nav_controls"> + <button label="Préc." name="back"/> + <button label="Suiv." name="forward"/> + <button label="Recharger" name="reload"/> + <button label="OK" name="go"/> + </layout_panel> + <layout_panel name="time_controls"> + <button label="retour" name="rewind"/> + <button label="stop" name="stop"/> + <button label="avance" name="seek"/> + </layout_panel> + <layout_panel name="parcel_owner_controls"> + <button label="Envoyer la page actuelle à la parcelle" name="assign"/> + </layout_panel> + <layout_panel name="external_controls"> + <button label="Ouvrir dans mon navigateur Web" name="open_browser"/> + <check_box label="Toujours ouvrir dans mon navigateur Web" name="open_always"/> + <button label="Fermer" name="close"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/minimal/xui/fr/floater_web_content.xml b/indra/newview/skins/minimal/xui/fr/floater_web_content.xml new file mode 100644 index 0000000000..71f44b6ec3 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/floater_web_content.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_web_content" title=""> + <layout_stack name="stack1"> + <layout_panel name="nav_controls"> + <button name="back" tool_tip="Précédente"/> + <button name="forward" tool_tip="Suivante"/> + <button name="stop" tool_tip="Arrêter"/> + <button name="reload" tool_tip="Recharger la page"/> + <combo_box name="address" tool_tip="Saisir une URL ici"/> + <icon name="media_secure_lock_flag" tool_tip="Navigation sécurisée"/> + <button name="popexternal" tool_tip="Ouvrir l'URL actuelle dans votre navigateur de bureau"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/minimal/xui/fr/menu_inspect_self_gear.xml b/indra/newview/skins/minimal/xui/fr/menu_inspect_self_gear.xml index 3bc164788a..7a79c00123 100644 --- a/indra/newview/skins/minimal/xui/fr/menu_inspect_self_gear.xml +++ b/indra/newview/skins/minimal/xui/fr/menu_inspect_self_gear.xml @@ -1,10 +1,8 @@ -<?xml version="1.0" encoding="utf-8"?> -<menu name="Gear Menu"> - <menu_item_call label="M'asseoir" name="sit_down_here"/> - <menu_item_call label="Me lever" name="stand_up"/> - <menu_item_call label="Changer de tenue" name="change_outfit"/> - <menu_item_call label="Mon profil" name="my_profile"/> - <menu_item_call label="Mes amis" name="my_friends"/> - <menu_item_call label="Mes groupes" name="my_groups"/> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Gear Menu"> + <menu_item_call label="M'asseoir" name="Sit Down Here"/> + <menu_item_call label="Me lever" name="Stand Up"/> + <menu_item_call label="Mes amis" name="Friends..."/> + <menu_item_call label="Mon profil" name="Profile..."/> <menu_item_call label="Déboguer les textures" name="Debug..."/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_people_nearby.xml b/indra/newview/skins/minimal/xui/fr/menu_people_nearby.xml index 26bd3978a9..f153ed15ae 100644 --- a/indra/newview/skins/minimal/xui/fr/menu_people_nearby.xml +++ b/indra/newview/skins/minimal/xui/fr/menu_people_nearby.xml @@ -9,5 +9,5 @@ <menu_item_call label="Partager" name="Share"/> <menu_item_call label="Payer" name="Pay"/> <menu_item_check label="Ignorer/Ne plus ignorer" name="Block/Unblock"/> - <menu_item_call label="Proposer une téléportation" name="teleport"/> + <menu_item_call label="Téléporter" name="teleport"/> </context_menu> diff --git a/indra/newview/skins/minimal/xui/fr/notifications.xml b/indra/newview/skins/minimal/xui/fr/notifications.xml new file mode 100644 index 0000000000..41dd42c39f --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/notifications.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<notifications> + <notification name="UserGiveItem"> + [NAME_SLURL] vous offre [ITEM_SLURL]. Pour utiliser cet article, vous devez passer en mode Avancé. L'article se trouve dans votre inventaire. Pour changer de mode, quittez l'application, redémarrez-la, puis sélectionnez un autre mode sur l'écran de connexion. + <form name="form"> + <button name="Show" text="Garder l'article"/> + <button name="Discard" text="Refuser l'article"/> + <button name="Mute" text="Ignorer l'utilisateur"/> + </form> + </notification> + <notification name="ObjectGiveItem"> + Un objet nommé <nolink>[OBJECTFROMNAME]</nolink> appartenant à [NAME_SLURL] vous offre [ITEM_SLURL]. Pour utiliser cet article, vous devez passer en mode Avancé. L'article se trouve dans votre inventaire. Pour changer de mode, quittez l'application, redémarrez-la, puis sélectionnez un autre mode sur l'écran de connexion. + <form name="form"> + <button name="Keep" text="Garder l'article"/> + <button name="Discard" text="Refuser l'article"/> + <button name="Mute" text="Ignorer l'objet"/> + </form> + </notification> +</notifications> diff --git a/indra/newview/skins/minimal/xui/fr/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/fr/panel_bottomtray.xml index 3a01571f54..ef62901e99 100644 --- a/indra/newview/skins/minimal/xui/fr/panel_bottomtray.xml +++ b/indra/newview/skins/minimal/xui/fr/panel_bottomtray.xml @@ -11,10 +11,10 @@ <bottomtray_button label="Affichage" name="camera_btn" tool_tip="Affiche/Masque le contrôle de la caméra"/> </layout_panel> <layout_panel name="avatar_and_destinations_panel"> - <radio_group name="avatar_and_destination_btns"> - <radio_item name="destination_btn" value="0"/> - <radio_item name="avatar_btn" value="1"/> - </radio_group> + <bottomtray_button label="Destinations" name="destination_btn" tool_tip="Afficher la fenêtre des personnes."/> + </layout_panel> + <layout_panel name="avatar_and_destinations_panel"> + <bottomtray_button label="Mon avatar" name="avatar_btn"/> </layout_panel> <layout_panel name="people_panel"> <bottomtray_button label="Personnes" name="show_people_button" tool_tip="Afficher la fenêtre des personnes."/> diff --git a/indra/newview/skins/minimal/xui/fr/panel_group_control_panel.xml b/indra/newview/skins/minimal/xui/fr/panel_group_control_panel.xml new file mode 100644 index 0000000000..676fa1d222 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/panel_group_control_panel.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <layout_stack name="vertical_stack"> + <layout_panel name="end_call_btn_panel"> + <button label="Quitter l'appel" name="end_call_btn"/> + </layout_panel> + <layout_panel name="voice_ctrls_btn_panel"> + <button label="Ouvrir contrôles vocaux" name="voice_ctrls_btn"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/fr/panel_login.xml b/indra/newview/skins/minimal/xui/fr/panel_login.xml index cb4822e96b..0869778a54 100644 --- a/indra/newview/skins/minimal/xui/fr/panel_login.xml +++ b/indra/newview/skins/minimal/xui/fr/panel_login.xml @@ -20,8 +20,8 @@ <text name="mode_selection_text"> Mode : </text> - <combo_box name="mode_combo"> - <combo_box.item label="Basique (par défaut)" name="Basic"/> + <combo_box name="mode_combo" tool_tip="Sélectionnez un mode. Pour une exploration facile et rapide avec chat, choisissez Basique. Pour accéder à plus de fonctionnalités, choisissez Avancé."> + <combo_box.item label="Basique" name="Basic"/> <combo_box.item label="Avancé" name="Advanced"/> </combo_box> </layout_panel> diff --git a/indra/newview/skins/minimal/xui/pt/floater_media_browser.xml b/indra/newview/skins/minimal/xui/pt/floater_media_browser.xml new file mode 100644 index 0000000000..da7428007e --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/floater_media_browser.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_about" title="NAVEGADOR DE MÍDIA"> + <floater.string name="home_page_url"> + http://www.secondlife.com + </floater.string> + <floater.string name="support_page_url"> + http://support.secondlife.com + </floater.string> + <layout_stack name="stack1"> + <layout_panel name="nav_controls"> + <button label="Atrás" name="back"/> + <button label="Frente" name="forward"/> + <button label="Recarregar" name="reload"/> + <button label="OK" name="go"/> + </layout_panel> + <layout_panel name="time_controls"> + <button label="p/ trás" name="rewind"/> + <button label="parar" name="stop"/> + <button label="p/ frente" name="seek"/> + </layout_panel> + <layout_panel name="parcel_owner_controls"> + <button label="Enviar esta página para lote" name="assign"/> + </layout_panel> + <layout_panel name="external_controls"> + <button label="Abrir no meu navegador" name="open_browser"/> + <check_box label="Abrir sempre no meu navegador" name="open_always"/> + <button label="Fechar" name="close"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/minimal/xui/pt/floater_web_content.xml b/indra/newview/skins/minimal/xui/pt/floater_web_content.xml new file mode 100644 index 0000000000..5101579c6f --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/floater_web_content.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_web_content" title=""> + <layout_stack name="stack1"> + <layout_panel name="nav_controls"> + <button name="back" tool_tip="Navegar para trás"/> + <button name="forward" tool_tip="Navegar para frente"/> + <button name="stop" tool_tip="Parar a navegação"/> + <button name="reload" tool_tip="Recarregar página"/> + <combo_box name="address" tool_tip="Digite a URL aqui"/> + <icon name="media_secure_lock_flag" tool_tip="Navegação segura"/> + <button name="popexternal" tool_tip="Abrir a URL atual no navegador do seu computador"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/minimal/xui/pt/menu_inspect_self_gear.xml b/indra/newview/skins/minimal/xui/pt/menu_inspect_self_gear.xml index 7e67f4cfd4..e514d2f4f5 100644 --- a/indra/newview/skins/minimal/xui/pt/menu_inspect_self_gear.xml +++ b/indra/newview/skins/minimal/xui/pt/menu_inspect_self_gear.xml @@ -1,10 +1,8 @@ -<?xml version="1.0" encoding="utf-8"?> -<menu name="Gear Menu"> - <menu_item_call label="Sentar" name="sit_down_here"/> - <menu_item_call label="Ficar de pé" name="stand_up"/> - <menu_item_call label="Trocar de look" name="change_outfit"/> - <menu_item_call label="Meu perfil" name="my_profile"/> - <menu_item_call label="Meus amigos" name="my_friends"/> - <menu_item_call label="Meus grupos" name="my_groups"/> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Gear Menu"> + <menu_item_call label="Sentar" name="Sit Down Here"/> + <menu_item_call label="Ficar de pé" name="Stand Up"/> + <menu_item_call label="Meus amigos" name="Friends..."/> + <menu_item_call label="Meu perfil" name="Profile..."/> <menu_item_call label="Depurar texturas" name="Debug..."/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_people_nearby.xml b/indra/newview/skins/minimal/xui/pt/menu_people_nearby.xml index 7c720f262b..b446a2fe81 100644 --- a/indra/newview/skins/minimal/xui/pt/menu_people_nearby.xml +++ b/indra/newview/skins/minimal/xui/pt/menu_people_nearby.xml @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Avatar Context Menu"> <menu_item_call label="Ver perfil" name="View Profile"/> - <menu_item_call label="Adicionar amigo..." name="Add Friend"/> - <menu_item_call label="Remover amigo..." name="Remove Friend"/> - <menu_item_call label="MI" name="IM"/> + <menu_item_call label="Adicionar amigo" name="Add Friend"/> + <menu_item_call label="Remover amigo" name="Remove Friend"/> + <menu_item_call label="IM" name="IM"/> <menu_item_call label="Ligar" name="Call"/> <menu_item_call label="Mapa" name="Map"/> <menu_item_call label="Compartilhar" name="Share"/> diff --git a/indra/newview/skins/minimal/xui/pt/notifications.xml b/indra/newview/skins/minimal/xui/pt/notifications.xml new file mode 100644 index 0000000000..30ba6f68bf --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/notifications.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<notifications> + <notification name="UserGiveItem"> + [NAME_SLURL] quer lhe dar [ITEM_SLURL]. Esta ação requer o modo Avançado. Passe para o modo avançado e você verá o item em seu inventário. Para passar para o modo avançado, feche e reinicialize esse aplicativo e mude o modo (indicado na tela de login). + <form name="form"> + <button name="Show" text="Guardar item"/> + <button name="Discard" text="Recusar item"/> + <button name="Mute" text="Bloquear usuário"/> + </form> + </notification> + <notification name="ObjectGiveItem"> + Um objeto chamado <nolink>[OBJECTFROMNAME]</nolink>, de [NAME_SLURL], está lhe oferecendo [ITEM_SLURL]. Esta ação requer o modo Avançado. Passe para o modo Avançado e você verá o item em seu Inventário. Para passar para o modo Avançado, feche e reinicialize esse aplicativo e mude o modo (indicado na tela de login). + <form name="form"> + <button name="Keep" text="Guardar item"/> + <button name="Discard" text="Recusar item"/> + <button name="Mute" text="Bloquear objeto"/> + </form> + </notification> +</notifications> diff --git a/indra/newview/skins/minimal/xui/pt/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/pt/panel_bottomtray.xml index 243f323f09..f67823dbd8 100644 --- a/indra/newview/skins/minimal/xui/pt/panel_bottomtray.xml +++ b/indra/newview/skins/minimal/xui/pt/panel_bottomtray.xml @@ -11,10 +11,10 @@ <bottomtray_button label="Exibir" name="camera_btn" tool_tip="Mostra/oculta os controles da câmera"/> </layout_panel> <layout_panel name="avatar_and_destinations_panel"> - <radio_group name="avatar_and_destination_btns"> - <radio_item name="destination_btn" value="0"/> - <radio_item name="avatar_btn" value="1"/> - </radio_group> + <bottomtray_button label="Destinos" name="destination_btn" tool_tip="Exibe janela de pessoas"/> + </layout_panel> + <layout_panel name="avatar_and_destinations_panel"> + <bottomtray_button label="Meu avatar" name="avatar_btn"/> </layout_panel> <layout_panel name="people_panel"> <bottomtray_button label="Pessoas" name="show_people_button" tool_tip="Exibe as pessoas"/> diff --git a/indra/newview/skins/minimal/xui/pt/panel_group_control_panel.xml b/indra/newview/skins/minimal/xui/pt/panel_group_control_panel.xml new file mode 100644 index 0000000000..177cee28a6 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/panel_group_control_panel.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <layout_stack name="vertical_stack"> + <layout_panel name="end_call_btn_panel"> + <button label="Desligar" name="end_call_btn"/> + </layout_panel> + <layout_panel name="voice_ctrls_btn_panel"> + <button label="Abrir controles de voz" name="voice_ctrls_btn"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/pt/panel_login.xml b/indra/newview/skins/minimal/xui/pt/panel_login.xml index cd529b0b06..de9717874f 100644 --- a/indra/newview/skins/minimal/xui/pt/panel_login.xml +++ b/indra/newview/skins/minimal/xui/pt/panel_login.xml @@ -20,8 +20,8 @@ <text name="mode_selection_text"> Modo: </text> - <combo_box name="mode_combo"> - <combo_box.item label="Básico (padrão)" name="Basic"/> + <combo_box name="mode_combo" tool_tip="Selecione o modo. O modo Básico é mais rápido e ideal para explorar e conversar. Use o modo Avançado para acessar mais recursos."> + <combo_box.item label="Básico" name="Basic"/> <combo_box.item label="Avançado" name="Advanced"/> </combo_box> </layout_panel> -- cgit v1.2.3 From 698565535a9a0652c6c21e5ac88124013a16324a Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Tue, 22 Mar 2011 16:56:11 -0700 Subject: avatar picker, destination guide, and how to urls now point to agni versions --- indra/newview/app_settings/settings.xml | 2 +- indra/newview/app_settings/settings_minimal.xml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 888f9c9d7f..4e701d89e8 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -12606,7 +12606,7 @@ <key>Type</key> <string>String</string> <key>Value</key> - <string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/damballah/404.html</string> + <string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/agni/404.html</string> </map> </map> </llsd> diff --git a/indra/newview/app_settings/settings_minimal.xml b/indra/newview/app_settings/settings_minimal.xml index 03656f2a53..490da2c9d4 100644 --- a/indra/newview/app_settings/settings_minimal.xml +++ b/indra/newview/app_settings/settings_minimal.xml @@ -61,7 +61,7 @@ <key>Type</key> <string>String</string> <key>Value</key> - <string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/damballah/howto/index.html?topic=[TOPIC]</string> + <string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/agni/howto/index.html?topic=[TOPIC]</string> </map> <key>PreferredMaturity</key> <map> @@ -345,7 +345,7 @@ <key>Type</key> <string>String</string> <key>Value</key> - <string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/damballah/guide.html</string> + <string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/agni/guide.html</string> </map> <key>AvatarPickerURL</key> <map> @@ -356,7 +356,7 @@ <key>Type</key> <string>String</string> <key>Value</key> - <string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/damballah/avatars.html</string> + <string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/agni/avatars.html</string> </map> <key>LogInventoryDecline</key> <map> -- cgit v1.2.3 From ccdc8898dc1f135252c27cb55c4626b076d37da9 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Tue, 22 Mar 2011 16:57:21 -0700 Subject: SOCIAL-778 FIX Make how to web content wider --- indra/newview/skins/minimal/xui/en/floater_help_browser.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/indra/newview/skins/minimal/xui/en/floater_help_browser.xml b/indra/newview/skins/minimal/xui/en/floater_help_browser.xml index eddfe41c25..cc551f7d58 100644 --- a/indra/newview/skins/minimal/xui/en/floater_help_browser.xml +++ b/indra/newview/skins/minimal/xui/en/floater_help_browser.xml @@ -8,12 +8,12 @@ min_height="360" left="645" top="10" - min_width="300" + min_width="345" name="floater_help_browser" save_rect="true" single_instance="true" title="HOW TO" - width="300"> + width="335"> <floater.string name="loading_text"> Loading... @@ -29,14 +29,14 @@ orientation="vertical" name="stack1" top="20" - width="290"> + width="325"> <layout_panel layout="topleft" left_delta="0" top_delta="0" name="external_controls" user_resize="false" - width="280"> + width="325"> <web_browser trusted_content="true" bottom="-5" @@ -46,7 +46,7 @@ name="browser" top="0" height="300" - width="280" /> + width="325" /> </layout_panel> </layout_stack> </floater> -- cgit v1.2.3 From 616b0a25686b0ffbc5a995a26f27d5f46efc7024 Mon Sep 17 00:00:00 2001 From: "alain@945battery-guestA-183.lindenlab.com" <alain@945battery-guestA-183.lindenlab.com> Date: Wed, 23 Mar 2011 10:44:39 -0700 Subject: Updated linux llqtwekit archive and fixed media webkit build and loading (fix CHOP-545). --- autobuild.xml | 4 ++-- indra/cmake/WebKitLibPlugin.cmake | 2 +- indra/media_plugins/webkit/media_plugin_webkit.cpp | 4 +++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 425a5d37c3..c6c087a6c3 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1074,9 +1074,9 @@ <key>archive</key> <map> <key>hash</key> - <string>f53e2a255d4c4039203de3e4640a2d41</string> + <string>ed7d6cb66e6fcd6dbac41aabe6a0d0c8</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-4.7.1-linux-20110314.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llqtwebkit/rev/224858/arch/Linux/installer/llqtwebkit-4.7.1-linux-20110323.tar.bz2</string> </map> <key>name</key> <string>linux</string> diff --git a/indra/cmake/WebKitLibPlugin.cmake b/indra/cmake/WebKitLibPlugin.cmake index 8fb717cdb8..6e8f6cec7f 100644 --- a/indra/cmake/WebKitLibPlugin.cmake +++ b/indra/cmake/WebKitLibPlugin.cmake @@ -67,7 +67,7 @@ elseif (LINUX) QtNetwork QtGui QtCore - + jscore jpeg fontconfig X11 diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp index d6f8ae3e16..e24ee6629e 100644 --- a/indra/media_plugins/webkit/media_plugin_webkit.cpp +++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp @@ -1231,7 +1231,9 @@ void MediaPluginWebKit::receiveMessage(const char *message_string) std::string url = message_in.getValue("url"); if ( 404 == code ) // browser lib only supports 404 right now { - LLQtWebKit::getInstance()->set404RedirectUrl( mBrowserWindowId, url ); +#if LLQTWEBKIT_API_VERSION < 8 + LLQtWebKit::getInstance()->set404RedirectUrl( mBrowserWindowId, url ); +#endif }; } else if(message_name == "set_user_agent") -- cgit v1.2.3 From 0a85143d42fff7748495e1dbfef696b6f8053e8a Mon Sep 17 00:00:00 2001 From: callum <none@none> Date: Wed, 23 Mar 2011 11:00:25 -0700 Subject: SOCIAL-634 FIX2 Error condition content for Destination Guide, Avatar Picker, and Help if S3 content or web content is not available. (Added same fix for Help/How To floater) --- indra/newview/llfloaterhelpbrowser.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/indra/newview/llfloaterhelpbrowser.cpp b/indra/newview/llfloaterhelpbrowser.cpp index a650886d89..627defd006 100644 --- a/indra/newview/llfloaterhelpbrowser.cpp +++ b/indra/newview/llfloaterhelpbrowser.cpp @@ -50,6 +50,7 @@ BOOL LLFloaterHelpBrowser::postBuild() { mBrowser = getChild<LLMediaCtrl>("browser"); mBrowser->addObserver(this); + mBrowser->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL")); childSetAction("open_browser", onClickOpenWebBrowser, this); -- cgit v1.2.3 From 501e282ee03e6d53c16c421d8b49f8bed3e74ef3 Mon Sep 17 00:00:00 2001 From: Eli Linden <eli@lindenlab.com> Date: Wed, 23 Mar 2011 11:37:45 -0700 Subject: INTL-30 WIP light viewer Set2 translations and new files for ES --- .../skins/minimal/xui/es/floater_media_browser.xml | 30 ++++++++++++++++++++++ .../skins/minimal/xui/es/floater_web_content.xml | 14 ++++++++++ .../minimal/xui/es/menu_inspect_self_gear.xml | 18 ++++++------- .../newview/skins/minimal/xui/es/notifications.xml | 19 ++++++++++++++ .../skins/minimal/xui/es/panel_bottomtray.xml | 8 +++--- .../minimal/xui/es/panel_group_control_panel.xml | 11 ++++++++ indra/newview/skins/minimal/xui/es/panel_login.xml | 4 +-- 7 files changed, 88 insertions(+), 16 deletions(-) create mode 100644 indra/newview/skins/minimal/xui/es/floater_media_browser.xml create mode 100644 indra/newview/skins/minimal/xui/es/floater_web_content.xml create mode 100644 indra/newview/skins/minimal/xui/es/notifications.xml create mode 100644 indra/newview/skins/minimal/xui/es/panel_group_control_panel.xml diff --git a/indra/newview/skins/minimal/xui/es/floater_media_browser.xml b/indra/newview/skins/minimal/xui/es/floater_media_browser.xml new file mode 100644 index 0000000000..a7086c2d6d --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/floater_media_browser.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_about" title="EXPLORADOR DE MEDIA"> + <floater.string name="home_page_url"> + http://www.secondlife.com + </floater.string> + <floater.string name="support_page_url"> + http://support.secondlife.com + </floater.string> + <layout_stack name="stack1"> + <layout_panel name="nav_controls"> + <button label="Atrás" name="back"/> + <button label="Adelante" name="forward"/> + <button label="Recargar" name="reload"/> + <button label="Ir" name="go"/> + </layout_panel> + <layout_panel name="time_controls"> + <button label="rebobinar" name="rewind"/> + <button label="parar" name="stop"/> + <button label="avanzar" name="seek"/> + </layout_panel> + <layout_panel name="parcel_owner_controls"> + <button label="Enviar a la parcela la página actual" name="assign"/> + </layout_panel> + <layout_panel name="external_controls"> + <button label="Abrir en mi propio navegador" name="open_browser"/> + <check_box label="Abrir siempre en mi propio navegador" name="open_always"/> + <button label="Cerrar" name="close"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/minimal/xui/es/floater_web_content.xml b/indra/newview/skins/minimal/xui/es/floater_web_content.xml new file mode 100644 index 0000000000..b012809679 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/floater_web_content.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_web_content" title=""> + <layout_stack name="stack1"> + <layout_panel name="nav_controls"> + <button name="back" tool_tip="Navegar hacia atrás"/> + <button name="forward" tool_tip="Navegar hacia adelante"/> + <button name="stop" tool_tip="Parar navegación"/> + <button name="reload" tool_tip="Recargar página"/> + <combo_box name="address" tool_tip="Escribe la URL aquí"/> + <icon name="media_secure_lock_flag" tool_tip="Navegación segura"/> + <button name="popexternal" tool_tip="Abrir la URL actual en tu explorador de escritorio"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/minimal/xui/es/menu_inspect_self_gear.xml b/indra/newview/skins/minimal/xui/es/menu_inspect_self_gear.xml index c8a1e9d9da..6b76137114 100644 --- a/indra/newview/skins/minimal/xui/es/menu_inspect_self_gear.xml +++ b/indra/newview/skins/minimal/xui/es/menu_inspect_self_gear.xml @@ -1,10 +1,8 @@ -<?xml version="1.0" encoding="utf-8"?> -<menu name="Gear Menu"> - <menu_item_call label="Sentarte" name="sit_down_here"/> - <menu_item_call label="Levantarme" name="stand_up"/> - <menu_item_call label="Cambiar vestuario" name="change_outfit"/> - <menu_item_call label="Mi perfil" name="my_profile"/> - <menu_item_call label="Mis amigos" name="my_friends"/> - <menu_item_call label="Mis grupos" name="my_groups"/> - <menu_item_call label="Depurar las texturas" name="Debug..."/> -</menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Gear Menu"> + <menu_item_call label="Sentarme" name="Sit Down Here"/> + <menu_item_call label="Levantarme" name="Stand Up"/> + <menu_item_call label="Mis amigos" name="Friends..."/> + <menu_item_call label="Mi perfil" name="Profile..."/> + <menu_item_call label="Depurar texturas" name="Debug..."/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/es/notifications.xml b/indra/newview/skins/minimal/xui/es/notifications.xml new file mode 100644 index 0000000000..b08ebb5f76 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/notifications.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<notifications> + <notification name="UserGiveItem"> + [NAME_SLURL] te ofrece un/a [ITEM_SLURL]. Para utilizar este ítem, cambia al modo Avanzado y búscalo en el inventario. Para cambiar al modo Avanzado, sal de la aplicación, reiníciala y cambia el ajuste de modo en la pantalla de inicio de sesión. + <form name="form"> + <button name="Show" text="Conservar ítem"/> + <button name="Discard" text="Rechazar ítem"/> + <button name="Mute" text="Bloquear usuario"/> + </form> + </notification> + <notification name="ObjectGiveItem"> + Un objeto de nombre <nolink>[OBJECTFROMNAME]</nolink>, propiedad de [NAME_SLURL], te ofrece un/a [ITEM_SLURL]. Para utilizar este ítem, cambia al modo Avanzado y búscalo en el inventario. Para cambiar al modo Avanzado, sal de la aplicación, reiníciala y cambia el ajuste de modo en la pantalla de inicio de sesión. + <form name="form"> + <button name="Keep" text="Conservar ítem"/> + <button name="Discard" text="Rechazar ítem"/> + <button name="Mute" text="Bloquear objeto"/> + </form> + </notification> +</notifications> diff --git a/indra/newview/skins/minimal/xui/es/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/es/panel_bottomtray.xml index 9ab30b5613..f782d66ae7 100644 --- a/indra/newview/skins/minimal/xui/es/panel_bottomtray.xml +++ b/indra/newview/skins/minimal/xui/es/panel_bottomtray.xml @@ -11,10 +11,10 @@ <bottomtray_button label="Visión" name="camera_btn" tool_tip="Muestra/Oculta los controles de la cámara"/> </layout_panel> <layout_panel name="avatar_and_destinations_panel"> - <radio_group name="avatar_and_destination_btns"> - <radio_item name="destination_btn" value="0"/> - <radio_item name="avatar_btn" value="1"/> - </radio_group> + <bottomtray_button label="Destinos" name="destination_btn" tool_tip="Muestra la ventana de gente"/> + </layout_panel> + <layout_panel name="avatar_and_destinations_panel"> + <bottomtray_button label="Mi avatar" name="avatar_btn"/> </layout_panel> <layout_panel name="people_panel"> <bottomtray_button label="Gente" name="show_people_button" tool_tip="Muestra la ventana de gente"/> diff --git a/indra/newview/skins/minimal/xui/es/panel_group_control_panel.xml b/indra/newview/skins/minimal/xui/es/panel_group_control_panel.xml new file mode 100644 index 0000000000..e77156b0d4 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/panel_group_control_panel.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <layout_stack name="vertical_stack"> + <layout_panel name="end_call_btn_panel"> + <button label="Colgar" name="end_call_btn"/> + </layout_panel> + <layout_panel name="voice_ctrls_btn_panel"> + <button label="Abrir los controles de la voz" name="voice_ctrls_btn"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/es/panel_login.xml b/indra/newview/skins/minimal/xui/es/panel_login.xml index 161ea19b0e..689a71e277 100644 --- a/indra/newview/skins/minimal/xui/es/panel_login.xml +++ b/indra/newview/skins/minimal/xui/es/panel_login.xml @@ -20,8 +20,8 @@ <text name="mode_selection_text"> Modo: </text> - <combo_box name="mode_combo"> - <combo_box.item label="Básico (Predeterminado)" name="Basic"/> + <combo_box name="mode_combo" tool_tip="Selecciona el modo. Elige Básico para una exploración rápida y fácil y para chatear. Elige Avanzado para tener acceso a más funciones."> + <combo_box.item label="Básico" name="Basic"/> <combo_box.item label="Avanzado" name="Advanced"/> </combo_box> </layout_panel> -- cgit v1.2.3 From 67561663da789454c658b5d466e9518790ed9289 Mon Sep 17 00:00:00 2001 From: Jonathan Yap <none@none> Date: Wed, 23 Mar 2011 14:55:28 -0400 Subject: STORM-1101 Using the -login parameter makes some keys and right click menus not work --- doc/contributions.txt | 3 +++ indra/newview/llstartup.cpp | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/doc/contributions.txt b/doc/contributions.txt index 560bedd518..35882d1fb2 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -156,6 +156,8 @@ Angus Boyd VWR-592 Ann Congrejo CT-193 +Ansariel Hiller + STORM-1101 Ardy Lay VWR-19499 VWR-24917 @@ -413,6 +415,7 @@ Jonathan Yap STORM-990 STORM-1020 STORM-1064 + STORM-1101 Kage Pixel VWR-11 Ken March diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 8fccb35886..417bac7df0 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -722,6 +722,8 @@ bool idle_startup() timeout_count = 0; + initialize_edit_menu(); + if (show_connect_box) { // Load all the name information out of the login view @@ -738,8 +740,6 @@ bool idle_startup() // Make sure the process dialog doesn't hide things gViewerWindow->setShowProgress(FALSE); - initialize_edit_menu(); - // Show the login dialog login_show(); // connect dialog is already shown, so fill in the names -- cgit v1.2.3 From d3b192c26f2068383b22f15496500c1f961a72e8 Mon Sep 17 00:00:00 2001 From: Merov Linden <merov@lindenlab.com> Date: Wed, 23 Mar 2011 13:39:31 -0700 Subject: STORM-1090 : Fix for use of freetype 2.4.4 and switch to freetype 2.4.4 in installables --- autobuild.xml | 8 ++++---- indra/llrender/llfontfreetype.cpp | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 425a5d37c3..1292a02136 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -498,9 +498,9 @@ <key>archive</key> <map> <key>hash</key> - <string>f93758faf1d06f1427e0ecb846b17d48</string> + <string>c0eacb6348e032fbc69cfdc4bd215ee4</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-freetype/rev/224777/arch/Darwin/installer/freetype-2.3.9-darwin-20110322.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.4.4-darwin-20110307.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -522,9 +522,9 @@ <key>archive</key> <map> <key>hash</key> - <string>df9a3c0a572b1f18dce32f5a3caba0ea</string> + <string>271349827b939406162ce42e42cd18e0</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-freetype/rev/224777/arch/CYGWIN/installer/freetype-2.3.9-windows-20110322.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.4.4-windows-20110218.tar.bz2</string> </map> <key>name</key> <string>windows</string> diff --git a/indra/llrender/llfontfreetype.cpp b/indra/llrender/llfontfreetype.cpp index b84e696e2d..91c8a37022 100644 --- a/indra/llrender/llfontfreetype.cpp +++ b/indra/llrender/llfontfreetype.cpp @@ -482,7 +482,7 @@ void LLFontFreetype::renderGlyph(U32 glyph_index) const if (mFTFace == NULL) return; - int error = FT_Load_Glyph(mFTFace, glyph_index, FT_LOAD_DEFAULT ); + int error = FT_Load_Glyph(mFTFace, glyph_index, FT_LOAD_FORCE_AUTOHINT ); llassert(!error); error = FT_Render_Glyph(mFTFace->glyph, gFontRenderMode); -- cgit v1.2.3 From 63876746dd80321db569e162347d4dda56004bc4 Mon Sep 17 00:00:00 2001 From: "alain@945battery-guestA-183.lindenlab.com" <alain@945battery-guestA-183.lindenlab.com> Date: Wed, 23 Mar 2011 15:27:03 -0700 Subject: update jpeglib archive on linux (now uses correct lib layout fixing erroneous linkage to system jpeg lib). --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index c6c087a6c3..543c4e6d1e 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -834,9 +834,9 @@ <key>archive</key> <map> <key>hash</key> - <string>fa1073ef1181f27e6bc01d571366070b</string> + <string>dcca1db348831cdb7c6b26dc4076c597</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-8c-linux-20110307.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-jpeglib/rev/224895/arch/Linux/installer/jpeglib-8c-linux-20110323.tar.bz2</string> </map> <key>name</key> <string>linux</string> -- cgit v1.2.3 From 9c82ea334ab0c1283f28997fe060b24200e3e2be Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Wed, 23 Mar 2011 17:02:23 -0700 Subject: SOCIAL-714 FIX [PUBLIC] Basic mode to launch with Destinations panel open by default --- indra/newview/app_settings/settings.xml | 11 +++++++++++ indra/newview/app_settings/settings_minimal.xml | 11 +++++++++++ indra/newview/llviewermenu.cpp | 14 ++++++-------- indra/newview/llviewerwindow.cpp | 7 ++----- 4 files changed, 30 insertions(+), 13 deletions(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index c79cf99eb4..d042a247c4 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -12608,5 +12608,16 @@ <key>Value</key> <string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/agni/404.html</string> </map> + <key>DestinationsAndAvatarsVisibility</key> + <map> + <key>Comment</key> + <string>Whether destination panel or avatar picker are open (0=destination guide, 1=avatar picker, default=nothing)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>-1</integer> + </map> </map> </llsd> diff --git a/indra/newview/app_settings/settings_minimal.xml b/indra/newview/app_settings/settings_minimal.xml index 490da2c9d4..8886976f3f 100644 --- a/indra/newview/app_settings/settings_minimal.xml +++ b/indra/newview/app_settings/settings_minimal.xml @@ -402,5 +402,16 @@ <key>Value</key> <integer>0</integer> </map> + <key>DestinationsAndAvatarsVisibility</key> + <map> + <key>Comment</key> + <string>Whether destination panel or avatar picker are open (0=destination guide, 1=avatar picker, default=nothing)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>0</integer> + </map> </map> </llsd> diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 33fff82738..b05b2e0a67 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -863,7 +863,6 @@ void toggle_destination_and_avatar_picker(const LLSD& show) LLFirstUse::notUsingDestinationGuide(false); avatar_btn->setToggleState(false); destination_btn->setToggleState(true); - return; } break; case 1: @@ -874,18 +873,17 @@ void toggle_destination_and_avatar_picker(const LLSD& show) avatar_picker->setVisible(true); avatar_btn->setToggleState(true); destination_btn->setToggleState(false); - return; } break; default: + container->setVisible(false); + destinations->setVisible(false); + avatar_picker->setVisible(false); + avatar_btn->setToggleState(false); + destination_btn->setToggleState(false); break; } - - container->setVisible(false); - destinations->setVisible(false); - avatar_picker->setVisible(false); - avatar_btn->setToggleState(false); - destination_btn->setToggleState(false); + gSavedSettings.setS32("DestinationsAndAvatarsVisibility", panel_idx); }; diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index b71eebc30f..faf4e8b3fc 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1801,11 +1801,8 @@ void LLViewerWindow::initWorldUI() avatar_picker->navigateTo(gSavedSettings.getString("AvatarPickerURL"), "text/html"); } - if (gSavedSettings.getBOOL("FirstLoginThisInstall")) - { - toggle_destination_and_avatar_picker(0); - gSavedSettings.setBOOL("FirstLoginThisInstall", FALSE); - } + // show destinations by default + toggle_destination_and_avatar_picker(gSavedSettings.getS32("DestinationsAndAvatarsVisibility")); } // Destroy the UI -- cgit v1.2.3 From be545aa51b67a9ab9d33c0c9b9b50486ed679bb8 Mon Sep 17 00:00:00 2001 From: Merov Linden <merov@lindenlab.com> Date: Wed, 23 Mar 2011 20:40:35 -0700 Subject: STORM-1090 : add attribution for the fix to Nicky --- doc/contributions.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/contributions.txt b/doc/contributions.txt index 998fed9cfb..212d6fdc57 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -579,6 +579,7 @@ Nicholaz Beresford Nicky Perian OPEN-1 OPEN-1087 + STORM-1090 Nounouch Hapmouche VWR-238 Patric Mills -- cgit v1.2.3 From 64e8bd3a99adcc6a0381705a9da44fc5299903f2 Mon Sep 17 00:00:00 2001 From: LanceCorrimal <none@none> Date: Thu, 24 Mar 2011 10:20:35 +0100 Subject: Fixed VWR-25269 --- indra/newview/llviewermenu.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index ec72df79d1..625107cf55 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -6402,12 +6402,12 @@ class LLToolsSelectedScriptAction : public view_listener_t else if (action == "start") { name = "start_queue"; - msg = "Running"; + msg = "SetRunning"; } else if (action == "stop") { name = "stop_queue"; - msg = "RunningNot"; + msg = "SetRunningNot"; } LLUUID id; id.generate(); -- cgit v1.2.3 From 40e14802e3f5bc78546c8ed38fb1a28e46b0dd7c Mon Sep 17 00:00:00 2001 From: LanceCorrimal <none@none> Date: Thu, 24 Mar 2011 12:56:15 +0100 Subject: forgot to update contributions.txt --- doc/contributions.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/contributions.txt b/doc/contributions.txt index 560bedd518..fac62c7b3b 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -434,6 +434,8 @@ Kitty Barnett Kunnis Basiat VWR-82 VWR-102 +Lance Corrimal + VWR-25269 Latif Khalifa VWR-5370 Lisa Lowe -- cgit v1.2.3 From 7986e092ec0a426d1f0e74811772db817d61ec47 Mon Sep 17 00:00:00 2001 From: "alain@945battery-guestA-183.lindenlab.com" <alain@945battery-guestA-183.lindenlab.com> Date: Thu, 24 Mar 2011 10:32:02 -0700 Subject: use vivox's openal for SLVoice because it isn't compatible with latest OpenAl version (should fix linux voice issues). --- indra/newview/viewer_manifest.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 0de6817072..92b6ff58b2 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -958,7 +958,6 @@ class Linux_i686Manifest(LinuxManifest): self.path("libopenal.so") self.path("libopenal.so.1") self.path("libopenal.so.1.12.854") - self.path("libopenal.so", "libvivoxoal.so.1") # vivox's sdk expects this soname self.path("libfontconfig.so.1.4.4") try: self.path("libfmod-3.75.so") @@ -975,7 +974,7 @@ class Linux_i686Manifest(LinuxManifest): if self.prefix(src="../packages/lib/release", dst="lib"): self.path("libortp.so") self.path("libsndfile.so.1") - #self.path("libvivoxoal.so.1") # no - we'll re-use the viewer's own OpenAL lib + self.path("libvivoxoal.so.1") self.path("libvivoxsdk.so") self.path("libvivoxplatform.so") self.end_prefix("lib") -- cgit v1.2.3 From d9849178d871d368b00f4701c32fe6e32b2aeac9 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Thu, 24 Mar 2011 11:22:20 -0700 Subject: minor whitespace change --- indra/newview/llviewermenu.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 64338d4417..b9a281047c 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -880,11 +880,11 @@ void toggle_destination_and_avatar_picker(const LLSD& show) } break; default: - container->setVisible(false); - destinations->setVisible(false); - avatar_picker->setVisible(false); - avatar_btn->setToggleState(false); - destination_btn->setToggleState(false); + container->setVisible(false); + destinations->setVisible(false); + avatar_picker->setVisible(false); + avatar_btn->setToggleState(false); + destination_btn->setToggleState(false); break; } gSavedSettings.setS32("DestinationsAndAvatarsVisibility", panel_idx); -- cgit v1.2.3 From 12d3acc1920fa8a90287d59df61864620bbf29ca Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Thu, 24 Mar 2011 15:27:15 -0700 Subject: SOCIAL-714 FIX [PUBLIC] Basic mode to launch with Destinations panel open by default we now correctly remember last state of destinations/avatar picker panels --- indra/newview/app_settings/settings.xml | 2 +- indra/newview/app_settings/settings_minimal.xml | 11 ----------- 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 2cfda13cfd..04045585a0 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -12617,7 +12617,7 @@ <key>Type</key> <string>S32</string> <key>Value</key> - <integer>-1</integer> + <integer>0</integer> </map> </map> </llsd> diff --git a/indra/newview/app_settings/settings_minimal.xml b/indra/newview/app_settings/settings_minimal.xml index 8886976f3f..490da2c9d4 100644 --- a/indra/newview/app_settings/settings_minimal.xml +++ b/indra/newview/app_settings/settings_minimal.xml @@ -402,16 +402,5 @@ <key>Value</key> <integer>0</integer> </map> - <key>DestinationsAndAvatarsVisibility</key> - <map> - <key>Comment</key> - <string>Whether destination panel or avatar picker are open (0=destination guide, 1=avatar picker, default=nothing)</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>S32</string> - <key>Value</key> - <integer>0</integer> - </map> </map> </llsd> -- cgit v1.2.3 From a2e3a002704e1057f1f67093729badd700b40c80 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Thu, 24 Mar 2011 15:48:44 -0700 Subject: SOCIAL-714 FIX [PUBLIC] Basic mode to launch with Destinations panel open by default fixed not being able to toggle off avatar/destination guide by clicking button again --- indra/newview/llviewermenu.cpp | 50 ++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 26 deletions(-) diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index b9a281047c..0883d1edf7 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -856,38 +856,36 @@ void toggle_destination_and_avatar_picker(const LLSD& show) LLButton* avatar_btn = gViewerWindow->getRootView()->getChildView("bottom_tray")->getChild<LLButton>("avatar_btn"); LLButton* destination_btn = gViewerWindow->getRootView()->getChildView("bottom_tray")->getChild<LLButton>("destination_btn"); - switch(panel_idx) - { - case 0: - if (!destinations->getVisible()) - { - container->setVisible(true); - destinations->setVisible(true); - avatar_picker->setVisible(false); - LLFirstUse::notUsingDestinationGuide(false); - avatar_btn->setToggleState(false); - destination_btn->setToggleState(true); - } - break; - case 1: - if (!avatar_picker->getVisible()) - { - container->setVisible(true); - destinations->setVisible(false); - avatar_picker->setVisible(true); - avatar_btn->setToggleState(true); - destination_btn->setToggleState(false); - } - break; - default: + if (panel_idx == 0 + && !destinations->getVisible()) + { // opening destinations guide + container->setVisible(true); + destinations->setVisible(true); + avatar_picker->setVisible(false); + LLFirstUse::notUsingDestinationGuide(false); + avatar_btn->setToggleState(false); + destination_btn->setToggleState(true); + gSavedSettings.setS32("DestinationsAndAvatarsVisibility", 0); + } + else if (panel_idx == 1 + && !avatar_picker->getVisible()) + { // opening avatar picker + container->setVisible(true); + destinations->setVisible(false); + avatar_picker->setVisible(true); + avatar_btn->setToggleState(true); + destination_btn->setToggleState(false); + gSavedSettings.setS32("DestinationsAndAvatarsVisibility", 1); + } + else + { // toggling off dest guide or avatar picker container->setVisible(false); destinations->setVisible(false); avatar_picker->setVisible(false); avatar_btn->setToggleState(false); destination_btn->setToggleState(false); - break; + gSavedSettings.setS32("DestinationsAndAvatarsVisibility", -1); } - gSavedSettings.setS32("DestinationsAndAvatarsVisibility", panel_idx); }; -- cgit v1.2.3 From 4af93641973c4ee8805e948ad04d7be306a38835 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Thu, 24 Mar 2011 16:40:50 -0700 Subject: SOCIAL-788 FIX HUD Click points not accurate in Basic mode SOCIAL-789 FIX HUD position and function affected by Destination Guide and Avatar picker panels in Basic mode --- indra/newview/llviewerdisplay.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index 41b7c13826..2f8f842ce7 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -1066,8 +1066,8 @@ bool get_hud_matrices(const LLRect& screen_region, glh::matrix4f &proj, glh::mat F32 scale_y = (F32)gViewerWindow->getWorldViewHeightScaled() / (F32)screen_region.getHeight(); mat.set_scale(glh::vec3f(scale_x, scale_y, 1.f)); mat.set_translate( - glh::vec3f(clamp_rescale((F32)screen_region.getCenterX(), 0.f, (F32)gViewerWindow->getWorldViewWidthScaled(), 0.5f * scale_x * aspect_ratio, -0.5f * scale_x * aspect_ratio), - clamp_rescale((F32)screen_region.getCenterY(), 0.f, (F32)gViewerWindow->getWorldViewHeightScaled(), 0.5f * scale_y, -0.5f * scale_y), + glh::vec3f(clamp_rescale((F32)(screen_region.getCenterX() - screen_region.mLeft), 0.f, (F32)gViewerWindow->getWorldViewWidthScaled(), 0.5f * scale_x * aspect_ratio, -0.5f * scale_x * aspect_ratio), + clamp_rescale((F32)(screen_region.getCenterY() - screen_region.mBottom), 0.f, (F32)gViewerWindow->getWorldViewHeightScaled(), 0.5f * scale_y, -0.5f * scale_y), 0.f)); proj *= mat; -- cgit v1.2.3 From a5572505d843778b7f5395e25f9b9d15178bb423 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Thu, 24 Mar 2011 19:37:00 -0700 Subject: SOCIAL-509 FIX There is no way to copy a user name from web profile with the mouse --- indra/llui/llmenugl.cpp | 3 - indra/newview/llmediactrl.cpp | 13 ++- indra/newview/llmediactrl.h | 2 + indra/newview/lltoolpie.cpp | 105 +++++++++++---------- indra/newview/llviewermedia.cpp | 18 +--- indra/newview/llviewermediafocus.cpp | 12 +++ .../skins/default/xui/en/menu_media_ctrl.xml | 34 +++++++ 7 files changed, 117 insertions(+), 70 deletions(-) create mode 100644 indra/newview/skins/default/xui/en/menu_media_ctrl.xml diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 32d7be377a..e60fae6ff5 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -3099,9 +3099,6 @@ void LLMenuGL::showPopup(LLView* spawning_view, LLMenuGL* menu, S32 x, S32 y) CURSOR_HEIGHT + MOUSE_CURSOR_PADDING * 2); menu->translateIntoRectWithExclusion( menu_region_rect, mouse_rect, FALSE ); menu->getParent()->sendChildToFront(menu); - - - } ///============================================================================ diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index b8c61068c4..0199958c62 100644 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -44,6 +44,7 @@ #include "llslurl.h" #include "lluictrlfactory.h" // LLDefaultChildRegistry #include "llkeyboard.h" +#include "llviewermenu.h" // linden library includes #include "llfocusmgr.h" @@ -106,7 +107,8 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) : mErrorPageURL(p.error_page_url), mTrusted(p.trusted_content), mWindowShade(NULL), - mHoverTextChanged(false) + mHoverTextChanged(false), + mContextMenu(NULL) { { LLColor4 color = p.caret_color().get(); @@ -151,6 +153,7 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) : LLMediaCtrl::~LLMediaCtrl() { + delete mContextMenu; if (mMediaSource) { @@ -318,6 +321,12 @@ BOOL LLMediaCtrl::handleRightMouseDown( S32 x, S32 y, MASK mask ) setFocus( TRUE ); } + if (mContextMenu) + { + mContextMenu->show(x, y); + LLMenuGL::showPopup(this, mContextMenu, x, y); + } + return TRUE; } @@ -380,6 +389,8 @@ void LLMediaCtrl::onFocusLost() // BOOL LLMediaCtrl::postBuild () { + mContextMenu = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>( + "menu_media_ctrl.xml", LLMenuGL::sMenuContainer, LLViewerMenuHolderGL::child_registry_t::instance()); setVisibleCallback(boost::bind(&LLMediaCtrl::onVisibilityChange, this, _2)); return TRUE; } diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h index 53b98b7ec8..28666e620f 100644 --- a/indra/newview/llmediactrl.h +++ b/indra/newview/llmediactrl.h @@ -34,6 +34,7 @@ class LLViewBorder; class LLUICtrlFactory; +class LLContextMenu; //////////////////////////////////////////////////////////////////////////////// // @@ -195,6 +196,7 @@ public: bool mClearCache; class LLWindowShade* mWindowShade; bool mHoverTextChanged; + LLContextMenu* mContextMenu; }; #endif // LL_LLMediaCtrl_H diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index a84346ab84..a8243a989e 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -528,42 +528,17 @@ void LLToolPie::selectionPropertiesReceived() BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask) { - if (!mMouseOutsideSlop - && mMouseButtonDown - && gSavedSettings.getBOOL("ClickToWalk")) - { - S32 delta_x = x - mMouseDownX; - S32 delta_y = y - mMouseDownY; - S32 threshold = gSavedSettings.getS32("DragAndDropDistanceThreshold"); - if (delta_x * delta_x + delta_y * delta_y > threshold * threshold) - { - startCameraSteering(); - } - } - mHoverPick = gViewerWindow->pickImmediate(x, y, FALSE); - - if (inCameraSteerMode()) - { - steerCameraWithMouse(x, y); - gViewerWindow->setCursor(UI_CURSOR_TOOLGRAB); - return TRUE; - } - - // perform a separate pick that detects transparent objects since they respond to 1-click actions - LLPickInfo click_action_pick = gViewerWindow->pickImmediate(x, y, TRUE); - - // Show screen-space highlight glow effect - bool show_highlight = false; LLViewerObject *parent = NULL; LLViewerObject *object = mHoverPick.getObject(); - if (object) { parent = object->getRootEdit(); } - LLViewerObject* click_action_object = click_action_pick.getObject(); + // Show screen-space highlight glow effect + bool show_highlight = false; + if (handleMediaHover(mHoverPick)) { // *NOTE: If you think the hover glow conflicts with the media outline, you @@ -572,37 +547,68 @@ BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask) // cursor set by media object lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl; } - else if (click_action_object && useClickAction(mask, click_action_object, click_action_object->getRootEdit())) + else if (!mMouseOutsideSlop + && mMouseButtonDown + && gSavedSettings.getBOOL("ClickToWalk")) { - show_highlight = true; - ECursorType cursor = cursorFromObject(click_action_object); - gViewerWindow->setCursor(cursor); - lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl; + S32 delta_x = x - mMouseDownX; + S32 delta_y = y - mMouseDownY; + S32 threshold = gSavedSettings.getS32("DragAndDropDistanceThreshold"); + if (delta_x * delta_x + delta_y * delta_y > threshold * threshold) + { + startCameraSteering(); + steerCameraWithMouse(x, y); + gViewerWindow->setCursor(UI_CURSOR_TOOLGRAB); + } + else + { + gViewerWindow->setCursor(UI_CURSOR_ARROW); + } } - - else if ((object && !object->isAvatar() && object->usePhysics()) - || (parent && !parent->isAvatar() && parent->usePhysics())) + else if (inCameraSteerMode()) { - show_highlight = true; + steerCameraWithMouse(x, y); gViewerWindow->setCursor(UI_CURSOR_TOOLGRAB); - lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl; - } - else if ( (object && object->flagHandleTouch()) - || (parent && parent->flagHandleTouch())) - { - show_highlight = true; - gViewerWindow->setCursor(UI_CURSOR_HAND); - lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl; } else { - gViewerWindow->setCursor(UI_CURSOR_ARROW); - lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl; + // perform a separate pick that detects transparent objects since they respond to 1-click actions + LLPickInfo click_action_pick = gViewerWindow->pickImmediate(x, y, TRUE); - if(!object) + LLViewerObject* click_action_object = click_action_pick.getObject(); + + if (click_action_object && useClickAction(mask, click_action_object, click_action_object->getRootEdit())) + { + show_highlight = true; + ECursorType cursor = cursorFromObject(click_action_object); + gViewerWindow->setCursor(cursor); + lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl; + } + + else if ((object && !object->isAvatar() && object->usePhysics()) + || (parent && !parent->isAvatar() && parent->usePhysics())) + { + show_highlight = true; + gViewerWindow->setCursor(UI_CURSOR_TOOLGRAB); + lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl; + } + else if ( (object && object->flagHandleTouch()) + || (parent && parent->flagHandleTouch())) { - LLViewerMediaFocus::getInstance()->clearHover(); + show_highlight = true; + gViewerWindow->setCursor(UI_CURSOR_HAND); + lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl; } + else + { + gViewerWindow->setCursor(UI_CURSOR_ARROW); + lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl; + } + } + + if(!object) + { + LLViewerMediaFocus::getInstance()->clearHover(); } static LLCachedControl<bool> enable_highlight( @@ -1430,6 +1436,7 @@ bool LLToolPie::handleMediaClick(const LLPickInfo& pick) { // Make sure keyboard focus is set to the media focus object. gFocusMgr.setKeyboardFocus(LLViewerMediaFocus::getInstance()); + LLEditMenuHandler::gEditMenuHandler = LLViewerMediaFocus::instance().getFocusedMediaImpl(); media_impl->mouseDown(pick.mUVCoords, gKeyboard->currentMask(TRUE)); mMediaMouseCaptureID = mep->getMediaID(); diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 499165135a..c2d630ece2 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -2543,23 +2543,7 @@ bool LLViewerMediaImpl::handleKeyHere(KEY key, MASK mask) // Menu keys should be handled by the menu system and not passed to UI elements, but this is how LLTextEditor and LLLineEditor do it... if( MASK_CONTROL & mask ) { - if( 'C' == key ) - { - mMediaSource->copy(); - result = true; - } - else - if( 'V' == key ) - { - mMediaSource->paste(); - result = true; - } - else - if( 'X' == key ) - { - mMediaSource->cut(); - result = true; - } + result = true; } if(!result) diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp index de52aa17d1..4543a1ba9a 100644 --- a/indra/newview/llviewermediafocus.cpp +++ b/indra/newview/llviewermediafocus.cpp @@ -113,6 +113,11 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac media_impl->focus(true); gFocusMgr.setKeyboardFocus(this); + LLViewerMediaImpl* impl = getFocusedMediaImpl(); + if (impl) + { + LLEditMenuHandler::gEditMenuHandler = impl; + } // We must do this before processing the media HUD zoom, or it may zoom to the wrong face. update(); @@ -139,6 +144,13 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac { gFocusMgr.setKeyboardFocus(NULL); } + + LLViewerMediaImpl* impl = getFocusedMediaImpl(); + if (LLEditMenuHandler::gEditMenuHandler == impl) + { + LLEditMenuHandler::gEditMenuHandler = NULL; + } + mFocusedImplID = LLUUID::null; if (objectp.notNull()) diff --git a/indra/newview/skins/default/xui/en/menu_media_ctrl.xml b/indra/newview/skins/default/xui/en/menu_media_ctrl.xml new file mode 100644 index 0000000000..ed1e1b0fae --- /dev/null +++ b/indra/newview/skins/default/xui/en/menu_media_ctrl.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu + name="media ctrl context menu"> + <menu_item_call + label="Cut" + layout="topleft" + name="Cut" + shortcut="control|X"> + <menu_item_call.on_click + function="Edit.Cut" /> + <menu_item_call.on_enable + function="Edit.EnableCut" /> + </menu_item_call> + <menu_item_call + label="Copy" + layout="topleft" + name="Copy" + shortcut="control|C"> + <menu_item_call.on_click + function="Edit.Copy" /> + <menu_item_call.on_enable + function="Edit.EnableCopy" /> + </menu_item_call> + <menu_item_call + label="Paste" + layout="topleft" + name="Paste" + shortcut="control|V"> + <menu_item_call.on_click + function="Edit.Paste" /> + <menu_item_call.on_enable + function="Edit.EnablePaste" /> + </menu_item_call> +</context_menu> -- cgit v1.2.3 From 5f224ed8ab527a14a7596adc65876177301aef30 Mon Sep 17 00:00:00 2001 From: callum <none@none> Date: Fri, 25 Mar 2011 10:34:13 -0700 Subject: VWR-25278 FIX Incorrect Help ID for Preferences > Colors tab --- indra/newview/skins/default/xui/en/floater_preferences.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml index 8eee8f44b5..ef670bdd52 100644 --- a/indra/newview/skins/default/xui/en/floater_preferences.xml +++ b/indra/newview/skins/default/xui/en/floater_preferences.xml @@ -96,7 +96,7 @@ filename="panel_preferences_colors.xml" label="Colors" layout="topleft" - help_topic="preferences_im_tab" + help_topic="preferences_colors_tab" name="colors" /> <panel class="panel_preference" -- cgit v1.2.3 From e9eff2b00975a753217d75437ffd89b62e96227b Mon Sep 17 00:00:00 2001 From: callum <none@none> Date: Fri, 25 Mar 2011 10:51:06 -0700 Subject: SOCIAL-808 FIX Crash on exit in LLMediaCtrl --- indra/newview/llmediactrl.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index 0199958c62..2ed4e136b9 100644 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -153,8 +153,6 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) : LLMediaCtrl::~LLMediaCtrl() { - delete mContextMenu; - if (mMediaSource) { mMediaSource->remObserver( this ); @@ -389,8 +387,8 @@ void LLMediaCtrl::onFocusLost() // BOOL LLMediaCtrl::postBuild () { - mContextMenu = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>( - "menu_media_ctrl.xml", LLMenuGL::sMenuContainer, LLViewerMenuHolderGL::child_registry_t::instance()); + mContextMenu = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>( + "menu_media_ctrl.xml", LLMenuGL::sMenuContainer, LLViewerMenuHolderGL::child_registry_t::instance()); setVisibleCallback(boost::bind(&LLMediaCtrl::onVisibilityChange, this, _2)); return TRUE; } -- cgit v1.2.3 From 58120840477421c85d46f32e3b12a15c6459d0ff Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Fri, 25 Mar 2011 11:28:40 -0700 Subject: SOCIAL-674 FIX 2 gray lines shown in UI in minimal skin after using gesture --- indra/newview/skins/minimal/xui/en/menu_avatar_icon.xml | 2 +- indra/newview/skins/minimal/xui/en/menu_bottomtray.xml | 2 +- indra/newview/skins/minimal/xui/en/menu_favorites.xml | 2 +- indra/newview/skins/minimal/xui/en/menu_group_plus.xml | 2 +- indra/newview/skins/minimal/xui/en/menu_hide_navbar.xml | 2 +- indra/newview/skins/minimal/xui/en/menu_imchiclet_adhoc.xml | 2 +- indra/newview/skins/minimal/xui/en/menu_imchiclet_group.xml | 2 +- indra/newview/skins/minimal/xui/en/menu_imchiclet_p2p.xml | 2 +- indra/newview/skins/minimal/xui/en/menu_inv_offer_chiclet.xml | 2 +- indra/newview/skins/minimal/xui/en/menu_inventory.xml | 2 +- indra/newview/skins/minimal/xui/en/menu_inventory_add.xml | 2 +- indra/newview/skins/minimal/xui/en/menu_mini_map.xml | 2 +- indra/newview/skins/minimal/xui/en/menu_navbar.xml | 2 +- indra/newview/skins/minimal/xui/en/menu_nearby_chat.xml | 2 +- indra/newview/skins/minimal/xui/en/menu_object_icon.xml | 2 +- indra/newview/skins/minimal/xui/en/menu_people_groups.xml | 2 +- indra/newview/skins/minimal/xui/en/menu_place_add_button.xml | 2 +- indra/newview/skins/minimal/xui/en/menu_script_chiclet.xml | 2 +- indra/newview/skins/minimal/xui/en/menu_slurl.xml | 2 +- indra/newview/skins/minimal/xui/en/menu_topinfobar.xml | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/indra/newview/skins/minimal/xui/en/menu_avatar_icon.xml b/indra/newview/skins/minimal/xui/en/menu_avatar_icon.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_avatar_icon.xml +++ b/indra/newview/skins/minimal/xui/en/menu_avatar_icon.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_bottomtray.xml b/indra/newview/skins/minimal/xui/en/menu_bottomtray.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_bottomtray.xml +++ b/indra/newview/skins/minimal/xui/en/menu_bottomtray.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_favorites.xml b/indra/newview/skins/minimal/xui/en/menu_favorites.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_favorites.xml +++ b/indra/newview/skins/minimal/xui/en/menu_favorites.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_group_plus.xml b/indra/newview/skins/minimal/xui/en/menu_group_plus.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_group_plus.xml +++ b/indra/newview/skins/minimal/xui/en/menu_group_plus.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_hide_navbar.xml b/indra/newview/skins/minimal/xui/en/menu_hide_navbar.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_hide_navbar.xml +++ b/indra/newview/skins/minimal/xui/en/menu_hide_navbar.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_imchiclet_adhoc.xml b/indra/newview/skins/minimal/xui/en/menu_imchiclet_adhoc.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_imchiclet_adhoc.xml +++ b/indra/newview/skins/minimal/xui/en/menu_imchiclet_adhoc.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_imchiclet_group.xml b/indra/newview/skins/minimal/xui/en/menu_imchiclet_group.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_imchiclet_group.xml +++ b/indra/newview/skins/minimal/xui/en/menu_imchiclet_group.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_imchiclet_p2p.xml b/indra/newview/skins/minimal/xui/en/menu_imchiclet_p2p.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_imchiclet_p2p.xml +++ b/indra/newview/skins/minimal/xui/en/menu_imchiclet_p2p.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_inv_offer_chiclet.xml b/indra/newview/skins/minimal/xui/en/menu_inv_offer_chiclet.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_inv_offer_chiclet.xml +++ b/indra/newview/skins/minimal/xui/en/menu_inv_offer_chiclet.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_inventory.xml b/indra/newview/skins/minimal/xui/en/menu_inventory.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_inventory.xml +++ b/indra/newview/skins/minimal/xui/en/menu_inventory.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_inventory_add.xml b/indra/newview/skins/minimal/xui/en/menu_inventory_add.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_inventory_add.xml +++ b/indra/newview/skins/minimal/xui/en/menu_inventory_add.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_mini_map.xml b/indra/newview/skins/minimal/xui/en/menu_mini_map.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_mini_map.xml +++ b/indra/newview/skins/minimal/xui/en/menu_mini_map.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_navbar.xml b/indra/newview/skins/minimal/xui/en/menu_navbar.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_navbar.xml +++ b/indra/newview/skins/minimal/xui/en/menu_navbar.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_nearby_chat.xml b/indra/newview/skins/minimal/xui/en/menu_nearby_chat.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_nearby_chat.xml +++ b/indra/newview/skins/minimal/xui/en/menu_nearby_chat.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_object_icon.xml b/indra/newview/skins/minimal/xui/en/menu_object_icon.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_object_icon.xml +++ b/indra/newview/skins/minimal/xui/en/menu_object_icon.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_people_groups.xml b/indra/newview/skins/minimal/xui/en/menu_people_groups.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_people_groups.xml +++ b/indra/newview/skins/minimal/xui/en/menu_people_groups.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_place_add_button.xml b/indra/newview/skins/minimal/xui/en/menu_place_add_button.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_place_add_button.xml +++ b/indra/newview/skins/minimal/xui/en/menu_place_add_button.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_script_chiclet.xml b/indra/newview/skins/minimal/xui/en/menu_script_chiclet.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_script_chiclet.xml +++ b/indra/newview/skins/minimal/xui/en/menu_script_chiclet.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_slurl.xml b/indra/newview/skins/minimal/xui/en/menu_slurl.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_slurl.xml +++ b/indra/newview/skins/minimal/xui/en/menu_slurl.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_topinfobar.xml b/indra/newview/skins/minimal/xui/en/menu_topinfobar.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_topinfobar.xml +++ b/indra/newview/skins/minimal/xui/en/menu_topinfobar.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> -- cgit v1.2.3 From 255758e199e2931b0670ce1e6bfa7d4bc540353d Mon Sep 17 00:00:00 2001 From: Paul ProductEngine <pguslisty@productengine.com> Date: Fri, 25 Mar 2011 21:10:50 +0200 Subject: STORM-1057 FIXED [TRUNCATION/LAYOUT] Make space larger for full strings to appear in the Move & View Preferences, ALL langs - Increased tabs width of floater preferences - To avoid truncation of some check box labels replaced them with text boxes and applied word wrap for these text boxes. These text boxes will be replaced by check box labels after STORM-1109 will be fixed. --- .../skins/default/xui/da/panel_preferences_chat.xml | 3 ++- .../skins/default/xui/da/panel_preferences_sound.xml | 3 ++- .../skins/default/xui/de/panel_preferences_chat.xml | 3 ++- .../skins/default/xui/de/panel_preferences_sound.xml | 3 ++- .../skins/default/xui/en/floater_preferences.xml | 2 +- .../default/xui/en/panel_preferences_alerts.xml | 4 ++-- .../skins/default/xui/en/panel_preferences_chat.xml | 20 ++++++++++++++++---- .../default/xui/en/panel_preferences_general.xml | 10 +++++----- .../skins/default/xui/en/panel_preferences_move.xml | 9 +++++---- .../default/xui/en/panel_preferences_privacy.xml | 2 +- .../skins/default/xui/en/panel_preferences_sound.xml | 16 ++++++++++++++-- .../skins/default/xui/es/panel_preferences_chat.xml | 3 ++- .../skins/default/xui/es/panel_preferences_sound.xml | 3 ++- .../skins/default/xui/fr/panel_preferences_chat.xml | 3 ++- .../skins/default/xui/fr/panel_preferences_sound.xml | 3 ++- .../skins/default/xui/it/panel_preferences_chat.xml | 3 ++- .../skins/default/xui/it/panel_preferences_sound.xml | 3 ++- .../skins/default/xui/ja/panel_preferences_chat.xml | 3 ++- .../skins/default/xui/ja/panel_preferences_sound.xml | 3 ++- .../skins/default/xui/nl/panel_preferences_sound.xml | 3 ++- .../skins/default/xui/pl/panel_preferences_chat.xml | 3 ++- .../skins/default/xui/pl/panel_preferences_sound.xml | 3 ++- .../skins/default/xui/pt/panel_preferences_chat.xml | 3 ++- .../skins/default/xui/pt/panel_preferences_sound.xml | 3 ++- 24 files changed, 78 insertions(+), 36 deletions(-) diff --git a/indra/newview/skins/default/xui/da/panel_preferences_chat.xml b/indra/newview/skins/default/xui/da/panel_preferences_chat.xml index 3705a5902a..ed499619f6 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_chat.xml @@ -29,7 +29,8 @@ <check_box label="IM chats" name="EnableIMChatPopups" tool_tip="Vælg for at se popup vindue når personlige beskeder (IM) modtages"/> <spinner label="Tid før chatvisning forsvinder:" name="nearby_toasts_lifetime"/> <spinner label="Tid før chatvisning forsvinder:" name="nearby_toasts_fadingtime"/> - <check_box label="Benyt maskin-oversættelse ved chat (håndteret af Google)" name="translate_chat_checkbox"/> + <check_box name="translate_chat_checkbox"/> + <text name="translate_chb_label" >Benyt maskin-oversættelse ved chat (håndteret af Google)</text> <text name="translate_language_text" width="110"> Oversæt chat til : </text> diff --git a/indra/newview/skins/default/xui/da/panel_preferences_sound.xml b/indra/newview/skins/default/xui/da/panel_preferences_sound.xml index 5810cc21e7..067463be02 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_sound.xml @@ -4,7 +4,8 @@ Midterste museknap </panel.string> <slider label="Generel" name="System Volume"/> - <check_box initial_value="true" label="Sluk lyd når minimeret" name="mute_when_minimized"/> + <check_box initial_value="true" name="mute_when_minimized"/> + <text name="mute_chb_label">Sluk lyd når minimeret</text> <slider label="Knapper" name="UI Volume"/> <slider label="Omgivelser" name="Wind Volume"/> <slider label="Lyd effekter" name="SFX Volume"/> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml index 8086128dd7..8c8cdd31fe 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml @@ -29,7 +29,8 @@ <check_box label="IM-Chats" name="EnableIMChatPopups" tool_tip="Markieren, um Popups zu sehen, wenn Instant Message eintrifft"/> <spinner label="Lebenszeit von Toasts für Chat in der Nähe:" name="nearby_toasts_lifetime"/> <spinner label="Ein-/Ausblenddauer von Toasts für Chat in der Nähe:" name="nearby_toasts_fadingtime"/> - <check_box label="Bei Chat Maschinenübersetzung verwenden (Service von Google)" name="translate_chat_checkbox"/> + <check_box name="translate_chat_checkbox"/> + <text name="translate_chb_label" >Bei Chat Maschinenübersetzung verwenden (Service von Google)</text> <text name="translate_language_text"> Chat übersetzen in: </text> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_sound.xml b/indra/newview/skins/default/xui/de/panel_preferences_sound.xml index 0f029d8664..07631b6a91 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_sound.xml @@ -4,7 +4,8 @@ Mittlere Maustaste </panel.string> <slider label="Master-Lautstärke" name="System Volume"/> - <check_box initial_value="true" label="Stummschalten, wenn minimiert" name="mute_when_minimized"/> + <check_box initial_value="true" name="mute_when_minimized"/> + <text name="mute_chb_label">Stummschalten, wenn minimiert</text> <slider label="Schaltflächen" name="UI Volume"/> <slider label="Umgebung" name="Wind Volume"/> <slider label="Soundeffekte" name="SFX Volume"/> diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml index 8eee8f44b5..5a280880bc 100644 --- a/indra/newview/skins/default/xui/en/floater_preferences.xml +++ b/indra/newview/skins/default/xui/en/floater_preferences.xml @@ -45,7 +45,7 @@ name="pref core" tab_group="1" tab_position="left" - tab_width="115" + tab_width="140" tab_padding_right="0" top="21" width="658"> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml index 559df5bec9..714dca7fac 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml @@ -67,7 +67,7 @@ image_overlay="Arrow_Up" hover_glow_amount="0.15" layout="topleft" - left="180" + left="200" name="enable_this_popup" top_pad="5" width="40"> @@ -81,7 +81,7 @@ image_overlay="Arrow_Down" hover_glow_amount="0.15" layout="topleft" - left_pad="40" + left_pad="20" name="disable_this_popup" top_delta="0" width="40"> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml index a1082d9c32..404537e1f2 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml @@ -208,15 +208,27 @@ <check_box control_name="TranslateChat" enabled="true" - height="16" - label="Use machine translation while chatting (powered by Google)" + height="16" layout="topleft" left="30" name="translate_chat_checkbox" - bottom_delta="30" + top_pad="5" width="400" /> + <!-- *HACK + After storm-1109 will be fixed: instead of using this text_box, word_wrap should be applied for "translate_chat_checkbox" check_box's label.--> + <text + follows="top|left" + height="15" + layout="topleft" + left="50" + name="translate_chb_label" + top_delta="1" + width="450" + wrap="true"> + Use machine translation while chatting (powered by Google) + </text> <text - bottom_delta="30" + top_pad="20" name="translate_language_text" follows="left|top" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_general.xml b/indra/newview/skins/default/xui/en/panel_preferences_general.xml index 36f8f99178..c26613994f 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml @@ -326,7 +326,7 @@ layout="topleft" left="30" name="inworld_typing_rg_label" - top_pad="6" + top_pad="1" width="400"> Pressing letter keys: </text> @@ -348,9 +348,9 @@ width="150" /> <radio_item label="Affects movement (i.e. WASD)" - left_pad="0" + left="0" layout="topleft" - top_delta="0" + top="18" height="16" name="radio_move" value="0" @@ -365,7 +365,7 @@ layout="topleft" left="30" name="title_afk_text" - top_pad="4" + top_pad="15" width="190"> Away timeout: </text> @@ -408,7 +408,7 @@ left="30" mouse_opaque="false" name="text_box3" - top_pad="5" + top_pad="3" width="240"> Busy mode response: </text> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_move.xml b/indra/newview/skins/default/xui/en/panel_preferences_move.xml index d2fc6ea09a..04412bdb9c 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_move.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_move.xml @@ -120,12 +120,13 @@ type="string" length="1" follows="left|top" - height="10" + height="15" layout="topleft" left_delta="3" name=" Mouse Sensitivity" top_pad="10" - width="160"> + width="160" + wrap="true"> Mouselook mouse sensitivity: </text> <slider @@ -139,7 +140,7 @@ max_val="15" name="mouse_sensitivity" top_delta="-1" - width="145" /> + width="115" /> <check_box control_name="InvertMouse" height="16" @@ -158,7 +159,7 @@ left="78" name="arrow_keys_move_avatar_check" width="237" - top_pad="1"/> + top_pad="10"/> <check_box control_name="AllowTapTapHoldRun" follows="left|top" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml index ef25588ca3..a929c71127 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml @@ -82,8 +82,8 @@ control_name="ShowFavoritesOnLogin" enabled="false" height="16" - label="Show my Favorite Landmarks at Login (via 'Start At' drop-down menu)" layout="topleft" + label="Show my Favorite Landmarks at Login (via 'Start At' drop-down menu)" left="30" name="favorites_on_login_check" top_pad="10" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml index 26af8dc29d..f89494da72 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml @@ -50,12 +50,24 @@ control_name="MuteWhenMinimized" height="15" initial_value="true" - label="Mute when minimized" layout="topleft" name="mute_when_minimized" top_delta="3" left_pad="5" - width="235" /> + width="20" /> + <!-- *HACK + After storm-1109 will be fixed: instead of using this text_box, word_wrap should be applied for "mute_when_minimized" check_box's label.--> + <text + follows="top|left" + height="15" + layout="topleft" + left_pad="0" + name="mute_chb_label" + top_delta="0" + width="150" + wrap="true"> + Mute when minimized + </text> <slider control_name="AudioLevelUI" disabled_control="MuteAudio" diff --git a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml index 67f9a929f6..878c57164a 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml @@ -29,7 +29,8 @@ <check_box label="Chats de MI" name="EnableIMChatPopups" tool_tip="Activa esta casilla para ver una ventana emergente cada vez que recibas un mensaje instantáneo"/> <spinner label="Duración de los interlocutores favoritos en los chats:" name="nearby_toasts_lifetime"/> <spinner label="Tiempo restante de los interlocutores favoritos en los chats:" name="nearby_toasts_fadingtime"/> - <check_box label="Utiliza la herramienta de traducción automática mientras utilizas el chat (mediante Google)" name="translate_chat_checkbox"/> + <check_box name="translate_chat_checkbox"/> + <text name="translate_chb_label" >Utiliza la herramienta de traducción automática mientras utilizas el chat (mediante Google)</text> <text name="translate_language_text"> Traducir el chat al: </text> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml index 6c4ab0f14f..741ecc06c3 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml @@ -4,7 +4,8 @@ Botón medio del ratón </panel.string> <slider label="Volumen general" name="System Volume"/> - <check_box initial_value="true" label="Silenciar cuando minimice" name="mute_when_minimized"/> + <check_box initial_value="true" name="mute_when_minimized"/> + <text name="mute_chb_label">Silenciar cuando minimice</text> <slider label="Botones" name="UI Volume"/> <slider label="Ambiental" name="Wind Volume"/> <slider label="Efectos de sonido" name="SFX Volume"/> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml index 4b3fc35150..d5cecfc698 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml @@ -29,7 +29,8 @@ <check_box label="Chats IM" name="EnableIMChatPopups" tool_tip="Cocher cette case pour qu'un popup s'affiche à réception d'un message instantané."/> <spinner label="Durée de vie du popup Chat près de moi :" name="nearby_toasts_lifetime"/> <spinner label="Disparition progressive du popup Chat près de moi :" name="nearby_toasts_fadingtime"/> - <check_box label="Utiliser la traduction automatique lors des chats (fournie par Google)" name="translate_chat_checkbox"/> + <check_box name="translate_chat_checkbox"/> + <text name="translate_chb_label" >Utiliser la traduction automatique lors des chats (fournie par Google)</text> <text name="translate_language_text"> Traduire le chat en : </text> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml b/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml index 48630918d7..ac7f72d367 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml @@ -4,7 +4,8 @@ Bouton central de la souris </panel.string> <slider label="Volume principal" name="System Volume"/> - <check_box initial_value="true" label="Couper quand minimisé" name="mute_when_minimized"/> + <check_box initial_value="true" name="mute_when_minimized"/> + <text name="mute_chb_label">Couper quand minimisé</text> <slider label="Boutons" name="UI Volume"/> <slider label="Ambiant" name="Wind Volume"/> <slider label="Effets sonores" name="SFX Volume"/> diff --git a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml index 4a1bbdf64a..208dd5ed28 100644 --- a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml @@ -56,7 +56,8 @@ <radio_item label="Finestre separate" name="radio" value="0"/> <radio_item label="Schede" name="radio2" value="1"/> </radio_group> - <check_box label="Usa la traduzione meccanica durante le chat (tecnologia Google)" name="translate_chat_checkbox"/> + <check_box name="translate_chat_checkbox"/> + <text name="translate_chb_label" >Usa la traduzione meccanica durante le chat (tecnologia Google)</text> <text name="translate_language_text" width="110"> Traduci chat in: </text> diff --git a/indra/newview/skins/default/xui/it/panel_preferences_sound.xml b/indra/newview/skins/default/xui/it/panel_preferences_sound.xml index 6e70a314c5..e2332b63d0 100644 --- a/indra/newview/skins/default/xui/it/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_sound.xml @@ -1,7 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Suoni" name="Preference Media panel"> <slider label="Vol. principale" name="System Volume"/> - <check_box initial_value="true" label="Disatt. se a icona" name="mute_when_minimized"/> + <check_box initial_value="true" label="" name="mute_when_minimized"/> + <text name="mute_chb_label">Disatt. se a icona</text> <slider label="Pulsanti" name="UI Volume"/> <slider label="Ambiente" name="Wind Volume"/> <slider label="Effetti sonori" name="SFX Volume"/> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml index c260cebef8..ce2a0f35e4 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml @@ -56,7 +56,8 @@ <radio_item label="別々のウィンドウ" name="radio" value="0"/> <radio_item label="タブ" name="radio2" value="1"/> </radio_group> - <check_box label="チャット中に内容を機械翻訳する(Google翻訳)" name="translate_chat_checkbox"/> + <check_box name="translate_chat_checkbox"/> + <text name="translate_chb_label" >チャット中に内容を機械翻訳する(Google翻訳)</text> <text name="translate_language_text"> 翻訳する言語: </text> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml index 9fbbd46220..74696a3b35 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml @@ -1,7 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="サウンド" name="Preference Media panel"> <slider label="全体の音量" name="System Volume"/> - <check_box initial_value="true" label="最小化でミュート" name="mute_when_minimized"/> + <check_box initial_value="true" name="mute_when_minimized"/> + <text name="mute_chb_label">最小化でミュート</text> <slider label="ボタン" name="UI Volume"/> <slider label="風" name="Wind Volume"/> <slider label="効果音" name="SFX Volume"/> diff --git a/indra/newview/skins/default/xui/nl/panel_preferences_sound.xml b/indra/newview/skins/default/xui/nl/panel_preferences_sound.xml index 2b709bde40..5ded015868 100644 --- a/indra/newview/skins/default/xui/nl/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/nl/panel_preferences_sound.xml @@ -1,7 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Geluid" name="Preference Media panel"> <slider label="Hoofd volume" name="System Volume"/> - <check_box initial_value="true" label="Dempen indien geminimaliseerd" name="mute_when_minimized"/> + <check_box initial_value="true" name="mute_when_minimized"/> + <text name="mute_chb_label">Dempen indien geminimaliseerd</text> <slider label="Omliggend" name="Wind Volume"/> <slider label="Knoppen" name="UI Volume"/> <slider label="Media" name="Media Volume"/> diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml index c7142c8419..4a4e6509ab 100644 --- a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml @@ -29,7 +29,8 @@ <check_box label="Czat IM" name="EnableIMChatPopups" tool_tip="Zaznacz aby widzieć wyskakujące okienka kiedy IM się pojawia"/> <spinner label="Czas widoczności czatu w pobliżu:" name="nearby_toasts_lifetime"/> <spinner label="Czas znikania czatu w pobliżu:" name="nearby_toasts_fadingtime"/> - <check_box label="Używaj translatora podczas rozmowy (wspierany przez Google)" name="translate_chat_checkbox"/> + <check_box name="translate_chat_checkbox"/> + <text name="translate_chb_label" >Używaj translatora podczas rozmowy (wspierany przez Google)</text> <text name="translate_language_text"> Przetłumacz czat na: </text> diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml b/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml index ac93949a1b..692f24715b 100644 --- a/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml @@ -4,7 +4,8 @@ Środkowy przycisk myszy </panel.string> <slider label="Główny" name="System Volume"/> - <check_box initial_value="true" label="Wycisz podczas minimalizacji" name="mute_when_minimized"/> + <check_box initial_value="true" name="mute_when_minimized"/> + <text name="mute_chb_label">Wycisz podczas minimalizacji</text> <slider label="Interfejs" name="UI Volume"/> <slider label="Otoczenie" name="Wind Volume"/> <slider label="Efekty dźwiękowe" name="SFX Volume"/> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml index 368c474ee9..412bdbb13e 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml @@ -29,7 +29,8 @@ <check_box label="Bate-papos de MI" name="EnableIMChatPopups" tool_tip="Exibir pop-up de mensagens instantâneas novas"/> <spinner label="Transição de avisos de bate-papos por perto:" name="nearby_toasts_lifetime"/> <spinner label="Transição de avisos de bate-papos por perto:" name="nearby_toasts_fadingtime"/> - <check_box label="Traduzir bate-papo automaticamente (via Google)" name="translate_chat_checkbox"/> + <check_box name="translate_chat_checkbox"/> + <text name="translate_chb_label" >Traduzir bate-papo automaticamente (via Google)</text> <text name="translate_language_text"> Traduzir bate-papo para: </text> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml b/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml index 3846bfb377..6053deb5b1 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml @@ -4,7 +4,8 @@ Botão do meio do mouse </panel.string> <slider label="Volume principal" name="System Volume"/> - <check_box initial_value="true" label="Silenciar ao minimizar" name="mute_when_minimized"/> + <check_box initial_value="true" name="mute_when_minimized"/> + <text name="mute_chb_label">Silenciar ao minimizar</text> <slider label="Botões" name="UI Volume"/> <slider label="Ambiente" name="Wind Volume"/> <slider label="Efeitos sonoros" name="SFX Volume"/> -- cgit v1.2.3 From 08846c3f72c22aa1d0006548204f62b5b8d1bd05 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Fri, 25 Mar 2011 13:06:28 -0700 Subject: SOCIAL-509 FIX There is no way to copy a user name from web profile with the mouse fixed spawning location of context menu removed keyboard shortcuts from context menus (where they don't belong) --- indra/newview/llmediactrl.cpp | 6 ++++-- indra/newview/skins/default/xui/en/menu_media_ctrl.xml | 9 +++------ indra/newview/skins/default/xui/en/menu_text_editor.xml | 15 +++++---------- 3 files changed, 12 insertions(+), 18 deletions(-) diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index 2ed4e136b9..5007f1c17a 100644 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -307,10 +307,12 @@ BOOL LLMediaCtrl::handleRightMouseUp( S32 x, S32 y, MASK mask ) BOOL LLMediaCtrl::handleRightMouseDown( S32 x, S32 y, MASK mask ) { if (LLPanel::handleRightMouseDown(x, y, mask)) return TRUE; - convertInputCoords(x, y); + + S32 media_x = x, media_y = y; + convertInputCoords(media_x, media_y); if (mMediaSource) - mMediaSource->mouseDown(x, y, mask, 1); + mMediaSource->mouseDown(media_x, media_y, mask, 1); gFocusMgr.setMouseCapture( this ); diff --git a/indra/newview/skins/default/xui/en/menu_media_ctrl.xml b/indra/newview/skins/default/xui/en/menu_media_ctrl.xml index ed1e1b0fae..c39c26f25f 100644 --- a/indra/newview/skins/default/xui/en/menu_media_ctrl.xml +++ b/indra/newview/skins/default/xui/en/menu_media_ctrl.xml @@ -4,8 +4,7 @@ <menu_item_call label="Cut" layout="topleft" - name="Cut" - shortcut="control|X"> + name="Cut"> <menu_item_call.on_click function="Edit.Cut" /> <menu_item_call.on_enable @@ -14,8 +13,7 @@ <menu_item_call label="Copy" layout="topleft" - name="Copy" - shortcut="control|C"> + name="Copy"> <menu_item_call.on_click function="Edit.Copy" /> <menu_item_call.on_enable @@ -24,8 +22,7 @@ <menu_item_call label="Paste" layout="topleft" - name="Paste" - shortcut="control|V"> + name="Paste"> <menu_item_call.on_click function="Edit.Paste" /> <menu_item_call.on_enable diff --git a/indra/newview/skins/default/xui/en/menu_text_editor.xml b/indra/newview/skins/default/xui/en/menu_text_editor.xml index ecd96088e7..fe8489166b 100644 --- a/indra/newview/skins/default/xui/en/menu_text_editor.xml +++ b/indra/newview/skins/default/xui/en/menu_text_editor.xml @@ -4,8 +4,7 @@ <menu_item_call label="Cut" layout="topleft" - name="Cut" - shortcut="control|X"> + name="Cut"> <menu_item_call.on_click function="Edit.Cut" /> <menu_item_call.on_enable @@ -14,8 +13,7 @@ <menu_item_call label="Copy" layout="topleft" - name="Copy" - shortcut="control|C"> + name="Copy"> <menu_item_call.on_click function="Edit.Copy" /> <menu_item_call.on_enable @@ -24,8 +22,7 @@ <menu_item_call label="Paste" layout="topleft" - name="Paste" - shortcut="control|V"> + name="Paste"> <menu_item_call.on_click function="Edit.Paste" /> <menu_item_call.on_enable @@ -34,8 +31,7 @@ <menu_item_call label="Delete" layout="topleft" - name="Delete" - shortcut="Del"> + name="Delete"> <menu_item_call.on_click function="Edit.Delete" /> <menu_item_call.on_enable @@ -44,8 +40,7 @@ <menu_item_call label="Select All" layout="topleft" - name="Select All" - shortcut="control|A"> + name="Select All"> <menu_item_call.on_click function="Edit.SelectAll" /> <menu_item_call.on_enable -- cgit v1.2.3 From 9b7fd9034f3e134db402726a2ebf89027b6bbf88 Mon Sep 17 00:00:00 2001 From: "alain@945battery-guestA-183.lindenlab.com" <alain@945battery-guestA-183.lindenlab.com> Date: Fri, 25 Mar 2011 13:40:10 -0700 Subject: revert to prior archive to get vivox compatible opealal lib. --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index c08954bd16..65d9764cc6 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1278,11 +1278,11 @@ <key>archive</key> <map> <key>hash</key> - <string>30b9b33fb9320d9b6634e0dbb013b4e7</string> + <string>fccdca18a950ac9363c6fb39118b80e1</string> <key>hash_algorithm</key> <string>md5</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openal-1.12.854-1.1.0-linux-20110315.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openal-3ad86a1c-linux-20110114.tar.bz2</string> </map> <key>name</key> <string>linux</string> -- cgit v1.2.3 From ff7c3ad97ce0149de04b837fc8ec511be0b51f6d Mon Sep 17 00:00:00 2001 From: "alain@945battery-guestA-183.lindenlab.com" <alain@945battery-guestA-183.lindenlab.com> Date: Fri, 25 Mar 2011 13:40:26 -0700 Subject: Backed out changeset 6e69fbe64617 --- indra/newview/viewer_manifest.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 92b6ff58b2..0de6817072 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -958,6 +958,7 @@ class Linux_i686Manifest(LinuxManifest): self.path("libopenal.so") self.path("libopenal.so.1") self.path("libopenal.so.1.12.854") + self.path("libopenal.so", "libvivoxoal.so.1") # vivox's sdk expects this soname self.path("libfontconfig.so.1.4.4") try: self.path("libfmod-3.75.so") @@ -974,7 +975,7 @@ class Linux_i686Manifest(LinuxManifest): if self.prefix(src="../packages/lib/release", dst="lib"): self.path("libortp.so") self.path("libsndfile.so.1") - self.path("libvivoxoal.so.1") + #self.path("libvivoxoal.so.1") # no - we'll re-use the viewer's own OpenAL lib self.path("libvivoxsdk.so") self.path("libvivoxplatform.so") self.end_prefix("lib") -- cgit v1.2.3 From b286a9091b66c816f12e9a98e5ae092549261904 Mon Sep 17 00:00:00 2001 From: callum <none@none> Date: Fri, 25 Mar 2011 13:56:14 -0700 Subject: SOCIAL-688 FIX Multiple SLurls error given in minimal skin when clicking links in web profile Also fixes SOCIAL-521 and SOCIAL-428 --- indra/llplugin/llpluginclassmedia.cpp | 2 ++ indra/llplugin/llpluginclassmedia.h | 4 ++++ indra/media_plugins/webkit/media_plugin_webkit.cpp | 5 +++++ indra/newview/llagentlistener.cpp | 4 ++-- indra/newview/llcommanddispatcherlistener.cpp | 2 +- indra/newview/llcommandhandler.cpp | 15 +++++++++++-- indra/newview/llcommandhandler.h | 1 + indra/newview/llstartup.cpp | 2 +- indra/newview/llurldispatcher.cpp | 25 ++++++++++++++-------- indra/newview/llurldispatcher.h | 3 +++ indra/newview/llurldispatcherlistener.cpp | 2 +- indra/newview/llviewermedia.cpp | 3 ++- indra/newview/llviewerregion.cpp | 2 +- indra/newview/llviewerwindow.cpp | 4 ++-- indra/newview/llworldmapview.cpp | 2 +- 15 files changed, 55 insertions(+), 21 deletions(-) diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp index 57f91a57ca..2103216536 100644 --- a/indra/llplugin/llpluginclassmedia.cpp +++ b/indra/llplugin/llpluginclassmedia.cpp @@ -144,6 +144,7 @@ void LLPluginClassMedia::reset() mStatusText.clear(); mProgressPercent = 0; mClickURL.clear(); + mClickNavType.clear(); mClickTarget.clear(); mClickUUID.clear(); mStatusCode = 0; @@ -1025,6 +1026,7 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message) else if(message_name == "click_nofollow") { mClickURL = message.getValue("uri"); + mClickNavType = message.getValue("nav_type"); mClickTarget.clear(); mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_CLICK_LINK_NOFOLLOW); } diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h index a940633b88..cf8d8b26b9 100644 --- a/indra/llplugin/llpluginclassmedia.h +++ b/indra/llplugin/llpluginclassmedia.h @@ -226,6 +226,9 @@ public: // This is valid after MEDIA_EVENT_CLICK_LINK_HREF or MEDIA_EVENT_CLICK_LINK_NOFOLLOW std::string getClickURL() const { return mClickURL; }; + // This is valid after MEDIA_EVENT_CLICK_LINK_NOFOLLOW + std::string getClickNavType() const { return mClickNavType; }; + // This is valid after MEDIA_EVENT_CLICK_LINK_HREF std::string getClickTarget() const { return mClickTarget; }; @@ -380,6 +383,7 @@ protected: int mProgressPercent; std::string mLocation; std::string mClickURL; + std::string mClickNavType; std::string mClickTarget; std::string mClickUUID; S32 mGeometryX; diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp index c1bc9adec0..61548a1ab4 100644 --- a/indra/media_plugins/webkit/media_plugin_webkit.cpp +++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp @@ -528,6 +528,11 @@ private: { LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "click_nofollow"); message.setValue("uri", event.getEventUri()); +#if LLQTWEBKIT_API_VERSION >= 7 + message.setValue("nav_type", event.getNavigationType()); +#else + message.setValue("nav_type", "clicked"); +#endif sendMessage(message); } diff --git a/indra/newview/llagentlistener.cpp b/indra/newview/llagentlistener.cpp index d520debc31..e6f1c04675 100644 --- a/indra/newview/llagentlistener.cpp +++ b/indra/newview/llagentlistener.cpp @@ -64,7 +64,7 @@ void LLAgentListener::requestTeleport(LLSD const & event_data) const params.append(event_data["x"]); params.append(event_data["y"]); params.append(event_data["z"]); - LLCommandDispatcher::dispatch("teleport", params, LLSD(), NULL, true); + LLCommandDispatcher::dispatch("teleport", params, LLSD(), NULL, "clicked", true); // *TODO - lookup other LLCommandHandlers for "agent", "classified", "event", "group", "floater", "parcel", "login", login_refresh", "balance", "chat" // should we just compose LLCommandHandler and LLDispatchListener? } @@ -74,7 +74,7 @@ void LLAgentListener::requestTeleport(LLSD const & event_data) const LLVector3(event_data["x"].asReal(), event_data["y"].asReal(), event_data["z"].asReal())).getSLURLString(); - LLURLDispatcher::dispatch(url, NULL, false); + LLURLDispatcher::dispatch(url, "clicked", NULL, false); } } diff --git a/indra/newview/llcommanddispatcherlistener.cpp b/indra/newview/llcommanddispatcherlistener.cpp index 5744d055a9..586f45fd8f 100644 --- a/indra/newview/llcommanddispatcherlistener.cpp +++ b/indra/newview/llcommanddispatcherlistener.cpp @@ -65,7 +65,7 @@ void LLCommandDispatcherListener::dispatch(const LLSD& params) const trusted_browser = params["trusted"].asBoolean(); } LLCommandDispatcher::dispatch(params["cmd"], params["params"], params["query"], NULL, - trusted_browser); + "clicked", trusted_browser); } void LLCommandDispatcherListener::enumerate(const LLSD& params) const diff --git a/indra/newview/llcommandhandler.cpp b/indra/newview/llcommandhandler.cpp index 1b6ba02aac..bb1fb41fae 100755 --- a/indra/newview/llcommandhandler.cpp +++ b/indra/newview/llcommandhandler.cpp @@ -35,7 +35,7 @@ // system includes #include <boost/tokenizer.hpp> -#define THROTTLE_PERIOD 5 // required secs between throttled commands +#define THROTTLE_PERIOD 20 // required secs between throttled commands static LLCommandDispatcherListener sCommandDispatcherListener; @@ -59,6 +59,7 @@ public: const LLSD& params, const LLSD& query_map, LLMediaCtrl* web, + const std::string& nav_type, bool trusted_browser); private: @@ -91,6 +92,7 @@ bool LLCommandHandlerRegistry::dispatch(const std::string& cmd, const LLSD& params, const LLSD& query_map, LLMediaCtrl* web, + const std::string& nav_type, bool trusted_browser) { static bool slurl_blocked = false; @@ -120,6 +122,14 @@ bool LLCommandHandlerRegistry::dispatch(const std::string& cmd, return true; case LLCommandHandler::UNTRUSTED_THROTTLE: + // if users actually click on a link, we don't need to throttle it + // (throttling mechanism is used to prevent an avalanche of clicks via + // javascript + if ( nav_type == "clicked" ) + { + break; + } + cur_time = LLTimer::getElapsedSeconds(); if (cur_time < last_throttle_time + THROTTLE_PERIOD) { @@ -166,10 +176,11 @@ bool LLCommandDispatcher::dispatch(const std::string& cmd, const LLSD& params, const LLSD& query_map, LLMediaCtrl* web, + const std::string& nav_type, bool trusted_browser) { return LLCommandHandlerRegistry::instance().dispatch( - cmd, params, query_map, web, trusted_browser); + cmd, params, query_map, web, nav_type, trusted_browser); } static std::string lookup(LLCommandHandler::EUntrustedAccess value); diff --git a/indra/newview/llcommandhandler.h b/indra/newview/llcommandhandler.h index 1e65b6de23..1e0895565a 100644 --- a/indra/newview/llcommandhandler.h +++ b/indra/newview/llcommandhandler.h @@ -95,6 +95,7 @@ public: const LLSD& params, const LLSD& query_map, LLMediaCtrl* web, + const std::string& nav_type, bool trusted_browser); // Execute a command registered via the above mechanism, // passing string parameters. diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 8fccb35886..bfa8cf09fd 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -2717,7 +2717,7 @@ bool LLStartUp::dispatchURL() || (dx*dx > SLOP*SLOP) || (dy*dy > SLOP*SLOP) ) { - LLURLDispatcher::dispatch(getStartSLURL().getSLURLString(), + LLURLDispatcher::dispatch(getStartSLURL().getSLURLString(), "clicked", NULL, false); } return true; diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp index ebbb045f0a..ed4d278e90 100644 --- a/indra/newview/llurldispatcher.cpp +++ b/indra/newview/llurldispatcher.cpp @@ -53,6 +53,7 @@ class LLURLDispatcherImpl { public: static bool dispatch(const LLSLURL& slurl, + const std::string& nav_type, LLMediaCtrl* web, bool trusted_browser); // returns true if handled or explicitly blocked. @@ -61,6 +62,7 @@ public: private: static bool dispatchCore(const LLSLURL& slurl, + const std::string& nav_type, bool right_mouse, LLMediaCtrl* web, bool trusted_browser); @@ -71,6 +73,7 @@ private: // Returns true if handled. static bool dispatchApp(const LLSLURL& slurl, + const std::string& nav_type, bool right_mouse, LLMediaCtrl* web, bool trusted_browser); @@ -78,7 +81,7 @@ private: // by showing panel in Search floater. // Returns true if handled or explicitly blocked. - static bool dispatchRegion(const LLSLURL& slurl, bool right_mouse); + static bool dispatchRegion(const LLSLURL& slurl, const std::string& nav_type, bool right_mouse); // handles secondlife://Ahern/123/45/67/ // Returns true if handled. @@ -97,6 +100,7 @@ private: // static bool LLURLDispatcherImpl::dispatchCore(const LLSLURL& slurl, + const std::string& nav_type, bool right_mouse, LLMediaCtrl* web, bool trusted_browser) @@ -105,9 +109,9 @@ bool LLURLDispatcherImpl::dispatchCore(const LLSLURL& slurl, switch(slurl.getType()) { case LLSLURL::APP: - return dispatchApp(slurl, right_mouse, web, trusted_browser); + return dispatchApp(slurl, nav_type, right_mouse, web, trusted_browser); case LLSLURL::LOCATION: - return dispatchRegion(slurl, right_mouse); + return dispatchRegion(slurl, nav_type, right_mouse); default: return false; } @@ -122,11 +126,12 @@ bool LLURLDispatcherImpl::dispatchCore(const LLSLURL& slurl, // static bool LLURLDispatcherImpl::dispatch(const LLSLURL& slurl, + const std::string& nav_type, LLMediaCtrl* web, bool trusted_browser) { const bool right_click = false; - return dispatchCore(slurl, right_click, web, trusted_browser); + return dispatchCore(slurl, nav_type, right_click, web, trusted_browser); } // static @@ -135,11 +140,12 @@ bool LLURLDispatcherImpl::dispatchRightClick(const LLSLURL& slurl) const bool right_click = true; LLMediaCtrl* web = NULL; const bool trusted_browser = false; - return dispatchCore(slurl, right_click, web, trusted_browser); + return dispatchCore(slurl, "clicked", right_click, web, trusted_browser); } // static bool LLURLDispatcherImpl::dispatchApp(const LLSLURL& slurl, + const std::string& nav_type, bool right_mouse, LLMediaCtrl* web, bool trusted_browser) @@ -147,7 +153,7 @@ bool LLURLDispatcherImpl::dispatchApp(const LLSLURL& slurl, llinfos << "cmd: " << slurl.getAppCmd() << " path: " << slurl.getAppPath() << " query: " << slurl.getAppQuery() << llendl; const LLSD& query_map = LLURI::queryMap(slurl.getAppQuery()); bool handled = LLCommandDispatcher::dispatch( - slurl.getAppCmd(), slurl.getAppPath(), query_map, web, trusted_browser); + slurl.getAppCmd(), slurl.getAppPath(), query_map, web, nav_type, trusted_browser); // alert if we didn't handle this secondlife:///app/ SLURL // (but still return true because it is a valid app SLURL) @@ -159,7 +165,7 @@ bool LLURLDispatcherImpl::dispatchApp(const LLSLURL& slurl, } // static -bool LLURLDispatcherImpl::dispatchRegion(const LLSLURL& slurl, bool right_mouse) +bool LLURLDispatcherImpl::dispatchRegion(const LLSLURL& slurl, const std::string& nav_type, bool right_mouse) { if(slurl.getType() != LLSLURL::LOCATION) { @@ -287,10 +293,11 @@ LLTeleportHandler gTeleportHandler; // static bool LLURLDispatcher::dispatch(const std::string& slurl, + const std::string& nav_type, LLMediaCtrl* web, bool trusted_browser) { - return LLURLDispatcherImpl::dispatch(LLSLURL(slurl), web, trusted_browser); + return LLURLDispatcherImpl::dispatch(LLSLURL(slurl), nav_type, web, trusted_browser); } // static @@ -310,7 +317,7 @@ bool LLURLDispatcher::dispatchFromTextEditor(const std::string& slurl) // *TODO: Make this trust model more refined. JC const bool trusted_browser = true; LLMediaCtrl* web = NULL; - return LLURLDispatcherImpl::dispatch(LLSLURL(slurl), web, trusted_browser); + return LLURLDispatcherImpl::dispatch(LLSLURL(slurl), "clicked", web, trusted_browser); } diff --git a/indra/newview/llurldispatcher.h b/indra/newview/llurldispatcher.h index b07db4da3f..6309a97af5 100644 --- a/indra/newview/llurldispatcher.h +++ b/indra/newview/llurldispatcher.h @@ -33,6 +33,7 @@ class LLURLDispatcher public: static bool dispatch(const std::string& slurl, + const std::string& nav_type, LLMediaCtrl* web, bool trusted_browser); // At startup time and on clicks in internal web browsers, @@ -41,6 +42,8 @@ public: // secondlife://RegionName/123/45/67/ // secondlife:///app/agent/3d6181b0-6a4b-97ef-18d8-722652995cf1/show // sl://app/foo/bar + // @param nav_type + // type of navigation type (see LLQtWebKit::LLWebPage::acceptNavigationRequest) // @param web // Pointer to LLMediaCtrl sending URL, can be NULL // @param trusted_browser diff --git a/indra/newview/llurldispatcherlistener.cpp b/indra/newview/llurldispatcherlistener.cpp index d0441d7bfa..c7b9afafef 100644 --- a/indra/newview/llurldispatcherlistener.cpp +++ b/indra/newview/llurldispatcherlistener.cpp @@ -61,7 +61,7 @@ void LLURLDispatcherListener::dispatch(const LLSD& params) const // But for testing, allow a caller to specify untrusted. trusted_browser = params["trusted"].asBoolean(); } - LLURLDispatcher::dispatch(params["url"], NULL, trusted_browser); + LLURLDispatcher::dispatch(params["url"], "clicked", NULL, trusted_browser); } void LLURLDispatcherListener::dispatchRightClick(const LLSD& params) const diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index c2d630ece2..037e22584f 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -2984,7 +2984,8 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla { LL_DEBUGS("Media") << "MEDIA_EVENT_CLICK_LINK_NOFOLLOW, uri is: " << plugin->getClickURL() << LL_ENDL; std::string url = plugin->getClickURL(); - LLURLDispatcher::dispatch(url, NULL, mTrustedBrowser); + std::string nav_type = plugin->getClickNavType(); + LLURLDispatcher::dispatch(url, nav_type, NULL, mTrustedBrowser); } break; case MEDIA_EVENT_CLICK_LINK_HREF: diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index e1d3e8a0b3..6ae143d299 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -111,7 +111,7 @@ public: } // Process the SLapp as if it was a secondlife://{PLACE} SLurl - LLURLDispatcher::dispatch(url, web, true); + LLURLDispatcher::dispatch(url, "clicked", web, true); return true; } }; diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 014d64176a..cd19d0c5cd 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -915,7 +915,7 @@ LLWindowCallbacks::DragNDropResult LLViewerWindow::handleDragNDrop( LLWindow *wi { if (drop) { - LLURLDispatcher::dispatch( dropped_slurl.getSLURLString(), NULL, true ); + LLURLDispatcher::dispatch( dropped_slurl.getSLURLString(), "clicked", NULL, true ); return LLWindowCallbacks::DND_MOVE; } return LLWindowCallbacks::DND_COPY; @@ -1306,7 +1306,7 @@ void LLViewerWindow::handleDataCopy(LLWindow *window, S32 data_type, void *data) std::string url = (const char*)data; LLMediaCtrl* web = NULL; const bool trusted_browser = false; - if (LLURLDispatcher::dispatch(url, web, trusted_browser)) + if (LLURLDispatcher::dispatch(url, "clicked", web, trusted_browser)) { // bring window to foreground, as it has just been "launched" from a URL mWindow->bringToFront(); diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index 8ef3a3b839..8cdb615686 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -1745,7 +1745,7 @@ BOOL LLWorldMapView::handleDoubleClick( S32 x, S32 y, MASK mask ) // Invoke the event details floater if someone is clicking on an event. LLSD params(LLSD::emptyArray()); params.append(event_id); - LLCommandDispatcher::dispatch("event", params, LLSD(), NULL, true); + LLCommandDispatcher::dispatch("event", params, LLSD(), NULL, "clicked", true); break; } case MAP_ITEM_LAND_FOR_SALE: -- cgit v1.2.3 From 3df0b60b3ad338a62a27e1492990f15c1393ea03 Mon Sep 17 00:00:00 2001 From: "alain@945battery-guestA-183.lindenlab.com" <alain@945battery-guestA-183.lindenlab.com> Date: Fri, 25 Mar 2011 13:58:23 -0700 Subject: revert packaging of openal libs. --- indra/newview/viewer_manifest.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 0de6817072..39ac03cd20 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -953,11 +953,7 @@ class Linux_i686Manifest(LinuxManifest): self.path("libopenjpeg.so.1") self.path("libopenjpeg.so") self.path("libalut.so") - self.path("libalut.so.0") - self.path("libalut.so.0.0.0") self.path("libopenal.so") - self.path("libopenal.so.1") - self.path("libopenal.so.1.12.854") self.path("libopenal.so", "libvivoxoal.so.1") # vivox's sdk expects this soname self.path("libfontconfig.so.1.4.4") try: -- cgit v1.2.3 From c7cacf7d67993c1309cae25ef495ad617a7b5bbc Mon Sep 17 00:00:00 2001 From: Jonathan Yap <none@none> Date: Fri, 25 Mar 2011 17:17:05 -0400 Subject: STORM-1108 Enable Hints menu entry/preference is confusing --- doc/contributions.txt | 1 + .../skins/default/xui/en/panel_preferences_general.xml | 11 ----------- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/doc/contributions.txt b/doc/contributions.txt index 560bedd518..65ba8b3fc8 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -413,6 +413,7 @@ Jonathan Yap STORM-990 STORM-1020 STORM-1064 + STORM-1108 Kage Pixel VWR-11 Ken March diff --git a/indra/newview/skins/default/xui/en/panel_preferences_general.xml b/indra/newview/skins/default/xui/en/panel_preferences_general.xml index 36f8f99178..84cfd31e05 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml @@ -307,17 +307,6 @@ tool_tip="Check to use display names in chat, IM, name tags, etc." top_pad="3"/> - <check_box - control_name="EnableUIHints" - follows="top|left" - height="16" - label="Enable Viewer UI Hints" - layout="topleft" - left="27" - name="viewer_hints_check" - top_pad="5" - width="237"/> - <text type="string" length="1" -- cgit v1.2.3 From 567035a2f758fc99ab09b8c9e802dfc881fc301b Mon Sep 17 00:00:00 2001 From: Jonathan Yap <none@none> Date: Fri, 25 Mar 2011 17:58:20 -0400 Subject: STORM-1094 Chat preferences > font size should increase size of input text in IM window --- doc/contributions.txt | 1 + indra/llui/lllineeditor.cpp | 5 +++++ indra/llui/lllineeditor.h | 1 + indra/newview/llimfloater.cpp | 3 +++ 4 files changed, 10 insertions(+) diff --git a/doc/contributions.txt b/doc/contributions.txt index 560bedd518..609bedf5ec 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -413,6 +413,7 @@ Jonathan Yap STORM-990 STORM-1020 STORM-1064 + STORM-1094 Kage Pixel VWR-11 Ken March diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index 7e348656a9..900742ed6c 100644 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -2290,3 +2290,8 @@ void LLLineEditor::setContextMenu(LLContextMenu* new_context_menu) else mContextMenuHandle.markDead(); } + +void LLLineEditor::setFont(const LLFontGL* font) +{ + mGLFont = font; +} \ No newline at end of file diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h index 723423a5b9..7b5fa218f2 100644 --- a/indra/llui/lllineeditor.h +++ b/indra/llui/lllineeditor.h @@ -201,6 +201,7 @@ public: const LLColor4& getTentativeFgColor() const { return mTentativeFgColor.get(); } const LLFontGL* getFont() const { return mGLFont; } + void setFont(const LLFontGL* font); void setIgnoreArrowKeys(BOOL b) { mIgnoreArrowKeys = b; } void setIgnoreTab(BOOL b) { mIgnoreTab = b; } diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index f74ae92a7b..a15d134f87 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -56,6 +56,7 @@ #include "llrootview.h" #include "llspeakers.h" #include "llsidetray.h" +#include "llviewerchat.h" static const S32 RECT_PADDING_NOT_INIT = -1; @@ -891,6 +892,7 @@ void LLIMFloater::updateChatHistoryStyle() void LLIMFloater::processChatHistoryStyleUpdate(const LLSD& newvalue) { + LLFontGL* font = LLViewerChat::getChatFont(); LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("impanel"); for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter) @@ -899,6 +901,7 @@ void LLIMFloater::processChatHistoryStyleUpdate(const LLSD& newvalue) if (floater) { floater->updateChatHistoryStyle(); + floater->mInputEditor->setFont(font); } } -- cgit v1.2.3 From d01afc8a6a1af4df7208724c71f916b5c111da95 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Fri, 25 Mar 2011 16:24:56 -0700 Subject: SOCIAL-751 FIX Don't Quit button on 'Changing modes...' dialog gives the false impression that it does nothing combo box now changes back to previous label when selecting don't quit --- indra/newview/llpanellogin.cpp | 21 +++++++++++++-------- indra/newview/llpanellogin.h | 4 ++-- indra/newview/skins/default/xui/en/panel_login.xml | 1 - indra/newview/skins/minimal/xui/en/panel_login.xml | 1 - 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 903cf4780d..7820ac3ecd 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -214,7 +214,9 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, } updateLocationCombo(false); - gSavedSettings.getControl("SessionSettingsFile")->getSignal()->connect(boost::bind(&onModeChange)); + LLUICtrl& mode_combo = getChildRef<LLUICtrl>("mode_combo"); + mode_combo.setValue(gSavedSettings.getString("SessionSettingsFile")); + mode_combo.setCommitCallback(boost::bind(&LLPanelLogin::onModeChange, this, getChild<LLUICtrl>("mode_combo")->getValue(), _2)); LLComboBox* server_choice_combo = sInstance->getChild<LLComboBox>("server_combo"); server_choice_combo->setCommitCallback(onSelectServer, NULL); @@ -1159,23 +1161,26 @@ void LLPanelLogin::updateLoginPanelLinks() sInstance->getChildView("forgot_password_text")->setVisible( system_grid); } -//static -void LLPanelLogin::onModeChange() +void LLPanelLogin::onModeChange(const LLSD& original_value, const LLSD& new_value) { - LLNotificationsUtil::add("ModeChange", LLSD(), LLSD(), boost::bind(&onModeChangeConfirm, _1, _2)); + if (original_value.asString() != new_value.asString()) + { + LLNotificationsUtil::add("ModeChange", LLSD(), LLSD(), boost::bind(&LLPanelLogin::onModeChangeConfirm, this, original_value, new_value, _1, _2)); + } } -//static -void LLPanelLogin::onModeChangeConfirm(const LLSD& notification, const LLSD& response) +void LLPanelLogin::onModeChangeConfirm(const LLSD& original_value, const LLSD& new_value, const LLSD& notification, const LLSD& response) { S32 option = LLNotificationsUtil::getSelectedOption(notification, response); switch (option) { case 0: - LLAppViewer::instance()->requestQuit(); + gSavedSettings.getControl("SessionSettingsFile")->set(new_value); + LLAppViewer::instance()->forceQuit(); break; case 1: - // do nothing + // revert to original value + getChild<LLUICtrl>("mode_combo")->setValue(original_value); break; default: break; diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h index 1430bec832..9cc5e3456a 100644 --- a/indra/newview/llpanellogin.h +++ b/indra/newview/llpanellogin.h @@ -98,8 +98,8 @@ private: static void onServerComboLostFocus(LLFocusableElement*); static void updateServerCombo(); static void updateStartSLURL(); - static void onModeChange(); - static void onModeChangeConfirm(const LLSD& notification, const LLSD& response); + void onModeChange(const LLSD& original_value, const LLSD& new_value); + void onModeChangeConfirm(const LLSD& original_value, const LLSD& new_value, const LLSD& notification, const LLSD& response); static void updateLoginPanelLinks(); diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml index 4c2faddfe4..8d0f1437e6 100644 --- a/indra/newview/skins/default/xui/en/panel_login.xml +++ b/indra/newview/skins/default/xui/en/panel_login.xml @@ -133,7 +133,6 @@ label="Remember password" max_chars="128" tool_tip="Select your mode. Choose Basic for fast, easy exploration and chat. Choose Advanced to access more features." top_pad="0" - control_name="SessionSettingsFile" name="mode_combo" width="110"> <combo_box.item diff --git a/indra/newview/skins/minimal/xui/en/panel_login.xml b/indra/newview/skins/minimal/xui/en/panel_login.xml index ef058e5567..3903658e71 100644 --- a/indra/newview/skins/minimal/xui/en/panel_login.xml +++ b/indra/newview/skins/minimal/xui/en/panel_login.xml @@ -134,7 +134,6 @@ top="20" max_chars="128" top_pad="0" tool_tip="Select your mode. Choose Basic for fast, easy exploration and chat. Choose Advanced to access more features." - control_name="SessionSettingsFile" name="mode_combo" width="120"> <combo_box.item -- cgit v1.2.3 From f443f3e84725d01d47b96a3385ee9ccc494ede89 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Fri, 25 Mar 2011 19:13:32 -0700 Subject: SOCIAL-717 FIX Artwork for click to move hint updated resize logic for hint popups to accomodate image size --- indra/llui/lliconctrl.h | 1 + indra/newview/app_settings/settings.xml | 2 +- indra/newview/llfirstuse.cpp | 6 +++- indra/newview/llhints.cpp | 14 +++++++++ indra/newview/llnavigationbar.cpp | 3 ++ .../newview/skins/default/xui/en/notifications.xml | 8 +++-- indra/newview/skins/default/xui/en/panel_hint.xml | 2 +- .../skins/default/xui/en/panel_hint_image.xml | 34 +++++++++++++-------- .../skins/minimal/textures/click_to_move.png | Bin 0 -> 8188 bytes indra/newview/skins/minimal/textures/textures.xml | 1 + 10 files changed, 54 insertions(+), 17 deletions(-) create mode 100644 indra/newview/skins/minimal/textures/click_to_move.png diff --git a/indra/llui/lliconctrl.h b/indra/llui/lliconctrl.h index e9bdab2d47..669e126266 100644 --- a/indra/llui/lliconctrl.h +++ b/indra/llui/lliconctrl.h @@ -69,6 +69,7 @@ public: void setColor(const LLColor4& color) { mColor = color; } void setImage(LLPointer<LLUIImage> image) { mImagep = image; } + const LLPointer<LLUIImage> getImage() { return mImagep; } private: void setIconImageDrawSize() ; diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 04045585a0..b966447942 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -12364,7 +12364,7 @@ <key>Type</key> <string>F32</string> <key>Value</key> - <real>120.0</real> + <real>1.0</real> </map> <key>DestinationGuideHintTimeout</key> <map> diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp index e319418def..1c15360b09 100644 --- a/indra/newview/llfirstuse.cpp +++ b/indra/newview/llfirstuse.cpp @@ -115,7 +115,11 @@ void LLFirstUse::notMoving(bool enable) { // fire off 2 notifications and rely on filtering to select the relevant one firstUseNotification("FirstNotMoving", enable, "HintMove", LLSD(), LLSD().with("target", "move_btn").with("direction", "top")); - firstUseNotification("FirstNotMoving", enable, "HintMoveArrows", LLSD(), LLSD().with("target", "bottom_tray").with("direction", "top").with("hint_image", "arrow_keys.png").with("down_arrow", "")); + firstUseNotification("FirstNotMoving", enable, "HintMoveClick", LLSD(), LLSD() + .with("target", "nav_bar") + .with("direction", "bottom") + .with("hint_image", "click_to_move.png") + .with("up_arrow", "")); } // static diff --git a/indra/newview/llhints.cpp b/indra/newview/llhints.cpp index c4dcaf11f9..97f0e36a0c 100644 --- a/indra/newview/llhints.cpp +++ b/indra/newview/llhints.cpp @@ -191,6 +191,8 @@ BOOL LLHintPopup::postBuild() LLRect text_bounds = hint_text.getTextBoundingRect(); S32 delta_height = text_bounds.getHeight() - hint_text.getRect().getHeight(); reshape(getRect().getWidth(), getRect().getHeight() + delta_height); + hint_text.reshape(hint_text.getRect().getWidth(), hint_text.getRect().getHeight() + delta_height); + hint_text.translate(0, -delta_height); return TRUE; } @@ -211,6 +213,18 @@ void LLHintPopup::draw() alpha = clamp_rescale(mFadeTimer.getElapsedTimeF32(), 0.f, mFadeInTime, 0.f, 1.f); } + LLIconCtrl& hint_icon = getChildRef<LLIconCtrl>("hint_image"); + + LLUIImagePtr hint_image = hint_icon.getImage(); + S32 image_height = hint_image.isNull() ? 0 : hint_image->getHeight(); + S32 image_width = hint_image.isNull() ? 0 : hint_image->getWidth(); + + S32 delta_height = image_height - hint_icon.getRect().getHeight(); + hint_icon.getParent()->reshape(image_width, image_height); + + LLRect hint_rect = getLocalRect(); + reshape(hint_rect.getWidth(), hint_rect.getHeight() + delta_height); + { LLViewDrawContext context(alpha); if (mTarget.empty()) diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp index 3b160ddc8e..b8832dfd8e 100644 --- a/indra/newview/llnavigationbar.cpp +++ b/indra/newview/llnavigationbar.cpp @@ -57,6 +57,7 @@ #include "llviewercontrol.h" #include "llfloatermediabrowser.h" #include "llweb.h" +#include "llhints.h" #include "llinventorymodel.h" #include "lllandmarkactions.h" @@ -324,6 +325,8 @@ BOOL LLNavigationBar::postBuild() LLTeleportHistory::getInstance()->setHistoryChangedCallback( boost::bind(&LLNavigationBar::onTeleportHistoryChanged, this)); + LLHints::registerHintTarget("nav_bar", LLView::getHandle()); + return TRUE; } diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 6ecaef1bf3..ad68e50e77 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -7034,11 +7034,15 @@ Mute everyone? </notification> <notification - name="HintMoveArrows" + name="HintMoveClick" label="Move" type="hint" unique="true"> - To walk, use the directional keys on your keyboard. You can run by pressing the Up arrow twice. +Click to Walk +Click anywhere on the ground to walk to that spot. + +Click and Drag to Rotate View +Click and drag anywhere on the world to rotate your view <tag>custom_skin</tag> </notification> diff --git a/indra/newview/skins/default/xui/en/panel_hint.xml b/indra/newview/skins/default/xui/en/panel_hint.xml index e2e9d0aef0..c883fd8a1d 100644 --- a/indra/newview/skins/default/xui/en/panel_hint.xml +++ b/indra/newview/skins/default/xui/en/panel_hint.xml @@ -16,7 +16,7 @@ right="197" top="26" bottom="92" - follows="all" + follows="left|right|bottom" text_color="Black" wrap="true"/> <button right="197" diff --git a/indra/newview/skins/default/xui/en/panel_hint_image.xml b/indra/newview/skins/default/xui/en/panel_hint_image.xml index 00b6e42497..30dd1836f1 100644 --- a/indra/newview/skins/default/xui/en/panel_hint_image.xml +++ b/indra/newview/skins/default/xui/en/panel_hint_image.xml @@ -1,33 +1,43 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel - width="205" + width="305" height="140" layout="topleft"> <text name="hint_title" font="SansSerifMedium" left="8" - right="180" + right="290" top="8" bottom="20" follows="left|right|top" text_color="Black" wrap="false"/> - <icon name="hint_image" - left="42" - top="25" - width="115" - height="86" - image_name="arrow_keys.png" - /> + <layout_stack left="0" + top="25" + width="305" + height="0" + follows="all" + orientation="horizontal"> + <layout_panel auto_resize="true" width="100"/> + <layout_panel auto_resize="true" width="0"> + <icon name="hint_image" + top="0" + left="0" + height="0" + width="0" + follows="all"/> + </layout_panel> + <layout_panel auto_resize="true" width="100"/> + </layout_stack> <text name="hint_text" left="8" - right="197" + right="297" top_pad="5" bottom="120" - follows="all" + follows="left|right|bottom" text_color="Black" wrap="true"/> - <button right="197" + <button right="297" top="8" width="16" height="16" diff --git a/indra/newview/skins/minimal/textures/click_to_move.png b/indra/newview/skins/minimal/textures/click_to_move.png new file mode 100644 index 0000000000..74e3faa8ff Binary files /dev/null and b/indra/newview/skins/minimal/textures/click_to_move.png differ diff --git a/indra/newview/skins/minimal/textures/textures.xml b/indra/newview/skins/minimal/textures/textures.xml index 3e2f5cd397..b4848a0619 100644 --- a/indra/newview/skins/minimal/textures/textures.xml +++ b/indra/newview/skins/minimal/textures/textures.xml @@ -2,6 +2,7 @@ <textures version="101"> <texture name="Button_Separator" file_name="bottomtray/button_separator.png" preload="true" /> <texture name="arrow_keys.png"/> + <texture name="click_to_move" file_name="click_to_move.png"/> <texture name="bottomtray_close_off" file_name="bottomtray/close_off.png" preload="true" /> <texture name="bottomtray_close_over" file_name="bottomtray/close_over.png" preload="true" /> <texture name="bottomtray_close_press" file_name="bottomtray/close_press.png" preload="true" /> -- cgit v1.2.3 From b9d92585f8c2456995ff0b0c3bad865b6361f841 Mon Sep 17 00:00:00 2001 From: Eli Linden <eli@lindenlab.com> Date: Mon, 28 Mar 2011 11:42:18 -0700 Subject: catchup with viewer-development --- .../skins/default/xui/da/floater_about_land.xml | 8 - .../xui/da/floater_inventory_item_properties.xml | 6 - .../newview/skins/default/xui/da/floater_tools.xml | 6 - .../skins/default/xui/da/inspect_avatar.xml | 2 - .../skins/default/xui/da/panel_edit_profile.xml | 4 - .../skins/default/xui/da/panel_profile_view.xml | 2 - .../skins/default/xui/da/sidepanel_task_info.xml | 6 - .../skins/default/xui/de/floater_about_land.xml | 8 - .../xui/de/floater_inventory_item_properties.xml | 6 - .../skins/default/xui/de/floater_script_search.xml | 2 +- .../newview/skins/default/xui/de/floater_tools.xml | 6 - .../skins/default/xui/de/inspect_avatar.xml | 3 - .../newview/skins/default/xui/de/inspect_group.xml | 3 - .../skins/default/xui/de/panel_activeim_row.xml | 6 - .../skins/default/xui/de/panel_chat_header.xml | 1 - .../skins/default/xui/de/panel_edit_profile.xml | 4 - .../skins/default/xui/de/panel_group_invite.xml | 2 +- .../skins/default/xui/de/panel_instant_message.xml | 1 - .../skins/default/xui/de/panel_profile_view.xml | 2 - .../skins/default/xui/de/sidepanel_task_info.xml | 6 - .../skins/default/xui/en/floater_about_land.xml | 38 +- .../default/xui/en/floater_hardware_settings.xml | 2 +- .../xui/en/floater_inventory_item_properties.xml | 6 +- .../xui/en/floater_region_debug_console.xml | 3 +- .../newview/skins/default/xui/en/floater_tools.xml | 59 +- .../skins/default/xui/en/floater_ui_preview.xml | 4 + .../skins/default/xui/en/inspect_avatar.xml | 9 +- .../newview/skins/default/xui/en/inspect_group.xml | 3 +- indra/newview/skins/default/xui/en/main_view.xml | 7 + .../skins/default/xui/en/menu_attachment_self.xml | 2 +- .../skins/default/xui/en/menu_avatar_self.xml | 2 +- .../skins/default/xui/en/menu_bottomtray.xml | 12 + .../default/xui/en/menu_inspect_self_gear.xml | 240 ++++++- indra/newview/skins/default/xui/en/menu_viewer.xml | 13 +- .../newview/skins/default/xui/en/notifications.xml | 791 +++++++++++++++++---- .../skins/default/xui/en/panel_activeim_row.xml | 3 +- .../skins/default/xui/en/panel_bottomtray.xml | 35 +- .../skins/default/xui/en/panel_chat_header.xml | 3 +- .../skins/default/xui/en/panel_edit_pick.xml | 10 +- .../skins/default/xui/en/panel_edit_profile.xml | 12 +- .../skins/default/xui/en/panel_group_general.xml | 6 +- .../skins/default/xui/en/panel_instant_message.xml | 3 +- indra/newview/skins/default/xui/en/panel_login.xml | 41 +- .../skins/default/xui/en/panel_main_inventory.xml | 2 +- .../default/xui/en/panel_outfits_inventory.xml | 8 +- .../newview/skins/default/xui/en/panel_people.xml | 26 +- .../newview/skins/default/xui/en/panel_places.xml | 18 +- .../skins/default/xui/en/panel_profile_view.xml | 6 +- .../skins/default/xui/en/panel_script_ed.xml | 4 + .../skins/default/xui/en/sidepanel_inventory.xml | 36 +- .../skins/default/xui/en/sidepanel_task_info.xml | 6 +- indra/newview/skins/default/xui/en/strings.xml | 18 + .../skins/default/xui/es/floater_about_land.xml | 8 - .../xui/es/floater_inventory_item_properties.xml | 6 - .../newview/skins/default/xui/es/floater_tools.xml | 6 - .../skins/default/xui/es/inspect_avatar.xml | 2 - .../skins/default/xui/es/panel_edit_profile.xml | 4 - .../skins/default/xui/es/panel_landmark_info.xml | 2 +- .../skins/default/xui/es/panel_place_profile.xml | 4 +- .../skins/default/xui/es/panel_profile_view.xml | 2 - .../skins/default/xui/es/panel_region_covenant.xml | 7 +- .../skins/default/xui/es/sidepanel_task_info.xml | 6 - indra/newview/skins/default/xui/es/strings.xml | 2 +- .../skins/default/xui/fr/floater_about_land.xml | 8 - .../xui/fr/floater_inventory_item_properties.xml | 6 - .../newview/skins/default/xui/fr/floater_tools.xml | 6 - .../skins/default/xui/fr/inspect_avatar.xml | 3 - .../newview/skins/default/xui/fr/inspect_group.xml | 3 - .../skins/default/xui/fr/panel_activeim_row.xml | 6 - .../skins/default/xui/fr/panel_chat_header.xml | 1 - .../skins/default/xui/fr/panel_edit_profile.xml | 4 - .../skins/default/xui/fr/panel_instant_message.xml | 1 - .../skins/default/xui/fr/panel_profile_view.xml | 2 - .../skins/default/xui/fr/sidepanel_task_info.xml | 6 - .../skins/default/xui/it/floater_about_land.xml | 10 +- .../xui/it/floater_inventory_item_properties.xml | 6 - .../newview/skins/default/xui/it/floater_tools.xml | 6 - .../skins/default/xui/it/panel_profile_view.xml | 1 - .../skins/default/xui/it/sidepanel_task_info.xml | 6 - .../skins/default/xui/ja/floater_about_land.xml | 8 - .../xui/ja/floater_inventory_item_properties.xml | 6 - .../newview/skins/default/xui/ja/floater_tools.xml | 6 - .../skins/default/xui/ja/inspect_avatar.xml | 1 - .../newview/skins/default/xui/ja/inspect_group.xml | 3 - .../skins/default/xui/ja/panel_activeim_row.xml | 6 - .../skins/default/xui/ja/panel_chat_header.xml | 1 - .../skins/default/xui/ja/panel_instant_message.xml | 1 - .../skins/default/xui/ja/panel_profile_view.xml | 1 - .../skins/default/xui/ja/sidepanel_task_info.xml | 6 - .../skins/default/xui/nl/floater_about_land.xml | 6 +- .../xui/nl/floater_inventory_item_properties.xml | 6 - .../newview/skins/default/xui/nl/floater_tools.xml | 6 - .../skins/default/xui/pl/floater_about_land.xml | 8 - .../xui/pl/floater_inventory_item_properties.xml | 6 - .../newview/skins/default/xui/pl/floater_tools.xml | 6 - .../skins/default/xui/pl/inspect_avatar.xml | 2 - .../skins/default/xui/pl/panel_edit_profile.xml | 4 - .../skins/default/xui/pl/panel_profile_view.xml | 2 - .../skins/default/xui/pl/sidepanel_task_info.xml | 6 - .../skins/default/xui/pt/floater_about_land.xml | 8 - .../xui/pt/floater_inventory_item_properties.xml | 6 - .../newview/skins/default/xui/pt/floater_tools.xml | 6 - .../skins/default/xui/pt/inspect_avatar.xml | 2 - .../skins/default/xui/pt/panel_edit_profile.xml | 4 - .../skins/default/xui/pt/panel_group_roles.xml | 12 +- .../skins/default/xui/pt/panel_profile_view.xml | 2 - .../skins/default/xui/pt/sidepanel_task_info.xml | 6 - 107 files changed, 1137 insertions(+), 636 deletions(-) delete mode 100644 indra/newview/skins/default/xui/de/panel_activeim_row.xml delete mode 100644 indra/newview/skins/default/xui/fr/panel_activeim_row.xml delete mode 100644 indra/newview/skins/default/xui/ja/panel_activeim_row.xml diff --git a/indra/newview/skins/default/xui/da/floater_about_land.xml b/indra/newview/skins/default/xui/da/floater_about_land.xml index a096a87928..e78924a1ab 100644 --- a/indra/newview/skins/default/xui/da/floater_about_land.xml +++ b/indra/newview/skins/default/xui/da/floater_about_land.xml @@ -87,15 +87,9 @@ Gå til 'Verden' > 'Om land' eller vælg en anden parcel <text name="Owner:"> Ejer: </text> - <text name="OwnerText"> - Leyla Linden - </text> <text name="Group:"> Gruppe: </text> - <text name="GroupText"> - Leyla Linden - </text> <button label="Vælg" name="Set..."/> <check_box label="Tillad dedikering til gruppe" name="check deed" tool_tip="En gruppe administrator kan dedikere denne jord til gruppen, så det vil blive støttet af gruppen's jord tildeling."/> <button label="Dedikér" name="Deed..." tool_tip="Du kan kun dedikere jord, hvis du er en administrator i den valgte gruppe."/> @@ -396,7 +390,6 @@ Kun større parceller kan vises i søgning. Hjemmeside: </text> <button label="Vælg" name="set_media_url"/> - <check_box label="Skjul medie URL" name="hide_media_url" tool_tip="Klik her for at skjule medie adressen så det kun er dig og evt. parcel gruppens ejer/administratorer der kan se den."/> <text left="4" name="Description:"> Beskrivelse: </text> @@ -424,7 +417,6 @@ Kun større parceller kan vises i søgning. <check_box label="Gentag afspil" name="media_loop" tool_tip="Gentager automatisk medie, når det er færdigt med at spille starter det automatisk forfra."/> </panel> <panel label="LYD" name="land_audio_panel"> - <check_box label="Skjul URL" name="hide_music_url" tool_tip="Ved at vælge her, vil musik URL skjules for alle ikke autoriserede brugere der læser denne parcels information."/> <check_box label="Tillad stemmer" name="parcel_enable_voice_channel"/> <check_box label="Tillad stemmer (håndteret af estate)" name="parcel_enable_voice_channel_is_estate_disabled"/> <check_box label="Begræns stemme chat til denne parcel" name="parcel_enable_voice_channel_local"/> diff --git a/indra/newview/skins/default/xui/da/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/da/floater_inventory_item_properties.xml index fa36fab762..59dcc87140 100644 --- a/indra/newview/skins/default/xui/da/floater_inventory_item_properties.xml +++ b/indra/newview/skins/default/xui/da/floater_inventory_item_properties.xml @@ -24,16 +24,10 @@ <text name="LabelCreatorTitle"> Skaber: </text> - <text name="LabelCreatorName"> - Nicole Linden - </text> <button label="Profil..." label_selected="" name="BtnCreator"/> <text name="LabelOwnerTitle"> Ejer: </text> - <text name="LabelOwnerName"> - Thrax Linden - </text> <button label="Profil..." label_selected="" name="BtnOwner"/> <text name="LabelAcquiredTitle"> Erhvervet: diff --git a/indra/newview/skins/default/xui/da/floater_tools.xml b/indra/newview/skins/default/xui/da/floater_tools.xml index 781adcd50b..9e673d0d5b 100644 --- a/indra/newview/skins/default/xui/da/floater_tools.xml +++ b/indra/newview/skins/default/xui/da/floater_tools.xml @@ -167,15 +167,9 @@ <text name="Creator:"> Skaber: </text> - <text name="Creator Name"> - Mrs. Esbee Linden (esbee.linden) - </text> <text name="Owner:"> Ejer: </text> - <text name="Owner Name"> - Mrs. Erica "Moose" Linden (erica.linden) - </text> <text name="Group:"> Gruppe: </text> diff --git a/indra/newview/skins/default/xui/da/inspect_avatar.xml b/indra/newview/skins/default/xui/da/inspect_avatar.xml index f581210e1b..dc1ed562eb 100644 --- a/indra/newview/skins/default/xui/da/inspect_avatar.xml +++ b/indra/newview/skins/default/xui/da/inspect_avatar.xml @@ -10,8 +10,6 @@ <string name="Details"> [SL_PROFILE] </string> - <text name="user_name_small" value="Grumpity ProductEngine med et langt navn"/> - <text name="user_slid" value="james.linden"/> <text name="user_details"> Dette er min second life beskrivelse og jeg synes den er rigtig god. Men af en eller ande grund er min beskrivelse meget lang fordi jeg taler en hel masse </text> diff --git a/indra/newview/skins/default/xui/da/panel_edit_profile.xml b/indra/newview/skins/default/xui/da/panel_edit_profile.xml index 80b20f15e9..14fd48ba2f 100644 --- a/indra/newview/skins/default/xui/da/panel_edit_profile.xml +++ b/indra/newview/skins/default/xui/da/panel_edit_profile.xml @@ -26,11 +26,7 @@ <text name="display_name_label" value="Visningsnavn:"/> <text name="solo_username_label" value="Bugernavn:"/> <button name="set_name" tool_tip="Sæt visningsnavn"/> - <text name="solo_user_name" value="Hamilton Hitchings"/> - <text name="user_name" value="Hamilton Hitchings"/> - <text name="user_name_small" value="Hamilton Hitchings"/> <text name="user_label" value="Brugernavn:"/> - <text name="user_slid" value="hamilton.linden"/> <panel name="lifes_images_panel"> <icon label="" name="2nd_life_edit_icon" tool_tip="Klik for at vælge et billede"/> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_profile_view.xml b/indra/newview/skins/default/xui/da/panel_profile_view.xml index 5e0a51eb28..e6e8ca4d10 100644 --- a/indra/newview/skins/default/xui/da/panel_profile_view.xml +++ b/indra/newview/skins/default/xui/da/panel_profile_view.xml @@ -10,10 +10,8 @@ <text name="solo_username_label" value="Brugernavn:"/> <text name="status" value="Online"/> <text name="user_name_small" value="Se på mig med dette enormt ekstremt super lange navn"/> - <text name="user_name" value="Jack Linden"/> <button name="copy_to_clipboard" tool_tip="Kopiér til udskriftsholder"/> <text name="user_label" value="Brugernavn:"/> - <text name="user_slid" value="jack.linden"/> <tab_container name="tabs"> <panel label="PROFIL" name="panel_profile"/> <panel label="FAVORITTER" name="panel_picks"/> diff --git a/indra/newview/skins/default/xui/da/sidepanel_task_info.xml b/indra/newview/skins/default/xui/da/sidepanel_task_info.xml index 746cf201bc..f80d5aeb15 100644 --- a/indra/newview/skins/default/xui/da/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/da/sidepanel_task_info.xml @@ -48,15 +48,9 @@ <text name="CreatorNameLabel"> Skaber: </text> - <text name="Creator Name"> - Erica Linden - </text> <text name="Owner:"> Ejer: </text> - <text name="Owner Name"> - Erica Linden - </text> <text name="Group_label"> Gruppe: </text> diff --git a/indra/newview/skins/default/xui/de/floater_about_land.xml b/indra/newview/skins/default/xui/de/floater_about_land.xml index f9169ed748..8783b52013 100644 --- a/indra/newview/skins/default/xui/de/floater_about_land.xml +++ b/indra/newview/skins/default/xui/de/floater_about_land.xml @@ -86,15 +86,9 @@ <text name="Owner:"> Eigentümer: </text> - <text name="OwnerText"> - Leyla Linden - </text> <text name="Group:"> Gruppe: </text> - <text name="GroupText"> - Leyla Linden - </text> <button label="Festlegen" label_selected="Einstellen..." name="Set..." width="90"/> <check_box label="Übertragung an Gruppe zulassen" name="check deed" tool_tip="Ein Gruppen-Officer kann dieses Land der Gruppe übertragen. Das Land wird dann über die Landzuteilung der Gruppe verwaltet."/> <button label="Übertragung" label_selected="Übertragen..." name="Deed..." tool_tip="Sie können Land nur übertragen, wenn Sie in der ausgewählten Gruppe Officer sind."/> @@ -398,7 +392,6 @@ Nur große Parzellen können in der Suche aufgeführt werden. Homepage: </text> <button label="Festlegen" name="set_media_url"/> - <check_box label="URL ausblenden" name="hide_media_url" tool_tip="Aktivieren Sie diese Option, wenn Sie nicht möchten, dass unautorisierte Personen die Medien-URL sehen können. Diese Option ist für HTML-Medien nicht verfügbar."/> <text name="Description:"> Inhalt: </text> @@ -428,7 +421,6 @@ Nur große Parzellen können in der Suche aufgeführt werden. <text name="MusicURL:"> Musik-URL: </text> - <check_box label="URL ausblenden" name="hide_music_url" tool_tip="Aktivieren Sie diese Option, wenn Sie nicht möchten, dass unautorisierte Personen die Musik-URL sehen können"/> <text name="Sound:"> Sound: </text> diff --git a/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml index f98e23bbc4..7f48105460 100644 --- a/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml +++ b/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml @@ -24,16 +24,10 @@ <text name="LabelCreatorTitle"> Ersteller: </text> - <text name="LabelCreatorName"> - Nicole Linden - </text> <button label="Profil..." label_selected="" name="BtnCreator"/> <text name="LabelOwnerTitle"> Eigentümer: </text> - <text name="LabelOwnerName"> - Thrax Linden - </text> <button label="Profil..." label_selected="" name="BtnOwner"/> <text name="LabelAcquiredTitle"> Erworben: diff --git a/indra/newview/skins/default/xui/de/floater_script_search.xml b/indra/newview/skins/default/xui/de/floater_script_search.xml index de959cbb28..ffae96f6a1 100644 --- a/indra/newview/skins/default/xui/de/floater_script_search.xml +++ b/indra/newview/skins/default/xui/de/floater_script_search.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="script search" title="SKRIPT-SUCHE"> - <check_box label="Groß-/Kleinschreibung irrelevant" name="case_text"/> + <check_box label="Groß-/Kleinschreibung ignorieren" name="case_text"/> <button label="Suchen" label_selected="Suchen" name="search_btn"/> <button label="Ersetzen" label_selected="Ersetzen" name="replace_btn"/> <button label="Alle ersetzen" label_selected="Alle ersetzen" name="replace_all_btn"/> diff --git a/indra/newview/skins/default/xui/de/floater_tools.xml b/indra/newview/skins/default/xui/de/floater_tools.xml index 2d30814974..d201fc327c 100644 --- a/indra/newview/skins/default/xui/de/floater_tools.xml +++ b/indra/newview/skins/default/xui/de/floater_tools.xml @@ -170,15 +170,9 @@ <text name="Creator:"> Ersteller: </text> - <text name="Creator Name"> - Frau Esbee Linden (esbee.linden) - </text> <text name="Owner:"> Eigentümer: </text> - <text name="Owner Name"> - Frau Erica "Elch" Linden (erica.linden) - </text> <text name="Group:"> Gruppe: </text> diff --git a/indra/newview/skins/default/xui/de/inspect_avatar.xml b/indra/newview/skins/default/xui/de/inspect_avatar.xml index 92d9bc37c4..4b8fd8a0ad 100644 --- a/indra/newview/skins/default/xui/de/inspect_avatar.xml +++ b/indra/newview/skins/default/xui/de/inspect_avatar.xml @@ -10,9 +10,6 @@ <string name="Details"> [SL_PROFILE] </string> - <text name="user_name_small" value="Launische Produktengine mit langem Namen"/> - <text name="user_name" value="Grumpity ProductEngine"/> - <text name="user_slid" value="james.linden"/> <text name="user_subtitle" value="11 Monate und 3 Tage alt"/> <text name="user_details"> Dies ist meine Second Life-Beschreibung und ich finde sie wirklich gut! Meine Beschreibung ist deshalb so lang, weil ich gerne rede. diff --git a/indra/newview/skins/default/xui/de/inspect_group.xml b/indra/newview/skins/default/xui/de/inspect_group.xml index badb47bf08..d85ca7ce4d 100644 --- a/indra/newview/skins/default/xui/de/inspect_group.xml +++ b/indra/newview/skins/default/xui/de/inspect_group.xml @@ -16,9 +16,6 @@ <string name="YouAreMember"> Sie sind Mitglied </string> - <text name="group_name"> - Grumpitys schlecht gelaunte Elche - </text> <text name="group_subtitle"> 123 Mitglieder </text> diff --git a/indra/newview/skins/default/xui/de/panel_activeim_row.xml b/indra/newview/skins/default/xui/de/panel_activeim_row.xml deleted file mode 100644 index 84272752cf..0000000000 --- a/indra/newview/skins/default/xui/de/panel_activeim_row.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="panel_activeim_row"> - <text name="contact_name"> - Grumpity ProductEngine - </text> -</panel> diff --git a/indra/newview/skins/default/xui/de/panel_chat_header.xml b/indra/newview/skins/default/xui/de/panel_chat_header.xml index babbff3132..7916bf5155 100644 --- a/indra/newview/skins/default/xui/de/panel_chat_header.xml +++ b/indra/newview/skins/default/xui/de/panel_chat_header.xml @@ -1,5 +1,4 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="im_header" name="im_header"> - <text_editor name="user_name" value="Ericag Vader"/> <text name="time_box" value="23:30"/> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_edit_profile.xml b/indra/newview/skins/default/xui/de/panel_edit_profile.xml index be124050e8..03974e7f7f 100644 --- a/indra/newview/skins/default/xui/de/panel_edit_profile.xml +++ b/indra/newview/skins/default/xui/de/panel_edit_profile.xml @@ -29,11 +29,7 @@ <text name="display_name_label" value="Anzeigename:"/> <text name="solo_username_label" value="Benutzername:"/> <button name="set_name" tool_tip="Anzeigenamen festlegen"/> - <text name="solo_user_name" value="Hamilton Hitchings"/> - <text name="user_name" value="Hamilton Hitchings"/> - <text name="user_name_small" value="Hamilton Hitchings"/> <text name="user_label" value="Benutzername:"/> - <text name="user_slid" value="hamilton.linden"/> <panel name="lifes_images_panel"> <panel name="second_life_image_panel"> <text name="second_life_photo_title_text" value="[SECOND_LIFE]:"/> diff --git a/indra/newview/skins/default/xui/de/panel_group_invite.xml b/indra/newview/skins/default/xui/de/panel_group_invite.xml index 4e3a304609..5f323d80dd 100644 --- a/indra/newview/skins/default/xui/de/panel_group_invite.xml +++ b/indra/newview/skins/default/xui/de/panel_group_invite.xml @@ -10,7 +10,7 @@ Einige der ausgewählten Einwohner sind bereits Gruppenmitglieder und haben aus diesem Grund keine Einladung erhalten. </panel.string> <text name="help_text"> - Sie können mehrere Einwohner Ihre Gruppe einladen. Klicken Sie hierzu auf „Einwohnerliste öffnen“. + Sie können mehrere Einwohner in Ihre Gruppe einladen. Klicken Sie hierzu auf „Einwohnerliste öffnen“. </text> <button label="Einwohnerliste öffnen" name="add_button" tool_tip=""/> <name_list name="invitee_list" tool_tip="Halten Sie zur Mehrfachauswahl die Strg-Taste gedrückt und klicken Sie auf die Namen."/> diff --git a/indra/newview/skins/default/xui/de/panel_instant_message.xml b/indra/newview/skins/default/xui/de/panel_instant_message.xml index 1433552c15..372def78ca 100644 --- a/indra/newview/skins/default/xui/de/panel_instant_message.xml +++ b/indra/newview/skins/default/xui/de/panel_instant_message.xml @@ -4,7 +4,6 @@ 6 </string> <panel label="im_header" name="im_header"> - <text name="user_name" value="Erica Vader"/> <text name="time_box" value="23:30"/> </panel> <button label="Antworten" name="reply"/> diff --git a/indra/newview/skins/default/xui/de/panel_profile_view.xml b/indra/newview/skins/default/xui/de/panel_profile_view.xml index b44c128000..7e93bd1ede 100644 --- a/indra/newview/skins/default/xui/de/panel_profile_view.xml +++ b/indra/newview/skins/default/xui/de/panel_profile_view.xml @@ -10,10 +10,8 @@ <text name="solo_username_label" value="Benutzername:"/> <text name="status" value="Online"/> <text name="user_name_small" value="Dieser Name ist ein ganz außerordentlich langer Name"/> - <text name="user_name" value="Jack Linden"/> <button name="copy_to_clipboard" tool_tip="In Zwischenablage kopieren"/> <text name="user_label" value="Benutzername:"/> - <text name="user_slid" value="jack.linden"/> <tab_container name="tabs" tab_min_width="60"> <panel label="PROFIL" name="panel_profile"/> <panel label="AUSWAHL" name="panel_picks"/> diff --git a/indra/newview/skins/default/xui/de/sidepanel_task_info.xml b/indra/newview/skins/default/xui/de/sidepanel_task_info.xml index 6474576c0f..7b46ee7c9b 100644 --- a/indra/newview/skins/default/xui/de/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/de/sidepanel_task_info.xml @@ -48,15 +48,9 @@ <text name="CreatorNameLabel"> Ersteller: </text> - <text name="Creator Name"> - Erica Linden - </text> <text name="Owner:"> Eigentümer: </text> - <text name="Owner Name"> - Erica Linden - </text> <text name="Group_label"> Gruppe: </text> diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml index 937a97797d..6e985e0476 100644 --- a/indra/newview/skins/default/xui/en/floater_about_land.xml +++ b/indra/newview/skins/default/xui/en/floater_about_land.xml @@ -220,9 +220,10 @@ layout="topleft" left_pad="2" name="OwnerText" + translate="false" use_ellipses="true" width="360"> - Leyla Linden + TestString PleaseIgnore </text> <button follows="right" @@ -260,8 +261,10 @@ left_pad="2" layout="topleft" name="GroupText" + translate="false" width="240"> -Leyla Linden </text> + TestString PleaseIgnore + </text> <button follows="right" height="23" @@ -1404,6 +1407,10 @@ Only large parcels can be listed in search. label="Shopping" name="item11" value="shopping" /> + <combo_box.item + label="Rental" + name="item13" + value="rental" /> <combo_box.item label="Other" name="item12" @@ -1461,6 +1468,10 @@ Only large parcels can be listed in search. label="Shopping" name="item11" value="shopping" /> + <combo_box.item + label="Rental" + name="item13" + value="rental" /> <combo_box.item label="Other" name="item12" @@ -1638,16 +1649,6 @@ Only large parcels can be listed in search. name="set_media_url" width="70" top_delta="0"/> - <check_box - follows="top|left" - height="16" - label="Hide URL" - layout="topleft" - left="110" - name="hide_media_url" - tool_tip="Checking this option will hide the media url to any non-authorized viewers of this parcel information. Note this is not available for HTML types." - width="50" - top_pad="5"/> <text type="string" length="1" @@ -1825,15 +1826,6 @@ Only large parcels can be listed in search. top_delta="0" right="-15" select_on_focus="true" /> - <check_box - height="16" - label="Hide URL" - layout="topleft" - name="hide_music_url" - tool_tip="Checking this option will hide the music url to any non-authorized viewers of this parcel information." - left_delta="10" - top_pad="5" - width="292" /> <text type="string" length="1" @@ -2078,7 +2070,7 @@ Only large parcels can be listed in search. layout="topleft" left_pad="10" name="remove_allowed" - right="-1" + right="-10" width="100" /> </panel> <panel @@ -2128,7 +2120,7 @@ Only large parcels can be listed in search. layout="topleft" left_pad="10" name="remove_banned" - right="-1" + right="-10" width="100" /> </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/floater_hardware_settings.xml b/indra/newview/skins/default/xui/en/floater_hardware_settings.xml index 0ea42f9757..a97c697b24 100644 --- a/indra/newview/skins/default/xui/en/floater_hardware_settings.xml +++ b/indra/newview/skins/default/xui/en/floater_hardware_settings.xml @@ -96,7 +96,7 @@ left="10" max_val="2" name="gamma" - top_pad="7" + top_pad="11" width="262" /> <text type="string" diff --git a/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml index 29f09dd0b2..0cf07926c2 100644 --- a/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml +++ b/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml @@ -106,9 +106,10 @@ left_delta="78" name="LabelCreatorName" top_delta="0" + translate="false" use_ellipses="true" width="170"> - Nicole Linden + TestString PleaseIgnore </text> <button follows="top|right" @@ -140,9 +141,10 @@ left_delta="78" name="LabelOwnerName" top_delta="0" + translate="false" use_ellipses="true" width="170"> - Thrax Linden + TestString PleaseIgnore </text> <button follows="top|right" diff --git a/indra/newview/skins/default/xui/en/floater_region_debug_console.xml b/indra/newview/skins/default/xui/en/floater_region_debug_console.xml index cf95257b0a..7c7ee2df4c 100644 --- a/indra/newview/skins/default/xui/en/floater_region_debug_console.xml +++ b/indra/newview/skins/default/xui/en/floater_region_debug_console.xml @@ -2,6 +2,7 @@ <floater name="region_debug_console" title="Region Debug" + can_resize="true" layout="topleft" min_height="300" min_width="300" @@ -12,7 +13,7 @@ left="10" type="string" length="1" - follows="left|top|right|bottom" + follows="left|right|bottom" font="Monospace" height="366" width="576" diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index b16124cb7e..85182c1c28 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -248,30 +248,53 @@ function="BuildTool.commitRadioEdit"/> </radio_group> <check_box - left="10" + left="5" follows="left|top" height="28" control_name="EditLinkedParts" label="Edit linked" layout="topleft" name="checkbox edit linked parts" - top_pad="2"> + top_pad="-10"> <check_box.commit_callback function="BuildTool.selectComponent"/> </check_box> - <text - text_color="LtGray_50" - follows="top|left" - halign="left" - left="13" - name="RenderingCost" - tool_tip="Shows the rendering cost calculated for this object" - top_pad="0" - type="string" - width="100"> - þ: [COUNT] - </text> + <button + follows="left|top" + height="23" + label="Link" + top_pad="2" + layout="topleft" + left="5" + name="link_btn" + width="50"> + <button.commit_callback + function="BuildTool.LinkObjects"/> + </button> + <button + follows="left|top" + height="23" + label="Unlink" + layout="topleft" + left_pad="2" + name="unlink_btn" + width="50"> + <button.commit_callback + function="BuildTool.UnlinkObjects"/> + </button> + <text + text_color="LtGray_50" + follows="top|left" + halign="left" + left_pad="3" + name="RenderingCost" + tool_tip="Shows the rendering cost calculated for this object" + top_delta="11" + type="string" + width="100"> + þ: [COUNT] + </text> <check_box control_name="ScaleUniform" height="19" @@ -299,7 +322,7 @@ layout="topleft" left="143" name="checkbox stretch textures" - top_pad="7" + top_pad="-6" width="134" /> <check_box control_name="SnapEnabled" @@ -876,10 +899,11 @@ layout="topleft" name="Creator Name" top_delta="0" + translate="false" width="190" word_wrap="true" use_ellipses="true"> - Mrs. Esbee Linden (esbee.linden) + TestString PleaseIgnore (please.ignore) </text> <text type="string" @@ -903,10 +927,11 @@ name="Owner Name" left_pad="0" top_delta="0" + translate="false" width="190" word_wrap="true" use_ellipses="true"> - Mrs. Erica "Moose" Linden (erica.linden) + TestString PleaseIgnore (please.ignore) </text> <text type="string" diff --git a/indra/newview/skins/default/xui/en/floater_ui_preview.xml b/indra/newview/skins/default/xui/en/floater_ui_preview.xml index 12c4561753..3921cfcd2c 100644 --- a/indra/newview/skins/default/xui/en/floater_ui_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_ui_preview.xml @@ -12,6 +12,10 @@ title="XUI PREVIEW TOOL" translate="false" width="750"> + <string name="ExternalEditorNotSet"> +Select an editor by setting the environment variable LL_XUI_EDITOR +or the ExternalEditor setting +or specifying its path in the "Editor Path" field.</string> <panel bottom="640" follows="left|top|right|bottom" diff --git a/indra/newview/skins/default/xui/en/inspect_avatar.xml b/indra/newview/skins/default/xui/en/inspect_avatar.xml index 853d5f8735..bd9e367d1f 100644 --- a/indra/newview/skins/default/xui/en/inspect_avatar.xml +++ b/indra/newview/skins/default/xui/en/inspect_avatar.xml @@ -40,10 +40,11 @@ name="user_name_small" top="7" text_color="White" + translate="false" use_ellipses="true" word_wrap="true" visible="false" - value="Grumpity ProductEngine with a long name" + value="TestString PleaseIgnore" width="185" /> <text follows="top|left" @@ -53,8 +54,9 @@ name="user_name" top="10" text_color="White" + translate="false" use_ellipses="true" - value="Grumpity ProductEngine" + value="TestString PleaseIgnore" width="190" /> <text follows="top|left" @@ -63,7 +65,8 @@ name="user_slid" font="SansSerifSmallBold" text_color="EmphasisColor" - value="james.linden" + translate="false" + value="teststring.pleaseignore" width="185" use_ellipses="true" /> <text diff --git a/indra/newview/skins/default/xui/en/inspect_group.xml b/indra/newview/skins/default/xui/en/inspect_group.xml index bcdb63228d..324ff3eabd 100644 --- a/indra/newview/skins/default/xui/en/inspect_group.xml +++ b/indra/newview/skins/default/xui/en/inspect_group.xml @@ -28,10 +28,11 @@ name="group_name" top="10" text_color="White" + translate="false" use_ellipses="true" width="175" word_wrap="false"> - Grumpity's Grumpy Group of Moose + TestString PleaseIgnore </text> <text follows="all" diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml index d9991fcae9..e5ae0b950a 100644 --- a/indra/newview/skins/default/xui/en/main_view.xml +++ b/indra/newview/skins/default/xui/en/main_view.xml @@ -80,6 +80,13 @@ user_resize="false" name="hud container" width="500"> + <view top="0" + follows="all" + height="500" + left="0" + mouse_opaque="false" + name="floater_snap_region" + width="500"/> <panel follows="left|top" height="19" left="0" diff --git a/indra/newview/skins/default/xui/en/menu_attachment_self.xml b/indra/newview/skins/default/xui/en/menu_attachment_self.xml index 84e81397be..b8128da358 100644 --- a/indra/newview/skins/default/xui/en/menu_attachment_self.xml +++ b/indra/newview/skins/default/xui/en/menu_attachment_self.xml @@ -68,7 +68,7 @@ name="Stand Up"> function="Self.EnableStandUp" /> </menu_item_call> <menu_item_call - label="Change Outfit" + label="My Appearance" name="Change Outfit"> <menu_item_call.on_click function="CustomizeAvatar" /> diff --git a/indra/newview/skins/default/xui/en/menu_avatar_self.xml b/indra/newview/skins/default/xui/en/menu_avatar_self.xml index 2afa29ec10..d727294cc8 100644 --- a/indra/newview/skins/default/xui/en/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/en/menu_avatar_self.xml @@ -193,7 +193,7 @@ </menu_item_call> </context_menu> <menu_item_call - label="Change Outfit" + label="My Appearance" layout="topleft" name="Chenge Outfit"> <menu_item_call.on_click diff --git a/indra/newview/skins/default/xui/en/menu_bottomtray.xml b/indra/newview/skins/default/xui/en/menu_bottomtray.xml index 5beafef4e4..1b55fa4fd3 100644 --- a/indra/newview/skins/default/xui/en/menu_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/menu_bottomtray.xml @@ -8,6 +8,18 @@ top="624" visible="false" width="128"> + <menu_item_check + label="Voice Enabled" + layout="topleft" + name="EnableVoiceChat"> + <menu_item_check.on_click + function="ToggleControl" + parameter="EnableVoiceChat" /> + <menu_item_check.on_check + function="CheckControl" + parameter="EnableVoiceChat" /> + </menu_item_check> + <menu_item_separator/> <menu_item_check label="Gesture button" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml index 50ad3f834e..5e7b16ed4a 100644 --- a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml @@ -1,63 +1,249 @@ -<?xml version="1.0" encoding="utf-8"?> +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> <toggleable_menu - create_jump_keys="true" - layout="topleft" - mouse_opaque="false" - visible="false" - name="Gear Menu"> + layout="topleft" + name="Self Pie"> <menu_item_call label="Sit Down" - enabled="true" - name="sit_down_here"> + layout="topleft" + name="Sit Down Here"> <menu_item_call.on_click function="Self.SitDown" parameter="" /> - <menu_item_call.on_visible + <menu_item_call.on_enable function="Self.EnableSitDown" /> </menu_item_call> <menu_item_call label="Stand Up" - enabled="true" - name="stand_up"> + layout="topleft" + name="Stand Up"> <menu_item_call.on_click function="Self.StandUp" parameter="" /> - <menu_item_call.on_visible + <menu_item_call.on_enable function="Self.EnableStandUp" /> </menu_item_call> + <context_menu + label="Take Off" + layout="topleft" + name="Take Off >"> + <context_menu + label="Clothes" + layout="topleft" + name="Clothes >"> + <menu_item_call + enabled="false" + label="Shirt" + layout="topleft" + name="Shirt"> + <menu_item_call.on_click + function="Edit.TakeOff" + parameter="shirt" /> + <menu_item_call.on_enable + function="Edit.EnableTakeOff" + parameter="shirt" /> + </menu_item_call> + <menu_item_call + enabled="false" + label="Pants" + layout="topleft" + name="Pants"> + <menu_item_call.on_click + function="Edit.TakeOff" + parameter="pants" /> + <menu_item_call.on_enable + function="Edit.EnableTakeOff" + parameter="pants" /> + </menu_item_call> + <menu_item_call + enabled="false" + label="Skirt" + layout="topleft" + name="Skirt"> + <menu_item_call.on_click + function="Edit.TakeOff" + parameter="skirt" /> + <menu_item_call.on_enable + function="Edit.EnableTakeOff" + parameter="skirt" /> + </menu_item_call> + <menu_item_call + enabled="false" + label="Shoes" + layout="topleft" + name="Shoes"> + <menu_item_call.on_click + function="Edit.TakeOff" + parameter="shoes" /> + <menu_item_call.on_enable + function="Edit.EnableTakeOff" + parameter="shoes" /> + </menu_item_call> + <menu_item_call + enabled="false" + label="Socks" + layout="topleft" + name="Socks"> + <menu_item_call.on_click + function="Edit.TakeOff" + parameter="socks" /> + <menu_item_call.on_enable + function="Edit.EnableTakeOff" + parameter="socks" /> + </menu_item_call> + <menu_item_call + enabled="false" + label="Jacket" + layout="topleft" + name="Jacket"> + <menu_item_call.on_click + function="Edit.TakeOff" + parameter="jacket" /> + <menu_item_call.on_enable + function="Edit.EnableTakeOff" + parameter="jacket" /> + </menu_item_call> + <menu_item_call + enabled="false" + label="Gloves" + layout="topleft" + name="Gloves"> + <menu_item_call.on_click + function="Edit.TakeOff" + parameter="gloves" /> + <menu_item_call.on_enable + function="Edit.EnableTakeOff" + parameter="gloves" /> + </menu_item_call> + <menu_item_call + enabled="false" + label="Undershirt" + layout="topleft" + name="Self Undershirt"> + <menu_item_call.on_click + function="Edit.TakeOff" + parameter="undershirt" /> + <menu_item_call.on_enable + function="Edit.EnableTakeOff" + parameter="undershirt" /> + </menu_item_call> + <menu_item_call + enabled="false" + label="Underpants" + layout="topleft" + name="Self Underpants"> + <menu_item_call.on_click + function="Edit.TakeOff" + parameter="underpants" /> + <menu_item_call.on_enable + function="Edit.EnableTakeOff" + parameter="underpants" /> + </menu_item_call> + <menu_item_call + enabled="false" + label="Tattoo" + layout="topleft" + name="Self Tattoo"> + <menu_item_call.on_click + function="Edit.TakeOff" + parameter="tattoo" /> + <menu_item_call.on_enable + function="Edit.EnableTakeOff" + parameter="tattoo" /> + </menu_item_call> + <menu_item_call + enabled="false" + label="Alpha" + layout="topleft" + name="Self Alpha"> + <menu_item_call.on_click + function="Edit.TakeOff" + parameter="alpha" /> + <menu_item_call.on_enable + function="Edit.EnableTakeOff" + parameter="alpha" /> + </menu_item_call> + <menu_item_separator + layout="topleft" /> + <menu_item_call + label="All Clothes" + layout="topleft" + name="All Clothes"> + <menu_item_call.on_click + function="Edit.TakeOff" + parameter="all" /> + </menu_item_call> + </context_menu> + <context_menu + label="HUD" + layout="topleft" + name="Object Detach HUD" /> + <context_menu + label="Detach" + layout="topleft" + name="Object Detach" /> + <menu_item_call + label="Detach All" + layout="topleft" + name="Detach All"> + <menu_item_call.on_click + function="Self.RemoveAllAttachments" + parameter="" /> + <menu_item_call.on_enable + function="Self.EnableRemoveAllAttachments" /> + </menu_item_call> + </context_menu> <menu_item_call - label="Change Outfit" - name="change_outfit"> + label="Change Outfit" + layout="topleft" + name="Chenge Outfit"> <menu_item_call.on_click function="CustomizeAvatar" /> <menu_item_call.on_enable function="Edit.EnableCustomizeAvatar" /> </menu_item_call> - <menu_item_call - label="My Profile" - enabled="true" - name="my_profile"> + <menu_item_call label="Edit My Outfit" + layout="topleft" + name="Edit Outfit"> <menu_item_call.on_click - function="ShowAgentProfile" - parameter="agent" /> + function="EditOutfit" /> + <menu_item_call.on_enable + function="Edit.EnableCustomizeAvatar" /> + </menu_item_call> + <menu_item_call label="Edit My Shape" + layout="topleft" + name="Edit My Shape"> + <menu_item_call.on_click + function="EditShape" /> + <menu_item_call.on_enable + function="Edit.EnableEditShape" /> </menu_item_call> <menu_item_call - label="My Friends" - name="my_friends"> + label="My Friends" + layout="topleft" + name="Friends..."> <menu_item_call.on_click - function="SideTray.PanelPeopleTab" - parameter="friends_panel" /> + function="SideTray.PanelPeopleTab" + parameter="friends_panel" /> </menu_item_call> <menu_item_call label="My Groups" - name="my_groups"> + layout="topleft" + name="Groups..."> <menu_item_call.on_click function="SideTray.PanelPeopleTab" parameter="groups_panel" /> </menu_item_call> <menu_item_call - label="Debug Textures" - name="Debug..."> + label="My Profile" + layout="topleft" + name="Profile..."> + <menu_item_call.on_click + function="ShowAgentProfile" + parameter="agent" /> + </menu_item_call> + <menu_item_call + label="Debug Textures" + name="Debug..."> <menu_item_call.on_click function="Avatar.Debug" /> <menu_item_call.on_visible diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 606ff69599..934cae93db 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -41,7 +41,7 @@ parameter="agent" /> </menu_item_call> <menu_item_call - label="Change Outfit" + label="My Appearance" name="ChangeOutfit"> <menu_item_call.on_click function="CustomizeAvatar" /> @@ -261,6 +261,17 @@ function="Floater.Toggle" parameter="world_map" /> </menu_item_check> + <menu_item_check + label="Search" + name="Search" + shortcut="control|F"> + <menu_item_check.on_check + function="Floater.Visible" + parameter="search" /> + <menu_item_check.on_click + function="Floater.Toggle" + parameter="search" /> + </menu_item_check> <menu_item_call label="Snapshot" name="Take Snapshot" diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index f008042a81..ba13479860 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -104,6 +104,7 @@ Your version of [APP_NAME] does not know how to display the notification it just received. Please verify that you have the latest Viewer installed. Error details: The notification called '[_NAME]' was not found in notifications.xml. + <tag>fail</tag> <usetemplate name="okbutton" yestext="OK"/> @@ -116,6 +117,7 @@ Error details: The notification called '[_NAME]' was not found in noti Floater error: Could not find the following controls: [CONTROLS] + <tag>fail</tag> <usetemplate name="okbutton" yestext="OK"/> @@ -126,6 +128,7 @@ Floater error: Could not find the following controls: name="TutorialNotFound" type="alertmodal"> No tutorial is currently available. + <tag>fail</tag> <usetemplate name="okbutton" yestext="OK"/> @@ -154,6 +157,7 @@ No tutorial is currently available. name="BadInstallation" type="alertmodal"> An error occurred while updating [APP_NAME]. Please [http://get.secondlife.com download the latest version] of the Viewer. + <tag>fail</tag> <usetemplate name="okbutton" yestext="OK"/> @@ -163,8 +167,9 @@ No tutorial is currently available. icon="alertmodal.tga" name="LoginFailedNoNetwork" type="alertmodal"> -Could not connect to the [SECOND_LIFE_GRID]. -'[DIAGNOSTIC]' + <tag>fail</tag> + Could not connect to the [SECOND_LIFE_GRID]. + '[DIAGNOSTIC]' Make sure your Internet connection is working properly. <usetemplate name="okbutton" @@ -176,6 +181,7 @@ Make sure your Internet connection is working properly. name="MessageTemplateNotFound" type="alertmodal"> Message Template [PATH] not found. + <tag>fail</tag> <usetemplate name="okbutton" yestext="OK"/> @@ -198,6 +204,7 @@ Save changes to current clothing/body part? name="CompileQueueSaveText" type="alertmodal"> There was a problem uploading the text for a script due to the following reason: [REASON]. Please try again later. + <tag>fail</tag> </notification> <notification @@ -205,6 +212,7 @@ There was a problem uploading the text for a script due to the following reason: name="CompileQueueSaveBytecode" type="alertmodal"> There was a problem uploading the compiled script due to the following reason: [REASON]. Please try again later. + <tag>fail</tag> </notification> <notification @@ -212,6 +220,7 @@ There was a problem uploading the compiled script due to the following reason: [ name="WriteAnimationFail" type="alertmodal"> There was a problem writing animation data. Please try again later. + <tag>fail</tag> </notification> <notification @@ -219,6 +228,7 @@ There was a problem writing animation data. Please try again later. name="UploadAuctionSnapshotFail" type="alertmodal"> There was a problem uploading the auction snapshot due to the following reason: [REASON] + <tag>fail</tag> </notification> <notification @@ -227,6 +237,7 @@ There was a problem uploading the auction snapshot due to the following reason: type="alertmodal"> Unable to view the contents of more than one item at a time. Please select only one object and try again. + <tag>fail</tag> </notification> <notification @@ -234,7 +245,8 @@ Please select only one object and try again. name="SaveClothingBodyChanges" type="alertmodal"> Save all changes to clothing/body parts? - <usetemplate +<tag>confirm</tag> +<usetemplate canceltext="Cancel" name="yesnocancelbuttons" notext="Don't Save" @@ -267,6 +279,7 @@ Save all changes to clothing/body parts? type="alertmodal"> Granting modify rights to another Resident allows them to change, delete or take ANY objects you may have in-world. Be VERY careful when handing out this permission. Do you want to grant modify rights for [NAME]? +<tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="No" @@ -279,6 +292,7 @@ Do you want to grant modify rights for [NAME]? type="alertmodal"> Granting modify rights to another Resident allows them to change ANY objects you may have in-world. Be VERY careful when handing out this permission. Do you want to grant modify rights for the selected Residents? +<tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="No" @@ -290,6 +304,7 @@ Do you want to grant modify rights for the selected Residents? name="RevokeModifyRights" type="alertmodal"> Do you want to revoke modify rights for [NAME]? +<tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="No" @@ -301,6 +316,7 @@ Do you want to revoke modify rights for [NAME]? name="RevokeModifyRightsMultiple" type="alertmodal"> Do you want to revoke modify rights for the selected Residents? +<tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="No" @@ -313,7 +329,9 @@ Do you want to revoke modify rights for the selected Residents? type="alertmodal"> Unable to create group. [MESSAGE] - <usetemplate + <tag>group</tag> + <tag>fail</tag> + <usetemplate name="okbutton" yestext="OK"/> </notification> @@ -324,7 +342,9 @@ Unable to create group. type="alertmodal"> [NEEDS_APPLY_MESSAGE] [WANT_APPLY_MESSAGE] - <usetemplate + <tag>confirm</tag> + <tag>group</tag> + <usetemplate canceltext="Cancel" name="yesnocancelbuttons" notext="Ignore Changes" @@ -336,7 +356,9 @@ Unable to create group. name="MustSpecifyGroupNoticeSubject" type="alertmodal"> You must specify a subject to send a group notice. - <usetemplate + <tag>group</tag> + <tag>fail</tag> + <usetemplate name="okbutton" yestext="OK"/> </notification> @@ -349,6 +371,8 @@ You are about to add group members to the role of [ROLE_NAME]. Members cannot be removed from that role. The members must resign from the role themselves. Are you sure you want to continue? + <tag>group</tag> + <tag>confirm</tag> <usetemplate ignoretext="Confirm before I add a new group Owner" name="okcancelignore" @@ -394,6 +418,7 @@ Add this Ability to '[ROLE_NAME]'? type="alertmodal"> You are about to drop your attachment. Are you sure you want to continue? + <tag>confirm</tag> <usetemplate ignoretext="Confirm before dropping attachments" name="okcancelignore" @@ -406,6 +431,9 @@ Add this Ability to '[ROLE_NAME]'? type="alertmodal"> Joining this group costs L$[COST]. Do you wish to proceed? + <tag>confirm</tag> + <tag>funds</tag> + <tag>group</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -418,6 +446,8 @@ Do you wish to proceed? type="alertmodal"> You are joining group [NAME]. Do you wish to proceed? + <tag>group</tag> + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -431,6 +461,9 @@ Do you wish to proceed? type="alertmodal"> Joining this group costs L$[COST]. You do not have enough L$ to join this group. + <tag>group</tag> + <tag>fail</tag> + <tag>funds</tag> </notification> <notification @@ -440,6 +473,8 @@ You do not have enough L$ to join this group. Creating this group will cost L$100. Groups need more than one member, or they are deleted forever. Please invite members within 48 hours. + <tag>group</tag> + <tag>funds</tag> <usetemplate canceltext="Cancel" name="okcancelbuttons" @@ -453,6 +488,8 @@ Please invite members within 48 hours. type="alertmodal"> <tag>fail</tag> For L$[COST] you can enter this land ('[PARCEL_NAME]') for [TIME] hours. Buy a pass? + <tag>funds</tag> + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -465,6 +502,7 @@ For L$[COST] you can enter this land ('[PARCEL_NAME]') for [TIME] hour type="alertmodal"> Sale price must be set to more than L$0 if selling to anyone. Please select an individual to sell to if selling for L$0. + <tag>fail</tag> </notification> <notification @@ -474,6 +512,7 @@ Please select an individual to sell to if selling for L$0. type="alertmodal"> The selected [LAND_SIZE] m² land is being set for sale. Your selling price will be L$[SALE_PRICE] and will be authorized for sale to [NAME]. + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -488,6 +527,7 @@ ATTENTION: Clicking 'sell to anyone' makes your land available to the The selected [LAND_SIZE] m² land is being set for sale. Your selling price will be L$[SALE_PRICE] and will be authorized for sale to [NAME]. + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -503,6 +543,8 @@ Are you sure you want to return all objects shared with the group '[NAME]&a *WARNING* This will delete the non-transferable objects deeded to the group! Objects: [N] + <tag>confirm</tag> + <tag>group</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -516,6 +558,7 @@ Objects: [N] Are you sure you want to return all objects owned by the Resident '[NAME]' on this parcel of land back to their inventory? Objects: [N] + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -529,6 +572,7 @@ Objects: [N] Are you sure you want to return all objects owned by you on this parcel of land back to your inventory? Objects: [N] + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -545,6 +589,7 @@ Transferable objects deeded to a group will be returned to their previous owners *WARNING* This will delete the non-transferable objects deeded to the group! Objects: [N] + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -561,6 +606,7 @@ Transferable objects deeded to a group will be returned to their previous owners *WARNING* This will delete the non-transferable objects deeded to the group! Objects: [N] + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -572,6 +618,7 @@ Objects: [N] name="ReturnAllTopObjects" type="alertmodal"> Are you sure you want to return all listed objects back to their owner's inventory? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -583,6 +630,7 @@ Are you sure you want to return all listed objects back to their owner's in name="DisableAllTopObjects" type="alertmodal"> Are you sure you want to disable all objects in this region? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -596,6 +644,8 @@ Are you sure you want to disable all objects in this region? Return the objects on this parcel of land that are NOT shared with the group [NAME] back to their owners? Objects: [N] + <tag>confirm</tag> + <tag>group</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -609,6 +659,7 @@ Objects: [N] Can not disable scripts. This entire region is damage enabled. Scripts must be allowed to run for weapons to work. + <tag>fail</tag> </notification> <notification @@ -618,6 +669,7 @@ Scripts must be allowed to run for weapons to work. Multiple faces are currently selected. If you continue this action, separate instances of media will be set on multiple faces of the object. To place the media on only one face, choose Select Face and click on the desired face of that object then click Add. + <tag>confirm</tag> <usetemplate ignoretext="Media will be set on multiple selected faces" name="okcancelignore" @@ -630,6 +682,7 @@ To place the media on only one face, choose Select Face and click on the desired name="MustBeInParcel" type="alertmodal"> You must be standing inside the land parcel to set its Landing Point. + <tag>fail</tag> </notification> <notification @@ -637,6 +690,7 @@ You must be standing inside the land parcel to set its Landing Point. name="PromptRecipientEmail" type="alertmodal"> Please enter a valid email address for the recipient(s). + <tag>fail</tag> </notification> <notification @@ -644,6 +698,7 @@ Please enter a valid email address for the recipient(s). name="PromptSelfEmail" type="alertmodal"> Please enter your email address. + <tag>fail</tag> </notification> <notification @@ -651,6 +706,7 @@ Please enter your email address. name="PromptMissingSubjMsg" type="alertmodal"> Email snapshot with the default subject or message? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -662,6 +718,7 @@ Email snapshot with the default subject or message? name="ErrorProcessingSnapshot" type="alertmodal"> Error processing snapshot data + <tag>fail</tag> </notification> <notification @@ -669,6 +726,7 @@ Error processing snapshot data name="ErrorEncodingSnapshot" type="alertmodal"> Error encoding snapshot. + <tag>fail</tag> </notification> <notification @@ -676,6 +734,7 @@ Error encoding snapshot. name="ErrorUploadingPostcard" type="alertmodal"> There was a problem sending a snapshot due to the following reason: [REASON] + <tag>fail</tag> </notification> <notification @@ -683,12 +742,14 @@ There was a problem sending a snapshot due to the following reason: [REASON] name="ErrorUploadingReportScreenshot" type="alertmodal"> There was a problem uploading a report screenshot due to the following reason: [REASON] + <tag>fail</tag> </notification> <notification icon="alertmodal.tga" name="MustAgreeToLogIn" type="alertmodal"> + <tag>fail</tag> You must agree to the Terms of Service to continue logging into [SECOND_LIFE]. </notification> @@ -698,6 +759,7 @@ You must agree to the Terms of Service to continue logging into [SECOND_LIFE]. type="alertmodal"> Could not put on outfit. The outfit folder contains no clothing, body parts, or attachments. + <tag>fail</tag> </notification> <notification @@ -705,6 +767,7 @@ The outfit folder contains no clothing, body parts, or attachments. name="CannotWearTrash" type="alertmodal"> You can not wear clothes or body parts that are in the trash + <tag>fail</tag> </notification> <notification @@ -713,6 +776,7 @@ You can not wear clothes or body parts that are in the trash type="alertmodal"> Could not attach object. Exceeds the attachments limit of [MAX_ATTACHMENTS] objects. Please detach another object first. + <tag>fail</tag> </notification> <notification @@ -720,16 +784,19 @@ Exceeds the attachments limit of [MAX_ATTACHMENTS] objects. Please detach anothe name="CannotWearInfoNotComplete" type="alertmodal"> You can not wear that item because it has not yet loaded. Please try again in a minute. + <tag>fail</tag> </notification> <notification icon="alertmodal.tga" name="MustHaveAccountToLogIn" type="alertmodal"> + <tag>fail</tag> Oops! Something was left blank. You need to enter the Username name of your avatar. You need an account to enter [SECOND_LIFE]. Would you like to create one now? + <tag>confirm</tag> <url option="0" name="url" @@ -747,31 +814,18 @@ You need an account to enter [SECOND_LIFE]. Would you like to create one now? icon="alertmodal.tga" name="InvalidCredentialFormat" type="alertmodal"> + <tag>fail</tag> You need to enter either the Username or both the First and Last name of your avatar into the Username field, then login again. </notification> - <notification - icon="alertmodal.tga" - name="AddClassified" - type="alertmodal"> -Classified ads appear in the 'Classified' section of the Search directory and on [http://secondlife.com/community/classifieds secondlife.com] for one week. -Fill out your ad, then click 'Publish...' to add it to the directory. -You'll be asked for a price to pay when clicking Publish. -Paying more makes your ad appear higher in the list, and also appear higher when people search for keywords. - <usetemplate - ignoretext="How to create a new Classified ad" - name="okcancelignore" - notext="Cancel" - yestext="OK"/> - </notification> - <notification icon="alertmodal.tga" name="DeleteClassified" type="alertmodal"> Delete classified '[NAME]'? There is no reimbursement for fees paid. + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -785,6 +839,7 @@ There is no reimbursement for fees paid. type="alertmodal"> You have selected to delete the media associated with this face. Are you sure you want to continue? + <tag>confirm</tag> <usetemplate ignoretext="Confirm before I delete media from an object" name="okcancelignore" @@ -797,6 +852,7 @@ Are you sure you want to continue? name="ClassifiedSave" type="alertmodal"> Save changes to classified [NAME]? + <tag>confirm</tag> <usetemplate canceltext="Cancel" name="yesnocancelbuttons" @@ -809,6 +865,7 @@ Save changes to classified [NAME]? name="ClassifiedInsufficientFunds" type="alertmodal"> Insufficient funds to create classified. + <tag>fail</tag> <usetemplate name="okbutton" yestext="OK"/> @@ -819,6 +876,7 @@ Insufficient funds to create classified. name="DeleteAvatarPick" type="alertmodal"> Delete pick <nolink>[PICK]</nolink>? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -830,6 +888,7 @@ Delete pick <nolink>[PICK]</nolink>? name="DeleteOutfits" type="alertmodal"> Delete the selected outfit? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -841,6 +900,7 @@ Delete pick <nolink>[PICK]</nolink>? name="PromptGoToEventsPage" type="alertmodal"> Go to the [SECOND_LIFE] events web page? + <tag>confirm</tag> <url option="0" name="url"> http://secondlife.com/events/ @@ -856,6 +916,7 @@ Go to the [SECOND_LIFE] events web page? name="SelectProposalToView" type="alertmodal"> Please select a proposal to view. + <tag>fail</tag> </notification> <notification @@ -863,6 +924,7 @@ Please select a proposal to view. name="SelectHistoryItemToView" type="alertmodal"> Please select a history item to view. + <tag>fail</tag> </notification> <!-- @@ -929,9 +991,9 @@ Changing language will take effect after you restart [APP_NAME]. icon="alertmodal.tga" name="GoToAuctionPage" type="alertmodal"> -Go to the [SECOND_LIFE] web page to see auction details or make a bid? + Go to the [SECOND_LIFE] web page to see auction details or make a bid? + <tag>confirm</tag> <url option="0" name="url"> - http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID] </url> <usetemplate @@ -945,6 +1007,7 @@ Go to the [SECOND_LIFE] web page to see auction details or make a bid? name="SaveChanges" type="alertmodal"> Save Changes? + <tag>confirm</tag> <usetemplate canceltext="Cancel" name="yesnocancelbuttons" @@ -959,6 +1022,7 @@ Save Changes? Gesture save failed. This gesture has too many steps. Try removing some steps, then save again. +<tag>fail</tag> </notification> <notification @@ -966,6 +1030,7 @@ Try removing some steps, then save again. name="GestureSaveFailedTryAgain" type="alertmodal"> Gesture save failed. Please try again in a minute. +<tag>fail</tag> </notification> <notification @@ -974,6 +1039,7 @@ Gesture save failed. Please try again in a minute. type="alertmodal"> Could not save gesture because the object or the associated object inventory could not be found. The object may be out of range or may have been deleted. +<tag>fail</tag> </notification> <notification @@ -981,6 +1047,7 @@ The object may be out of range or may have been deleted. name="GestureSaveFailedReason" type="alertmodal"> There was a problem saving a gesture due to the following reason: [REASON]. Please try resaving the gesture later. +<tag>fail</tag> </notification> <notification @@ -989,6 +1056,7 @@ There was a problem saving a gesture due to the following reason: [REASON]. Ple type="alertmodal"> Could not save notecard because the object or the associated object inventory could not be found. The object may be out of range or may have been deleted. +<tag>fail</tag> </notification> <notification @@ -996,6 +1064,7 @@ The object may be out of range or may have been deleted. name="SaveNotecardFailReason" type="alertmodal"> There was a problem saving a notecard due to the following reason: [REASON]. Please try re-saving the notecard later. +<tag>fail</tag> </notification> <notification @@ -1005,6 +1074,7 @@ There was a problem saving a notecard due to the following reason: [REASON]. Pl Could not undo all changes in your version of the script. Would you like to load the server's last saved version? (**Warning** This operation cannot be undone.) + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -1016,6 +1086,7 @@ Would you like to load the server's last saved version? name="SaveScriptFailReason" type="alertmodal"> There was a problem saving a script due to the following reason: [REASON]. Please try re-saving the script later. +<tag>fail</tag> </notification> <notification @@ -1024,6 +1095,7 @@ There was a problem saving a script due to the following reason: [REASON]. Plea type="alertmodal"> Could not save the script because the object it is in could not be found. The object may be out of range or may have been deleted. +<tag>fail</tag> </notification> <notification @@ -1031,6 +1103,7 @@ The object may be out of range or may have been deleted. name="SaveBytecodeFailReason" type="alertmodal"> There was a problem saving a compiled script due to the following reason: [REASON]. Please try re-saving the script later. +<tag>fail</tag> </notification> <notification @@ -1039,6 +1112,7 @@ There was a problem saving a compiled script due to the following reason: [REASO type="alertmodal"> Oops, Your Start Region is not defined. Please type the Region name in Start Location box or choose My Last Location or My Home as your Start Location. +<tag>fail</tag> <usetemplate name="okbutton" yestext="OK"/> @@ -1050,6 +1124,7 @@ Please type the Region name in Start Location box or choose My Last Location or type="alertmodal"> Could not start or stop the script because the object it is on could not be found. The object may be out of range or may have been deleted. + <tag>fail</tag> </notification> <notification @@ -1057,6 +1132,7 @@ The object may be out of range or may have been deleted. name="CannotDownloadFile" type="alertmodal"> Unable to download file + <tag>fail</tag> </notification> <notification @@ -1064,6 +1140,7 @@ Unable to download file name="CannotWriteFile" type="alertmodal"> Unable to write file [[FILE]] + <tag>fail</tag> </notification> <notification @@ -1073,6 +1150,7 @@ Unable to write file [[FILE]] Just so you know, your computer does not meet [APP_NAME]'s minimum system requirements. You may experience poor performance. Unfortunately, the [SUPPORT_SITE] can't provide technical support for unsupported system configurations. Visit [_URL] for more information? + <tag>confirm</tag> <url option="0" name="url"> http://www.secondlife.com/corporate/sysreqs.php @@ -1082,6 +1160,7 @@ Visit [_URL] for more information? name="okcancelignore" notext="No" yestext="Yes"/> + <tag>fail</tag> </notification> <notification @@ -1095,6 +1174,7 @@ This is often the case with new hardware that hasn't been tested yet with [ <ignore name="ignore" text="My graphics card could not be identified"/> </form> + <tag>fail</tag> </notification> <notification @@ -1105,6 +1185,7 @@ This is often the case with new hardware that hasn't been tested yet with [ Graphics Quality will be set to Low to avoid some common driver errors. This will disable some graphics features. We recommend updating your graphics card drivers. Graphics Quality can be raised in Preferences > Graphics. + <tag>fail</tag> </notification> <notification @@ -1112,6 +1193,7 @@ Graphics Quality can be raised in Preferences > Graphics. name="RegionNoTerraforming" type="alertmodal"> The region [REGION] does not allow terraforming. + <tag>fail</tag> </notification> <notification @@ -1121,10 +1203,12 @@ The region [REGION] does not allow terraforming. You do not have permission to copy the following items: [ITEMS] and will lose it from your inventory if you give it away. Do you really want to offer these items? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="No" yestext="Yes"/> + <tag>fail</tag> </notification> <notification @@ -1132,6 +1216,7 @@ and will lose it from your inventory if you give it away. Do you really want to name="CannotGiveItem" type="alertmodal"> Unable to give inventory item. + <tag>fail</tag> </notification> <notification @@ -1146,6 +1231,7 @@ Transaction cancelled. name="TooManyItems" type="alertmodal"> Cannot give more than 42 items in a single inventory transfer. + <tag>fail</tag> </notification> <notification @@ -1153,6 +1239,7 @@ Cannot give more than 42 items in a single inventory transfer. name="NoItems" type="alertmodal"> You do not have permission to transfer the selected items. + <tag>fail</tag> </notification> <notification @@ -1161,6 +1248,8 @@ You do not have permission to transfer the selected items. type="alertmodal"> You do not have permission to copy [COUNT] of the selected items. You will lose these items from your inventory. Do you really want to give these items? + <tag>confirm</tag> + <tag>fail</tag> <usetemplate name="okcancelbuttons" notext="No" @@ -1172,6 +1261,7 @@ Do you really want to give these items? name="CannotGiveCategory" type="alertmodal"> You do not have permission to transfer the selected folder. + <tag>fail</tag> </notification> <notification @@ -1180,6 +1270,7 @@ You do not have permission to transfer the selected folder. type="alertmodal"> Freeze this avatar? He or she will temporarily be unable to move, chat, or interact with the world. + <tag>confirm</tag> <usetemplate canceltext="Cancel" name="yesnocancelbuttons" @@ -1193,6 +1284,7 @@ He or she will temporarily be unable to move, chat, or interact with the world. type="alertmodal"> Freeze [AVATAR_NAME]? He or she will temporarily be unable to move, chat, or interact with the world. + <tag>confirm</tag> <usetemplate canceltext="Cancel" name="yesnocancelbuttons" @@ -1205,6 +1297,7 @@ He or she will temporarily be unable to move, chat, or interact with the world. name="EjectAvatarFullname" type="alertmodal"> Eject [AVATAR_NAME] from your land? + <tag>confirm</tag> <usetemplate canceltext="Cancel" name="yesnocancelbuttons" @@ -1217,6 +1310,7 @@ Eject [AVATAR_NAME] from your land? name="EjectAvatarNoBan" type="alertmodal"> Eject this avatar from your land? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -1228,6 +1322,7 @@ Eject this avatar from your land? name="EjectAvatarFullnameNoBan" type="alertmodal"> Eject [AVATAR_NAME] from your land? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -1240,6 +1335,7 @@ Eject [AVATAR_NAME] from your land? persist="true" type="notify"> You ejected [AVATAR_NAME] from group [GROUP_NAME] + <tag>group</tag> </notification> <notification @@ -1247,6 +1343,7 @@ You ejected [AVATAR_NAME] from group [GROUP_NAME] name="AcquireErrorTooManyObjects" type="alertmodal"> ACQUIRE ERROR: Too many objects selected. + <tag>fail</tag> </notification> <notification @@ -1255,6 +1352,7 @@ ACQUIRE ERROR: Too many objects selected. type="alertmodal"> ACQUIRE ERROR: Objects span more than one region. Please move all objects to be acquired onto the same region. + <tag>fail</tag> </notification> <notification @@ -1264,6 +1362,7 @@ Please move all objects to be acquired onto the same region. [EXTRA] Go to [_URL] for information on purchasing L$? + <tag>confirm</tag> <url option="0" name="url"> http://secondlife.com/app/currency/ @@ -1280,6 +1379,7 @@ Go to [_URL] for information on purchasing L$? type="alertmodal"> Unable to link these [COUNT] objects. You can link a maximum of [MAX] objects. + <tag>fail</tag> </notification> <notification @@ -1287,6 +1387,7 @@ You can link a maximum of [MAX] objects. name="CannotLinkIncompleteSet" type="alertmodal"> You can only link complete sets of objects, and must select more than one object. + <tag>fail</tag> </notification> <notification @@ -1296,6 +1397,7 @@ You can only link complete sets of objects, and must select more than one object Unable to link because you don't have modify permission on all the objects. Please make sure none are locked, and that you own all of them. + <tag>fail</tag> </notification> <notification @@ -1305,6 +1407,7 @@ Please make sure none are locked, and that you own all of them. Unable to link because not all of the objects have the same owner. Please make sure you own all of the selected objects. + <tag>fail</tag> </notification> <notification @@ -1314,6 +1417,7 @@ Please make sure you own all of the selected objects. No file extension for the file: '[FILE]' Please make sure the file has a correct file extension. + <tag>fail</tag> </notification> <notification @@ -1325,6 +1429,7 @@ Expected [VALIDS] <usetemplate name="okbutton" yestext="OK"/> + <tag>fail</tag> </notification> <notification @@ -1333,6 +1438,7 @@ Expected [VALIDS] type="alertmodal"> Couldn't open uploaded sound file for reading: [FILE] + <tag>fail</tag> </notification> <notification @@ -1341,6 +1447,7 @@ Couldn't open uploaded sound file for reading: type="alertmodal"> File does not appear to be a RIFF WAVE file: [FILE] + <tag>fail</tag> </notification> <notification @@ -1349,6 +1456,7 @@ File does not appear to be a RIFF WAVE file: type="alertmodal"> File does not appear to be a PCM WAVE audio file: [FILE] + <tag>fail</tag> </notification> <notification @@ -1357,6 +1465,7 @@ File does not appear to be a PCM WAVE audio file: type="alertmodal"> File has invalid number of channels (must be mono or stereo): [FILE] + <tag>fail</tag> </notification> <notification @@ -1365,6 +1474,7 @@ File has invalid number of channels (must be mono or stereo): type="alertmodal"> File does not appear to be a supported sample rate (must be 44.1k): [FILE] + <tag>fail</tag> </notification> <notification @@ -1373,6 +1483,7 @@ File does not appear to be a supported sample rate (must be 44.1k): type="alertmodal"> File does not appear to be a supported word size (must be 8 or 16 bit): [FILE] + <tag>fail</tag> </notification> <notification @@ -1381,6 +1492,7 @@ File does not appear to be a supported word size (must be 8 or 16 bit): type="alertmodal"> Could not find 'data' chunk in WAV header: [FILE] + <tag>fail</tag> </notification> <notification @@ -1389,6 +1501,7 @@ Could not find 'data' chunk in WAV header: type="alertmodal"> Wrong chunk size in WAV file: [FILE] + <tag>fail</tag> </notification> <notification @@ -1397,6 +1510,7 @@ Wrong chunk size in WAV file: type="alertmodal"> Audio file is too long (10 second maximum): [FILE] + <tag>fail</tag> </notification> <notification @@ -1406,6 +1520,7 @@ Audio file is too long (10 second maximum): Problem with file [FILE]: [ERROR] + <tag>fail</tag> </notification> <notification @@ -1413,6 +1528,7 @@ Problem with file [FILE]: name="CannotOpenTemporarySoundFile" type="alertmodal"> Couldn't open temporary compressed sound file for writing: [FILE] + <tag>fail</tag> </notification> <notification @@ -1420,6 +1536,7 @@ Couldn't open temporary compressed sound file for writing: [FILE] name="UnknownVorbisEncodeFailure" type="alertmodal"> Unknown Vorbis encode failure on: [FILE] + <tag>fail</tag> </notification> <notification @@ -1427,6 +1544,7 @@ Unknown Vorbis encode failure on: [FILE] name="CannotEncodeFile" type="alertmodal"> Unable to encode file: [FILE] + <tag>fail</tag> </notification> <notification @@ -1435,6 +1553,7 @@ Unable to encode file: [FILE] type="alertmodal"> We can't fill in your username and password. This may happen when you change network setup + <tag>fail</tag> <usetemplate name="okbutton" yestext="OK"/> @@ -1445,6 +1564,7 @@ Unable to encode file: [FILE] name="CorruptResourceFile" type="alertmodal"> Corrupt resource file: [FILE] + <tag>fail</tag> </notification> <notification @@ -1452,6 +1572,7 @@ Corrupt resource file: [FILE] name="UnknownResourceFileVersion" type="alertmodal"> Unknown Linden resource file version in file: [FILE] + <tag>fail</tag> </notification> <notification @@ -1459,6 +1580,7 @@ Unknown Linden resource file version in file: [FILE] name="UnableToCreateOutputFile" type="alertmodal"> Unable to create output file: [FILE] + <tag>fail</tag> </notification> <notification @@ -1466,6 +1588,7 @@ Unable to create output file: [FILE] name="DoNotSupportBulkAnimationUpload" type="alertmodal"> [APP_NAME] does not currently support bulk upload of animation files. + <tag>fail</tag> </notification> <notification @@ -1474,6 +1597,7 @@ Unable to create output file: [FILE] type="alertmodal"> Unable to upload [FILE] due to the following reason: [REASON] Please try again later. + <tag>fail</tag> </notification> <notification @@ -1491,6 +1615,7 @@ You already have a landmark for this location. <usetemplate name="okbutton" yestext="OK"/> + <tag>fail</tag> </notification> <notification @@ -1498,6 +1623,7 @@ You already have a landmark for this location. name="CannotCreateLandmarkNotOwner" type="alertmodal"> You cannot create a landmark here because the owner of the land doesn't allow it. + <tag>fail</tag> </notification> <notification @@ -1506,6 +1632,7 @@ You cannot create a landmark here because the owner of the land doesn't all type="alertmodal"> Not able to perform 'recompilation'. Select an object with a script. + <tag>fail</tag> </notification> <notification @@ -1515,6 +1642,7 @@ Select an object with a script. Not able to perform 'recompilation'. Select objects with scripts that you have permission to modify. + <tag>fail</tag> </notification> <notification @@ -1524,6 +1652,7 @@ Select objects with scripts that you have permission to modify. Not able to perform 'reset'. Select objects with scripts. + <tag>fail</tag> </notification> <notification @@ -1533,6 +1662,7 @@ Select objects with scripts. Not able to perform 'reset'. Select objects with scripts that you have permission to modify. + <tag>fail</tag> </notification> <notification @@ -1540,6 +1670,7 @@ Select objects with scripts that you have permission to modify. name="CannotOpenScriptObjectNoMod" type="alertmodal"> Unable to open script in object without modify permissions. + <tag>fail</tag> </notification> <notification @@ -1549,6 +1680,7 @@ Select objects with scripts that you have permission to modify. Not able to set any scripts to 'running'. Select objects with scripts. + <tag>fail</tag> </notification> <notification @@ -1558,6 +1690,7 @@ Select objects with scripts. Unable to set any scripts to 'not running'. Select objects with scripts. + <tag>fail</tag> </notification> <notification @@ -1565,6 +1698,7 @@ Select objects with scripts. name="NoFrontmostFloater" type="alertmodal"> No frontmost floater to save. + <tag>fail</tag> </notification> <notification @@ -1581,6 +1715,7 @@ Searched for: [FINALQUERY] name="SeachFilteredOnShortWordsEmpty" type="alertmodal"> Your search terms were too short so no search was performed. + <tag>fail</tag> </notification> <!-- Generic Teleport failure modes - strings will be inserted from @@ -1591,6 +1726,7 @@ Your search terms were too short so no search was performed. type="alertmodal"> Teleport failed. [REASON] + <tag>fail</tag> </notification> <!-- Teleport failure modes not delivered via the generic mechanism @@ -1603,6 +1739,7 @@ Teleport failed. type="alertmodal"> Problem encountered processing your teleport request. You may need to log back in before you can teleport. If you continue to get this message, please check the [SUPPORT_SITE]. + <tag>fail</tag> </notification> <notification icon="alertmodal.tga" @@ -1610,19 +1747,21 @@ If you continue to get this message, please check the [SUPPORT_SITE]. type="alertmodal"> Problem encountered processing your region crossing. You may need to log back in before you can cross regions. If you continue to get this message, please check the [SUPPORT_SITE]. + <tag>fail</tag> </notification> <notification icon="alertmodal.tga" name="blocked_tport" type="alertmodal"> - <tag>fail</tag> Sorry, teleport is currently blocked. Try again in a moment. If you still cannot teleport, please log out and log back in to resolve the problem. + <tag>fail</tag> </notification> <notification icon="alertmodal.tga" name="nolandmark_tport" type="alertmodal"> Sorry, but system was unable to locate landmark destination. + <tag>fail</tag> </notification> <notification icon="alertmodal.tga" @@ -1678,6 +1817,7 @@ Unable to find teleport destination. The destination may be temporarily unavaila name="no_inventory_host" type="alertmodal"> The inventory system is currently unavailable. + <tag>fail</tag> </notification> <notification @@ -1686,6 +1826,7 @@ The inventory system is currently unavailable. type="alertmodal"> Unable to set land owner: No parcel selected. + <tag>fail</tag> </notification> <notification @@ -1693,6 +1834,7 @@ No parcel selected. name="CannotSetLandOwnerMultipleRegions" type="alertmodal"> Unable to force land ownership because selection spans multiple regions. Please select a smaller area and try again. + <tag>fail</tag> </notification> <notification @@ -1701,6 +1843,7 @@ Unable to force land ownership because selection spans multiple regions. Please type="alertmodal"> This parcel is up for auction. Forcing ownership will cancel the auction and potentially make some Residents unhappy if bidding has begun. Force ownership? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -1713,6 +1856,7 @@ Force ownership? type="alertmodal"> Unable to contentify: No parcel selected. + <tag>fail</tag> </notification> <notification @@ -1721,6 +1865,7 @@ No parcel selected. type="alertmodal"> Unable to contentify: No region selected. + <tag>fail</tag> </notification> <notification @@ -1729,6 +1874,7 @@ No region selected. type="alertmodal"> Unable to abandon land: No parcel selected. + <tag>fail</tag> </notification> <notification @@ -1737,6 +1883,7 @@ No parcel selected. type="alertmodal"> Unable to abandon land: Cannot find region. + <tag>fail</tag> </notification> <notification @@ -1745,6 +1892,7 @@ Cannot find region. type="alertmodal"> Unable to buy land: No parcel selected. + <tag>fail</tag> </notification> <notification @@ -1753,6 +1901,7 @@ No parcel selected. type="alertmodal"> Unable to buy land: Cannot find the region this land is in. + <tag>fail</tag> </notification> <notification @@ -1760,6 +1909,7 @@ Cannot find the region this land is in. name="CannotCloseFloaterBuyLand" type="alertmodal"> You cannot close the Buy Land window until [APP_NAME] estimates the price of this transaction. + <tag>fail</tag> </notification> <notification @@ -1768,6 +1918,7 @@ You cannot close the Buy Land window until [APP_NAME] estimates the price of thi type="alertmodal"> Unable to deed land: No parcel selected. + <tag>fail</tag> </notification> <notification @@ -1776,6 +1927,8 @@ No parcel selected. type="alertmodal"> Unable to deed land: No Group selected. + <tag>group</tag> + <tag>fail</tag> </notification> <notification @@ -1784,6 +1937,7 @@ No Group selected. type="alertmodal"> Unable to deed land: Cannot find the region this land is in. + <tag>fail</tag> </notification> <notification @@ -1794,6 +1948,7 @@ Unable to deed land: Multiple parcels selected. Try selecting a single parcel. + <tag>fail</tag> </notification> <notification @@ -1804,6 +1959,7 @@ Unable to deed land: Waiting for server to report ownership. Please try again. + <tag>fail</tag> </notification> <notification @@ -1812,6 +1968,7 @@ Please try again. type="alertmodal"> Unable to deed land: The region [REGION] does not allow transfer of land. + <tag>fail</tag> </notification> <notification @@ -1822,6 +1979,7 @@ Unable to abandon land: Waiting for server to update parcel information. Try again in a few seconds. + <tag>fail</tag> </notification> <notification @@ -1832,6 +1990,7 @@ Unable to abandon land: You do not own all the parcels selected. Please select a single parcel. + <tag>fail</tag> </notification> <notification @@ -1841,6 +2000,7 @@ Please select a single parcel. Unable to abandon land: You don't have permission to release this parcel. Parcels you own appear in green. + <tag>fail</tag> </notification> <notification @@ -1849,6 +2009,7 @@ Parcels you own appear in green. type="alertmodal"> Unable to abandon land: Cannot find the region this land is in. + <tag>fail</tag> </notification> <notification @@ -1857,6 +2018,7 @@ Cannot find the region this land is in. type="alertmodal"> Unable to abandon land: The region [REGION] does not allow transfer of land. + <tag>fail</tag> </notification> <notification @@ -1867,6 +2029,7 @@ Unable to abandon land: You must select an entire parcel to release it. Select an entire parcel, or divide your parcel first. + <tag>fail</tag> </notification> <notification @@ -1877,6 +2040,7 @@ You are about to release [AREA] m² of land. Releasing this parcel will remove it from your land holdings, but will not grant any L$. Release this land? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -1890,6 +2054,7 @@ Release this land? Unable to divide land: No parcels selected. + <tag>fail</tag> </notification> <notification @@ -1900,6 +2065,7 @@ Unable to divide land: You have an entire parcel selected. Try selecting a part of the parcel. + <tag>fail</tag> </notification> <notification @@ -1909,6 +2075,7 @@ Try selecting a part of the parcel. Dividing this land will split this parcel into two and each parcel can have its own settings. Some settings will be reset to defaults after the operation. Divide land? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -1921,6 +2088,7 @@ Divide land? type="alertmodal"> Unable to divide land: Cannot find the region this land is in. + <tag>fail</tag> </notification> <notification @@ -1929,6 +2097,7 @@ Cannot find the region this land is in. type="alertmodal"> Unable to join land: Cannot find the region this land is in. + <tag>fail</tag> </notification> <notification @@ -1937,6 +2106,7 @@ Cannot find the region this land is in. type="alertmodal"> Unable to join land: No parcels selected. + <tag>fail</tag> </notification> <notification @@ -1947,6 +2117,7 @@ Unable to join land: You only have one parcel selected. Select land across both parcels. + <tag>fail</tag> </notification> <notification @@ -1957,6 +2128,7 @@ Unable to join land: You must select more than one parcel. Select land across both parcels. + <tag>fail</tag> </notification> <notification @@ -1967,6 +2139,7 @@ Joining this land will create one large parcel out of all parcels intersecting t You will need to reset the name and options of the new parcel. Join land? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -1978,6 +2151,7 @@ Join land? name="ConfirmNotecardSave" type="alertmodal"> This notecard needs to be saved before the item can be copied or viewed. Save notecard? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -1989,6 +2163,7 @@ This notecard needs to be saved before the item can be copied or viewed. Save no name="ConfirmItemCopy" type="alertmodal"> Copy this item to your inventory? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -2000,6 +2175,7 @@ Copy this item to your inventory? name="ResolutionSwitchFail" type="alertmodal"> Failed to switch resolution to [RESX] by [RESY] + <tag>fail</tag> </notification> <notification @@ -2007,6 +2183,7 @@ Failed to switch resolution to [RESX] by [RESY] name="ErrorUndefinedGrasses" type="alertmodal"> Error: Undefined grasses: [SPECIES] + <tag>fail</tag> </notification> <notification @@ -2014,6 +2191,7 @@ Error: Undefined grasses: [SPECIES] name="ErrorUndefinedTrees" type="alertmodal"> Error: Undefined trees: [SPECIES] + <tag>fail</tag> </notification> <notification @@ -2021,6 +2199,7 @@ Error: Undefined trees: [SPECIES] name="CannotSaveWearableOutOfSpace" type="alertmodal"> Unable to save '[NAME]' to wearable file. You will need to free up some space on your computer and save the wearable again. + <tag>fail</tag> </notification> <notification @@ -2029,6 +2208,7 @@ Unable to save '[NAME]' to wearable file. You will need to free up so type="alertmodal"> Unable to save [NAME] to central asset store. This is usually a temporary failure. Please customize and save the wearable again in a few minutes. + <tag>fail</tag> </notification> <notification @@ -2049,6 +2229,8 @@ Darn. You have been logged out of [SECOND_LIFE] type="alertmodal"> Unable to buy land for the group: You do not have permission to buy land for your active group. + <tag>group</tag> + <tag>fail</tag> </notification> <notification @@ -2056,9 +2238,11 @@ You do not have permission to buy land for your active group. label="Add Friend" name="AddFriendWithMessage" type="alertmodal"> + <tag>friendship</tag> Friends can give permissions to track each other on the map and receive online status updates. Offer friendship to [NAME]? + <tag>confirm</tag> <form name="form"> <input name="message" type="text"> Would you be my friend? @@ -2082,6 +2266,7 @@ Would you be my friend? type="alertmodal" unique="true"> Save what I'm wearing as a new Outfit: + <tag>confirm</tag> <form name="form"> <input name="message" type="text"> [DESC] (new) @@ -2104,6 +2289,7 @@ Would you be my friend? name="SaveWearableAs" type="alertmodal"> Save item to my inventory as: + <tag>confirm</tag> <form name="form"> <input name="message" type="text"> [DESC] (new) @@ -2127,6 +2313,7 @@ Would you be my friend? name="RenameOutfit" type="alertmodal"> New outfit name: + <tag>confirm</tag> <form name="form"> <input name="new_name" type="text" width="300"> [NAME] @@ -2147,7 +2334,9 @@ Would you be my friend? icon="alertmodal.tga" name="RemoveFromFriends" type="alertmodal"> + <tag>friendship</tag> Do you want to remove [NAME] from your Friends List? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -2158,7 +2347,9 @@ Do you want to remove [NAME] from your Friends List? icon="alertmodal.tga" name="RemoveMultipleFromFriends" type="alertmodal"> + <tag>friendship</tag> Do you want to remove multiple friends from your Friends list? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -2172,6 +2363,7 @@ Do you want to remove multiple friends from your Friends list? Are you sure you want to delete all scripted objects owned by ** [AVATAR_NAME] ** on all others land in this sim? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -2185,6 +2377,7 @@ on all others land in this sim? Are you sure you want to DELETE ALL scripted objects owned by ** [AVATAR_NAME] ** on ALL LAND in this sim? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -2198,6 +2391,7 @@ on ALL LAND in this sim? Are you sure you want to DELETE ALL objects (scripted or not) owned by ** [AVATAR_NAME] ** on ALL LAND in this sim? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -2209,6 +2403,7 @@ on ALL LAND in this sim? name="BlankClassifiedName" type="alertmodal"> You must specify a name for your classified. + <tag>fail</tag> </notification> <notification @@ -2218,6 +2413,7 @@ You must specify a name for your classified. Price to pay for listing must be at least L$[MIN_PRICE]. Please enter a higher price. + <tag>fail</tag> </notification> <notification @@ -2227,6 +2423,7 @@ Please enter a higher price. At least one of the items you has link items that point to it. If you delete this item, its links will permanently stop working. It is strongly advised to delete the links first. Are you sure you want to delete these items? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -2240,6 +2437,7 @@ Are you sure you want to delete these items? At least one of the items you have selected is locked. Are you sure you want to delete these items? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -2253,6 +2451,7 @@ Are you sure you want to delete these items? At least one of the items you have selected is not copyable. Are you sure you want to delete these items? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -2266,6 +2465,7 @@ Are you sure you want to delete these items? You do not own least one of the items you have selected. Are you sure you want to delete these items? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -2280,6 +2480,7 @@ At least one object is locked. At least one object is not copyable. Are you sure you want to delete these items? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -2294,6 +2495,7 @@ At least one object is locked. You do not own least one object. Are you sure you want to delete these items? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -2308,6 +2510,7 @@ At least one object is not copyable. You do not own least one object. Are you sure you want to delete these items? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -2323,6 +2526,7 @@ At least one object is not copyable. You do not own least one object. Are you sure you want to delete these items? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="cancel" @@ -2336,6 +2540,7 @@ Are you sure you want to delete these items? At least one object is locked. Are you sure you want to take these items? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -2350,6 +2555,7 @@ You do not own all of the objects you are taking. If you continue, next owner permissions will be applied and possibly restrict your ability to modify or copy them. Are you sure you want to take these items? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -2366,6 +2572,7 @@ If you continue, next owner permissions will be applied and possibly restrict yo However, you can take the current selection. Are you sure you want to take these items? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -2379,6 +2586,7 @@ Are you sure you want to take these items? Unable to buy land because selection spans multiple regions. Please select a smaller area and try again. + <tag>fail</tag> </notification> <notification @@ -2389,6 +2597,8 @@ By deeding this parcel, the group will be required to have and maintain sufficie The purchase price of the land is not refunded to the owner. If a deeded parcel is sold, the sale price will be divided evenly among group members. Deed this [AREA] m² of land to the group '[GROUP_NAME]'? + <tag>group</tag> + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -2404,6 +2614,8 @@ The deed will include a simultaneous land contribution to the group from '[ The purchase price of the land is not refunded to the owner. If a deeded parcel is sold, the sale price will be divided evenly among group members. Deed this [AREA] m² of land to the group '[GROUP_NAME]'? + <tag>group</tag> + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -2429,6 +2641,7 @@ Display settings have been set to recommended levels based on your system config name="ErrorMessage" type="alertmodal"> [ERROR_MESSAGE] + <tag>fail</tag> <usetemplate name="okbutton" yestext="OK"/> @@ -2484,6 +2697,7 @@ You can use [SECOND_LIFE] normally and other people will see you correctly. If this is your first time using [SECOND_LIFE], you will need to create an account before you can log in. Return to [http://join.secondlife.com secondlife.com] to create a new account? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Continue" @@ -2537,6 +2751,7 @@ Please choose the male or female avatar. You can change your mind later. name="CantTeleportToGrid" type="alertmodal"> Could not teleport to [SLURL] as it's on a different grid ([GRID]) than the current grid ([CURRENT_GRID]). Please close your viewer and try again. + <tag>fail</tag> <usetemplate name="okbutton" yestext="OK"/> @@ -2557,6 +2772,7 @@ SHA1 Fingerprint: [MD5_DIGEST] Key Usage: [KEYUSAGE] Extended Key Usage: [EXTENDEDKEYUSAGE] Subject Key Identifier: [SUBJECTKEYIDENTIFIER] + <tag>fail</tag> <usetemplate name="okbutton" yestext="OK"/> @@ -2579,6 +2795,7 @@ Extended Key Usage: [EXTENDEDKEYUSAGE] Subject Key Identifier: [SUBJECTKEYIDENTIFIER] Would you like to trust this authority? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -2590,6 +2807,8 @@ Would you like to trust this authority? name="NotEnoughCurrency" type="alertmodal"> [NAME] L$ [PRICE] You don't have enough L$ to do that. + <tag>fail</tag> + <tag>funds</tag> </notification> <notification @@ -2626,6 +2845,7 @@ This is really only useful for debugging. name="BuyOneObjectOnly" type="alertmodal"> Unable to buy more than one object at a time. Please select only one object and try again. + <tag>fail</tag> </notification> <notification @@ -2634,6 +2854,7 @@ Unable to buy more than one object at a time. Please select only one object and type="alertmodal"> Unable to copy the contents of more than one item at a time. Please select only one object and try again. + <tag>fail</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -2645,6 +2866,7 @@ Please select only one object and try again. name="KickUsersFromRegion" type="alertmodal"> Teleport all Residents in this region home? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -2656,6 +2878,7 @@ Teleport all Residents in this region home? name="EstateObjectReturn" type="alertmodal"> Are you sure you want to return objects owned by [USER_NAME]? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -2670,6 +2893,7 @@ Couldn't set region textures: Terrain texture [TEXTURE_NUM] has an invalid bit depth of [TEXTURE_BIT_DEPTH]. Replace texture [TEXTURE_NUM] with a 24-bit 512x512 or smaller image then click "Apply" again. + <tag>fail</tag> </notification> <notification @@ -2694,6 +2918,7 @@ Upload started. It may take up to two minutes, depending on your connection spee name="ConfirmBakeTerrain" type="alertmodal"> Do you really want to bake the current terrain, make it the center for terrain raise/lower limits and the default for the 'Revert' tool? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -2727,6 +2952,7 @@ Exceeds the [MAX_AGENTS] [LIST_TYPE] limit by [NUM_EXCESS]. name="MaxAllowedGroupsOnRegion" type="alertmodal"> You can only have [MAX_GROUPS] Allowed Groups. + <tag>group</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -2784,6 +3010,7 @@ Finished download of raw terrain file to: A new version of [APP_NAME] is available. [MESSAGE] You must download this update to use [APP_NAME]. + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Quit" @@ -2797,6 +3024,7 @@ You must download this update to use [APP_NAME]. An updated version of [APP_NAME] is available. [MESSAGE] This update is not required, but we suggest you install it to improve performance and stability. + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Continue" @@ -2810,6 +3038,7 @@ This update is not required, but we suggest you install it to improve performanc An updated version of [APP_NAME] is available. [MESSAGE] This update is not required, but we suggest you install it to improve performance and stability. + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Continue" @@ -2823,6 +3052,7 @@ This update is not required, but we suggest you install it to improve performanc A new version of [APP_NAME] is available. [MESSAGE] You must download this update to use [APP_NAME]. + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Quit" @@ -2836,6 +3066,7 @@ You must download this update to use [APP_NAME]. An updated version of [APP_NAME] is available. [MESSAGE] This update is not required, but we suggest you install it to improve performance and stability. + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Continue" @@ -2849,6 +3080,7 @@ This update is not required, but we suggest you install it to improve performanc An updated version of [APP_NAME] is available. [MESSAGE] This update is not required, but we suggest you install it to improve performance and stability. + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Continue" @@ -2864,6 +3096,7 @@ A new version of [APP_NAME] is available. You must download this update to use [APP_NAME]. Download to your Applications folder? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Quit" @@ -2879,6 +3112,7 @@ An updated version of [APP_NAME] is available. This update is not required, but we suggest you install it to improve performance and stability. Download to your Applications folder? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Continue" @@ -2894,6 +3128,7 @@ An updated version of [APP_NAME] is available. This update is not required, but we suggest you install it to improve performance and stability. Download to your Applications folder? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Continue" @@ -2921,6 +3156,7 @@ You will be unable to log in until [APP_NAME] has been updated. Please download and install the latest viewer from http://secondlife.com/download. + <tag>fail</tag> <usetemplate name="okbutton" yestext="Quit"/> @@ -2934,6 +3170,7 @@ There is a required update for your Second Life Installation. You may download this update from http://www.secondlife.com/downloads or you can install it now. + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Quit Second Life" @@ -2946,6 +3183,7 @@ or you can install it now. type="notify"> We have downloaded an update to your [APP_NAME] installation. Version [VERSION] [[RELEASE_NOTES_FULL_URL] Information about this update] + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Later..." @@ -2958,6 +3196,7 @@ Version [VERSION] [[RELEASE_NOTES_FULL_URL] Information about this update] type="alertmodal"> We have downloaded an update to your [APP_NAME] installation. Version [VERSION] [[RELEASE_NOTES_FULL_URL] Information about this update] + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Later..." @@ -2972,6 +3211,7 @@ We have downloaded a required software update. Version [VERSION] We must restart [APP_NAME] to install the update. + <tag>confirm</tag> <usetemplate name="okbutton" yestext="OK"/> @@ -2982,6 +3222,7 @@ We must restart [APP_NAME] to install the update. name="RequiredUpdateDownloadedDialog" type="alertmodal"> We must restart [APP_NAME] to install the update. + <tag>confirm</tag> <usetemplate name="okbutton" yestext="OK"/> @@ -2993,6 +3234,8 @@ We must restart [APP_NAME] to install the update. type="alertmodal"> Deeding this object will cause the group to: * Receive L$ paid into the object + <tag>group</tag> + <tag>confirm</tag> <usetemplate ignoretext="Confirm before I deed an object to a group" name="okcancelignore" @@ -3005,6 +3248,7 @@ Deeding this object will cause the group to: name="WebLaunchExternalTarget" type="alertmodal"> Do you want to open your Web browser to view this content? + <tag>confirm</tag> <usetemplate ignoretext="Launch my browser to view a web page" name="okcancelignore" @@ -3017,6 +3261,7 @@ Do you want to open your Web browser to view this content? name="WebLaunchJoinNow" type="alertmodal"> Go to your [http://secondlife.com/account/ Dashboard] to manage your account? + <tag>confirm</tag> <usetemplate ignoretext="Launch my browser to manage my account" name="okcancelignore" @@ -3029,6 +3274,7 @@ Go to your [http://secondlife.com/account/ Dashboard] to manage your account? name="WebLaunchSecurityIssues" type="alertmodal"> Visit the [SECOND_LIFE] Wiki for details of how to report a security issue. + <tag>confirm</tag> <usetemplate ignoretext="Launch my browser to learn how to report a Security Issue" name="okcancelignore" @@ -3041,6 +3287,7 @@ Visit the [SECOND_LIFE] Wiki for details of how to report a security issue. name="WebLaunchQAWiki" type="alertmodal"> Visit the [SECOND_LIFE] QA Wiki. + <tag>confirm</tag> <usetemplate ignoretext="Launch my browser to view the QA Wiki" name="okcancelignore" @@ -3053,6 +3300,7 @@ Visit the [SECOND_LIFE] QA Wiki. name="WebLaunchPublicIssue" type="alertmodal"> Visit the [SECOND_LIFE] Public Issue Tracker, where you can report bugs and other issues. + <tag>confirm</tag> <usetemplate ignoretext="Launch my browser to use the Public Issue Tracker" name="okcancelignore" @@ -3065,6 +3313,7 @@ Visit the [SECOND_LIFE] Public Issue Tracker, where you can report bugs and othe name="WebLaunchSupportWiki" type="alertmodal"> Go to the Official Linden Blog, for the latest news and information. + <tag>confirm</tag> <usetemplate ignoretext="Launch my browser to view the blog" name="okcancelignore" @@ -3077,6 +3326,7 @@ Go to the Official Linden Blog, for the latest news and information. name="WebLaunchLSLGuide" type="alertmodal"> Do you want to open the Scripting Guide for help with scripting? + <tag>confirm</tag> <usetemplate ignoretext="Launch my browser to view the Scripting Guide" name="okcancelignore" @@ -3089,6 +3339,7 @@ Do you want to open the Scripting Guide for help with scripting? name="WebLaunchLSLWiki" type="alertmodal"> Do you want to visit the LSL Portal for help with scripting? + <tag>confirm</tag> <usetemplate ignoretext="Launch my browser to view the LSL Portal" name="okcancelignore" @@ -3103,6 +3354,7 @@ Do you want to visit the LSL Portal for help with scripting? Are you sure you want to return the selected objects to their owners? Transferable deeded objects will be returned to their previous owners. *WARNING* No-transfer deeded objects will be deleted! + <tag>confirm</tag> <usetemplate ignoretext="Confirm before I return objects to their owners" name="okcancelignore" @@ -3116,6 +3368,8 @@ Are you sure you want to return the selected objects to their owners? Transferab type="alert"> You are currently a member of the group [GROUP]. Leave Group? + <tag>group</tag> + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -3127,6 +3381,7 @@ Leave Group? name="ConfirmKick" type="alert"> Do you REALLY want to kick all Residents off the grid? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -3138,6 +3393,7 @@ Do you REALLY want to kick all Residents off the grid? name="MuteLinden" type="alertmodal"> Sorry, you cannot block a Linden. + <tag>fail</tag> <usetemplate name="okbutton" yestext="OK"/> @@ -3147,7 +3403,8 @@ Sorry, you cannot block a Linden. icon="alertmodal.tga" name="CannotStartAuctionAlreadyForSale" type="alertmodal"> -You cannot start an auction on a parcel which is already set for sale. Disable the land sale if you are sure you want to start an auction. + You cannot start an auction on a parcel which is already set for sale. Disable the land sale if you are sure you want to start an auction. + <tag>fail</tag> </notification> <notification @@ -3156,6 +3413,7 @@ You cannot start an auction on a parcel which is already set for sale. Disable name="MuteByNameFailed" type="alertmodal"> You already have blocked this name. + <tag>fail</tag> <usetemplate name="okbutton" yestext="OK"/> @@ -3166,6 +3424,7 @@ You already have blocked this name. name="RemoveItemWarn" type="alert"> Though permitted, deleting contents may damage the object. Do you want to delete that item? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -3177,6 +3436,7 @@ Though permitted, deleting contents may damage the object. Do you want to delete name="CantOfferCallingCard" type="alert"> Cannot offer a calling card at this time. Please try again in a moment. + <tag>fail</tag> <usetemplate name="okbutton" yestext="OK"/> @@ -3186,6 +3446,8 @@ Cannot offer a calling card at this time. Please try again in a moment. icon="alert.tga" name="CantOfferFriendship" type="alert"> + <tag>friendship</tag> + <tag>fail</tag> Cannot offer friendship at this time. Please try again in a moment. <usetemplate name="okbutton" @@ -3210,6 +3472,8 @@ Chat and instant messages will be hidden. Instant messages will get your Busy mo type="alert"> You have reached your maximum number of groups. Please leave another group before joining this one, or decline the offer. [NAME] has invited you to join a group as a member. + <tag>group</tag> + <tag>fail</tag> <usetemplate name="okcancelbuttons" notext="Decline" @@ -3221,6 +3485,8 @@ You have reached your maximum number of groups. Please leave another group befor name="JoinedTooManyGroups" type="alert"> You have reached your maximum number of groups. Please leave some group before joining or creating a new one. + <tag>group</tag> + <tag>fail</tag> <usetemplate name="okbutton" yestext="OK"/> @@ -3232,6 +3498,7 @@ You have reached your maximum number of groups. Please leave some group before j type="alert"> <tag>win</tag> Kick this Resident with what message? + <tag>confirm</tag> <form name="form"> <input name="message" type="text"> An administrator has logged you off. @@ -3254,6 +3521,7 @@ An administrator has logged you off. type="alert"> <tag>win</tag> Kick everyone currently on the grid with what message? + <tag>confirm</tag> <form name="form"> <input name="message" type="text"> An administrator has logged you off. @@ -3274,7 +3542,8 @@ An administrator has logged you off. icon="alert.tga" name="FreezeUser" type="alert"> - <tag>win</tag> + <tag>win</tag> + <tag>confirm</tag> Freeze this Resident with what message? <form name="form"> <input name="message" type="text"> @@ -3297,6 +3566,7 @@ You have been frozen. You cannot move or chat. An administrator will contact you name="UnFreezeUser" type="alert"> <tag>win</tag> + <tag>confirm</tag> Unfreeze this Resident with what message? <form name="form"> <input name="message" type="text"> @@ -3328,6 +3598,7 @@ Just like in real life, it takes a while for everyone to learn about a new name. name="SetDisplayNameBlocked" type="alert"> Sorry, you cannot change your display name. If you feel this is in error, please contact support. + <tag>fail</tag> </notification> <notification @@ -3337,6 +3608,7 @@ Sorry, you cannot change your display name. If you feel this is in error, please Sorry, that name is too long. Display names can have a maximum of [LENGTH] characters. Please try a shorter name. + <tag>fail</tag> </notification> <notification @@ -3344,6 +3616,7 @@ Please try a shorter name. name="SetDisplayNameFailedGeneric" type="alertmodal"> Sorry, we could not set your display name. Please try again later. + <tag>fail</tag> </notification> <notification @@ -3351,6 +3624,7 @@ Please try a shorter name. name="SetDisplayNameMismatch" type="alertmodal"> The display names you entered do not match. Please re-enter. + <tag>fail</tag> </notification> <!-- *NOTE: This should never happen --> @@ -3363,6 +3637,7 @@ Sorry, you have to wait longer before you can change your display name. See http://wiki.secondlife.com/wiki/Setting_your_display_name Please try again later. + <tag>fail</tag> </notification> <notification @@ -3372,6 +3647,7 @@ Please try again later. Sorry, we could not set your requested name because it contains a banned word. Please try a different name. + <tag>fail</tag> </notification> <notification @@ -3379,6 +3655,7 @@ Please try again later. name="AgentDisplayNameSetInvalidUnicode" type="alertmodal"> The display name you wish to set contains invalid characters. + <tag>fail</tag> </notification> <notification @@ -3386,6 +3663,7 @@ Please try again later. name="AgentDisplayNameSetOnlyPunctuation" type="alertmodal"> Your display name must contain letters other than punctuation. + <tag>fail</tag> </notification> @@ -3401,6 +3679,7 @@ Please try again later. name="OfferTeleport" type="alertmodal"> Offer a teleport to your location with the following message? + <tag>confirm</tag> <form name="form"> <input name="message" type="text"> Join me in [REGION] @@ -3422,6 +3701,7 @@ Join me in [REGION] name="OfferTeleportFromGod" type="alertmodal"> God summon Resident to your location? + <tag>confirm</tag> <form name="form"> <input name="message" type="text"> Join me in [REGION] @@ -3443,6 +3723,7 @@ Join me in [REGION] name="TeleportFromLandmark" type="alertmodal"> Are you sure you want to teleport to <nolink>[LOCATION]</nolink>? + <tag>confirm</tag> <usetemplate ignoretext="Confirm that I want to teleport to a landmark" name="okcancelignore" @@ -3454,7 +3735,8 @@ Are you sure you want to teleport to <nolink>[LOCATION]</nolink>? icon="alertmodal.tga" name="TeleportToPick" type="alertmodal"> -Teleport to [PICK]? + Teleport to [PICK]? + <tag>confirm</tag> <usetemplate ignoretext="Confirm that I want to teleport to a location in Picks" name="okcancelignore" @@ -3467,6 +3749,7 @@ Teleport to [PICK]? name="TeleportToClassified" type="alertmodal"> Teleport to [CLASSIFIED]? + <tag>confirm</tag> <usetemplate ignoretext="Confirm that I want to teleport to a location in Classifieds" name="okcancelignore" @@ -3479,6 +3762,7 @@ Teleport to [PICK]? name="TeleportToHistoryEntry" type="alertmodal"> Teleport to [HISTORY_ENTRY]? + <tag>confirm</tag> <usetemplate ignoretext="Confirm that I want to teleport to a history location" name="okcancelignore" @@ -3492,6 +3776,7 @@ Teleport to [HISTORY_ENTRY]? name="MessageEstate" type="alert"> Type a short announcement which will be sent to everyone currently in your estate. + <tag>confirm</tag> <form name="form"> <input name="message" type="text"/> <button @@ -3516,6 +3801,7 @@ You are about to change a Linden owned estate (mainland, teen grid, orientation, This is EXTREMELY DANGEROUS because it can fundamentally affect the Resident experience. On the mainland, it will change thousands of regions and make the spaceserver hiccup. Proceed? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -3531,6 +3817,7 @@ You are about to change the access list for a Linden owned estate (mainland, tee This is DANGEROUS and should only be done to invoke the hack allowing objects/L$ to be transfered in/out of a grid. It will change thousands of regions and make the spaceserver hiccup. + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -3543,6 +3830,7 @@ It will change thousands of regions and make the spaceserver hiccup. name="EstateAllowedAgentAdd" type="alert"> Add to allowed list for this estate only or for [ALL_ESTATES]? + <tag>confirm</tag> <usetemplate canceltext="Cancel" name="yesnocancelbuttons" @@ -3556,6 +3844,7 @@ Add to allowed list for this estate only or for [ALL_ESTATES]? name="EstateAllowedAgentRemove" type="alert"> Remove from allowed list for this estate only or for [ALL_ESTATES]? + <tag>confirm</tag> <usetemplate canceltext="Cancel" name="yesnocancelbuttons" @@ -3569,6 +3858,8 @@ Remove from allowed list for this estate only or for [ALL_ESTATES]? name="EstateAllowedGroupAdd" type="alert"> Add to group allowed list for this estate only or for [ALL_ESTATES]? + <tag>group</tag> + <tag>confirm</tag> <usetemplate canceltext="Cancel" name="yesnocancelbuttons" @@ -3582,6 +3873,8 @@ Add to group allowed list for this estate only or for [ALL_ESTATES]? name="EstateAllowedGroupRemove" type="alert"> Remove from group allowed list for this estate only or [ALL_ESTATES]? + <tag>group</tag> + <tag>confirm</tag> <usetemplate canceltext="Cancel" name="yesnocancelbuttons" @@ -3595,6 +3888,7 @@ Remove from group allowed list for this estate only or [ALL_ESTATES]? name="EstateBannedAgentAdd" type="alert"> Deny access for this estate only or for [ALL_ESTATES]? + <tag>confirm</tag> <usetemplate canceltext="Cancel" name="yesnocancelbuttons" @@ -3608,6 +3902,7 @@ Deny access for this estate only or for [ALL_ESTATES]? name="EstateBannedAgentRemove" type="alert"> Remove this Resident from the ban list for access for this estate only or for [ALL_ESTATES]? + <tag>confirm</tag> <usetemplate canceltext="Cancel" name="yesnocancelbuttons" @@ -3621,6 +3916,7 @@ Remove this Resident from the ban list for access for this estate only or for [ name="EstateManagerAdd" type="alert"> Add estate manager for this estate only or for [ALL_ESTATES]? + <tag>confirm</tag> <usetemplate canceltext="Cancel" name="yesnocancelbuttons" @@ -3634,6 +3930,7 @@ Add estate manager for this estate only or for [ALL_ESTATES]? name="EstateManagerRemove" type="alert"> Remove estate manager for this estate only or for [ALL_ESTATES]? + <tag>confirm</tag> <usetemplate canceltext="Cancel" name="yesnocancelbuttons" @@ -3647,6 +3944,7 @@ Remove estate manager for this estate only or for [ALL_ESTATES]? name="EstateKickUser" type="alert"> Kick [EVIL_USER] from this estate? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -3658,6 +3956,7 @@ Kick [EVIL_USER] from this estate? name="EstateChangeCovenant" type="alertmodal"> Are you sure you want to change the Estate Covenant? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -3682,6 +3981,7 @@ Please verify you have the latest Viewer installed, and go to the Knowledge Base name="RegionEntryAccessBlocked_KB" type="alertmodal"> <tag>fail</tag> + <tag>confirm</tag> You are not allowed in that region due to your maturity Rating. Go to the Knowledge Base for more information about maturity Ratings? @@ -3708,6 +4008,7 @@ You are not allowed in that region due to your maturity Rating. name="RegionEntryAccessBlocked_Change" type="alertmodal"> <tag>fail</tag> + <tag>confirm</tag> You are not allowed in that Region due to your maturity Rating preference. To enter the desired region, please change your maturity Rating preference. This will allow you to search for and access [REGIONMATURITY] content. To undo any changes, go to Me > Preferences > General. @@ -3739,6 +4040,7 @@ Your maturity Rating preference is now [RATING]. You cannot claim this land due to your maturity Rating. This may be a result of a lack of information validating your age. Please verify you have the latest Viewer installed, and go to the Knowledge Base for details on accessing areas with this maturity rating. + <tag>fail</tag> <usetemplate name="okbutton" yestext="OK"/> @@ -3751,6 +4053,8 @@ Please verify you have the latest Viewer installed, and go to the Knowledge Base You cannot claim this land due to your maturity Rating. Go to the Knowledge Base for more information about maturity Ratings? + <tag>fail</tag> + <tag>confirm</tag> <url option="0" name="url"> http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview </url> @@ -3766,6 +4070,7 @@ Go to the Knowledge Base for more information about maturity Ratings? name="LandClaimAccessBlocked_Notify" type="notifytip"> You cannot claim this land due to your maturity Rating. + <tag>fail</tag> </notification> <notification @@ -3775,6 +4080,8 @@ You cannot claim this land due to your maturity Rating. You cannot claim this land due to your maturity Rating preference. You can click 'Change Preference' to raise your maturity Rating preference now and allow you to enter. You will be able to search and access [REGIONMATURITY] content from now on. If you later want to change this setting back, go to Me > Preferences > General. + <tag>fail</tag> + <tag>confirm</tag> <usetemplate name="okcancelignore" yestext="Change Preference" @@ -3789,6 +4096,7 @@ You can click 'Change Preference' to raise your maturity Rating prefer You cannot buy this land due to your maturity Rating. This may be a result of a lack of information validating your age. Please verify you have the latest Viewer installed, and go to the Knowledge Base for details on accessing areas with this maturity rating. + <tag>fail</tag> <usetemplate name="okbutton" yestext="OK"/> @@ -3801,6 +4109,8 @@ Please verify you have the latest Viewer installed, and go to the Knowledge Base You cannot buy this land due to your maturity Rating. Go to the Knowledge Base for more information about maturity Ratings? + <tag>confirm</tag> + <tag>fail</tag> <url option="0" name="url"> http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview </url> @@ -3816,6 +4126,7 @@ Go to the Knowledge Base for more information about maturity Ratings? name="LandBuyAccessBlocked_Notify" type="notifytip"> You cannot buy this land due to your maturity Rating. + <tag>fail</tag> </notification> <notification @@ -3825,6 +4136,8 @@ You cannot buy this land due to your maturity Rating. You cannot buy this land due to your maturity Rating preference. You can click 'Change Preference' to raise your maturity Rating preference now and allow you to enter. You will be able to search and access [REGIONMATURITY] content from now on. If you later want to change this setting back, go to Me > Preferences > General. + <tag>confirm</tag> + <tag>fail</tag> <usetemplate name="okcancelignore" yestext="Change Preference" @@ -3837,6 +4150,7 @@ You can click 'Change Preference' to raise your maturity Rating prefer name="TooManyPrimsSelected" type="alertmodal"> There are too many prims selected. Please select [MAX_PRIM_COUNT] or fewer prims and try again + <tag>fail</tag> <usetemplate name="okbutton" yestext="OK"/> @@ -3847,6 +4161,7 @@ There are too many prims selected. Please select [MAX_PRIM_COUNT] or fewer prim name="ProblemImportingEstateCovenant" type="alertmodal"> Problem importing estate covenant. + <tag>fail</tag> <usetemplate name="okbutton" yestext="OK"/> @@ -3857,6 +4172,7 @@ Problem importing estate covenant. name="ProblemAddingEstateManager" type="alertmodal"> Problems adding a new estate manager. One or more estates may have a full manager list. + <tag>fail</tag> </notification> <notification @@ -3864,6 +4180,7 @@ Problems adding a new estate manager. One or more estates may have a full manag name="ProblemAddingEstateGeneric" type="alertmodal"> Problems adding to this estate list. One or more estates may have a full list. + <tag>fail</tag> </notification> <notification @@ -3874,6 +4191,7 @@ Unable to load notecard's asset at this time. <usetemplate name="okbutton" yestext="OK"/> + <tag>fail</tag> </notification> <notification @@ -3884,6 +4202,7 @@ Insufficient permissions to view notecard associated with asset ID requested. <usetemplate name="okbutton" yestext="OK"/> + <tag>fail</tag> </notification> <notification @@ -3891,6 +4210,7 @@ Insufficient permissions to view notecard associated with asset ID requested. name="MissingNotecardAssetID" type="alertmodal"> Asset ID for notecard is missing from database. + <tag>fail</tag> <usetemplate name="okbutton" yestext="OK"/> @@ -3903,6 +4223,8 @@ Asset ID for notecard is missing from database. Remember: Classified ad fees are non-refundable. Publish this classified now for L$[AMOUNT]? + <tag>confirm</tag> + <tag>funds</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -3914,6 +4236,7 @@ Publish this classified now for L$[AMOUNT]? name="SetClassifiedMature" type="alertmodal"> Does this classified contain Moderate content? + <tag>confirm</tag> <usetemplate canceltext="Cancel" name="yesnocancelbuttons" @@ -3926,6 +4249,8 @@ Does this classified contain Moderate content? name="SetGroupMature" type="alertmodal"> Does this group contain Moderate content? + <tag>group</tag> + <tag>confirm</tag> <usetemplate canceltext="Cancel" name="yesnocancelbuttons" @@ -3939,6 +4264,7 @@ Does this group contain Moderate content? name="ConfirmRestart" type="alert"> Do you really want to restart this region in 2 minutes? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -3951,6 +4277,7 @@ Do you really want to restart this region in 2 minutes? name="MessageRegion" type="alert"> Type a short announcement which will be sent to everyone in this region. + <tag>confirm</tag> <form name="form"> <input name="message" type="text"/> <button @@ -3982,6 +4309,8 @@ To enter Adult regions, Residents must be Account Verified, either by age-verifi name="VoiceVersionMismatch" type="alertmodal"> This version of [APP_NAME] is not compatible with the Voice Chat feature in this region. In order for Voice Chat to function correctly you will need to update [APP_NAME]. + <tag>fail</tag> + <tag>voice</tag> </notification> <notification @@ -3991,6 +4320,7 @@ This version of [APP_NAME] is not compatible with the Voice Chat feature in this type="alertmodal"> Cannot buy objects from different owners at the same time. Please select only one object and try again. + <tag>fail</tag> </notification> <notification @@ -4000,6 +4330,7 @@ Please select only one object and try again. type="alertmodal"> Unable to buy the contents of more than one object at a time. Please select only one object and try again. + <tag>fail</tag> </notification> <notification @@ -4009,6 +4340,7 @@ Please select only one object and try again. type="alertmodal"> Cannot buy objects from different owners at the same time. Please select only one object and try again. + <tag>fail</tag> </notification> <notification @@ -4021,6 +4353,8 @@ You will be able to: Modify: [MODIFYPERM] Copy: [COPYPERM] Resell or Give Away: [RESELLPERM] + <tag>confirm</tag> + <tag>funds</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -4037,6 +4371,8 @@ You will be able to: Modify: [MODIFYPERM] Copy: [COPYPERM] Resell or Give Away: [RESELLPERM] + <tag>confirm</tag> + <tag>funds</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -4053,6 +4389,8 @@ You will be able to: Modify: [MODIFYPERM] Copy: [COPYPERM] Resell or Give Away: [RESELLPERM] + <tag>confirm</tag> + <tag>funds</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -4069,6 +4407,8 @@ You will be able to: Modify: [MODIFYPERM] Copy: [COPYPERM] Resell or Give Away: [RESELLPERM] + <tag>confirm</tag> + <tag>funds</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -4081,6 +4421,8 @@ You will be able to: type="alertmodal"> Buy contents from [OWNER] for L$[PRICE]? They will be copied to your inventory. + <tag>confirm</tag> + <tag>funds</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -4093,6 +4435,8 @@ They will be copied to your inventory. type="alertmodal"> Buy contents for L$[PRICE]? They will be copied to your inventory. + <tag>confirm</tag> + <tag>funds</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -4107,6 +4451,8 @@ This transaction will: [ACTION] Are you sure you want to proceed with this purchase? + <tag>confirm</tag> + <tag>funds</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -4122,6 +4468,8 @@ This transaction will: Are you sure you want to proceed with this purchase? Please re-enter your password and click OK. + <tag>funds</tag> + <tag>confirm</tag> <form name="form"> <input name="message" @@ -4157,6 +4505,7 @@ You have selected 'no copy' inventory items. These items will be moved to your inventory, not copied. Move the inventory item(s)? + <tag>confirm</tag> <usetemplate ignoretext="Warn me before I move 'no-copy' items from an object" name="okcancelignore" @@ -4171,7 +4520,8 @@ Move the inventory item(s)? You have selected 'no copy' inventory items. These items will be moved to your inventory, not copied. Because this object is scripted, moving these items to your inventory may cause the script to malfunction. -Move the inventory item(s)? +Move the inventory item(s)? + <tag>confirm</tag> <usetemplate ignoretext="Warn me before I move 'no-copy' items which might break a scripted object" name="okcancelignore" @@ -4195,6 +4545,7 @@ Warning: The 'Pay object' click action has been set, but it will only name="OpenObjectCannotCopy" type="alertmodal"> There are no items in this object that you are allowed to copy. + <tag>fail</tag> </notification> <notification @@ -4202,6 +4553,7 @@ There are no items in this object that you are allowed to copy. name="WebLaunchAccountHistory" type="alertmodal"> Go to your [http://secondlife.com/account/ Dashboard] to see your account history? + <tag>confirm</tag> <usetemplate ignoretext="Launch my browser to see my account history" name="okcancelignore" @@ -4215,6 +4567,7 @@ Go to your [http://secondlife.com/account/ Dashboard] to see your account histor type="alertmodal" unique="true"> Are you sure you want to quit? + <tag>confirm</tag> <usetemplate ignoretext="Confirm before I quit" name="okcancelignore" @@ -4228,6 +4581,7 @@ Are you sure you want to quit? type="alertmodal" unique="true"> [QUESTION] + <tag>confirm</tag> <usetemplate ignoretext="Confirm before deleting items" name="okcancelignore" @@ -4251,6 +4605,7 @@ All reported abuses are investigated and resolved. type="alertmodal"> Please select a category for this abuse report. Selecting a category helps us file and process abuse reports. + <tag>fail</tag> </notification> <notification @@ -4259,6 +4614,7 @@ Selecting a category helps us file and process abuse reports. type="alertmodal"> Please enter the name of the abuser. Entering an accurate value helps us file and process abuse reports. + <tag>fail</tag> </notification> <notification @@ -4267,6 +4623,7 @@ Entering an accurate value helps us file and process abuse reports. type="alertmodal"> Please enter the location where the abuse took place. Entering an accurate value helps us file and process abuse reports. + <tag>fail</tag> </notification> <notification @@ -4275,6 +4632,7 @@ Entering an accurate value helps us file and process abuse reports. type="alertmodal"> Please enter a summary of the abuse that took place. Entering an accurate summary helps us file and process abuse reports. + <tag>fail</tag> </notification> <notification @@ -4284,6 +4642,7 @@ Entering an accurate summary helps us file and process abuse reports. Please enter a detailed description of the abuse that took place. Be as specific as you can, including names and the details of the incident you are reporting. Entering an accurate description helps us file and process abuse reports. + <tag>fail</tag> </notification> <notification @@ -4311,6 +4670,7 @@ Linden Lab type="alertmodal"> The following required components are missing from [FLOATER]: [COMPONENTS] + <tag>fail</tag> </notification> <notification @@ -4320,6 +4680,7 @@ The following required components are missing from [FLOATER]: type="alert"> There is already an object attached to this point on your body. Do you want to replace it with the selected object? + <tag>confirm</tag> <form name="form"> <ignore name="ignore" save_option="true" @@ -4346,6 +4707,7 @@ Do you want to replace it with the selected object? You are in Busy Mode, which means you will not receive any items offered in exchange for this payment. Would you like to leave Busy Mode before completing this transaction? + <tag>confirm</tag> <form name="form"> <ignore name="ignore" save_option="true" @@ -4369,6 +4731,7 @@ Would you like to leave Busy Mode before completing this transaction? name="ConfirmDeleteProtectedCategory" type="alertmodal"> The folder '[FOLDERNAME]' is a system folder. Deleting system folders can cause instability. Are you sure you want to delete it? + <tag>confirm</tag> <usetemplate ignoretext="Confirm before I delete a system folder" name="okcancelignore" @@ -4381,6 +4744,7 @@ The folder '[FOLDERNAME]' is a system folder. Deleting system folders name="ConfirmEmptyTrash" type="alertmodal"> Are you sure you want to permanently delete the contents of your Trash? + <tag>confirm</tag> <usetemplate ignoretext="Confirm before I empty the inventory Trash folder" name="okcancelignore" @@ -4393,6 +4757,7 @@ Are you sure you want to permanently delete the contents of your Trash? name="ConfirmClearBrowserCache" type="alertmodal"> Are you sure you want to delete your travel, web, and search history? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -4404,6 +4769,7 @@ Are you sure you want to delete your travel, web, and search history? name="ConfirmClearCookies" type="alertmodal"> Are you sure you want to clear your cookies? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -4415,6 +4781,7 @@ Are you sure you want to clear your cookies? name="ConfirmClearMediaUrlList" type="alertmodal"> Are you sure you want to clear your list of saved URLs? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -4426,6 +4793,7 @@ Are you sure you want to clear your list of saved URLs? name="ConfirmEmptyLostAndFound" type="alertmodal"> Are you sure you want to permanently delete the contents of your Lost And Found? + <tag>confirm</tag> <usetemplate ignoretext="Confirm before I empty the inventory Lost And Found folder" name="okcancelignore" @@ -4452,6 +4820,7 @@ Link to this from a web page to give others easy access to this location, or try name="WLSavePresetAlert" type="alertmodal"> Do you wish to overwrite the saved preset? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="No" @@ -4463,6 +4832,7 @@ Do you wish to overwrite the saved preset? name="WLDeletePresetAlert" type="alertmodal"> Do you wish to delete [SKY]? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="No" @@ -4474,6 +4844,7 @@ Do you wish to delete [SKY]? name="WLNoEditDefault" type="alertmodal"> You cannot edit or delete a default preset. + <tag>fail</tag> </notification> <notification @@ -4481,6 +4852,7 @@ You cannot edit or delete a default preset. name="WLMissingSky" type="alertmodal"> This day cycle file references a missing sky file: [SKY]. + <tag>fail</tag> </notification> <notification @@ -4499,6 +4871,7 @@ PostProcess Effect exists. Do you still wish overwrite it? name="NewSkyPreset" type="alert"> Give me a name for the new sky. + <tag>confirm</tag> <form name="form"> <input name="message" type="text"> New Preset @@ -4520,6 +4893,7 @@ New Preset name="ExistsSkyPresetAlert" type="alertmodal"> Preset already exists! + <tag>fail</tag> </notification> <notification @@ -4527,6 +4901,7 @@ Preset already exists! name="NewWaterPreset" type="alert"> Give me a name for the new water preset. + <tag>confirm</tag> <form name="form"> <input name="message" type="text"> New Preset @@ -4548,6 +4923,7 @@ New Preset name="ExistsWaterPresetAlert" type="alertmodal"> Preset already exists! + <tag>fail</tag> </notification> <notification @@ -4555,6 +4931,7 @@ Preset already exists! name="WaterNoEditDefault" type="alertmodal"> You cannot edit or delete a default preset. + <tag>fail</tag> </notification> <notification @@ -4563,6 +4940,7 @@ You cannot edit or delete a default preset. type="alertmodal"> Unable to start a new chat session with [RECIPIENT]. [REASON] + <tag>fail</tag> <usetemplate name="okbutton" yestext="OK"/> @@ -4574,6 +4952,7 @@ Unable to start a new chat session with [RECIPIENT]. type="alertmodal"> [EVENT] [REASON] + <tag>fail</tag> <usetemplate name="okbutton" yestext="OK"/> @@ -4595,6 +4974,7 @@ Your chat session with [NAME] must close. name="Cannot_Purchase_an_Attachment" type="alertmodal"> You can't buy an object while it is attached. + <tag>fail</tag> </notification> <notification @@ -4613,6 +4993,7 @@ Granting this request gives a script ongoing permission to take Linden dollars ( name="AutoWearNewClothing" type="alertmodal"> Would you like to automatically wear the clothing you are about to create? + <tag>confirm</tag> <usetemplate ignoretext="Wear the clothing I create while editing My Appearance" name="okcancelignore" @@ -4628,6 +5009,7 @@ Would you like to automatically wear the clothing you are about to create? You must be age-verified to visit this area. Do you want to go to the [SECOND_LIFE] website and verify your age? [_URL] + <tag>confirm</tag> <url option="0" name="url"> https://secondlife.com/account/verification.php @@ -4646,6 +5028,7 @@ You must be age-verified to visit this area. Do you want to go to the [SECOND_L You must have payment information on file to visit this area. Do you want to go to the [SECOND_LIFE] website and set this up? [_URL] + <tag>confirm</tag> <url option="0" name="url"> https://secondlife.com/account/ @@ -4662,6 +5045,7 @@ You must have payment information on file to visit this area. Do you want to go name="MissingString" type="alertmodal"> The string [STRING_NAME] is missing from strings.xml + <tag>fail</tag> </notification> <notification @@ -4712,12 +5096,14 @@ Replaced missing clothing/body part with default. persist="true" type="groupnotify"> Topic: [SUBJECT], Message: [MESSAGE] + <tag>group</tag> </notification> <notification icon="notifytip.tga" name="FriendOnline" type="notifytip"> + <tag>friendship</tag> [NAME] is Online </notification> @@ -4725,6 +5111,7 @@ Topic: [SUBJECT], Message: [MESSAGE] icon="notifytip.tga" name="FriendOffline" type="notifytip"> + <tag>friendship</tag> [NAME] is Offline </notification> @@ -4732,6 +5119,7 @@ Topic: [SUBJECT], Message: [MESSAGE] icon="notifytip.tga" name="AddSelfFriend" type="notifytip"> + <tag>friendship</tag> Although you're very nice, you can't add yourself as a friend. </notification> @@ -4749,6 +5137,7 @@ Uploading in-world and web site snapshots... persist="true" type="notify"> You paid L$[AMOUNT] to upload. +<tag>funds</tag> </notification> <notification @@ -4777,6 +5166,7 @@ Terrain.raw downloaded name="GestureMissing" type="notifytip"> Hmm. Gesture [NAME] is missing from the database. + <tag>fail</tag> </notification> <notification @@ -4784,6 +5174,7 @@ Hmm. Gesture [NAME] is missing from the database. name="UnableToLoadGesture" type="notifytip"> Unable to load gesture [NAME]. + <tag>fail</tag> </notification> <notification @@ -4791,6 +5182,7 @@ Unable to load gesture [NAME]. name="LandmarkMissing" type="notifytip"> Landmark is missing from database. + <tag>fail</tag> </notification> <notification @@ -4798,6 +5190,7 @@ Landmark is missing from database. name="UnableToLoadLandmark" type="notifytip"> Unable to load landmark. Please try again. + <tag>fail</tag> </notification> <notification @@ -4813,6 +5206,7 @@ This might affect your password. name="NotecardMissing" type="notifytip"> Notecard is missing from database. + <tag>fail</tag> </notification> <notification @@ -4820,6 +5214,7 @@ Notecard is missing from database. name="NotecardNoPermissions" type="notifytip"> You don't have permission to view this notecard. + <tag>fail</tag> </notification> <notification @@ -4827,6 +5222,7 @@ You don't have permission to view this notecard. name="RezItemNoPermissions" type="notifytip"> Insufficient permissions to rez object. + <tag>fail</tag> </notification> <notification @@ -4835,6 +5231,7 @@ Insufficient permissions to rez object. type="notifytip"> Unable to load notecard. Please try again. + <tag>fail</tag> </notification> <notification @@ -4842,6 +5239,7 @@ Please try again. name="ScriptMissing" type="notifytip"> Script is missing from database. + <tag>fail</tag> </notification> <notification @@ -4849,6 +5247,7 @@ Script is missing from database. name="ScriptNoPermissions" type="notifytip"> Insufficient permissions to view script. + <tag>fail</tag> </notification> <notification @@ -4856,6 +5255,7 @@ Insufficient permissions to view script. name="UnableToLoadScript" type="notifytip"> Unable to load script. Please try again. + <tag>fail</tag> </notification> <notification @@ -4863,6 +5263,7 @@ Unable to load script. Please try again. name="IncompleteInventory" type="notifytip"> The complete contents you are offering are not yet locally available. Please try offering those items again in a minute. + <tag>fail</tag> </notification> <notification @@ -4870,6 +5271,7 @@ The complete contents you are offering are not yet locally available. Please try name="CannotModifyProtectedCategories" type="notifytip"> You cannot modify protected categories. + <tag>fail</tag> </notification> <notification @@ -4877,6 +5279,7 @@ You cannot modify protected categories. name="CannotRemoveProtectedCategories" type="notifytip"> You cannot remove protected categories. + <tag>fail</tag> </notification> <notification @@ -4885,6 +5288,7 @@ You cannot remove protected categories. type="notifytip"> Unable to buy while downloading object data. Please try again. + <tag>fail</tag> </notification> <notification @@ -4893,6 +5297,7 @@ Please try again. type="notifytip"> Unable to link while downloading object data. Please try again. + <tag>fail</tag> </notification> <notification @@ -4901,6 +5306,7 @@ Please try again. type="notifytip"> You can only buy objects from one owner at a time. Please select a single object. + <tag>fail</tag> </notification> <notification @@ -4908,6 +5314,7 @@ Please select a single object. name="ObjectNotForSale" type="notifytip"> This object is not for sale. + <tag>fail</tag> </notification> <notification @@ -4929,6 +5336,7 @@ Now leaving god mode, level [LEVEL] name="CopyFailed" type="notifytip"> You don't have permission to copy this. + <tag>fail</tag> </notification> <notification @@ -4990,6 +5398,7 @@ Select the Resident from the list, then click 'IM' at the bottom of th type="notifytip"> Can't select land across server boundaries. Try selecting a smaller piece of land. + <tag>fail</tag> </notification> <notification @@ -4997,6 +5406,7 @@ Try selecting a smaller piece of land. name="SearchWordBanned" type="notifytip"> Some terms in your search query were excluded due to content restrictions as clarified in the Community Standards. + <tag>fail</tag> </notification> <notification @@ -5004,6 +5414,7 @@ Some terms in your search query were excluded due to content restrictions as cla name="NoContentToSearch" type="notifytip"> Please select at least one type of content to search (General, Moderate, or Adult). + <tag>fail</tag> </notification> <notification @@ -5019,6 +5430,7 @@ Please select at least one type of content to search (General, Moderate, or Adul name="PaymentReceived" persist="true" type="notify"> + <tag>funds</tag> [MESSAGE] </notification> @@ -5027,6 +5439,7 @@ Please select at least one type of content to search (General, Moderate, or Adul name="PaymentSent" persist="true" type="notify"> + <tag>funds</tag> [MESSAGE] </notification> @@ -5084,13 +5497,16 @@ Deactivated gestures with same trigger: type="notify"> Apple's QuickTime software does not appear to be installed on your system. If you want to view streaming media on parcels that support it you should go to the [http://www.apple.com/quicktime QuickTime site] and install the QuickTime Player. + <tag>fail</tag> </notification> + <notification icon="notify.tga" name="NoPlugin" persist="true" type="notify"> No Media Plugin was found to handle the "[MIME_TYPE]" mime type. Media of this type will be unavailable. + <tag>fail</tag> <unique> <context>MIME_TYPE</context> </unique> @@ -5104,6 +5520,7 @@ The following Media Plugin has failed: [PLUGIN] Please re-install the plugin or contact the vendor if you continue to experience problems. + <tag>fail</tag> <form name="form"> <ignore name="ignore" text="A Media Plugin fails to run"/> @@ -5141,6 +5558,7 @@ The objects on the selected parcel of land owned by the Resident '[NAME]&ap The objects on the selected parcel of land shared with the group [GROUPNAME] have been returned back to their owner's inventory. Transferable deeded objects have been returned to their previous owners. Non-transferable objects that are deeded to the group have been deleted. + <tag>group</tag> </notification> <notification @@ -5197,6 +5615,7 @@ This area does not allow pushing. You can't push others here unless you own type="notify" unique="true"> This area has voice chat disabled. You won't be able to hear anyone talking. + <tag>voice</tag> </notification> <notification @@ -5241,6 +5660,7 @@ No scripts will work here except those belonging to the land owner. persist="true" type="notify"> You can only claim public land in the Region you're in. + <tag>fail</tag> </notification> <notification @@ -5529,6 +5949,7 @@ An object named <nolink>[OBJECTFROMNAME]</nolink> owned by [NAME_SLU name="JoinGroup" persist="true" type="notify"> + <tag>group</tag> [MESSAGE] <form name="form"> <button @@ -5553,6 +5974,7 @@ An object named <nolink>[OBJECTFROMNAME]</nolink> owned by [NAME_SLU [NAME_SLURL] has offered to teleport you to their location: [MESSAGE] - [MATURITY_STR] <icon>[MATURITY_ICON]</icon> + <tag>confirm</tag> <form name="form"> <button index="0" @@ -5596,6 +6018,8 @@ An object named <nolink>[OBJECTFROMNAME]</nolink> owned by [NAME_SLU icon="notify.tga" name="OfferFriendship" type="offer"> + <tag>friendship</tag> + <tag>confirm</tag> [NAME_SLURL] is offering friendship. [MESSAGE] @@ -5617,6 +6041,7 @@ An object named <nolink>[OBJECTFROMNAME]</nolink> owned by [NAME_SLU icon="notify.tga" name="FriendshipOffered" type="offer"> + <tag>friendship</tag> You have offered friendship to [TO_NAME] </notification> @@ -5625,6 +6050,7 @@ An object named <nolink>[OBJECTFROMNAME]</nolink> owned by [NAME_SLU name="OfferFriendshipNoMessage" persist="true" type="notify"> + <tag>friendship</tag> [NAME_SLURL] is offering friendship. (By default, you will be able to see each other's online status.) @@ -5644,6 +6070,7 @@ An object named <nolink>[OBJECTFROMNAME]</nolink> owned by [NAME_SLU icon="notify.tga" name="FriendshipAccepted" type="offer"> + <tag>friendship</tag> [NAME] accepted your friendship offer. </notification> @@ -5652,6 +6079,7 @@ An object named <nolink>[OBJECTFROMNAME]</nolink> owned by [NAME_SLU name="FriendshipDeclined" persist="true" type="notify"> + <tag>friendship</tag> [NAME] declined your friendship offer. </notification> @@ -5659,6 +6087,7 @@ An object named <nolink>[OBJECTFROMNAME]</nolink> owned by [NAME_SLU icon="notify.tga" name="FriendshipAcceptedByMe" type="offer"> + <tag>friendship</tag> Friendship offer accepted. </notification> @@ -5666,6 +6095,7 @@ Friendship offer accepted. icon="notify.tga" name="FriendshipDeclinedByMe" type="offer"> + <tag>friendship</tag> Friendship offer declined. </notification> @@ -5719,6 +6149,7 @@ Load web page [URL]? [MESSAGE] From object: <nolink>[OBJECTNAME]</nolink>, owner: [NAME]? + <tag>confirm</tag> <form name="form"> <button index="0" @@ -5737,6 +6168,7 @@ From object: <nolink>[OBJECTNAME]</nolink>, owner: [NAME]? persist="true" type="notify"> Failed to find [TYPE] in database. + <tag>fail</tag> </notification> <notification @@ -5745,6 +6177,7 @@ Failed to find [TYPE] in database. persist="true" type="notify"> Failed to find [TYPE] named [DESC] in database. + <tag>fail</tag> </notification> <notification @@ -5753,6 +6186,7 @@ Failed to find [TYPE] named [DESC] in database. persist="true" type="notify"> The item you are trying to wear uses a feature that your Viewer can't read. Please upgrade your version of [APP_NAME] to wear this item. + <tag>fail</tag> </notification> <notification @@ -5764,6 +6198,7 @@ The item you are trying to wear uses a feature that your Viewer can't read. [QUESTIONS] Is this OK? + <tag>confirm</tag> <form name="form"> <button index="0" @@ -5792,6 +6227,7 @@ An object named '<nolink>[OBJECTNAME]</nolink>', owned by If you do not trust this object and its creator, you should deny the request. Grant this request? + <tag>confirm</tag> <form name="form"> <button index="0" @@ -5827,6 +6263,7 @@ Grant this request? icon="notify.tga" name="ScriptDialogGroup" type="notify"> + <tag>group</tag> [GROUPNAME]'s '<nolink>[TITLE]</nolink>' [MESSAGE] <form name="form"> @@ -5863,6 +6300,7 @@ Your L$ balance is shown in the upper-right. name="BuyLindenDollarSuccess" persist="true" type="notify"> + <tag>funds</tag> Thank you for your payment! Your L$ balance will be updated when processing completes. If processing takes more than 20 mins, your transaction may be cancelled. In that case, the purchase amount will be credited to your US$ balance. @@ -5870,57 +6308,6 @@ Your L$ balance will be updated when processing completes. If processing takes m The status of your payment can be checked on your Transaction History page on your [http://secondlife.com/account/ Dashboard] </notification> -<!-- - <notification - icon="notify.tga" - name="FirstSit" - persist="true" - type="notify"> -You are sitting. -Use your arrow keys (or AWSD) to look around. -Click the 'Stand Up' button to stand. - </notification> - - <notification - icon="notify.tga" - name="FirstMap" - persist="true" - type="notify"> -Click and drag the map to look around. -Double-click to teleport. -Use the controls on the right to find things and display different backgrounds. - </notification> - - <notification - icon="notify.tga" - name="FirstBuild" - persist="true" - type="notify"> -You have opened the Build Tools. Every object you see around you was created using these tools. - </notification> ---> - -<!-- - <notification - icon="notify.tga" - name="FirstLeftClickNoHit" - persist="true" - type="notify"> - Left-clicking interacts with special objects. - If the mouse pointer changes to a hand, you can interact with the object. - Right-click always shows a menu of things you can do. - </notification> - - <notification - icon="notify.tga" - name="FirstTeleport" - persist="true" - type="notify"> -You can only teleport to certain areas in this region. The arrow points to your specific destination. Click the arrow to dismiss it. - </notification> - ---> - <notification icon="notify.tga" name="FirstOverrideKeys" @@ -5932,30 +6319,6 @@ Some objects (like guns) require you to go into mouselook to use them. Press 'M' to do this. </notification> -<!-- - <notification - icon="notify.tga" - name="FirstAppearance" - persist="true" - type="notify"> -You are editing your Appearance. -Use the arrow keys to look around. -When you are done, press 'Save All'. - </notification> - - <notification - icon="notify.tga" - name="FirstInventory" - persist="true" - type="notify"> -This is your Inventory, which contains items you own. - -* To wear something, drag it onto yourself. -* To rez something inworld, drag it onto the ground. -* To read a notecard, double-click it. - </notification> ---> - <notification icon="notify.tga" name="FirstSandbox" @@ -5966,47 +6329,6 @@ This is a sandbox area, and is meant to help Residents learn how to build. Things you build here will be deleted after you leave, so don't forget to right-click and choose 'Take' to move your creation to your Inventory. </notification> -<!-- - <notification - icon="notify.tga" - name="FirstFlexible" - persist="true" - type="notify"> -This object is flexible. Flexis must be phantom and not physical. - </notification> - - <notification - icon="notify.tga" - name="FirstDebugMenus" - persist="true" - type="notify"> -You opened the Advanced menu. - -To toggle this menu, - Windows: Ctrl+Alt+D - Mac: ⌥⌘D - - </notification> - - <notification - icon="notify.tga" - name="FirstSculptedPrim" - persist="true" - type="notify"> -You are editing a Sculpted prim. Sculpties require a special texture to define their shape. - </notification> ---> - - <!-- - <notification - icon="notify.tga" - name="FirstMedia" - persist="true" - type="notify"> - You have begun playing media. Media can set to play automatically in the preferences window under Audio / Video. Note that this can be a security risk for media sites you do not trust. - </notification> - --> - <notification icon="notifytip.tga" name="MaxListSelectMessage" @@ -6020,6 +6342,8 @@ You may only select up to [MAX_SELECT] items from this list. type="notify"> [NAME] is inviting you to a Voice Chat call. Click Accept to join the call or Decline to decline the invitation. Click Block to block this caller. + <tag>confirm</tag> + <tag>voice</tag> <unique> <context>NAME</context> </unique> @@ -6069,6 +6393,9 @@ Click Accept to join the call or Decline to decline the invitation. Click Block type="notify"> [NAME] has joined a Voice Chat call with the group [GROUP]. Click Accept to join the call or Decline to decline the invitation. Click Block to block this caller. + <tag>group</tag> + <tag>confirm</tag> + <tag>voice</tag> <unique> <context>NAME</context> <context>GROUP</context> @@ -6095,6 +6422,8 @@ Click Accept to join the call or Decline to decline the invitation. Click Block type="notify"> [NAME] has joined a voice chat call with a conference chat. Click Accept to join the call or Decline to decline the invitation. Click Block to block this caller. + <tag>confirm</tag> + <tag>voice</tag> <unique> <context>NAME</context> </unique> @@ -6120,6 +6449,8 @@ Click Accept to join the call or Decline to decline the invitation. Click Block type="notify"> [NAME] is inviting you to a conference chat. Click Accept to join the chat or Decline to decline the invitation. Click Block to block this caller. + <tag>confirm</tag> + <tag>voice</tag> <unique> <context>NAME</context> </unique> @@ -6144,6 +6475,8 @@ Click Accept to join the chat or Decline to decline the invitation. Click Block name="VoiceChannelFull" type="notifytip"> The voice call you are trying to join, [VOICE_CHANNEL_NAME], has reached maximum capacity. Please try again later. + <tag>fail</tag> + <tag>voice</tag> <unique> <context>VOICE_CHANNEL_NAME</context> </unique> @@ -6154,7 +6487,9 @@ The voice call you are trying to join, [VOICE_CHANNEL_NAME], has reached maximum name="ProximalVoiceChannelFull" type="notifytip" unique="true"> -We're sorry. This area has reached maximum capacity for voice conversations. Please try to use voice in another area. + We're sorry. This area has reached maximum capacity for voice conversations. Please try to use voice in another area. + <tag>fail</tag> + <tag>voice</tag> </notification> <notification @@ -6162,6 +6497,7 @@ We're sorry. This area has reached maximum capacity for voice conversation name="VoiceChannelDisconnected" type="notifytip"> You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnected to Nearby Voice Chat. + <tag>voice</tag> <unique> <context>VOICE_CHANNEL_NAME</context> </unique> @@ -6172,6 +6508,7 @@ You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnect name="VoiceChannelDisconnectedP2P" type="notifytip"> [VOICE_CHANNEL_NAME] has ended the call. You will now be reconnected to Nearby Voice Chat. + <tag>voice</tag> <unique> <context>VOICE_CHANNEL_NAME</context> </unique> @@ -6182,6 +6519,8 @@ You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnect name="P2PCallDeclined" type="notifytip"> [VOICE_CHANNEL_NAME] has declined your call. You will now be reconnected to Nearby Voice Chat. + <tag>voice</tag> + <tag>fail</tag> <unique> <context>VOICE_CHANNEL_NAME</context> </unique> @@ -6192,6 +6531,8 @@ You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnect name="P2PCallNoAnswer" type="notifytip"> [VOICE_CHANNEL_NAME] is not available to take your call. You will now be reconnected to Nearby Voice Chat. + <tag>fail</tag> + <tag>voice</tag> <unique> <context>VOICE_CHANNEL_NAME</context> </unique> @@ -6202,6 +6543,8 @@ You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnect name="VoiceChannelJoinFailed" type="notifytip"> Failed to connect to [VOICE_CHANNEL_NAME], please try again later. You will now be reconnected to Nearby Voice Chat. + <tag>fail</tag> + <tag>voice</tag> <unique> <context>VOICE_CHANNEL_NAME</context> </unique> @@ -6214,6 +6557,8 @@ Failed to connect to [VOICE_CHANNEL_NAME], please try again later. You will now type="notifytip" unique="true"> We are creating a voice channel for you. This may take up to one minute. + <tag>status</tag> + <tag>voice</tag> </notification> <notification @@ -6225,6 +6570,8 @@ We are creating a voice channel for you. This may take up to one minute. unique="true"> One or more of your subscribed Voice Morphs has expired. [[URL] Click here] to renew your subscription. + <tag>fail</tag> + <tag>voice</tag> </notification> <notification @@ -6236,6 +6583,8 @@ One or more of your subscribed Voice Morphs has expired. unique="true"> The active Voice Morph has expired, your normal voice settings have been applied. [[URL] Click here] to renew your subscription. + <tag>fail</tag> + <tag>voice</tag> </notification> <notification @@ -6247,6 +6596,8 @@ The active Voice Morph has expired, your normal voice settings have been applied unique="true"> One or more of your Voice Morphs will expire in less than [INTERVAL] days. [[URL] Click here] to renew your subscription. + <tag>fail</tag> + <tag>voice</tag> </notification> <notification @@ -6257,6 +6608,7 @@ One or more of your Voice Morphs will expire in less than [INTERVAL] days. type="notify" unique="true"> New Voice Morphs are available! + <tag>voice</tag> </notification> <notification @@ -6264,6 +6616,7 @@ New Voice Morphs are available! name="Cannot enter parcel: not a group member" type="notifytip"> <tag>fail</tag> + <tag>group</tag> Only members of a certain group can visit this area. </notification> @@ -6288,6 +6641,8 @@ Cannot enter parcel, you are not on the access list. name="VoiceNotAllowed" type="notifytip"> You do not have permission to connect to voice chat for [VOICE_CHANNEL_NAME]. + <tag>fail</tag> + <tag>voice</tag> <unique> <context>VOICE_CHANNEL_NAME</context> </unique> @@ -6298,6 +6653,8 @@ You do not have permission to connect to voice chat for [VOICE_CHANNEL_NAME]. name="VoiceCallGenericError" type="notifytip"> An error has occurred while trying to connect to voice chat for [VOICE_CHANNEL_NAME]. Please try again later. + <tag>fail</tag> + <tag>voice</tag> <unique> <context>VOICE_CHANNEL_NAME</context> </unique> @@ -6309,6 +6666,7 @@ An error has occurred while trying to connect to voice chat for [VOICE_CHANNEL_N priority="high" type="notifytip"> The SLurl you clicked on is not supported. + <tag>fail</tag> </notification> <notification @@ -6316,7 +6674,7 @@ The SLurl you clicked on is not supported. name="BlockedSLURL" priority="high" type="notifytip"> - <tag>win</tag> + <tag>security</tag> A SLurl was received from an untrusted browser and has been blocked for your security. </notification> @@ -6325,6 +6683,7 @@ A SLurl was received from an untrusted browser and has been blocked for your sec name="ThrottledSLURL" priority="high" type="notifytip"> + <tag>security</tag> Multiple SLurls were received from an untrusted browser within a short period. They will be blocked for a few seconds for your security. </notification> @@ -6341,6 +6700,7 @@ They will be blocked for a few seconds for your security. name="ConfirmCloseAll" type="alertmodal"> Are you sure you want to close all IMs? + <tag>confirm</tag> <usetemplate name="okcancelignore" notext="Cancel" @@ -6358,6 +6718,7 @@ Attachment has been saved. name="UnableToFindHelpTopic" type="alertmodal"> Unable to find the help topic for this element. + <tag>fail</tag> </notification> <notification @@ -6366,6 +6727,7 @@ Unable to find the help topic for this element. type="alertmodal"> Server Error: Media update or get failed. '[ERROR]' + <tag>fail</tag> <usetemplate name="okbutton" yestext="OK"/> @@ -6386,6 +6748,7 @@ Your text chat has been muted by moderator. name="VoiceIsMutedByModerator" type="alertmodal"> Your voice has been muted by moderator. + <tag>voice</tag> <usetemplate name="okbutton" yestext="OK"/> @@ -6396,6 +6759,7 @@ Your voice has been muted by moderator. name="ConfirmClearTeleportHistory" type="alertmodal"> Are you sure you want to delete your teleport history? + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" @@ -6408,6 +6772,7 @@ Are you sure you want to delete your teleport history? type="alert"> Selected button can not be shown right now. The button will be shown when there is enough space for it. + <tag>fail</tag> </notification> <notification @@ -6427,22 +6792,27 @@ Are you sure you want to share the following items: With the following Residents: [RESIDENTS] + <tag>confirm</tag> <usetemplate name="okcancelbuttons" notext="Cancel" yestext="Ok"/> </notification> + <notification icon="notifytip.tga" name="ItemsShared" type="notifytip"> Items successfully shared. </notification> + <notification icon="notifytip.tga" name="DeedToGroupFail" type="notifytip"> Deed to group failed. + <tag>group</tag> + <tag>fail</tag> </notification> <notification @@ -6516,6 +6886,7 @@ Avatar '[NAME]' left appearance mode. type="alertmodal"> We're having trouble connecting using [PROTOCOL] [HOSTID]. Please check your network and firewall setup. + <tag>fail</tag> <usetemplate name="okbutton" yestext="OK"/> @@ -6531,6 +6902,8 @@ We're having trouble connecting to your voice server: Voice communications will not be available. Please check your network and firewall setup. + <tag>voice</tag> + <tag>fail</tag> <usetemplate name="okbutton" yestext="OK"/> @@ -6565,6 +6938,8 @@ You locally updated a [RESOLUTION] baked texture for '[BODYREGION]' after [TIME] name="ConfirmLeaveCall" type="alert"> Are you sure you want to leave this call? + <tag>confirm</tag> + <tag>voice</tag> <usetemplate ignoretext="Confirm before I leave call" name="okcancelignore" @@ -6582,6 +6957,9 @@ This will also cause all residents that later join the call to be muted, even after you have left the call. Mute everyone? + <tag>group</tag> + <tag>confirm</tag> + <tag>voice</tag> <usetemplate ignoretext="Confirm before I mute all participants in a group call" name="okcancelignore" @@ -6600,6 +6978,7 @@ Mute everyone? <notification name="HintSit" + label="Stand" type="hint" unique="true"> @@ -6614,14 +6993,6 @@ Mute everyone? The Destination Guide contains thousands of new places to discover. Select a location and choose Teleport to start exploring. </notification> - <notification - name="HintAvatarPicker" - label="Change your Look" - type="hint" - unique="true"> - Would you like to try a new look? Click the button below to see more Avatars. - </notification> - <notification name="HintSidePanel" label="Side Panel" @@ -6678,6 +7049,7 @@ Mute everyone? type="hint" unique="true"> Here's your current balance of L$. Click Buy L$ to purchase more Linden Dollars. + <tag>funds</tag> </notification> <notification @@ -6701,6 +7073,7 @@ Mute everyone? name="AuthRequest" type="browser"> The site at '<nolink>[HOST_NAME]</nolink>' in realm '[REALM]' requires a user name and password. + <tag>confirm</tag> <form name="form"> <input name="username" type="text" text="User Name"/> <input name="password" type="password" text="Password "/> @@ -6714,6 +7087,116 @@ The site at '<nolink>[HOST_NAME]</nolink>' in realm ' </form> </notification> + <notification + name="ModeChange" + label="" + type="alertmodal" + unique="true"> + Changing modes requires you to quit and restart. + <tag>confirm</tag> + <usetemplate + name="okcancelbuttons" + yestext="Quit" + notext="Don't Quit"/> + </notification> + + <notification + name="NoClassifieds" + label="" + type="alertmodal" + unique="true"> + <tag>fail</tag> + <tag>confirm</tag> + Creation and editing of Classifieds is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen. + <usetemplate + name="okcancelbuttons" + yestext="Quit" + notext="Don't Quit"/> + </notification> + + <notification + name="NoGroupInfo" + label="" + type="alertmodal" + unique="true"> + <tag>fail</tag> + <tag>confirm</tag> + Creation and editing of Groups is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen. + <usetemplate + name="okcancelbuttons" + yestext="Quit" + notext="Don't Quit"/> + </notification> + + <notification + name="NoPicks" + label="" + type="alertmodal" + unique="true"> + <tag>fail</tag> + <tag>confirm</tag> + Creation and editing of Picks is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen. + <usetemplate + name="okcancelbuttons" + yestext="Quit" + notext="Don't Quit"/> + </notification> + + <notification + name="NoWorldMap" + label="" + type="alertmodal" + unique="true"> + <tag>fail</tag> + <tag>confirm</tag> + Viewing of the world map is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen. + <usetemplate + name="okcancelbuttons" + yestext="Quit" + notext="Don't Quit"/> + </notification> + + <notification + name="NoVoiceCall" + label="" + type="alertmodal" + unique="true"> + <tag>fail</tag> + <tag>confirm</tag> + Voice calls are only available in Advanced mode. Would you like to logout and change modes? + <usetemplate + name="okcancelbuttons" + yestext="Quit" + notext="Don't Quit"/> + </notification> + + <notification + name="NoAvatarShare" + label="" + type="alertmodal" + unique="true"> + <tag>fail</tag> + <tag>confirm</tag> + Sharing is only available in Advanced mode. Would you like to logout and change modes? + <usetemplate + name="okcancelbuttons" + yestext="Quit" + notext="Don't Quit"/> + </notification> + + <notification + name="NoAvatarPay" + label="" + type="alertmodal" + unique="true"> + <tag>fail</tag> + <tag>confirm</tag> + Paying other residents is only available in Advanced mode. Would you like to logout and change modes? + <usetemplate + name="okcancelbuttons" + yestext="Quit" + notext="Don't Quit"/> + </notification> <global name="UnsupportedCPU"> - Your CPU speed does not meet the minimum requirements. diff --git a/indra/newview/skins/default/xui/en/panel_activeim_row.xml b/indra/newview/skins/default/xui/en/panel_activeim_row.xml index 72f41c62f4..1d8bfa0672 100644 --- a/indra/newview/skins/default/xui/en/panel_activeim_row.xml +++ b/indra/newview/skins/default/xui/en/panel_activeim_row.xml @@ -65,6 +65,7 @@ speaker.visible="false"> </chiclet_im_adhoc> <text + translate="false" type="string" name="contact_name" layout="topleft" @@ -76,7 +77,7 @@ follows="right|left" use_ellipses="true" font="SansSerifBold"> - Grumpity ProductEngine + TestString PleaseIgnore </text> <button top="10" diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index 013a8090f7..a92cc886e7 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -45,11 +45,11 @@ min_width="214" height="28" mouse_opaque="false" - name="chat_bar_layout_panel" + name="chat_bar_layout_panel" user_resize="true" - width="308" > + width="310" > <panel - name="chat_bar" + name="chat_bar" filename="panel_nearby_chat_bar.xml" left="0" height="28" @@ -60,11 +60,30 @@ /> </layout_panel> <!-- - There is resize bar between chatbar and Speak button. It has 2px width (is is set as 2*UIResizeBarOverlap) + This 5px Panel is an indicator of where the resize handle is. + The panel provides a gap between the resize handle icon and a button to the right. --> <layout_panel auto_resize="false" - follows="right" + layout="topleft" + max_width="5" + min_width="5" + name="chat_bar_resize_handle_panel" + user_resize="false" + width="5"> + <icon + follows="top|right" + height="25" + image_name="ChatBarHandle" + layout="topleft" + left="-7" + name="resize_handle" + top="4" + width="5" /> + </layout_panel> + <layout_panel + auto_resize="false" + follows="left|right" height="28" layout="topleft" min_height="28" @@ -72,13 +91,13 @@ mouse_opaque="false" name="speak_panel" top_delta="0" - user_resize="true" - width="110"> + user_resize="false" + width="108"> <talk_button follows="left|right" height="23" layout="topleft" - left="2" + left="0" name="talk" top="5" width="105"> diff --git a/indra/newview/skins/default/xui/en/panel_chat_header.xml b/indra/newview/skins/default/xui/en/panel_chat_header.xml index 17e8d4d2df..2645d472f9 100644 --- a/indra/newview/skins/default/xui/en/panel_chat_header.xml +++ b/indra/newview/skins/default/xui/en/panel_chat_header.xml @@ -35,9 +35,10 @@ text_color="white" bg_readonly_color="black" top="0" + translate="false" use_ellipses="true" valign="bottom" - value="Ericag Vader" /> + value="TestString PleaseIgnore" /> <text allow_scroll="false" font="SansSerifSmall" diff --git a/indra/newview/skins/default/xui/en/panel_edit_pick.xml b/indra/newview/skins/default/xui/en/panel_edit_pick.xml index a028e3ab9f..82dfb445da 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_pick.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_pick.xml @@ -183,17 +183,17 @@ left="8" name="bottom_panel" top_pad="5" - width="303"> + width="315"> <layout_stack follows="bottom|left|right" height="23" layout="topleft" name="layout_stack1" - left="2" + left="0" orientation="horizontal" top_pad="0" - width="303"> + width="313"> <layout_panel follows="bottom|left|right" @@ -223,7 +223,7 @@ name="layout_panel1" user_resize="false" auto_resize="true" - width="150"> + width="146"> <button follows="bottom|left|right" height="23" @@ -232,7 +232,7 @@ name="cancel_btn" top="0" left="1" - width="149" /> + width="145" /> </layout_panel> </layout_stack> diff --git a/indra/newview/skins/default/xui/en/panel_edit_profile.xml b/indra/newview/skins/default/xui/en/panel_edit_profile.xml index 37265d65f1..442eb8c28d 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_profile.xml @@ -127,7 +127,8 @@ name="solo_user_name" text_color="white" top_delta="3" - value="Hamilton Hitchings" + translate="false" + value="TestString PleaseIgnore" use_ellipses="true" visible="false" width="275" /> @@ -140,7 +141,8 @@ name="user_name" text_color="white" top_delta="0" - value="Hamilton Hitchings" + translate="false" + value="TestString PleaseIgnore" use_ellipses="true" visible="true" width="250" /> @@ -153,7 +155,8 @@ name="user_name_small" text_color="white" top_delta="-4" - value="Hamilton Hitchings" + translate="false" + value="TestString PleaseIgnore" use_ellipses="true" visible="false" wrap="true" @@ -177,8 +180,9 @@ text_color="EmphasisColor" font="SansSerifBold" top_delta="-2" + translate="false" use_ellipses="true" - value="hamilton.linden" + value="teststring.pleaseignore" wrap="true" width="205" /> <panel diff --git a/indra/newview/skins/default/xui/en/panel_group_general.xml b/indra/newview/skins/default/xui/en/panel_group_general.xml index 70b96ca5eb..38b680ba86 100644 --- a/indra/newview/skins/default/xui/en/panel_group_general.xml +++ b/indra/newview/skins/default/xui/en/panel_group_general.xml @@ -21,7 +21,7 @@ Hover your mouse over the options for more help. </panel.string> <panel name="group_info_top" - follows="top|left" + follows="top|left|right" top="0" left="0" height="129" @@ -43,7 +43,7 @@ Hover your mouse over the options for more help. font="SansSerifSmall" text_color="White_50" width="190" - follows="top|left" + follows="top|left|right" layout="topleft" mouse_opaque="false" type="string" @@ -55,7 +55,7 @@ Hover your mouse over the options for more help. Founder: </text> <text - follows="left|top" + follows="left|top|right" height="16" layout="topleft" left_delta="-2" diff --git a/indra/newview/skins/default/xui/en/panel_instant_message.xml b/indra/newview/skins/default/xui/en/panel_instant_message.xml index 021cf00d03..46c1add739 100644 --- a/indra/newview/skins/default/xui/en/panel_instant_message.xml +++ b/indra/newview/skins/default/xui/en/panel_instant_message.xml @@ -65,8 +65,9 @@ name="user_name" text_color="white" top="8" + translate="false" use_ellipses="true" - value="Erica Vader" + value="TestString PleaseIgnore" width="205" /> <!-- TIME STAMP --> <text diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml index 806182bcb4..4c2faddfe4 100644 --- a/indra/newview/skins/default/xui/en/panel_login.xml +++ b/indra/newview/skins/default/xui/en/panel_login.xml @@ -47,8 +47,8 @@ auto_resize="false" follows="left|bottom" name="login" layout="topleft" -width="695" -min_width="695" +width="705" +min_width="705" user_resize="false" height="80"> <text @@ -67,8 +67,7 @@ follows="left|bottom" height="22" left_delta="0" max_chars="128" -prevalidate_callback="ascii" -select_on_focus="true" +combo_editor.prevalidate_callback="ascii" tool_tip="The username you chose when you registered, like bobsmith12 or Steller Sunshine" top_pad="0" name="username_combo" @@ -118,13 +117,41 @@ label="Remember password" name="connect_btn" top="35" width="90" /> + <text + follows="left|bottom" + font="SansSerifSmall" + height="15" + left_pad="10" + name="mode_selection_text" + top="20" + width="130"> + Mode: + </text> +<combo_box + follows="left|bottom" + height="23" + max_chars="128" + tool_tip="Select your mode. Choose Basic for fast, easy exploration and chat. Choose Advanced to access more features." + top_pad="0" + control_name="SessionSettingsFile" + name="mode_combo" + width="110"> +<combo_box.item + label="Basic" + name="Basic" + value="settings_minimal.xml" /> +<combo_box.item + label="Advanced" + name="Advanced" + value="" /> +</combo_box> <text follows="left|bottom" font="SansSerifSmall" height="15" - left_pad="18" + left_pad="8" name="start_location_text" -top="20" + top="20" width="130"> Start at: </text> @@ -136,7 +163,7 @@ control_name="NextLoginLocation" max_chars="128" top_pad="0" name="start_location_combo" - width="170"> + width="165"> <combo_box.item label="My last location" name="MyLastLocation" diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml index 96633cb5b4..0df9aa2868 100644 --- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml @@ -46,7 +46,7 @@ label="Filter Inventory" layout="topleft" left="10" - max_length="300" + max_length_chars="300" name="inventory search editor" top="18" width="303" /> diff --git a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml index 88c82313dd..2ad2416179 100644 --- a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml @@ -76,7 +76,7 @@ left="0" orientation="horizontal" top="0" - width="313"> + width="308"> <layout_panel follows="bottom|left|right" height="23" @@ -120,16 +120,16 @@ name="wear_btn_lp" user_resize="false" auto_resize="true" - width="152"> + width="147"> <button follows="bottom|left|right" height="23" label="Wear" layout="topleft" name="wear_btn" - left="0" + left="1" top="0" - width="152" /> + width="146" /> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml index 43431ea7c1..1a00416b2a 100644 --- a/indra/newview/skins/default/xui/en/panel_people.xml +++ b/indra/newview/skins/default/xui/en/panel_people.xml @@ -76,7 +76,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M follows="all" height="383" layout="topleft" - left="5" + left="3" name="tabs" tab_group="1" tab_min_width="70" @@ -84,7 +84,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M tab_position="top" top_pad="10" halign="center" - width="317"> + width="319"> <panel background_opaque="true" background_visible="true" @@ -106,20 +106,20 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M left="3" mouse_opaque="false" name="Net Map" - width="307" + width="305" height="140" - top="0"/> + top="5"/> <avatar_list allow_select="true" follows="top|left|bottom|right" - height="216" + height="211" ignore_online_status="true" layout="topleft" left="3" multi_select="true" name="avatar_list" top="145" - width="307" /> + width="306" /> <panel background_visible="true" follows="left|right|bottom" @@ -165,7 +165,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M layout="topleft" left_pad="1" name="dummy_icon" - width="241" + width="243" /> </panel> </panel> @@ -251,7 +251,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M top_pad="1" left="0" name="bottom_panel" - width="305"> + width="308"> <layout_panel auto_resize="false" height="25" @@ -300,7 +300,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M layout="topleft" name="dummy_panel" user_resize="false" - width="212"> + width="210"> <icon follows="bottom|left|right" height="25" @@ -309,7 +309,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M left="0" top="0" name="dummy_icon" - width="211" /> + width="210" /> </layout_panel> <layout_panel auto_resize="false" @@ -471,7 +471,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M layout="topleft" left_pad="1" name="dummy_icon" - width="209" + width="212" /> </panel> </panel> @@ -506,7 +506,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M height="27" label="bottom_panel" layout="topleft" - left="0" + left="3" name="bottom_panel" top_pad="0" width="313"> @@ -544,7 +544,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M layout="topleft" left_pad="1" name="dummy_icon" - width="241" + width="244" /> </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_places.xml b/indra/newview/skins/default/xui/en/panel_places.xml index d9c357f277..daf571297f 100644 --- a/indra/newview/skins/default/xui/en/panel_places.xml +++ b/indra/newview/skins/default/xui/en/panel_places.xml @@ -176,7 +176,7 @@ background_visible="true" left="0" orientation="horizontal" top="0" - width="120"> + width="113"> <layout_panel follows="bottom|left|right" @@ -214,7 +214,9 @@ background_visible="true" <menu_button follows="bottom|left|right" height="23" - label="▼" + image_disabled="ComboButton_UpOff" + image_unselected="ComboButton_UpOff" + image_selected="ComboButton_UpSelected" layout="topleft" mouse_opaque="false" name="overflow_btn" @@ -236,7 +238,7 @@ background_visible="true" left="0" orientation="horizontal" top="0" - width="120"> + width="110"> <layout_panel follows="bottom|left|right" height="23" @@ -246,7 +248,7 @@ background_visible="true" name="profile_btn_lp" user_resize="false" auto_resize="true" - width="112"> + width="102"> <button follows="bottom|left|right" height="23" @@ -257,7 +259,7 @@ background_visible="true" left="1" tool_tip="Show place profile" top="0" - width="111" /> + width="101" /> </layout_panel> </layout_stack> @@ -272,7 +274,7 @@ background_visible="true" left="0" orientation="horizontal" top="0" - width="120"> + width="112"> <layout_panel follows="bottom|left|right" height="23" @@ -283,7 +285,7 @@ background_visible="true" top="0" user_resize="false" auto_resize="true" - width="61"> + width="51"> <button follows="bottom|left|right" height="23" @@ -293,7 +295,7 @@ background_visible="true" name="close_btn" left="1" top="0" - width="60" /> + width="50" /> </layout_panel> </layout_stack> diff --git a/indra/newview/skins/default/xui/en/panel_profile_view.xml b/indra/newview/skins/default/xui/en/panel_profile_view.xml index c553a3aba0..646875b52e 100644 --- a/indra/newview/skins/default/xui/en/panel_profile_view.xml +++ b/indra/newview/skins/default/xui/en/panel_profile_view.xml @@ -83,8 +83,9 @@ left="45" name="user_name" text_color="LtGray" + translate="false" top="25" - value="Jack Linden" + value="TestString PleaseIgnore" visible="true" use_ellipses="true" width="258" /> @@ -118,8 +119,9 @@ text_color="EmphasisColor" font="SansSerifBold" top_delta="-2" + translate="false" use_ellipses="true" - value="jack.linden" + value="teststring.pleaseignore" width="195" wrap="true "/> <tab_container diff --git a/indra/newview/skins/default/xui/en/panel_script_ed.xml b/indra/newview/skins/default/xui/en/panel_script_ed.xml index 627b12cfe1..8d42024386 100644 --- a/indra/newview/skins/default/xui/en/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/en/panel_script_ed.xml @@ -28,6 +28,10 @@ name="Title"> Script: [NAME] </panel.string> + <panel.string + name="external_editor_not_set"> + Select an editor by setting the environment variable LL_SCRIPT_EDITOR or the ExternalEditor setting. + </panel.string> <menu_bar bg_visible="false" follows="left|top" diff --git a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml index f3c6895cee..8997c1a6d7 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml @@ -37,7 +37,7 @@ name="button_panel" left="9" top_pad="-2" - width="313"> + width="308"> <layout_stack follows="bottom|left|right" height="23" @@ -47,7 +47,7 @@ left="0" orientation="horizontal" top="0" - width="313"> + width="308"> <layout_panel follows="bottom|left|right" height="23" @@ -57,7 +57,7 @@ name="info_btn_lp" user_resize="false" auto_resize="true" - width="103"> + width="101"> <button enabled="true" follows="bottom|left|right" @@ -68,62 +68,62 @@ name="info_btn" tool_tip="Show object profile" top="0" - width="102" /> + width="100" /> </layout_panel> <layout_panel follows="bottom|left|right" height="23" layout="bottomleft" - left_pad="3" + left_pad="1" mouse_opaque="false" name="share_btn_lp" user_resize="false" auto_resize="true" - width="102"> + width="100"> <button enabled="true" follows="bottom|left|right" height="23" label="Share" layout="topleft" - left="0" + left="1" name="share_btn" tool_tip="Share an inventory item" top="0" - width="102" /> + width="99" /> </layout_panel> <layout_panel follows="bottom|left|right" height="23" layout="bottomleft" - left_pad="3" + left_pad="1" mouse_opaque="false" name="shop_btn_lp" user_resize="false" auto_resize="true" - width="102"> + width="100"> <button enabled="true" follows="bottom|left|right" height="23" label="Shop" layout="topleft" - left="0" + left="1" name="shop_btn" tool_tip="Open Marketplace webpage" top="0" - width="102" /> + width="99" /> <button enabled="false" follows="bottom|left|right" height="23" label="Wear" layout="topleft" - left="0" + left="1" name="wear_btn" tool_tip="Wear seleceted outfit" top="0" - width="102" /> + width="99" /> <button enabled="false" follows="bottom|left|right" @@ -131,20 +131,20 @@ label="Play" layout="topleft" name="play_btn" - left="0" + left="1" top="0" - width="102" /> + width="99" /> <button enabled="false" follows="bottom|left|right" height="23" label="Teleport" layout="topleft" - left="0" + left="1" name="teleport_btn" tool_tip="Teleport to the selected area" top="0" - width="102" /> + width="99" /> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml index e2b3d81bf6..c2394a3fa2 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml @@ -168,9 +168,10 @@ left_pad="0" name="Creator Name" top_delta="0" + translate="false" use_ellipses="true" width="225"> - Erica Linden + TestString PleaseIgnore </text> <text type="string" @@ -193,9 +194,10 @@ left_pad="0" name="Owner Name" top_delta="0" + translate="false" use_ellipses="true" width="225"> - Erica Linden + TestString PleaseIgnore </text> <text type="string" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 70a40960a1..14ea43a8f8 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2370,6 +2370,7 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh <!--<string name="Shopping">Shopping</string> --> <string name="Stage">Stage</string> <string name="Other">Other</string> + <string name="Rental">Rental</string> <string name="Any">Any</string> <string name="You">You</string> @@ -3309,6 +3310,14 @@ Abuse Report</string> <string name="DeleteItem">Delete selected item?</string> <string name="EmptyOutfitText">There are no items in this outfit</string> + + <!-- External editor status codes --> + <string name="ExternalEditorNotSet">Select an editor using the ExternalEditor setting.</string> + <string name="ExternalEditorNotFound">Cannot find the external editor you specified. +Try enclosing path to the editor with double quotes. +(e.g. "/path to my/editor" "%s")</string> + <string name="ExternalEditorCommandParseError">Error parsing the external editor command.</string> + <string name="ExternalEditorFailedToRun">External editor failed to run.</string> <!-- Key names begin --> <string name="Esc">Esc</string> @@ -3425,4 +3434,13 @@ Abuse Report</string> <string name="Z">Z</string> <!-- Key names end --> + <!-- llviewerwindow --> + <string name="BeaconParticle">Viewing particle beacons (blue)</string> + <string name="BeaconPhysical">Viewing physical object beacons (green)</string> + <string name="BeaconScripted">Viewing scripted object beacons (red)</string> + <string name="BeaconScriptedTouch">Viewing scripted object with touch function beacons (red)</string> + <string name="BeaconSound">Viewing sound beacons (yellow)</string> + <string name="BeaconMedia">Viewing media beacons (white)</string> + <string name="ParticleHiding">Hiding Particles</string> + </strings> diff --git a/indra/newview/skins/default/xui/es/floater_about_land.xml b/indra/newview/skins/default/xui/es/floater_about_land.xml index be5b5d011c..3f50437c13 100644 --- a/indra/newview/skins/default/xui/es/floater_about_land.xml +++ b/indra/newview/skins/default/xui/es/floater_about_land.xml @@ -87,15 +87,9 @@ Vaya al menú Mundo > Acerca del terreno o seleccione otra parcela para ver s <text name="Owner:"> Propietario: </text> - <text name="OwnerText"> - Leyla Linden - </text> <text name="Group:"> Grupo: </text> - <text name="GroupText"> - Leyla Linden - </text> <button label="Configurar" name="Set..."/> <check_box label="Permitir transferir al grupo" name="check deed" tool_tip="Un oficial del grupo puede transferir este terreno al grupo. El terreno será apoyado por el grupo en sus asignaciones de terreno."/> <button label="Transferir" name="Deed..." tool_tip="Sólo si es usted un oficial del grupo seleccionado puede transferir terreno."/> @@ -398,7 +392,6 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda. </text> <line_editor left="97" name="media_url"/> <button label="Definir" name="set_media_url"/> - <check_box label="Ocultar la URL del media" left="97" name="hide_media_url" tool_tip="Marcando esta opción esconderá en la información de esta parcela -a quien no esté autorizado a verla- la URL del media. Note que esto no está disponible para HTML."/> <text name="Description:"> Descripción: </text> @@ -430,7 +423,6 @@ los media: <text name="MusicURL:"> URL de música: </text> - <check_box label="Ocultar la URL" name="hide_music_url" tool_tip="Al marcar esta opción se ocultará la URL de la música a quien no esté autorizado a ver la información de esta parcela."/> <text name="Sound:"> Sonido: </text> diff --git a/indra/newview/skins/default/xui/es/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/es/floater_inventory_item_properties.xml index 5746688962..bf84c3d808 100644 --- a/indra/newview/skins/default/xui/es/floater_inventory_item_properties.xml +++ b/indra/newview/skins/default/xui/es/floater_inventory_item_properties.xml @@ -24,16 +24,10 @@ <text name="LabelCreatorTitle"> Creador: </text> - <text name="LabelCreatorName"> - Nicole Linden - </text> <button label="Perfil..." label_selected="" name="BtnCreator"/> <text name="LabelOwnerTitle"> Propietario: </text> - <text name="LabelOwnerName"> - Thrax Linden - </text> <button label="Perfil..." label_selected="" name="BtnOwner"/> <text name="LabelAcquiredTitle"> Adquirido: diff --git a/indra/newview/skins/default/xui/es/floater_tools.xml b/indra/newview/skins/default/xui/es/floater_tools.xml index d85b43b7e8..e2ff4a25ce 100644 --- a/indra/newview/skins/default/xui/es/floater_tools.xml +++ b/indra/newview/skins/default/xui/es/floater_tools.xml @@ -170,15 +170,9 @@ <text name="Creator:"> Creador: </text> - <text name="Creator Name"> - Dª Esbee Linden (esbee.linden) - </text> <text name="Owner:"> Propietario: </text> - <text name="Owner Name"> - Dª Erica "Moose" Linden (erica.linden) - </text> <text name="Group:"> Grupo: </text> diff --git a/indra/newview/skins/default/xui/es/inspect_avatar.xml b/indra/newview/skins/default/xui/es/inspect_avatar.xml index 119f252db2..1d70fa6a90 100644 --- a/indra/newview/skins/default/xui/es/inspect_avatar.xml +++ b/indra/newview/skins/default/xui/es/inspect_avatar.xml @@ -10,8 +10,6 @@ <string name="Details"> [SL_PROFILE] </string> - <text name="user_name_small" value="Grumpity ProductEngine con un nombre demasiado largo"/> - <text name="user_slid" value="james.linden"/> <text name="user_details"> Ésta es mi descripción de Second Life que, por cierto, me encanta. Pero, por lo que sea, me he enrollado más de la cuenta y la descripción es larguísima. </text> diff --git a/indra/newview/skins/default/xui/es/panel_edit_profile.xml b/indra/newview/skins/default/xui/es/panel_edit_profile.xml index 56d03dccc2..8e5e09cfec 100644 --- a/indra/newview/skins/default/xui/es/panel_edit_profile.xml +++ b/indra/newview/skins/default/xui/es/panel_edit_profile.xml @@ -25,11 +25,7 @@ <text name="display_name_label" value="Nombre mostrado:"/> <text name="solo_username_label" value="Nombre de usuario:"/> <button name="set_name" tool_tip="Configurar nombre mostrado"/> - <text name="solo_user_name" value="Hamilton Hitchings"/> - <text name="user_name" value="Hamilton Hitchings"/> - <text name="user_name_small" value="Hamilton Hitchings"/> <text name="user_label" value="Nombre de usuario:"/> - <text name="user_slid" value="hamilton.linden"/> <panel name="lifes_images_panel"> <icon label="" name="2nd_life_edit_icon" tool_tip="Pulsa para elegir una imagen"/> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_landmark_info.xml b/indra/newview/skins/default/xui/es/panel_landmark_info.xml index 49a9f84cfe..1a0ac3ba79 100644 --- a/indra/newview/skins/default/xui/es/panel_landmark_info.xml +++ b/indra/newview/skins/default/xui/es/panel_landmark_info.xml @@ -19,7 +19,7 @@ [wkday,datetime,local][day,datetime,local] [mth,datetime,local] [year,datetime,local][hour,datetime,local]:[min,datetime,local]:[second,datetime,local] </string> <button name="back_btn" tool_tip="Atrás"/> - <text name="title" value="Añadir el perfil"/> + <text name="title" value="Perfil del lugar"/> <scroll_container name="place_scroll"> <panel name="scrolling_panel"> <text name="maturity_value" value="desconocido"/> diff --git a/indra/newview/skins/default/xui/es/panel_place_profile.xml b/indra/newview/skins/default/xui/es/panel_place_profile.xml index 524ba2253b..3c363859a4 100644 --- a/indra/newview/skins/default/xui/es/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/es/panel_place_profile.xml @@ -5,7 +5,7 @@ <string name="anyone" value="Cualquiera"/> <string name="available" value="disponible"/> <string name="allocated" value="asignados"/> - <string name="title_place" value="Añadir el perfil"/> + <string name="title_place" value="Perfil del lugar"/> <string name="title_teleport_history" value="Historial de teleportes"/> <string name="not_available" value="(No disp.)"/> <string name="unknown" value="(desconocido)"/> @@ -42,7 +42,7 @@ [wkday,datetime,local][day,datetime,local] [mth,datetime,local] [year,datetime,local][hour,datetime,local]:[min,datetime,local]:[second,datetime,local] </string> <button name="back_btn" tool_tip="Atrás"/> - <text name="title" value="Añadir el perfil"/> + <text name="title" value="Perfil del lugar"/> <scroll_container name="place_scroll"> <panel name="scrolling_panel"> <text name="owner_label" value="Propietario:"/> diff --git a/indra/newview/skins/default/xui/es/panel_profile_view.xml b/indra/newview/skins/default/xui/es/panel_profile_view.xml index a11fc31607..cb374dee52 100644 --- a/indra/newview/skins/default/xui/es/panel_profile_view.xml +++ b/indra/newview/skins/default/xui/es/panel_profile_view.xml @@ -10,10 +10,8 @@ <text name="solo_username_label" value="Nombre de usuario:"/> <text name="status" value="Conectado/a"/> <text name="user_name_small" value="Jack, ¿has visto esto? Es un nombre larguísimo."/> - <text name="user_name" value="Jack Linden"/> <button name="copy_to_clipboard" tool_tip="Copiar al portapapeles"/> <text name="user_label" value="Nombre de usuario:"/> - <text name="user_slid" value="jack.linden"/> <tab_container name="tabs"> <panel label="PERFIL" name="panel_profile"/> <panel label="DESTACADOS" name="panel_picks"/> diff --git a/indra/newview/skins/default/xui/es/panel_region_covenant.xml b/indra/newview/skins/default/xui/es/panel_region_covenant.xml index 0a5d7c2786..06f4fffacf 100644 --- a/indra/newview/skins/default/xui/es/panel_region_covenant.xml +++ b/indra/newview/skins/default/xui/es/panel_region_covenant.xml @@ -27,8 +27,8 @@ </text_editor> <button label="Cambiar" name="reset_covenant"/> <text name="covenant_help_text"> - Los cambios en el contrato se mostrarán en todas las parcelas - del estado. + Los cambios en el contrato se mostrarán en todas las parcelas +del estado. </text> <text bottom_delta="-31" name="covenant_instructions"> Arrastra y suelta una nota para cambiar el contrato de este estado. @@ -73,7 +73,8 @@ El terreno comprado en esta región no se podrá revender. </string> <string name="can_change"> - El terreno comprado en esta región se podrá unir o subdividir. + El terreno comprado en esta región se podrá unir o +subdividir. </string> <string name="can_not_change"> El terreno comprado en esta región no se podrá unir ni diff --git a/indra/newview/skins/default/xui/es/sidepanel_task_info.xml b/indra/newview/skins/default/xui/es/sidepanel_task_info.xml index e6d9e28aff..bd814ecc66 100644 --- a/indra/newview/skins/default/xui/es/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/es/sidepanel_task_info.xml @@ -48,15 +48,9 @@ <text name="CreatorNameLabel"> Creador: </text> - <text name="Creator Name"> - Erica Linden - </text> <text name="Owner:"> Propietario: </text> - <text name="Owner Name"> - Erica Linden - </text> <text name="Group_label"> Grupo: </text> diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index 19adf29d29..df40a2b6b4 100644 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -1692,7 +1692,7 @@ <string name="RegionNoCovenantOtherOwner"> No se ha aportado un contrato para este estado. El terreno de este estado lo vende el propietario del estado, no Linden Lab. Por favor, contacta con ese propietario para informarte sobre la venta. </string> - <string name="covenant_last_modified" value="Última modificación:"/> + <string name="covenant_last_modified" value="Última modificación: "/> <string name="none_text" value="(no hay)"/> <string name="never_text" value=" (nunca)"/> <string name="GroupOwned"> diff --git a/indra/newview/skins/default/xui/fr/floater_about_land.xml b/indra/newview/skins/default/xui/fr/floater_about_land.xml index b0ef1cf8df..6e6409725f 100644 --- a/indra/newview/skins/default/xui/fr/floater_about_land.xml +++ b/indra/newview/skins/default/xui/fr/floater_about_land.xml @@ -88,15 +88,9 @@ <text name="Owner:"> Propriétaire : </text> - <text name="OwnerText"> - Leyla Linden - </text> <text name="Group:"> Groupe : </text> - <text name="GroupText"> - Leyla Linden - </text> <button label="Choisir" label_selected="Définir..." name="Set..."/> <check_box label="Autoriser la cession au groupe" name="check deed" tool_tip="Un officier du groupe peut céder ce terrain à ce groupe, afin qu'il soit pris en charge par l'allocation de terrains du groupe."/> <button label="Céder" label_selected="Céder..." name="Deed..." tool_tip="Vous ne pouvez céder le terrain que si vous avez un rôle d'officier dans le groupe sélectionné."/> @@ -403,7 +397,6 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche. </text> <line_editor left="97" name="media_url"/> <button label="Choisir" name="set_media_url"/> - <check_box label="Masquer l'URL" left="97" name="hide_media_url" tool_tip="Si vous cochez cette option, les personnes non autorisées à accéder aux infos de cette parcelle ne verront pas l'URL du média. Cette option n'est pas disponible pour les fichiers HTML."/> <text name="Description:"> Description : </text> @@ -435,7 +428,6 @@ texture : URL de la musique : </text> - <check_box label="Masquer l'URL" name="hide_music_url" tool_tip="Si vous cochez cette option, l'URL de musique sera masquée et invisible pour tous les utilisateurs non autorisés des informations de cette parcelle."/> <text name="Sound:"> Son : </text> diff --git a/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml index 29b61fc98d..f2eb3cb6bc 100644 --- a/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml +++ b/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml @@ -24,16 +24,10 @@ <text name="LabelCreatorTitle"> Créateur : </text> - <text name="LabelCreatorName"> - Nicole Linden - </text> <button label="Profil..." label_selected="" name="BtnCreator"/> <text name="LabelOwnerTitle"> Propriétaire : </text> - <text name="LabelOwnerName"> - Thrax Linden - </text> <button label="Profil..." label_selected="" name="BtnOwner"/> <text name="LabelAcquiredTitle"> Acquis : diff --git a/indra/newview/skins/default/xui/fr/floater_tools.xml b/indra/newview/skins/default/xui/fr/floater_tools.xml index 46a27e960c..01274b4cbc 100644 --- a/indra/newview/skins/default/xui/fr/floater_tools.xml +++ b/indra/newview/skins/default/xui/fr/floater_tools.xml @@ -170,15 +170,9 @@ <text name="Creator:"> Créateur : </text> - <text name="Creator Name"> - Mrs. Esbee Linden (esbee.linden) - </text> <text name="Owner:"> Propriétaire : </text> - <text name="Owner Name"> - Mrs. Erica "Moose" Linden (erica.linden) - </text> <text name="Group:"> Groupe : </text> diff --git a/indra/newview/skins/default/xui/fr/inspect_avatar.xml b/indra/newview/skins/default/xui/fr/inspect_avatar.xml index f34ca1f8dd..553646f8e9 100644 --- a/indra/newview/skins/default/xui/fr/inspect_avatar.xml +++ b/indra/newview/skins/default/xui/fr/inspect_avatar.xml @@ -10,9 +10,6 @@ <string name="Details"> [SL_PROFILE] </string> - <text name="user_name_small" value="Grumpity ProductEngine with a long name"/> - <text name="user_name" value="Grumpity ProductEngine"/> - <text name="user_slid" value="james.linden"/> <text name="user_subtitle" value="11 mois, 3 jours"/> <text name="user_details"> This is my second life description and I really think it is great. But for some reason my description is super extra long because I like to talk a whole lot diff --git a/indra/newview/skins/default/xui/fr/inspect_group.xml b/indra/newview/skins/default/xui/fr/inspect_group.xml index 4519c380c5..e8c528c1ac 100644 --- a/indra/newview/skins/default/xui/fr/inspect_group.xml +++ b/indra/newview/skins/default/xui/fr/inspect_group.xml @@ -16,9 +16,6 @@ <string name="YouAreMember"> Vous êtes membre </string> - <text name="group_name"> - Groupe grognon des Orignaux Grumpity - </text> <text name="group_subtitle"> 123 membres </text> diff --git a/indra/newview/skins/default/xui/fr/panel_activeim_row.xml b/indra/newview/skins/default/xui/fr/panel_activeim_row.xml deleted file mode 100644 index 84272752cf..0000000000 --- a/indra/newview/skins/default/xui/fr/panel_activeim_row.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="panel_activeim_row"> - <text name="contact_name"> - Grumpity ProductEngine - </text> -</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_chat_header.xml b/indra/newview/skins/default/xui/fr/panel_chat_header.xml index babbff3132..7916bf5155 100644 --- a/indra/newview/skins/default/xui/fr/panel_chat_header.xml +++ b/indra/newview/skins/default/xui/fr/panel_chat_header.xml @@ -1,5 +1,4 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="im_header" name="im_header"> - <text_editor name="user_name" value="Ericag Vader"/> <text name="time_box" value="23:30"/> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_edit_profile.xml b/indra/newview/skins/default/xui/fr/panel_edit_profile.xml index ef65d2fe24..9e63c88221 100644 --- a/indra/newview/skins/default/xui/fr/panel_edit_profile.xml +++ b/indra/newview/skins/default/xui/fr/panel_edit_profile.xml @@ -29,11 +29,7 @@ <text name="display_name_label" value="Nom d'affichage :"/> <text name="solo_username_label" value="Nom d'utilisateur :"/> <button name="set_name" tool_tip="Définir un nom d'affichage"/> - <text name="solo_user_name" value="Hamilton Hitchings"/> - <text name="user_name" value="Hamilton Hitchings"/> - <text name="user_name_small" value="Hamilton Hitchings"/> <text name="user_label" value="Nom d'utilisateur :"/> - <text name="user_slid" value="hamilton.linden"/> <panel name="lifes_images_panel"> <panel name="second_life_image_panel"> <text name="second_life_photo_title_text" value="[SECOND_LIFE]:"/> diff --git a/indra/newview/skins/default/xui/fr/panel_instant_message.xml b/indra/newview/skins/default/xui/fr/panel_instant_message.xml index bf3720f411..305d2d853c 100644 --- a/indra/newview/skins/default/xui/fr/panel_instant_message.xml +++ b/indra/newview/skins/default/xui/fr/panel_instant_message.xml @@ -4,7 +4,6 @@ 6 </string> <panel label="im_header" name="im_header"> - <text name="user_name" value="Erica Vader"/> <text name="time_box" value="23:30"/> </panel> <button label="Répondre" name="reply"/> diff --git a/indra/newview/skins/default/xui/fr/panel_profile_view.xml b/indra/newview/skins/default/xui/fr/panel_profile_view.xml index 0447618420..76ba44e899 100644 --- a/indra/newview/skins/default/xui/fr/panel_profile_view.xml +++ b/indra/newview/skins/default/xui/fr/panel_profile_view.xml @@ -10,10 +10,8 @@ <text name="solo_username_label" value="Nom d'utilisateur :"/> <text name="status" value="En ligne"/> <text name="user_name_small" value="Jack oh look at me this is a super duper long name"/> - <text name="user_name" value="Jack Linden"/> <button name="copy_to_clipboard" tool_tip="Copier dans le presse-papiers"/> <text name="user_label" value="Nom d'utilisateur :"/> - <text name="user_slid" value="jack.linden"/> <tab_container name="tabs"> <panel label="PROFIL" name="panel_profile"/> <panel label="FAVORIS" name="panel_picks"/> diff --git a/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml b/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml index c8e76118a1..bd8a39fe16 100644 --- a/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml @@ -48,15 +48,9 @@ <text name="CreatorNameLabel"> Créateur : </text> - <text name="Creator Name"> - Erica Linden - </text> <text name="Owner:"> Propriétaire : </text> - <text name="Owner Name"> - Erica Linden - </text> <text name="Group_label"> Groupe : </text> diff --git a/indra/newview/skins/default/xui/it/floater_about_land.xml b/indra/newview/skins/default/xui/it/floater_about_land.xml index d6834fa70a..186ed59e36 100644 --- a/indra/newview/skins/default/xui/it/floater_about_land.xml +++ b/indra/newview/skins/default/xui/it/floater_about_land.xml @@ -87,15 +87,11 @@ Vai al menu Mondo > Informazioni sul terreno oppure seleziona un altro appezz <text name="Owner:"> Proprietario: </text> - <text left="119" name="OwnerText" width="227"> - Leyla Linden - </text> + <text left="119" name="OwnerText" width="227"/> <text name="Group:"> Gruppo: </text> - <text left="119" name="GroupText" width="227"> - Leyla Linden - </text> + <text left="119" name="GroupText" width="227"/> <button label="Imposta" name="Set..."/> <check_box label="Permetti cessione al gruppo" left="119" name="check deed" tool_tip="Un funzionario del gruppo può cedere questa terra al gruppo stesso cosicchè essa sarà  supportata dalle terre del gruppo."/> <button label="Cedi" name="Deed..." tool_tip="Puoi solo offrire terra se sei un funzionario del gruppo selezionato."/> @@ -401,7 +397,6 @@ Solamente terreni più grandi possono essere abilitati nella ricerca. </text> <line_editor left="97" name="media_url"/> <button label="Imposta" name="set_media_url"/> - <check_box label="Nascondi indirizzo URL Media" left="94" name="hide_media_url" tool_tip="Abilitando questa opzione nasconderai l'indirizzo url dei media a tutte le persone non autorizzate a vedere le informazioni del terreno. Nota che questo non è disponibile per contenuto di tipo HTML."/> <text name="Description:"> Descrizione: </text> @@ -433,7 +428,6 @@ Media: <text name="MusicURL:"> URL musica: </text> - <check_box label="Nascondi URL" name="hide_music_url" tool_tip="Questa opzione consente di nascondere l'url della musica a chi non è autorizzato a visionare le informazioni di questo parcel."/> <text name="Sound:"> Audio: </text> diff --git a/indra/newview/skins/default/xui/it/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/it/floater_inventory_item_properties.xml index d3dc4d7eae..7ed3486b9b 100644 --- a/indra/newview/skins/default/xui/it/floater_inventory_item_properties.xml +++ b/indra/newview/skins/default/xui/it/floater_inventory_item_properties.xml @@ -24,16 +24,10 @@ <text name="LabelCreatorTitle"> Creatore: </text> - <text name="LabelCreatorName"> - Nicole Linden - </text> <button label="Profilo..." label_selected="" name="BtnCreator"/> <text name="LabelOwnerTitle"> proprietario: </text> - <text name="LabelOwnerName"> - Thrax Linden - </text> <button label="Profilo..." label_selected="" name="BtnOwner"/> <text name="LabelAcquiredTitle"> Acquisito: diff --git a/indra/newview/skins/default/xui/it/floater_tools.xml b/indra/newview/skins/default/xui/it/floater_tools.xml index a8c985cb12..fc13e09d1c 100644 --- a/indra/newview/skins/default/xui/it/floater_tools.xml +++ b/indra/newview/skins/default/xui/it/floater_tools.xml @@ -171,15 +171,9 @@ <text name="Creator:"> Creatore: </text> - <text name="Creator Name"> - Thrax Linden - </text> <text name="Owner:"> Proprietario: </text> - <text name="Owner Name"> - Thrax Linden - </text> <text name="Group:"> Gruppo: </text> diff --git a/indra/newview/skins/default/xui/it/panel_profile_view.xml b/indra/newview/skins/default/xui/it/panel_profile_view.xml index 20c62d4ceb..cf65aabebc 100644 --- a/indra/newview/skins/default/xui/it/panel_profile_view.xml +++ b/indra/newview/skins/default/xui/it/panel_profile_view.xml @@ -6,7 +6,6 @@ <string name="status_offline"> Offline </string> - <text_editor name="user_name" value="(Caricamento in corso...)"/> <text name="status" value="Online"/> <tab_container name="tabs"> <panel label="PROFILO" name="panel_profile"/> diff --git a/indra/newview/skins/default/xui/it/sidepanel_task_info.xml b/indra/newview/skins/default/xui/it/sidepanel_task_info.xml index 67870d9b76..cfabdc81b0 100644 --- a/indra/newview/skins/default/xui/it/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/it/sidepanel_task_info.xml @@ -48,15 +48,9 @@ <text name="CreatorNameLabel"> Ideatore: </text> - <text name="Creator Name"> - Erica Linden - </text> <text name="Owner:"> Proprietario: </text> - <text name="Owner Name"> - Erica Linden - </text> <text name="Group_label"> Gruppo: </text> diff --git a/indra/newview/skins/default/xui/ja/floater_about_land.xml b/indra/newview/skins/default/xui/ja/floater_about_land.xml index 2de9e781d4..eefe71c9a5 100644 --- a/indra/newview/skins/default/xui/ja/floater_about_land.xml +++ b/indra/newview/skins/default/xui/ja/floater_about_land.xml @@ -87,15 +87,9 @@ <text name="Owner:"> 所有者: </text> - <text name="OwnerText"> - Leyla Linden - </text> <text name="Group:"> グループ: </text> - <text name="GroupText"> - Leyla Linden - </text> <button label="設定" label_selected="設定..." name="Set..."/> <check_box label="グループへの譲渡を許可" name="check deed" tool_tip="グループのオフィサーはこの土地をグループに譲渡できます。グループの土地割り当てによってサポートされます。"/> <button label="譲渡" label_selected="譲渡..." name="Deed..." tool_tip="選択したグループのオフィサーのみ、土地を譲渡できます。"/> @@ -399,7 +393,6 @@ ホームページ: </text> <button label="設定" name="set_media_url"/> - <check_box label="URL を非表示" name="hide_media_url" tool_tip="このオプションをオンにすると、許可なしでこの区画情報にアクセスしているユーザーにはメディア URL が表示されません。 これは HTML タイプには使用できませんのでご注意ください。"/> <text name="Description:"> 説明: </text> @@ -429,7 +422,6 @@ <text name="MusicURL:"> 音楽 URL: </text> - <check_box label="URL を非表示にする" name="hide_music_url" tool_tip="このオプションにチェックを入れると、権限のない人が区画情報を見たときに音楽の URL が隠れます。"/> <text name="Sound:"> サウンド: </text> diff --git a/indra/newview/skins/default/xui/ja/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/ja/floater_inventory_item_properties.xml index 7480b04856..725214086a 100644 --- a/indra/newview/skins/default/xui/ja/floater_inventory_item_properties.xml +++ b/indra/newview/skins/default/xui/ja/floater_inventory_item_properties.xml @@ -24,16 +24,10 @@ <text name="LabelCreatorTitle"> クリエーター </text> - <text name="LabelCreatorName"> - Nicole Linden - </text> <button label="情報" label_selected="" name="BtnCreator"/> <text name="LabelOwnerTitle"> オーナー: </text> - <text name="LabelOwnerName"> - Thrax Linden - </text> <button label="情報" label_selected="" name="BtnOwner"/> <text name="LabelAcquiredTitle"> 入手日時: diff --git a/indra/newview/skins/default/xui/ja/floater_tools.xml b/indra/newview/skins/default/xui/ja/floater_tools.xml index bbd78fb818..2272234d7a 100644 --- a/indra/newview/skins/default/xui/ja/floater_tools.xml +++ b/indra/newview/skins/default/xui/ja/floater_tools.xml @@ -170,15 +170,9 @@ <text name="Creator:"> 制作者: </text> - <text name="Creator Name"> - Esbee Linden - </text> <text name="Owner:"> 所有者: </text> - <text name="Owner Name"> - Erica Linden - </text> <text name="Group:"> グループ: </text> diff --git a/indra/newview/skins/default/xui/ja/inspect_avatar.xml b/indra/newview/skins/default/xui/ja/inspect_avatar.xml index fb4937242b..f3ea794bc7 100644 --- a/indra/newview/skins/default/xui/ja/inspect_avatar.xml +++ b/indra/newview/skins/default/xui/ja/inspect_avatar.xml @@ -10,7 +10,6 @@ <string name="Details"> [SL_PROFILE] </string> - <text name="user_name" value="Grumpity ProductEngine"/> <text name="user_subtitle" value="11 Months, 3 days old"/> <text name="user_details"> This is my second life description and I really think it is great. diff --git a/indra/newview/skins/default/xui/ja/inspect_group.xml b/indra/newview/skins/default/xui/ja/inspect_group.xml index b461b93f65..be628befdf 100644 --- a/indra/newview/skins/default/xui/ja/inspect_group.xml +++ b/indra/newview/skins/default/xui/ja/inspect_group.xml @@ -16,9 +16,6 @@ <string name="YouAreMember"> あなたはメンバーです </string> - <text name="group_name"> - Grumpity's Grumpy Group of Moose - </text> <text name="group_subtitle"> 123 メートル </text> diff --git a/indra/newview/skins/default/xui/ja/panel_activeim_row.xml b/indra/newview/skins/default/xui/ja/panel_activeim_row.xml deleted file mode 100644 index 84272752cf..0000000000 --- a/indra/newview/skins/default/xui/ja/panel_activeim_row.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="panel_activeim_row"> - <text name="contact_name"> - Grumpity ProductEngine - </text> -</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_chat_header.xml b/indra/newview/skins/default/xui/ja/panel_chat_header.xml index babbff3132..7916bf5155 100644 --- a/indra/newview/skins/default/xui/ja/panel_chat_header.xml +++ b/indra/newview/skins/default/xui/ja/panel_chat_header.xml @@ -1,5 +1,4 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="im_header" name="im_header"> - <text_editor name="user_name" value="Ericag Vader"/> <text name="time_box" value="23:30"/> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_instant_message.xml b/indra/newview/skins/default/xui/ja/panel_instant_message.xml index 9fd0cb3b0d..bf4cbcdc46 100644 --- a/indra/newview/skins/default/xui/ja/panel_instant_message.xml +++ b/indra/newview/skins/default/xui/ja/panel_instant_message.xml @@ -4,7 +4,6 @@ 6 </string> <panel label="im_header" name="im_header"> - <text name="user_name" value="Erica Vader"/> <text name="time_box" value="23:30"/> </panel> <button label="返信" name="reply"/> diff --git a/indra/newview/skins/default/xui/ja/panel_profile_view.xml b/indra/newview/skins/default/xui/ja/panel_profile_view.xml index 5666a93cf0..82807bc8fc 100644 --- a/indra/newview/skins/default/xui/ja/panel_profile_view.xml +++ b/indra/newview/skins/default/xui/ja/panel_profile_view.xml @@ -6,7 +6,6 @@ <string name="status_offline"> オフライン </string> - <text_editor name="user_name" value="(ローディング...)"/> <text name="status" value="オンライン"/> <tab_container name="tabs"> <panel label="プロフィール" name="panel_profile"/> diff --git a/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml b/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml index ff9b5dc6aa..eb2bfa993b 100644 --- a/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml @@ -48,15 +48,9 @@ <text name="CreatorNameLabel"> 制作者: </text> - <text name="Creator Name"> - Erica Linden - </text> <text name="Owner:"> 所有者: </text> - <text name="Owner Name"> - Erica Linden - </text> <text name="Group_label"> グループ: </text> diff --git a/indra/newview/skins/default/xui/nl/floater_about_land.xml b/indra/newview/skins/default/xui/nl/floater_about_land.xml index 4271ad5b82..d51ea1c0f8 100644 --- a/indra/newview/skins/default/xui/nl/floater_about_land.xml +++ b/indra/newview/skins/default/xui/nl/floater_about_land.xml @@ -23,9 +23,7 @@ <text name="Owner:"> Eigenaar: </text> - <text name="OwnerText" left="102" width="242"> - Leyla Linden - </text> + <text name="OwnerText" left="102" width="242"/> <button label="Profiel" name="Profile..."/> <text name="Group:"> Groep: @@ -427,8 +425,6 @@ hebt geklikt.) </text> <check_box label="Automatisch schalen" name="media_auto_scale" tool_tip="Het aanvinken van deze optie zal de inhoud voor dit perceel automatisch schalen. Het kan enigszins trager zijn en de visuele kwaliteit kan iets lager zijn, maar er zal geen andere textuurschaling of uitlijning nodig zijn."/> <check_box label="Herhaal media" name="media_loop" tool_tip="Speel media af in een lus. Wanneer de media klaar is met afspelen zal het herstarten vanaf het begin."/> - <check_box label="Verberg media URL" name="hide_media_url" tool_tip="Het aanvinken van deze optie zal de media URL verbergen voor alle niet-geautoriseerde bekijkers van de perceelinformatie. Let op: dit is niet beschikbaar voor HTML types."/> - <check_box label="Verberg muziek URL" name="hide_music_url" tool_tip="Het aanvinken van deze optie zal de muziek URL verbergen voor alle niet-geautoriseerde bekijkers van de perceelinformatie."/> <text name="media_size" tool_tip="Grootte om webmedia weer te geven, laat op 0 staan voor standaard." width="120"> Media grootte: </text> diff --git a/indra/newview/skins/default/xui/nl/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/nl/floater_inventory_item_properties.xml index 63cfafab81..81a823acd4 100644 --- a/indra/newview/skins/default/xui/nl/floater_inventory_item_properties.xml +++ b/indra/newview/skins/default/xui/nl/floater_inventory_item_properties.xml @@ -9,16 +9,10 @@ <text name="LabelCreatorTitle"> Maker: </text> - <text name="LabelCreatorName"> - Nicole Linden - </text> <button label="Profiel..." label_selected="" name="BtnCreator"/> <text name="LabelOwnerTitle"> Eigenaar </text> - <text name="LabelOwnerName"> - Thrax Linden - </text> <button label="Profiel..." label_selected="" name="BtnOwner"/> <text name="LabelAcquiredTitle"> Verworven: diff --git a/indra/newview/skins/default/xui/nl/floater_tools.xml b/indra/newview/skins/default/xui/nl/floater_tools.xml index 4ffe675831..98339383e4 100644 --- a/indra/newview/skins/default/xui/nl/floater_tools.xml +++ b/indra/newview/skins/default/xui/nl/floater_tools.xml @@ -98,16 +98,10 @@ <text name="Creator:"> Maker: </text> - <text name="Creator Name"> - Thrax Linden - </text> <button label="Profiel..." label_selected="Profiel..." name="button creator profile"/> <text name="Owner:"> Eigenaar: </text> - <text name="Owner Name"> - Thrax Linden - </text> <button label="Profiel..." label_selected="Profiel..." name="button owner profile"/> <text name="Group:"> Groep: diff --git a/indra/newview/skins/default/xui/pl/floater_about_land.xml b/indra/newview/skins/default/xui/pl/floater_about_land.xml index 0974518a1f..b935615fcb 100644 --- a/indra/newview/skins/default/xui/pl/floater_about_land.xml +++ b/indra/newview/skins/default/xui/pl/floater_about_land.xml @@ -87,15 +87,9 @@ Idź do Świat > O Posiadłości albo wybierz inną posiadłość żeby pokaz <text name="Owner:"> Właściciel: </text> - <text name="OwnerText"> - Leyla Linden - </text> <text name="Group:"> Grupa: </text> - <text name="GroupText"> - Leyla Linden - </text> <button label="Ustaw" name="Set..."/> <check_box label="Udostępnij przypisywanie na Grupę" name="check deed" tool_tip="Oficer Grupy ma prawo przepisać prawo własności Posiadłości na Grupę. Posiadłość wspierana jest przez przydziały pochodzące od członków Grupy."/> <button label="Przypisz" name="Deed..." tool_tip="Prawo przypisania Posiadłości na Grupę może dokonać jedynie oficer Grupy."/> @@ -399,7 +393,6 @@ Jedynie większe posiadłości mogą być umieszczone w bazie wyszukiwarki. URL mediów: </text> <button label="Ustaw" name="set_media_url"/> - <check_box label="Ukryj URL mediów" name="hide_media_url" tool_tip="Wybranie tej opcji, zablokuje widok adresu do medów wszystkim nieautoryzowanym Rezydentom. Nie dotyczy to jednak typów HTML."/> <text name="Description:"> Opis: </text> @@ -428,7 +421,6 @@ Mediów: <check_box label="Powtórka Odtwarzania" name="media_loop" tool_tip="Odtwarzaj media z powtórką. Po wyświetleniu materialu, rozpocznie się odtwarzanie od początku."/> </panel> <panel label="DŹWIĘK" name="land_audio_panel"> - <check_box label="Ukryj URL muzyki" name="hide_music_url" tool_tip="Wybranie tej opcji, zablokuje widok adresu do medów muzycznych w posiadłości wszystkim nieautoryzowanym Użytkownikom"/> <check_box label="Rozmowy dozwolone" name="parcel_enable_voice_channel"/> <check_box label="Rozmowy dozwolone (ustawione przez Majątek)" name="parcel_enable_voice_channel_is_estate_disabled"/> <check_box label="Ogranicz komunikację głosową w tej Posiadłości." name="parcel_enable_voice_channel_local"/> diff --git a/indra/newview/skins/default/xui/pl/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/pl/floater_inventory_item_properties.xml index 1e63987585..054d74b234 100644 --- a/indra/newview/skins/default/xui/pl/floater_inventory_item_properties.xml +++ b/indra/newview/skins/default/xui/pl/floater_inventory_item_properties.xml @@ -24,16 +24,10 @@ <text name="LabelCreatorTitle"> Twórca: </text> - <text name="LabelCreatorName"> - Nicole Linden - </text> <button label="Profil..." label_selected="" name="BtnCreator"/> <text name="LabelOwnerTitle"> Właściciel: </text> - <text name="LabelOwnerName"> - Thrax Linden - </text> <button label="Profil..." label_selected="" name="BtnOwner"/> <text name="LabelAcquiredTitle"> Nabyte: diff --git a/indra/newview/skins/default/xui/pl/floater_tools.xml b/indra/newview/skins/default/xui/pl/floater_tools.xml index 7c1ced0eae..337998efc9 100644 --- a/indra/newview/skins/default/xui/pl/floater_tools.xml +++ b/indra/newview/skins/default/xui/pl/floater_tools.xml @@ -173,15 +173,9 @@ <text name="Creator:"> Twórca: </text> - <text name="Creator Name"> - Pani Esbee Linden (esbee.linden) - </text> <text name="Owner:"> Właściciel: </text> - <text name="Owner Name"> - Pani Erica "Moose" Linden (erica.linden) - </text> <text name="Group:"> Grupa: </text> diff --git a/indra/newview/skins/default/xui/pl/inspect_avatar.xml b/indra/newview/skins/default/xui/pl/inspect_avatar.xml index 1db3339352..5e982c0185 100644 --- a/indra/newview/skins/default/xui/pl/inspect_avatar.xml +++ b/indra/newview/skins/default/xui/pl/inspect_avatar.xml @@ -10,8 +10,6 @@ <string name="Details"> [SL_PROFILE] </string> - <text name="user_name_small" value="Grumpity ProductEngine with a long name"/> - <text name="user_slid" value="james.linden"/> <text name="user_details"> To jest mój opis w Second Life. </text> diff --git a/indra/newview/skins/default/xui/pl/panel_edit_profile.xml b/indra/newview/skins/default/xui/pl/panel_edit_profile.xml index c409666ec9..e6fd8b18f8 100644 --- a/indra/newview/skins/default/xui/pl/panel_edit_profile.xml +++ b/indra/newview/skins/default/xui/pl/panel_edit_profile.xml @@ -25,11 +25,7 @@ <text name="display_name_label" value="Wyświetlana nazwa:"/> <text name="solo_username_label" value="Nazwa użytkownika:"/> <button name="set_name" tool_tip="Ustaw wyświetlanią nazwę."/> - <text name="solo_user_name" value="Hamilton Hitchings"/> - <text name="user_name" value="Hamilton Hitchings"/> - <text name="user_name_small" value="Hamilton Hitchings"/> <text name="user_label" value="Nazwa użytkownika:"/> - <text name="user_slid" value="hamilton.linden"/> <panel name="lifes_images_panel"> <icon label="" name="2nd_life_edit_icon" tool_tip="Kliknij aby wybrać teksturę"/> </panel> diff --git a/indra/newview/skins/default/xui/pl/panel_profile_view.xml b/indra/newview/skins/default/xui/pl/panel_profile_view.xml index 3590e9222e..1fd6bc1d10 100644 --- a/indra/newview/skins/default/xui/pl/panel_profile_view.xml +++ b/indra/newview/skins/default/xui/pl/panel_profile_view.xml @@ -10,10 +10,8 @@ <text name="solo_username_label" value="Nazwa użytkownika:"/> <text name="status" value="Obecnie w SL"/> <text name="user_name_small" value="Jack oh look at me this is a super duper long name"/> - <text name="user_name" value="Jack Linden"/> <button name="copy_to_clipboard" tool_tip="Kopiuj do schowka"/> <text name="user_label" value="Nazwa użytkownika:"/> - <text name="user_slid" value="jack.linden"/> <tab_container name="tabs"> <panel label="PROFIL" name="panel_profile"/> <panel label="ULUBIONE" name="panel_picks"/> diff --git a/indra/newview/skins/default/xui/pl/sidepanel_task_info.xml b/indra/newview/skins/default/xui/pl/sidepanel_task_info.xml index d8cf456c64..eb8c9cdbbb 100644 --- a/indra/newview/skins/default/xui/pl/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/pl/sidepanel_task_info.xml @@ -48,15 +48,9 @@ <text name="CreatorNameLabel"> Twórca: </text> - <text name="Creator Name"> - Erica Linden - </text> <text name="Owner:"> Właściciel: </text> - <text name="Owner Name"> - Erica Linden - </text> <text name="Group_label"> Grupa: </text> diff --git a/indra/newview/skins/default/xui/pt/floater_about_land.xml b/indra/newview/skins/default/xui/pt/floater_about_land.xml index 3fb4bc272e..ffd1cce76c 100644 --- a/indra/newview/skins/default/xui/pt/floater_about_land.xml +++ b/indra/newview/skins/default/xui/pt/floater_about_land.xml @@ -87,15 +87,9 @@ Vá para o menu Mundo > Sobre o terreno ou selecione outro lote para mostrar <text name="Owner:"> Proprietário: </text> - <text name="OwnerText"> - Leyla Linden - </text> <text name="Group:"> Grupo: </text> - <text name="GroupText"> - Leyla Linden - </text> <button label="Ajustar" name="Set..."/> <check_box label="Permitir doação para o grupo" name="check deed" tool_tip="Oficiais do grupo podem doar esse terreno ao grupo, passando a administração para o gestor da ilha"/> <button label="Passar" name="Deed..." tool_tip="Você só pode doar o terreno se você for um dos oficiais do grupo selecionado."/> @@ -398,7 +392,6 @@ Apenas lotes maiores podem ser listados na busca. </text> <line_editor left="97" name="media_url"/> <button label="Definir..." label_selected="Definir..." name="set_media_url"/> - <check_box label="Esconder a URL da mídia" left="97" name="hide_media_url" tool_tip="Ativando esta opção, a URL da mídia se ocultará para quaisquer visualizadores não autorizados a ver esta informação do lote. Notar que isto não está disponível para tipos HTML."/> <text name="Description:"> Descrição: </text> @@ -430,7 +423,6 @@ Mídia: <text name="MusicURL:"> URL de música: </text> - <check_box label="Ocultar URL" name="hide_music_url" tool_tip="Selecionar esta opção oculta o URL de música a visitantes não autorizados aos dados do terreno."/> <text name="Sound:"> Som: </text> diff --git a/indra/newview/skins/default/xui/pt/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/pt/floater_inventory_item_properties.xml index 8fe69c097d..8a8f1f5b34 100644 --- a/indra/newview/skins/default/xui/pt/floater_inventory_item_properties.xml +++ b/indra/newview/skins/default/xui/pt/floater_inventory_item_properties.xml @@ -24,16 +24,10 @@ <text name="LabelCreatorTitle"> Criador: </text> - <text name="LabelCreatorName"> - Nicole Linden - </text> <button label="Perfil..." label_selected="" name="BtnCreator"/> <text name="LabelOwnerTitle"> Dono: </text> - <text name="LabelOwnerName"> - Thrax Linden - </text> <button label="Perfil..." label_selected="" name="BtnOwner"/> <text name="LabelAcquiredTitle"> Adquirido: diff --git a/indra/newview/skins/default/xui/pt/floater_tools.xml b/indra/newview/skins/default/xui/pt/floater_tools.xml index bd5fbf80d1..f90097bf22 100644 --- a/indra/newview/skins/default/xui/pt/floater_tools.xml +++ b/indra/newview/skins/default/xui/pt/floater_tools.xml @@ -170,15 +170,9 @@ <text name="Creator:"> Criador: </text> - <text name="Creator Name"> - Mrs. Esbee Linden (esbee.linden) - </text> <text name="Owner:"> Proprietário: </text> - <text name="Owner Name"> - Mrs. Erica "Moose" Linden (erica.linden) - </text> <text name="Group:"> Grupo: </text> diff --git a/indra/newview/skins/default/xui/pt/inspect_avatar.xml b/indra/newview/skins/default/xui/pt/inspect_avatar.xml index a95d5ff31a..a199c58c15 100644 --- a/indra/newview/skins/default/xui/pt/inspect_avatar.xml +++ b/indra/newview/skins/default/xui/pt/inspect_avatar.xml @@ -10,8 +10,6 @@ <string name="Details"> [PERFIL_SL] </string> - <text name="user_name_small" value="Grumpity ProductEngine with a long name"/> - <text name="user_slid" value="james.linden"/> <text name="user_details"> This is my second life description and I really think it is great. But for some reason my description is super extra long because I like to talk a whole lot </text> diff --git a/indra/newview/skins/default/xui/pt/panel_edit_profile.xml b/indra/newview/skins/default/xui/pt/panel_edit_profile.xml index 4066842b25..0ba7382845 100644 --- a/indra/newview/skins/default/xui/pt/panel_edit_profile.xml +++ b/indra/newview/skins/default/xui/pt/panel_edit_profile.xml @@ -25,11 +25,7 @@ <text name="display_name_label" value="Nome de tela:"/> <text name="solo_username_label" value="Nome de usuário:"/> <button name="set_name" tool_tip="Definir nome de tela"/> - <text name="solo_user_name" value="Hamilton Hitchings"/> - <text name="user_name" value="Hamilton Hitchings"/> - <text name="user_name_small" value="Hamilton Hitchings"/> <text name="user_label" value="Nome de usuário:"/> - <text name="user_slid" value="hamilton.linden"/> <panel name="lifes_images_panel"> <icon label="" name="2nd_life_edit_icon" tool_tip="Selecione uma imagem"/> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_group_roles.xml b/indra/newview/skins/default/xui/pt/panel_group_roles.xml index c861e29624..11a31570d1 100644 --- a/indra/newview/skins/default/xui/pt/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/pt/panel_group_roles.xml @@ -6,8 +6,8 @@ <panel.string name="want_apply_text"> Deseja salvar essas mudanças? </panel.string> - <tab_container height="164" name="roles_tab_container"> - <panel height="148" label="MEMBROS" name="members_sub_tab" tool_tip="Membros"> + <tab_container name="roles_tab_container"> + <panel label="MEMBROS" name="members_sub_tab" tool_tip="Membros"> <panel.string name="help_text"> Você pode adicionar ou remover as funções designadas aos membros. Selecione vários membros, segurando a tecla Ctrl e clicando em seus nomes. </panel.string> @@ -15,15 +15,15 @@ [AREA] m² </panel.string> <filter_editor label="Filtrar por membro" name="filter_input"/> - <name_list bottom_delta="-105" height="104" name="member_list"> + <name_list name="member_list"> <name_list.columns label="Membro" name="name"/> <name_list.columns label="Doações" name="donated"/> <name_list.columns label="Status" name="online"/> </name_list> - <button label="Convidar" name="member_invite" width="165"/> + <button label="Convidar" name="member_invite" /> <button label="Ejetar" name="member_eject"/> </panel> - <panel height="148" label="CARGOS" name="roles_sub_tab"> + <panel label="CARGOS" name="roles_sub_tab"> <panel.string name="help_text"> Cada cargo tem um nome e uma lista das funções que membros designados podem desempenhar. Os membros podem ter um ou mais cargos. @@ -36,7 +36,7 @@ Inv_FolderClosed </panel.string> <filter_editor label="Filtrar por cargo" name="filter_input"/> - <scroll_list bottom_delta="-104" height="104" name="role_list"> + <scroll_list name="role_list"> <scroll_list.columns label="Cargo" name="name"/> <scroll_list.columns label="Título" name="title"/> <scroll_list.columns label="#" name="members"/> diff --git a/indra/newview/skins/default/xui/pt/panel_profile_view.xml b/indra/newview/skins/default/xui/pt/panel_profile_view.xml index d3ec9b82bc..d81ee08e6c 100644 --- a/indra/newview/skins/default/xui/pt/panel_profile_view.xml +++ b/indra/newview/skins/default/xui/pt/panel_profile_view.xml @@ -10,10 +10,8 @@ <text name="solo_username_label" value="Nome de usuário:"/> <text name="status" value="Conectado"/> <text name="user_name_small" value="Jack oh look at me this is a super duper long name"/> - <text name="user_name" value="Jack Linden"/> <button name="copy_to_clipboard" tool_tip="Copiar para área de transferência"/> <text name="user_label" value="Nome de usuário:"/> - <text name="user_slid" value="jack.linden"/> <tab_container name="tabs"> <panel label="PERFIL" name="panel_profile"/> <panel label="DESTAQUES" name="panel_picks"/> diff --git a/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml b/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml index dd65810b22..8092e6c145 100644 --- a/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml @@ -48,15 +48,9 @@ <text name="CreatorNameLabel"> Criador: </text> - <text name="Creator Name"> - Erica Linden - </text> <text name="Owner:"> Proprietário: </text> - <text name="Owner Name"> - Erica Linden - </text> <text name="Group_label"> Grupo: </text> -- cgit v1.2.3 From f2892c98823a4022604afe91de0bbb1b2ce56e19 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Mon, 28 Mar 2011 11:48:43 -0700 Subject: fix for linux and mac --- indra/newview/llappviewerlinux.cpp | 2 +- indra/newview/llappviewermacosx.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp index 898cc1c0ba..39e754e549 100644 --- a/indra/newview/llappviewerlinux.cpp +++ b/indra/newview/llappviewerlinux.cpp @@ -233,7 +233,7 @@ gboolean viewer_app_api_GoSLURL(ViewerAppAPI *obj, gchar *slurl, gboolean **succ std::string url = slurl; LLMediaCtrl* web = NULL; const bool trusted_browser = false; - if (LLURLDispatcher::dispatch(url, web, trusted_browser)) + if (LLURLDispatcher::dispatch(url, web, "", trusted_browser)) { // bring window to foreground, as it has just been "launched" from a URL // todo: hmm, how to get there from here? diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp index 1cd80986d8..6b32263927 100644 --- a/indra/newview/llappviewermacosx.cpp +++ b/indra/newview/llappviewermacosx.cpp @@ -500,7 +500,7 @@ OSErr AEGURLHandler(const AppleEvent *messagein, AppleEvent *reply, long refIn) LLMediaCtrl* web = NULL; const bool trusted_browser = false; - LLURLDispatcher::dispatch(url, web, trusted_browser); + LLURLDispatcher::dispatch(url, web, "", trusted_browser); } return(result); -- cgit v1.2.3 From 7564583238c8fabe042dedf7d7491fa0a81db8f3 Mon Sep 17 00:00:00 2001 From: "alain@945battery-guestA-183.lindenlab.com" <alain@945battery-guestA-183.lindenlab.com> Date: Mon, 28 Mar 2011 13:34:06 -0700 Subject: fix openal linking of viewer. --- indra/newview/CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 2574454d96..e93ef8c498 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1688,6 +1688,12 @@ target_link_libraries(${VIEWER_BINARY_NAME} ${GOOGLE_PERFTOOLS_LIBRARIES} ) +if (OPENAL) + target_link_libraries(${VIEWER_BINARY_NAME} + ${OPENAL_LIBRARIES} + ) +endif() + if (USE_KDU) target_link_libraries(${VIEWER_BINARY_NAME} ${LLKDU_LIBRARIES} -- cgit v1.2.3 From 1733929aafb2839937c9590a53e06d7e9e623017 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Mon, 28 Mar 2011 13:44:52 -0700 Subject: SOCIAL-823 FIX Performing click to walk or click to drag actions do not remove move hint in Basic mode --- indra/newview/lltoolpie.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index a8243a989e..95bd210ae3 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -37,7 +37,7 @@ #include "llavatarnamecache.h" #include "llviewercontrol.h" #include "llfocusmgr.h" -//#include "llfirstuse.h" +#include "llfirstuse.h" #include "llfloaterland.h" #include "llfloaterreg.h" #include "llfloaterscriptdebug.h" @@ -668,6 +668,8 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask) mAutoPilotDestination->setDuration(3.f); handle_go_to(); + LLFirstUse::notMoving(false); + mBlockClickToWalk = false; return TRUE; @@ -1753,6 +1755,7 @@ bool intersect_ray_with_sphere( const LLVector3& ray_pt, const LLVector3& ray_di void LLToolPie::startCameraSteering() { + LLFirstUse::notMoving(false); mMouseOutsideSlop = true; mBlockClickToWalk = true; -- cgit v1.2.3 From 331a419a691145c8ef956581143c9267ba8f0909 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Mon, 28 Mar 2011 13:46:36 -0700 Subject: SOCIAL-821 FIX Move hint comes up immediately when launching viewer --- indra/newview/app_settings/settings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index b966447942..04045585a0 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -12364,7 +12364,7 @@ <key>Type</key> <string>F32</string> <key>Value</key> - <real>1.0</real> + <real>120.0</real> </map> <key>DestinationGuideHintTimeout</key> <map> -- cgit v1.2.3 From d20f8a07cce466dcdddd9c113c32f53faa4ab0fd Mon Sep 17 00:00:00 2001 From: "Andrew A. de Laix" <alain@lindenlab.com> Date: Mon, 28 Mar 2011 14:00:35 -0700 Subject: fix CHOP-402: use newer api call for move to trash that will rename if needed. --- indra/mac_updater/mac_updater.cpp | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/indra/mac_updater/mac_updater.cpp b/indra/mac_updater/mac_updater.cpp index 5d19e8a889..809f66cb1d 100644 --- a/indra/mac_updater/mac_updater.cpp +++ b/indra/mac_updater/mac_updater.cpp @@ -1230,20 +1230,14 @@ void *updatethreadproc(void*) // Move work directory to the trash if(tempDir[0] != 0) { -// chdir("/"); -// FSDeleteObjects(tempDirRef); - llinfos << "Moving work directory to the trash." << llendl; - err = FSMoveObject(&tempDirRef, &trashFolderRef, NULL); + FSRef trashRef; + OSStatus err = FSMoveObjectToTrashSync(&tempDirRef, &trashRef, 0); if(err != noErr) { llwarns << "failed to move files to trash, (error code " << err << ")" << llendl; } - -// snprintf(temp, sizeof(temp), "rm -rf '%s'", tempDir); -// printf("%s\n", temp); -// system(temp); } if(!gCancelled && !gFailure && (target[0] != 0)) -- cgit v1.2.3 From d597efc0f365fa07de9b7c0641dc4297466bfae5 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Mon, 28 Mar 2011 15:35:48 -0700 Subject: fix for mac/linux? --- indra/newview/llappviewerlinux.cpp | 2 +- indra/newview/llappviewermacosx.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp index 39e754e549..523c2e3adf 100644 --- a/indra/newview/llappviewerlinux.cpp +++ b/indra/newview/llappviewerlinux.cpp @@ -233,7 +233,7 @@ gboolean viewer_app_api_GoSLURL(ViewerAppAPI *obj, gchar *slurl, gboolean **succ std::string url = slurl; LLMediaCtrl* web = NULL; const bool trusted_browser = false; - if (LLURLDispatcher::dispatch(url, web, "", trusted_browser)) + if (LLURLDispatcher::dispatch(url, "", web, trusted_browser)) { // bring window to foreground, as it has just been "launched" from a URL // todo: hmm, how to get there from here? diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp index 6b32263927..c2916717bd 100644 --- a/indra/newview/llappviewermacosx.cpp +++ b/indra/newview/llappviewermacosx.cpp @@ -500,7 +500,7 @@ OSErr AEGURLHandler(const AppleEvent *messagein, AppleEvent *reply, long refIn) LLMediaCtrl* web = NULL; const bool trusted_browser = false; - LLURLDispatcher::dispatch(url, web, "", trusted_browser); + LLURLDispatcher::dispatch(url, "", web, trusted_browser); } return(result); -- cgit v1.2.3 From 1a49226a894900332fb90bef6507986df2d5515b Mon Sep 17 00:00:00 2001 From: Andrew de Laix <alain@lindenlab.com> Date: Mon, 28 Mar 2011 22:49:53 +0000 Subject: well, that didn't work. Rollback.. --- indra/newview/CMakeLists.txt | 6 ------ 1 file changed, 6 deletions(-) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index e93ef8c498..2574454d96 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1688,12 +1688,6 @@ target_link_libraries(${VIEWER_BINARY_NAME} ${GOOGLE_PERFTOOLS_LIBRARIES} ) -if (OPENAL) - target_link_libraries(${VIEWER_BINARY_NAME} - ${OPENAL_LIBRARIES} - ) -endif() - if (USE_KDU) target_link_libraries(${VIEWER_BINARY_NAME} ${LLKDU_LIBRARIES} -- cgit v1.2.3 From 8e42c0e0a7182f9f51769926b163709ced15d4b2 Mon Sep 17 00:00:00 2001 From: Andrew de Laix <alain@lindenlab.com> Date: Mon, 28 Mar 2011 22:51:45 +0000 Subject: get naming of openallib right when packaging. --- indra/newview/viewer_manifest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 39ac03cd20..f0b1973fdf 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -953,7 +953,7 @@ class Linux_i686Manifest(LinuxManifest): self.path("libopenjpeg.so.1") self.path("libopenjpeg.so") self.path("libalut.so") - self.path("libopenal.so") + self.path("libopenal.so", "libopenal.so.1") self.path("libopenal.so", "libvivoxoal.so.1") # vivox's sdk expects this soname self.path("libfontconfig.so.1.4.4") try: -- cgit v1.2.3 From e0ca936fbf7411bcc1cdd935a50c5913db6a1cb9 Mon Sep 17 00:00:00 2001 From: Paul ProductEngine <pguslisty@productengine.com> Date: Tue, 29 Mar 2011 13:57:24 +0300 Subject: =?UTF-8?q?STORM-1072=20FIXED=20[TRANSLATED=20BUT=20IN=20EN]=20in?= =?UTF-8?q?=20"Monde"=20>=20"Profil=20du=20lieu"=20>=20"=C3=80=20propos=20?= =?UTF-8?q?des=20terrains"=20>=20"R=C3=A9glement"=20:=20"Estate=20/=20Full?= =?UTF-8?q?=20Region"=20is=20in=20english.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Linked region_type string value with translation in strings.xml. If translation for region_type string is absent set unlocalized version (not MissingString text as usual) --- indra/newview/llfloaterland.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index a6025661b7..7be4ebc690 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -2871,7 +2871,10 @@ void LLPanelLandCovenant::refresh() LLTextBox* region_landtype = getChild<LLTextBox>("region_landtype_text"); if (region_landtype) { - region_landtype->setText(region->getSimProductName()); + std::string land_type; + bool is_land_type_localized = LLTrans::findString(land_type, region->getSimProductName()); + + region_landtype->setText(is_land_type_localized ? land_type : region->getSimProductName()); } LLTextBox* region_maturity = getChild<LLTextBox>("region_maturity_text"); -- cgit v1.2.3 From fe9260239145ed008b3ae94d57a96a86b2ef0179 Mon Sep 17 00:00:00 2001 From: Alain Linden <alain@lindenlab.com> Date: Tue, 29 Mar 2011 16:43:38 -0700 Subject: update windows llqtwebkit archive. --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 65d9764cc6..7ed98ce3bb 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1086,9 +1086,9 @@ <key>archive</key> <map> <key>hash</key> - <string>7865b9c3a5d9f9424af56d5d05b82de9</string> + <string>1b1b8e104e39c542d69eb37b5ee81818</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-4.7.1-windows-20110210.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llqtwebkit/rev/225249/arch/CYGWIN/installer/llqtwebkit-4.7.1-windows-20110329.tar.bz2</string> </map> <key>name</key> <string>windows</string> -- cgit v1.2.3 From df05762114bae02d18fe14bbfbb5ca45222104f8 Mon Sep 17 00:00:00 2001 From: Merov Linden <merov@lindenlab.com> Date: Tue, 29 Mar 2011 16:54:52 -0700 Subject: STORM-987: Make building of llimage_libtest optional so that builf failure on Linux doesn't block autobuild merge --- indra/integration_tests/CMakeLists.txt | 4 +++- indra/integration_tests/llimage_libtest/CMakeLists.txt | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/indra/integration_tests/CMakeLists.txt b/indra/integration_tests/CMakeLists.txt index 5935f23fe9..248583d775 100644 --- a/indra/integration_tests/CMakeLists.txt +++ b/indra/integration_tests/CMakeLists.txt @@ -1,4 +1,6 @@ # -*- cmake -*- add_subdirectory(llui_libtest) -add_subdirectory(llimage_libtest) +if (LLIMAGE_LIBTEST) + add_subdirectory(llimage_libtest) +endif (LLIMAGE_LIBTEST) diff --git a/indra/integration_tests/llimage_libtest/CMakeLists.txt b/indra/integration_tests/llimage_libtest/CMakeLists.txt index f59440be6b..cab0546083 100644 --- a/indra/integration_tests/llimage_libtest/CMakeLists.txt +++ b/indra/integration_tests/llimage_libtest/CMakeLists.txt @@ -53,9 +53,9 @@ if (DARWIN) find_library(COREFOUNDATION_LIBRARY CoreFoundation) set(OS_LIBRARIES ${COREFOUNDATION_LIBRARY}) elseif (WINDOWS) -# set(OS_LIBRARIES) + set(OS_LIBRARIES) elseif (LINUX) -# set(OS_LIBRARIES) + set(OS_LIBRARIES) else (DARWIN) message(FATAL_ERROR "Unknown platform") endif (DARWIN) -- cgit v1.2.3 From 3208104e2e51124fb6ee90133fee328f59e1fddc Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Tue, 29 Mar 2011 20:57:17 -0400 Subject: A bit of rearchitecture so that we can have edit wearables that don't have associated snapshots. Needed to support physics wearables, which don't use a snapshot. --- indra/newview/CMakeLists.txt | 2 + indra/newview/llpaneleditwearable.cpp | 11 +- indra/newview/llphysicsmotion.cpp | 14 ++- indra/newview/llscrollingpanelparam.cpp | 61 +++-------- indra/newview/llscrollingpanelparam.h | 11 +- indra/newview/llscrollingpanelparambase.cpp | 112 +++++++++++++++++++++ indra/newview/llscrollingpanelparambase.h | 62 ++++++++++++ .../default/xui/en/panel_scrolling_param_base.xml | 23 +++++ 8 files changed, 236 insertions(+), 60 deletions(-) create mode 100644 indra/newview/llscrollingpanelparambase.cpp create mode 100644 indra/newview/llscrollingpanelparambase.h create mode 100644 indra/newview/skins/default/xui/en/panel_scrolling_param_base.xml diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index b7ed4fc0a4..04f2ec0cb2 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -401,6 +401,7 @@ set(viewer_SOURCE_FILES llscreenchannel.cpp llscriptfloater.cpp llscrollingpanelparam.cpp + llscrollingpanelparambase.cpp llsearchcombobox.cpp llsearchhistory.cpp llsecapi.cpp @@ -938,6 +939,7 @@ set(viewer_HEADER_FILES llscreenchannel.h llscriptfloater.h llscrollingpanelparam.h + llscrollingpanelparambase.h llsearchcombobox.h llsearchhistory.h llsecapi.h diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp index 7058839e8c..a7d20acbbc 100644 --- a/indra/newview/llpaneleditwearable.cpp +++ b/indra/newview/llpaneleditwearable.cpp @@ -1415,7 +1415,16 @@ void LLPanelEditWearable::buildParamList(LLScrollingPanelList *panel_list, value { LLPanel::Params p; p.name("LLScrollingPanelParam"); - LLScrollingPanelParam* panel_param = new LLScrollingPanelParam( p, NULL, (*it).second, TRUE, this->getWearable(), jointp); + LLWearable *wearable = this->getWearable(); + LLScrollingPanelParamBase *panel_param = NULL; + if (wearable && wearable->getType() == LLWearableType::WT_PHYSICS) // Hack to show a different panel for physics. Should generalize this later. + { + panel_param = new LLScrollingPanelParamBase( p, NULL, (*it).second, TRUE, this->getWearable(), jointp); + } + else + { + panel_param = new LLScrollingPanelParam( p, NULL, (*it).second, TRUE, this->getWearable(), jointp); + } height = panel_list->addPanel( panel_param ); } } diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 48e632280e..4048c66262 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -448,8 +448,16 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) const F32 behavior_spring = getParamValue("Spring"); const F32 behavior_gain = getParamValue("Gain"); const F32 behavior_damping = getParamValue("Damping"); - const F32 behavior_maxspeed = getParamValue("MaxSpeed"); const F32 behavior_drag = getParamValue("Drag"); + const BOOL physics_test = gSavedSettings.getBOOL("AvatarPhysicsTest"); + + F32 behavior_maxspeed = getParamValue("MaxSpeed"); + if (physics_test) + behavior_maxspeed = 100.0f; + /* + if (behavior_maxspeed == 0) + return FALSE; + */ F32 position_current_local = mPosition_local; // Normalized [0,1] range @@ -526,9 +534,9 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) -behavior_maxspeed, behavior_maxspeed); // Temporary debugging setting to cause all avatars to move, for profiling purposes. - if (gSavedSettings.getBOOL("AvatarPhysicsTest")) + if (physics_test) { - velocity_new_local = sin(time*4.0)*5.0; + velocity_new_local = sin(time*4.0); } // Calculate the new parameters, or remain unchanged if max speed is 0. const F32 position_new_local = (behavior_maxspeed != 0) ? diff --git a/indra/newview/llscrollingpanelparam.cpp b/indra/newview/llscrollingpanelparam.cpp index f8c20dada0..5310ababba 100644 --- a/indra/newview/llscrollingpanelparam.cpp +++ b/indra/newview/llscrollingpanelparam.cpp @@ -50,14 +50,9 @@ const S32 LLScrollingPanelParam::PARAM_HINT_HEIGHT = 128; S32 LLScrollingPanelParam::sUpdateDelayFrames = 0; LLScrollingPanelParam::LLScrollingPanelParam( const LLPanel::Params& panel_params, - LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable, LLJoint* jointp ) - : LLScrollingPanel( panel_params ), - mParam(param), - mAllowModify(allow_modify), - mWearable(wearable) + LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable, LLJoint* jointp, BOOL use_hints ) + : LLScrollingPanelParamBase( panel_params, mesh, param, allow_modify, wearable, jointp, use_hints) { - buildFromFile( "panel_scrolling_param.xml"); - // *HACK To avoid hard coding texture position, lets use border's position for texture. LLViewBorder* left_border = getChild<LLViewBorder>("left_border"); @@ -73,17 +68,6 @@ LLScrollingPanelParam::LLScrollingPanelParam( const LLPanel::Params& panel_param mHintMin->setAllowsUpdates( FALSE ); mHintMax->setAllowsUpdates( FALSE ); - getChild<LLUICtrl>("param slider")->setValue(weightToPercent(param->getWeight())); - - std::string display_name = LLTrans::getString(param->getDisplayName()); - getChild<LLUICtrl>("param slider")->setLabelArg("[DESC]", display_name); - getChildView("param slider")->setEnabled(mAllowModify); - childSetCommitCallback("param slider", LLScrollingPanelParam::onSliderMoved, this); - - std::string min_name = LLTrans::getString(param->getMinDisplayName()); - std::string max_name = LLTrans::getString(param->getMaxDisplayName()); - getChild<LLUICtrl>("min param text")->setValue(min_name); - getChild<LLUICtrl>("max param text")->setValue(max_name); LLButton* less = getChild<LLButton>("less"); if (less) @@ -112,20 +96,15 @@ LLScrollingPanelParam::~LLScrollingPanelParam() } void LLScrollingPanelParam::updatePanel(BOOL allow_modify) { - LLViewerVisualParam* param = mHintMin->getVisualParam(); - if (!mWearable) { // not editing a wearable just now, no update necessary return; } - F32 current_weight = mWearable->getVisualParamWeight( param->getID() ); - getChild<LLUICtrl>("param slider")->setValue(weightToPercent( current_weight ) ); + LLScrollingPanelParamBase::updatePanel(allow_modify); + mHintMin->requestUpdate( sUpdateDelayFrames++ ); mHintMax->requestUpdate( sUpdateDelayFrames++ ); - - mAllowModify = allow_modify; - getChildView("param slider")->setEnabled(mAllowModify); getChildView("less")->setEnabled(mAllowModify); getChildView("more")->setEnabled(mAllowModify); } @@ -135,13 +114,17 @@ void LLScrollingPanelParam::setVisible( BOOL visible ) if( getVisible() != visible ) { LLPanel::setVisible( visible ); - mHintMin->setAllowsUpdates( visible ); - mHintMax->setAllowsUpdates( visible ); + if (mHintMin) + mHintMin->setAllowsUpdates( visible ); + if (mHintMax) + mHintMax->setAllowsUpdates( visible ); if( visible ) { - mHintMin->setUpdateDelayFrames( sUpdateDelayFrames++ ); - mHintMax->setUpdateDelayFrames( sUpdateDelayFrames++ ); + if (mHintMin) + mHintMin->setUpdateDelayFrames( sUpdateDelayFrames++ ); + if (mHintMax) + mHintMax->setUpdateDelayFrames( sUpdateDelayFrames++ ); } } } @@ -164,7 +147,7 @@ void LLScrollingPanelParam::draw() getChildView("min param text")->setVisible( FALSE ); getChildView("max param text")->setVisible( FALSE ); LLPanel::draw(); - + // If we're in a focused floater, don't apply the floater's alpha to visual param hint, // making its behavior similar to texture controls'. F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency(); @@ -195,23 +178,6 @@ void LLScrollingPanelParam::draw() drawChild(getChild<LLView>("max param text")); } -// static -void LLScrollingPanelParam::onSliderMoved(LLUICtrl* ctrl, void* userdata) -{ - LLSliderCtrl* slider = (LLSliderCtrl*) ctrl; - LLScrollingPanelParam* self = (LLScrollingPanelParam*) userdata; - LLViewerVisualParam* param = self->mParam; - - F32 current_weight = self->mWearable->getVisualParamWeight( param->getID() ); - F32 new_weight = self->percentToWeight( (F32)slider->getValue().asReal() ); - if (current_weight != new_weight ) - { - self->mWearable->setVisualParamWeight( param->getID(), new_weight, FALSE ); - self->mWearable->writeToAvatar(); - gAgentAvatarp->updateVisualParams(); - } -} - // static void LLScrollingPanelParam::onSliderMouseDown(LLUICtrl* ctrl, void* userdata) { @@ -221,7 +187,6 @@ void LLScrollingPanelParam::onSliderMouseDown(LLUICtrl* ctrl, void* userdata) void LLScrollingPanelParam::onSliderMouseUp(LLUICtrl* ctrl, void* userdata) { LLScrollingPanelParam* self = (LLScrollingPanelParam*) userdata; - LLVisualParamHint::requestHintUpdates( self->mHintMin, self->mHintMax ); } diff --git a/indra/newview/llscrollingpanelparam.h b/indra/newview/llscrollingpanelparam.h index 1cbc64f45a..c7a47d5c7a 100644 --- a/indra/newview/llscrollingpanelparam.h +++ b/indra/newview/llscrollingpanelparam.h @@ -28,8 +28,7 @@ #ifndef LL_SCROLLINGPANELPARAM_H #define LL_SCROLLINGPANELPARAM_H -#include "llpanel.h" -#include "llscrollingpanellist.h" +#include "llscrollingpanelparambase.h" class LLViewerJointMesh; class LLViewerVisualParam; @@ -38,11 +37,11 @@ class LLVisualParamHint; class LLViewerVisualParam; class LLJoint; -class LLScrollingPanelParam : public LLScrollingPanel +class LLScrollingPanelParam : public LLScrollingPanelParamBase { public: LLScrollingPanelParam( const LLPanel::Params& panel_params, - LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable, LLJoint* jointp ); + LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable, LLJoint* jointp, BOOL use_hints = TRUE ); virtual ~LLScrollingPanelParam(); virtual void draw(); @@ -50,7 +49,6 @@ public: virtual void updatePanel(BOOL allow_modify); static void onSliderMouseDown(LLUICtrl* ctrl, void* userdata); - static void onSliderMoved(LLUICtrl* ctrl, void* userdata); static void onSliderMouseUp(LLUICtrl* ctrl, void* userdata); static void onHintMinMouseDown(void* userdata); @@ -74,7 +72,6 @@ public: const static S32 PARAM_HINT_HEIGHT; public: - LLViewerVisualParam* mParam; LLPointer<LLVisualParamHint> mHintMin; LLPointer<LLVisualParamHint> mHintMax; static S32 sUpdateDelayFrames; @@ -82,9 +79,7 @@ public: protected: LLTimer mMouseDownTimer; // timer for how long mouse has been held down on a hint. F32 mLastHeldTime; - BOOL mAllowModify; - LLWearable *mWearable; }; #endif diff --git a/indra/newview/llscrollingpanelparambase.cpp b/indra/newview/llscrollingpanelparambase.cpp new file mode 100644 index 0000000000..62e3039d2f --- /dev/null +++ b/indra/newview/llscrollingpanelparambase.cpp @@ -0,0 +1,112 @@ +/** + * @file llscrollingpanelparam.cpp + * @brief UI panel for a list of visual param panels + * + * $LicenseInfo:firstyear=2009&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llscrollingpanelparambase.h" +#include "llviewerjointmesh.h" +#include "llviewervisualparam.h" +#include "llwearable.h" +#include "llviewervisualparam.h" +#include "lltoolmorph.h" +#include "lltrans.h" +#include "llbutton.h" +#include "llsliderctrl.h" +#include "llagent.h" +#include "llviewborder.h" +#include "llvoavatarself.h" + +LLScrollingPanelParamBase::LLScrollingPanelParamBase( const LLPanel::Params& panel_params, + LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable, LLJoint* jointp, BOOL use_hints) + : LLScrollingPanel( panel_params ), + mParam(param), + mAllowModify(allow_modify), + mWearable(wearable) +{ + if (use_hints) + buildFromFile( "panel_scrolling_param.xml"); + else + buildFromFile( "panel_scrolling_param_base.xml"); + + getChild<LLUICtrl>("param slider")->setValue(weightToPercent(param->getWeight())); + + std::string display_name = LLTrans::getString(param->getDisplayName()); + getChild<LLUICtrl>("param slider")->setLabelArg("[DESC]", display_name); + getChildView("param slider")->setEnabled(mAllowModify); + childSetCommitCallback("param slider", LLScrollingPanelParamBase::onSliderMoved, this); + + setVisible(FALSE); + setBorderVisible( FALSE ); +} + +LLScrollingPanelParamBase::~LLScrollingPanelParamBase() +{ +} + +void LLScrollingPanelParamBase::updatePanel(BOOL allow_modify) +{ + LLViewerVisualParam* param = mParam; + + if (!mWearable) + { + // not editing a wearable just now, no update necessary + return; + } + + F32 current_weight = mWearable->getVisualParamWeight( param->getID() ); + getChild<LLUICtrl>("param slider")->setValue(weightToPercent( current_weight ) ); + mAllowModify = allow_modify; + getChildView("param slider")->setEnabled(mAllowModify); +} + +// static +void LLScrollingPanelParamBase::onSliderMoved(LLUICtrl* ctrl, void* userdata) +{ + LLSliderCtrl* slider = (LLSliderCtrl*) ctrl; + LLScrollingPanelParamBase* self = (LLScrollingPanelParamBase*) userdata; + LLViewerVisualParam* param = self->mParam; + + F32 current_weight = self->mWearable->getVisualParamWeight( param->getID() ); + F32 new_weight = self->percentToWeight( (F32)slider->getValue().asReal() ); + if (current_weight != new_weight ) + { + self->mWearable->setVisualParamWeight( param->getID(), new_weight, FALSE ); + self->mWearable->writeToAvatar(); + gAgentAvatarp->updateVisualParams(); + } +} + +F32 LLScrollingPanelParamBase::weightToPercent( F32 weight ) +{ + LLViewerVisualParam* param = mParam; + return (weight - param->getMinWeight()) / (param->getMaxWeight() - param->getMinWeight()) * 100.f; +} + +F32 LLScrollingPanelParamBase::percentToWeight( F32 percent ) +{ + LLViewerVisualParam* param = mParam; + return percent / 100.f * (param->getMaxWeight() - param->getMinWeight()) + param->getMinWeight(); +} diff --git a/indra/newview/llscrollingpanelparambase.h b/indra/newview/llscrollingpanelparambase.h new file mode 100644 index 0000000000..9538826251 --- /dev/null +++ b/indra/newview/llscrollingpanelparambase.h @@ -0,0 +1,62 @@ +/** + * @file llscrollingpanelparam.h + * @brief the scrolling panel containing a list of visual param + * panels + * + * $LicenseInfo:firstyear=2009&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#ifndef LL_SCROLLINGPANELPARAMBASE_H +#define LL_SCROLLINGPANELPARAMBASE_H + +#include "llpanel.h" +#include "llscrollingpanellist.h" + +class LLViewerJointMesh; +class LLViewerVisualParam; +class LLWearable; +class LLVisualParamHint; +class LLViewerVisualParam; +class LLJoint; + +class LLScrollingPanelParamBase : public LLScrollingPanel +{ +public: + LLScrollingPanelParamBase( const LLPanel::Params& panel_params, + LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable, LLJoint* jointp, BOOL use_hints = FALSE ); + virtual ~LLScrollingPanelParamBase(); + + virtual void updatePanel(BOOL allow_modify); + + static void onSliderMoved(LLUICtrl* ctrl, void* userdata); + + F32 weightToPercent( F32 weight ); + F32 percentToWeight( F32 percent ); + +public: + LLViewerVisualParam* mParam; +protected: + BOOL mAllowModify; + LLWearable *mWearable; +}; + +#endif diff --git a/indra/newview/skins/default/xui/en/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/en/panel_scrolling_param_base.xml new file mode 100644 index 0000000000..177a2fe9f0 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_scrolling_param_base.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + layout="topleft" + left="0" + name="LLScrollingPanelParamBase" + height="20" + width="290"> + <slider + can_edit_text="true" + decimal_digits="0" + enabled="false" + height="16" + increment="1" + initial_value="0" + label="[DESC]" + layout="bottom|left" + left="6" + max_val="100" + name="param slider" + bottom="1" + width="274" + slider_label.font.style="BOLD" /> +</panel> -- cgit v1.2.3 From 8ecd02641c87fde51e2cc18f9ee4096d69490771 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Tue, 29 Mar 2011 21:17:36 -0400 Subject: Fix for labels not showing up in edit params anymore (accidentally took out the code that displayed them). --- indra/newview/llscrollingpanelparam.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/indra/newview/llscrollingpanelparam.cpp b/indra/newview/llscrollingpanelparam.cpp index 5310ababba..05b82ba967 100644 --- a/indra/newview/llscrollingpanelparam.cpp +++ b/indra/newview/llscrollingpanelparam.cpp @@ -69,6 +69,11 @@ LLScrollingPanelParam::LLScrollingPanelParam( const LLPanel::Params& panel_param mHintMin->setAllowsUpdates( FALSE ); mHintMax->setAllowsUpdates( FALSE ); + std::string min_name = LLTrans::getString(param->getMinDisplayName()); + std::string max_name = LLTrans::getString(param->getMaxDisplayName()); + getChild<LLUICtrl>("min param text")->setValue(min_name); + getChild<LLUICtrl>("max param text")->setValue(max_name); + LLButton* less = getChild<LLButton>("less"); if (less) { -- cgit v1.2.3 From 92802e69509824f1d3dca212726373fd9d799104 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Tue, 29 Mar 2011 21:56:18 -0400 Subject: Fixed some labels, and made some labels/wearables hidden in edit. Added accordions for physics. --- indra/newview/character/avatar_lad.xml | 156 +++++++-------------- indra/newview/llpaneleditwearable.cpp | 10 +- .../skins/default/xui/en/panel_edit_physics.xml | 37 ++++- indra/newview/skins/default/xui/en/strings.xml | 5 +- 4 files changed, 95 insertions(+), 113 deletions(-) diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index 160b8f3408..7ab93d3fce 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -3798,7 +3798,7 @@ id="1092" group="1" name="Belly_Torso_Physics_UpDown_Driven" - wearable="shape" + wearable="physics" edit_group="driven" value_default="0" value_min="-1" @@ -4394,7 +4394,7 @@ id="1093" group="1" name="Belly_Legs_Physics_UpDown_Driven" - wearable="shape" + wearable="physics" edit_group="driven" value_min="-1" value_max="1"> @@ -4444,7 +4444,7 @@ id="1089" group="0" name="Butt_Physics_UpDown_Driven" - wearable="shape" + wearable="physics" edit_group="driven" label_min="Separate" label_max="Join" @@ -4460,7 +4460,7 @@ id="1090" group="0" name="Butt_Physics_LeftRight_Driven" - wearable="shape" + wearable="physics" edit_group="driven" label_min="Separate" label_max="Join" @@ -5189,7 +5189,7 @@ id="1094" group="1" name="Belly_Skirt_Physics_UpDown_Driven" - wearable="skirt" + wearable="physics" edit_group="driven" cross_wearable="true" value_min="-1" @@ -9138,14 +9138,12 @@ render_pass="bump"> name="Breast_Physics_Mass" label="Breast Physics Mass" wearable="physics" - edit_group="physics" + edit_group="physics_breasts" label_min="Less" label_max="More" value_default=".1" value_min=".1" - value_max="1" - camera_elevation=".3" - camera_distance=".8"> + value_max="1"> <param_driver /> </param> @@ -9156,14 +9154,12 @@ render_pass="bump"> name="Breast_Physics_Smoothing" label="Breast Physics Smoothing" wearable="physics" - edit_group="physics" + edit_group="physics_breasts" label_min="Less" label_max="More" value_default="2" value_min="1" - value_max="10" - camera_elevation=".3" - camera_distance=".8"> + value_max="10"> <param_driver /> </param> @@ -9174,14 +9170,12 @@ render_pass="bump"> name="Breast_Physics_Gravity" label="Breast Physics Gravity" wearable="physics" - edit_group="physics" + edit_group="physics_breasts" label_min="Less" label_max="More" value_default="0" value_min="0" - value_max="1" - camera_elevation=".3" - camera_distance=".8"> + value_max="1"> <param_driver /> </param> @@ -9192,14 +9186,12 @@ render_pass="bump"> name="Breast_Physics_Side_Spring" label="Breast Physics Side Spring" wearable="physics" - edit_group="physics" + edit_group="physics_breasts" label_min="Less" label_max="More" value_default=".1" value_min="0" - value_max="1" - camera_elevation=".3" - camera_distance=".8"> + value_max="1"> <param_driver /> </param> @@ -9210,14 +9202,12 @@ render_pass="bump"> name="Breast_Physics_Side_Gain" label="Breast Physics Side Gain" wearable="physics" - edit_group="physics" + edit_group="physics_breasts" label_min="Less" label_max="More" value_default="10" value_min="1" - value_max="100" - camera_elevation=".3" - camera_distance=".8"> + value_max="100"> <param_driver /> </param> @@ -9233,9 +9223,7 @@ render_pass="bump"> label_max="More" value_default=".05" value_min="0" - value_max=".1" - camera_elevation=".3" - camera_distance=".8"> + value_max=".1"> <param_driver /> </param> @@ -9246,14 +9234,12 @@ render_pass="bump"> name="Breast_Physics_Side_Drag" label="Breast Physics Side Drag" wearable="physics" - edit_group="physics" + edit_group="physics_breasts" label_min="Less" label_max="More" value_default=".15" value_min="0" - value_max=".5" - camera_elevation=".3" - camera_distance=".8"> + value_max=".5"> <param_driver /> </param> @@ -9264,14 +9250,12 @@ render_pass="bump"> name="Breast_Physics_Side_Max_Velocity" label="Breast Physics Side Max Speed" wearable="physics" - edit_group="physics" + edit_group="physics_breasts" label_min="Less" label_max="More" value_default="0" value_min="0" - value_max="10" - camera_elevation=".3" - camera_distance=".8"> + value_max="10"> <param_driver /> </param> @@ -9283,14 +9267,12 @@ render_pass="bump"> name="Breast_Physics_UpDown_Spring" label="Breast Physics UpDown Spring" wearable="physics" - edit_group="physics" + edit_group="physics_breasts" label_min="Less" label_max="More" value_default=".1" value_min="0" - value_max="1" - camera_elevation=".3" - camera_distance=".8"> + value_max="1"> <param_driver /> </param> @@ -9301,14 +9283,12 @@ render_pass="bump"> name="Breast_Physics_UpDown_Gain" label="Breast Physics UpDown Gain" wearable="physics" - edit_group="physics" + edit_group="physics_breasts" label_min="Less" label_max="More" value_default="10" value_min="1" - value_max="100" - camera_elevation=".3" - camera_distance=".8"> + value_max="100"> <param_driver /> </param> @@ -9319,7 +9299,7 @@ render_pass="bump"> name="Breast_Physics_UpDown_Damping" label="Breast Physics UpDown Damping" wearable="physics" - edit_group="physics" + edit_group="physics_breasts" label_min="Less" label_max="More" value_default=".05" @@ -9337,14 +9317,12 @@ render_pass="bump"> name="Breast_Physics_UpDown_Drag" label="Breast Physics UpDown Drag" wearable="physics" - edit_group="physics" + edit_group="physics_breasts" label_min="Less" label_max="More" value_default=".15" value_min="0" - value_max=".5" - camera_elevation=".3" - camera_distance=".8"> + value_max=".5"> <param_driver /> </param> @@ -9355,32 +9333,27 @@ render_pass="bump"> name="Breast_Physics_UpDown_Max_Velocity" label="Breast Physics UpDown Max Speed" wearable="physics" - edit_group="physics" + edit_group="physics_breasts" label_min="Less" label_max="More" value_default="0" value_min="0" - value_max="10" - camera_elevation=".3" - camera_distance=".8"> + value_max="10"> <param_driver /> </param> <param id="1104" - group="0" + group="1" wearable="shape" - edit_group="shape_legs" - edit_group_order="14" + edit_group="physics_butt" name="Butt_Physics_UpDown_Controller" label="Butt Physics UpDown Controller" label_min="Down" label_max="Up" value_min="-1" value_max="1" - value_default="0" - camera_elevation=".3" - camera_distance=".8"> + value_default="0"> <param_driver> <driven id="1089" /> @@ -9389,19 +9362,16 @@ render_pass="bump"> <param id="1105" - group="0" + group="1" wearable="shape" - edit_group="shape_legs" - edit_group_order="15" + edit_group="physics_butt" name="Butt_Physics_LeftRight_Controller" label="Butt Physics LeftRight Controller" label_min="Down" label_max="Up" value_min="-1" value_max="1" - value_default="0" - camera_elevation=".3" - camera_distance=".8"> + value_default="0"> <param_driver> <driven id="1090" /> @@ -9443,9 +9413,7 @@ render_pass="bump"> label_max="More" value_default="0" value_min="-.3" - value_max="1.3" - camera_elevation=".3" - camera_distance=".8"> + value_max="1.3"> <param_driver> <driven id="1088" /> @@ -10177,9 +10145,9 @@ render_pass="bump"> <param id="1091" - group="0" - wearable="shape" - edit_group="shape_torso" + group="1" + wearable="physics" + edit_group="physics_belly" edit_group_order="14" name="Belly_Physics_UpDown_Controller" label="Belly Physics UpDown Controller" @@ -10207,14 +10175,12 @@ render_pass="bump"> name="Belly_Physics_UpDown_Spring" label="Belly Physics UpDown Spring" wearable="physics" - edit_group="physics" + edit_group="physics_belly" label_min="Less" label_max="More" value_default=".1" value_min="0" - value_max="1" - camera_elevation=".3" - camera_distance=".8"> + value_max="1"> <param_driver /> </param> @@ -10224,14 +10190,12 @@ render_pass="bump"> name="Belly_Physics_UpDown_Gain" label="Belly Physics UpDown Gain" wearable="physics" - edit_group="physics" + edit_group="physics_belly" label_min="Less" label_max="More" value_default="10" value_min="1" - value_max="100" - camera_elevation=".3" - camera_distance=".8"> + value_max="100"> <param_driver /> </param> @@ -10246,9 +10210,7 @@ render_pass="bump"> label_max="More" value_default=".05" value_min="0" - value_max=".1" - camera_elevation=".3" - camera_distance=".8"> + value_max=".1"> <param_driver /> </param> @@ -10258,14 +10220,12 @@ render_pass="bump"> name="Belly_Physics_UpDown_Max_Velocity" label="Belly Physics UpDown Max Speed" wearable="physics" - edit_group="physics" + edit_group="physics_belly" label_min="Less" label_max="More" value_default="0" value_min="0" - value_max="10" - camera_elevation=".3" - camera_distance=".8"> + value_max="10"> <param_driver /> </param> @@ -10275,14 +10235,12 @@ render_pass="bump"> name="Butt_Physics_UpDown_Spring" label="Butt Physics UpDown Spring" wearable="physics" - edit_group="physics" + edit_group="physics_butt" label_min="Less" label_max="More" value_default=".1" value_min="0" - value_max="1" - camera_elevation=".3" - camera_distance=".8"> + value_max="1"> <param_driver /> </param> @@ -10292,14 +10250,12 @@ render_pass="bump"> name="Butt_Physics_UpDown_Gain" label="Butt Physics UpDown Gain" wearable="physics" - edit_group="physics" + edit_group="physics_butt" label_min="Less" label_max="More" value_default="10" value_min="1" - value_max="100" - camera_elevation=".3" - camera_distance=".8"> + value_max="100"> <param_driver /> </param> @@ -10308,15 +10264,13 @@ render_pass="bump"> group="0" name="Butt_Physics_UpDown_Damping" label="Butt Physics UpDown Damping" - wearable="physics" + wearable="physics_butt" edit_group="physics" label_min="Less" label_max="More" value_default=".05" value_min="0" - value_max=".1" - camera_elevation=".3" - camera_distance=".8"> + value_max=".1"> <param_driver /> </param> @@ -10326,14 +10280,12 @@ render_pass="bump"> name="Butt_Physics_UpDown_Max_Velocity" label="Butt Physics UpDown Max Speed" wearable="physics" - edit_group="physics" + edit_group="physics_butt" label_min="Less" label_max="More" value_default="0" value_min="0" - value_max="10" - camera_elevation=".3" - camera_distance=".8"> + value_max="10"> <param_driver /> </param> diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp index a7d20acbbc..d04604a644 100644 --- a/indra/newview/llpaneleditwearable.cpp +++ b/indra/newview/llpaneleditwearable.cpp @@ -95,7 +95,9 @@ enum ESubpart { SUBPART_SKIRT, SUBPART_ALPHA, SUBPART_TATTOO, - SUBPART_PHYSICS + SUBPART_PHYSICS_BREASTS, + SUBPART_PHYSICS_BELLY, + SUBPART_PHYSICS_BUTT }; using namespace LLVOAvatarDefines; @@ -234,7 +236,7 @@ LLEditWearableDictionary::Wearables::Wearables() addEntry(LLWearableType::WT_SKIRT, new WearableEntry(LLWearableType::WT_SKIRT,"edit_skirt_title","skirt_desc_text",1,1,1, TEX_SKIRT, TEX_SKIRT, SUBPART_SKIRT)); addEntry(LLWearableType::WT_ALPHA, new WearableEntry(LLWearableType::WT_ALPHA,"edit_alpha_title","alpha_desc_text",0,5,1, TEX_LOWER_ALPHA, TEX_UPPER_ALPHA, TEX_HEAD_ALPHA, TEX_EYES_ALPHA, TEX_HAIR_ALPHA, SUBPART_ALPHA)); addEntry(LLWearableType::WT_TATTOO, new WearableEntry(LLWearableType::WT_TATTOO,"edit_tattoo_title","tattoo_desc_text",1,3,1, TEX_HEAD_TATTOO, TEX_LOWER_TATTOO, TEX_UPPER_TATTOO, TEX_HEAD_TATTOO, SUBPART_TATTOO)); - addEntry(LLWearableType::WT_PHYSICS, new WearableEntry(LLWearableType::WT_PHYSICS,"edit_physics_title","physics_desc_text",0,0,1, SUBPART_PHYSICS)); + addEntry(LLWearableType::WT_PHYSICS, new WearableEntry(LLWearableType::WT_PHYSICS,"edit_physics_title","physics_desc_text",0,0,3, SUBPART_PHYSICS_BREASTS, SUBPART_PHYSICS_BELLY, SUBPART_PHYSICS_BUTT)); } LLEditWearableDictionary::WearableEntry::WearableEntry(LLWearableType::EType type, @@ -305,7 +307,9 @@ LLEditWearableDictionary::Subparts::Subparts() addEntry(SUBPART_UNDERPANTS, new SubpartEntry(SUBPART_UNDERPANTS, "mPelvis", "underpants", "underpants_main_param_list", "underpants_main_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH)); addEntry(SUBPART_ALPHA, new SubpartEntry(SUBPART_ALPHA, "mPelvis", "alpha", "alpha_main_param_list", "alpha_main_tab", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f),SEX_BOTH)); addEntry(SUBPART_TATTOO, new SubpartEntry(SUBPART_TATTOO, "mPelvis", "tattoo", "tattoo_main_param_list", "tattoo_main_tab", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f),SEX_BOTH)); - addEntry(SUBPART_PHYSICS, new SubpartEntry(SUBPART_PHYSICS, "mTorso", "physics", "physics_main_param_list", "physics_main_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(-1.f, 0.15f, 0.3f),SEX_FEMALE)); + addEntry(SUBPART_PHYSICS_BREASTS, new SubpartEntry(SUBPART_PHYSICS_BREASTS, "mTorso", "physics_breasts", "physics_breasts_param_list", "physics_breasts_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_FEMALE)); + addEntry(SUBPART_PHYSICS_BELLY, new SubpartEntry(SUBPART_PHYSICS_BELLY, "mTorso", "physics_belly", "physics_belly_param_list", "physics_belly_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH)); + addEntry(SUBPART_PHYSICS_BUTT, new SubpartEntry(SUBPART_PHYSICS_BUTT, "mTorso", "physics_butt", "physics_butt_param_list", "physics_butt_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH)); } LLEditWearableDictionary::SubpartEntry::SubpartEntry(ESubpart part, diff --git a/indra/newview/skins/default/xui/en/panel_edit_physics.xml b/indra/newview/skins/default/xui/en/panel_edit_physics.xml index 4e781e2360..0eb9c703ca 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_physics.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_physics.xml @@ -34,14 +34,43 @@ <accordion_tab layout="topleft" fit_panel="false" - min_height="150" - name="physics_main_tab" - title="Physics"> + min_height="50" + name="physics_breasts_tab" + title="Breasts"> <scrolling_panel_list follows="all" layout="topleft" left="0" - name="physics_main_param_list" + name="physics_breasts_param_list" + top="0" + width="303" /> + </accordion_tab> + <accordion_tab + layout="topleft" + fit_panel="false" + min_height="50" + name="physics_belly_tab" + title="Belly"> + <scrolling_panel_list + follows="all" + layout="topleft" + left="0" + name="physics_belly_param_list" + top="0" + width="303" /> + </accordion_tab> + + <accordion_tab + layout="topleft" + fit_panel="false" + min_height="50" + name="physics_butt_tab" + title="Butt"> + <scrolling_panel_list + follows="all" + layout="topleft" + left="0" + name="physics_butt_param_list" top="0" width="303" /> </accordion_tab> diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index e183b0ba78..9570e28d26 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2500,7 +2500,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="Body Thin">Body Thin</string> <string name="Bow Legged">Bow Legged</string> -<string name="Breast Physics Updown Controller">Breast Buoyancy</string> +<string name="Breast Physics UpDown Controller">Breast Buoyancy</string> <string name="Breast Physics Side Controller">Breast Cleavage</string> <string name="Breast Size">Breast Size</string> <string name="Bridge Width">Bridge Width</string> @@ -2527,14 +2527,11 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="Breast Physics UpDown Drag">Breast UpDown Drag</string> <string name="Breast Physics UpDown Max Speed">Breast UpDown Max Speed</string> -<string name="Belly Physics UpDown Controller">Belly Updown Bounce</string> <string name="Belly Physics UpDown Spring">Belly Updown Spring</string> <string name="Belly Physics UpDown Gain">Belly Updown Gain</string> <string name="Belly Physics UpDown Damping">Belly Updown Damping</string> <string name="Belly Physics UpDown Max Speed">Belly Updown Max Speed</string> -<string name="Butt Physics UpDown Controller">Butt UpDown Bounce</string> -<string name="Butt Physics LeftRight Controller">Butt LeftRight Bounce</string> <string name="Butt Physics UpDown Spring">Butt UpDown Spring</string> <string name="Butt Physics UpDown Gain">Butt UpDown Gain</string> <string name="Butt Physics UpDown Damping">Butt UpDown Damping</string> -- cgit v1.2.3 From 85c97c19347c1409f8f7231940b0b8f3a57fc0a5 Mon Sep 17 00:00:00 2001 From: Jonathan Yap <none@none> Date: Wed, 30 Mar 2011 09:23:48 -0400 Subject: STORM-1094 Added 2 lines so new IM windows pick up the font setting --- indra/newview/llimfloater.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index a15d134f87..50a9c56518 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -267,7 +267,9 @@ BOOL LLIMFloater::postBuild() mInputEditor->setMaxTextLength(1023); // enable line history support for instant message bar mInputEditor->setEnableLineHistory(TRUE); - + + LLFontGL* font = LLViewerChat::getChatFont(); + mInputEditor->setFont(font); mInputEditor->setFocusReceivedCallback( boost::bind(onInputEditorFocusReceived, _1, this) ); mInputEditor->setFocusLostCallback( boost::bind(onInputEditorFocusLost, _1, this) ); -- cgit v1.2.3 From 44f418f88680d7920df06d169c0b7c38b1131c86 Mon Sep 17 00:00:00 2001 From: "Andrew A. de Laix" <alain@lindenlab.com> Date: Wed, 30 Mar 2011 10:26:16 -0700 Subject: update llqtwebkit archive on darwin. --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 65d9764cc6..15a822975e 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1062,9 +1062,9 @@ <key>archive</key> <map> <key>hash</key> - <string>0326cb770c7ff995cf822fb330ae9d0c</string> + <string>76c1015eafcba5ca9932c3009533b51c</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-4.7.1-darwin-20110308.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llqtwebkit/rev/225273/arch/Darwin/installer/llqtwebkit-4.7.1-darwin-20110329.tar.bz2</string> </map> <key>name</key> <string>darwin</string> -- cgit v1.2.3 From 5620e18f5a9486696fadc96204de5611714512bf Mon Sep 17 00:00:00 2001 From: "alain@945battery-guestA-183.lindenlab.com" <alain@945battery-guestA-183.lindenlab.com> Date: Wed, 30 Mar 2011 11:46:24 -0700 Subject: revert to old llqtwebkit on linux. --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 65d9764cc6..a259637a94 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1074,9 +1074,9 @@ <key>archive</key> <map> <key>hash</key> - <string>ed7d6cb66e6fcd6dbac41aabe6a0d0c8</string> + <string>c05a33ee8b6f253b5a744596dfc3707d</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llqtwebkit/rev/224858/arch/Linux/installer/llqtwebkit-4.7.1-linux-20110323.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-linux-qt4.6-20101013.tar.bz2</string> </map> <key>name</key> <string>linux</string> -- cgit v1.2.3 From 2f190297f0ff37452b3e966c0878e14a6aacc41b Mon Sep 17 00:00:00 2001 From: Andrew de Laix <alain@lindenlab.com> Date: Wed, 30 Mar 2011 20:12:37 +0000 Subject: remove lib requirement not in current llqtwebkit linux archive. --- indra/cmake/WebKitLibPlugin.cmake | 1 - 1 file changed, 1 deletion(-) diff --git a/indra/cmake/WebKitLibPlugin.cmake b/indra/cmake/WebKitLibPlugin.cmake index 6e8f6cec7f..b599982afb 100644 --- a/indra/cmake/WebKitLibPlugin.cmake +++ b/indra/cmake/WebKitLibPlugin.cmake @@ -67,7 +67,6 @@ elseif (LINUX) QtNetwork QtGui QtCore - jscore jpeg fontconfig X11 -- cgit v1.2.3 From 7b47c0a6f6f74bd42382f37102446742f91bd34a Mon Sep 17 00:00:00 2001 From: Merov Linden <merov@lindenlab.com> Date: Wed, 30 Mar 2011 13:22:41 -0700 Subject: STORM-987 : cmake fixes so that llimage_libtest builds correctly on Mac with autobuild --- indra/integration_tests/CMakeLists.txt | 7 +++++-- indra/integration_tests/llimage_libtest/CMakeLists.txt | 18 +++++++++--------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/indra/integration_tests/CMakeLists.txt b/indra/integration_tests/CMakeLists.txt index 248583d775..dcd2079631 100644 --- a/indra/integration_tests/CMakeLists.txt +++ b/indra/integration_tests/CMakeLists.txt @@ -1,6 +1,9 @@ # -*- cmake -*- add_subdirectory(llui_libtest) -if (LLIMAGE_LIBTEST) +IF (LLIMAGE_LIBTEST) + MESSAGE(STATUS "Build llimage_libtest") add_subdirectory(llimage_libtest) -endif (LLIMAGE_LIBTEST) +ELSE (LLIMAGE_LIBTEST) + MESSAGE(STATUS "Skip llimage_libtest") +ENDIF (LLIMAGE_LIBTEST) diff --git a/indra/integration_tests/llimage_libtest/CMakeLists.txt b/indra/integration_tests/llimage_libtest/CMakeLists.txt index cab0546083..fdd6770aca 100644 --- a/indra/integration_tests/llimage_libtest/CMakeLists.txt +++ b/indra/integration_tests/llimage_libtest/CMakeLists.txt @@ -102,20 +102,20 @@ add_custom_command(TARGET llimage_libtest POST_BUILD if (DARWIN) # Copy the required libraries to the package app add_custom_command(TARGET llimage_libtest POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libapr-1.0.3.7.dylib ${LLIMAGE_LIBTEST_DESTINATION_DIR} - DEPENDS ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libapr-1.0.3.7.dylib + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libapr-1.0.dylib ${LLIMAGE_LIBTEST_DESTINATION_DIR} + DEPENDS ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libapr-1.0.dylib ) - add_custom_command(TARGET llimage_libtest POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libaprutil-1.0.3.8.dylib ${LLIMAGE_LIBTEST_DESTINATION_DIR} - DEPENDS ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libaprutil-1.0.3.8.dylib + add_custom_command(TARGET llimage_libtest POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libaprutil-1.0.dylib ${LLIMAGE_LIBTEST_DESTINATION_DIR} + DEPENDS ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libaprutil-1.0.dylib ) add_custom_command(TARGET llimage_libtest POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libexception_handler.dylib ${LLIMAGE_LIBTEST_DESTINATION_DIR} - DEPENDS ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libexception_handler.dylib + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libexception_handler.dylib ${LLIMAGE_LIBTEST_DESTINATION_DIR} + DEPENDS ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libexception_handler.dylib ) add_custom_command(TARGET llimage_libtest POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libexpat.0.5.0.dylib ${LLIMAGE_LIBTEST_DESTINATION_DIR} - DEPENDS ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libexpat.0.5.0.dylib + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libexpat.1.5.2.dylib ${LLIMAGE_LIBTEST_DESTINATION_DIR} + DEPENDS ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libexpat.1.5.2.dylib ) endif (DARWIN) -- cgit v1.2.3 From dff83a1ba0592049ccdcd31177c183d62df65e85 Mon Sep 17 00:00:00 2001 From: Seth ProductEngine <slitovchuk@productengine.com> Date: Wed, 30 Mar 2011 23:42:13 +0300 Subject: STORM-1117 FIXED Disabled placing calling cards in prims inventory. --- indra/newview/lltooldraganddrop.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index 1c745906aa..ba243f258a 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -1386,6 +1386,10 @@ EAcceptance LLToolDragAndDrop::willObjectAcceptInventory(LLViewerObject* obj, LL worn = TRUE; } break; + case LLAssetType::AT_CALLINGCARD: + // Calling Cards in object are disabled for now + // because of incomplete LSL support. See STORM-1117. + return ACCEPT_NO; default: break; } -- cgit v1.2.3 From 48be3c6af841231f705d88598672588e68e2977e Mon Sep 17 00:00:00 2001 From: Merov Linden <merov@lindenlab.com> Date: Wed, 30 Mar 2011 14:47:35 -0700 Subject: STORM-1121 : Simplify dependencies for llimage_libtest --- indra/integration_tests/CMakeLists.txt | 2 ++ indra/integration_tests/llimage_libtest/CMakeLists.txt | 6 ------ 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/indra/integration_tests/CMakeLists.txt b/indra/integration_tests/CMakeLists.txt index dcd2079631..63a053479b 100644 --- a/indra/integration_tests/CMakeLists.txt +++ b/indra/integration_tests/CMakeLists.txt @@ -1,4 +1,6 @@ # -*- cmake -*- +# For STORM-1121 debug. Will delete when ready +SET (LLIMAGE_LIBTEST ON CACHE BOOL "Force build of llimage_libtest for testing") add_subdirectory(llui_libtest) IF (LLIMAGE_LIBTEST) diff --git a/indra/integration_tests/llimage_libtest/CMakeLists.txt b/indra/integration_tests/llimage_libtest/CMakeLists.txt index fdd6770aca..a687e60610 100644 --- a/indra/integration_tests/llimage_libtest/CMakeLists.txt +++ b/indra/integration_tests/llimage_libtest/CMakeLists.txt @@ -6,19 +6,15 @@ project (llimage_libtest) include(00-Common) include(LLCommon) -include(Linking) -include(LLSharedLibs) include(LLImage) include(LLImageJ2COJ) include(LLKDU) -include(LLMath) include(LLVFS) include_directories( ${LLCOMMON_INCLUDE_DIRS} ${LLVFS_INCLUDE_DIRS} ${LLIMAGE_INCLUDE_DIRS} - ${LLMATH_INCLUDE_DIRS} ) set(llimage_libtest_SOURCE_FILES @@ -127,5 +123,3 @@ endif (WINDOWS) # *NOTE: This could be removed, or only built by TeamCity, if the build # and link times become too long. add_dependencies(viewer llimage_libtest) - -ll_deploy_sharedlibs_command(llimage_libtest) -- cgit v1.2.3 From 23fe1a4787ae80dfe284a09e329237aab00bd5a4 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Wed, 30 Mar 2011 19:07:38 -0400 Subject: Changes to better logically group avatar_lad.xml physics params. --- indra/newview/character/avatar_lad.xml | 1154 +++++++++++++++----------------- indra/newview/llpolymesh.cpp | 6 +- 2 files changed, 549 insertions(+), 611 deletions(-) diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index 7ab93d3fce..51be7f52fa 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -3794,18 +3794,6 @@ </param_morph> </param> - <param - id="1092" - group="1" - name="Belly_Torso_Physics_UpDown_Driven" - wearable="physics" - edit_group="driven" - value_default="0" - value_min="-1" - value_max="1"> - <param_morph /> - </param> - <param id="626" sex="female" @@ -4052,33 +4040,6 @@ scale="0.0 0.0 0.01" pos="0 0 -0.01"/> </param_morph> - - </param> - - <param - id="1087" - group="0" - sex="female" - name="Breast_Gravity" - wearable="shape" - edit_group="driven" - value_default="0" - value_min="-1.5" - value_max="2"> - <param_morph /> - </param> - - <param - id="1088" - group="0" - sex="female" - name="Breast_Female_Cleavage" - wearable="shape" - edit_group="driven" - value_default="0" - value_min="-.3" - value_max="1.3"> - <param_morph /> </param> <param @@ -4327,9 +4288,53 @@ <param_morph /> </param> + <!-- + ############# + # physics morphs (not user controlled) + ############# + --> + <param + id="1150" + group="1" + sex="female" + name="Breast_Gravity" + wearable="shape" + edit_group="driven" + value_default="0" + value_min="-1.5" + value_max="2"> + <param_morph /> + </param> + + <param + id="1151" + group="1" + sex="female" + name="Breast_Female_Cleavage" + wearable="shape" + edit_group="driven" + value_default="0" + value_min="-.3" + value_max="1.3"> + <param_morph /> + </param> + + <param + id="1154" + group="1" + name="Belly_Physics_Torso_UpDown_Driven" + wearable="physics" + edit_group="driven" + value_default="0" + value_min="-1" + value_max="1"> + <param_morph /> + </param> + <!-- #end morph targets --> + </mesh> <mesh @@ -4390,17 +4395,6 @@ <param_morph /> </param> - <param - id="1093" - group="1" - name="Belly_Legs_Physics_UpDown_Driven" - wearable="physics" - edit_group="driven" - value_min="-1" - value_max="1"> - <param_morph /> - </param> - <param id="151" @@ -4440,38 +4434,6 @@ </param_morph> </param> - <param - id="1089" - group="0" - name="Butt_Physics_UpDown_Driven" - wearable="physics" - edit_group="driven" - label_min="Separate" - label_max="Join" - value_default="0" - value_min="-2" - value_max="2" - camera_elevation=".3" - camera_distance=".8"> - <param_morph /> - </param> - - <param - id="1090" - group="0" - name="Butt_Physics_LeftRight_Driven" - wearable="physics" - edit_group="driven" - label_min="Separate" - label_max="Join" - value_default="0" - value_min="-2" - value_max="2" - camera_elevation=".3" - camera_distance=".8"> - <param_morph /> - </param> - <param id="152" group="1" @@ -4872,9 +4834,50 @@ <param_morph /> </param> + <!-- + ############# + # physics morphs (not user controlled) + ############# + --> + <param + id="1152" + group="1" + name="Belly_Physics_Legs_UpDown_Driven" + wearable="physics" + edit_group="driven" + value_min="-1" + value_max="1"> + <param_morph /> + </param> + + + <param + id="1155" + group="1" + name="Butt_Physics_UpDown_Driven" + wearable="physics" + edit_group="driven" + value_default="0"> + <param_morph /> + </param> + + <param + id="1156" + group="1" + name="Butt_Physics_LeftRight_Driven" + wearable="physics" + edit_group="driven" + value_default="0" + value_min="-2" + value_max="2"> + <param_morph /> + </param> + + <!-- #end morph targets --> + </mesh> <mesh @@ -5185,18 +5188,6 @@ <param_morph /> </param> - <param - id="1094" - group="1" - name="Belly_Skirt_Physics_UpDown_Driven" - wearable="physics" - edit_group="driven" - cross_wearable="true" - value_min="-1" - value_max="1"> - <param_morph /> - </param> - <param id="850" group="1" @@ -9132,411 +9123,122 @@ render_pass="bump"> <driver_parameters> <param - id="1074" + id="828" group="0" - sex="female" - name="Breast_Physics_Mass" - label="Breast Physics Mass" - wearable="physics" - edit_group="physics_breasts" - label_min="Less" - label_max="More" - value_default=".1" - value_min=".1" - value_max="1"> - <param_driver /> - </param> + name="Loose Upper Clothing" + label="Shirt Fit" + show_simple="true" + wearable="shirt" + edit_group="shirt" + edit_group_order="4" + label_min="Tight Shirt" + label_max="Loose Shirt" + value_min="0" + value_max="1" + camera_distance="1.2" + camera_angle="30" + camera_elevation=".2"> + <param_driver> + <driven + id="628" /> - <param - id="1075" - group="0" - sex="female" - name="Breast_Physics_Smoothing" - label="Breast Physics Smoothing" - wearable="physics" - edit_group="physics_breasts" - label_min="Less" - label_max="More" - value_default="2" - value_min="1" - value_max="10"> - <param_driver /> + <driven + id="899" + min1="0.1" + max1="0.5" + max2="1" + min2="1" /> + </param_driver> </param> <param - id="1076" + id="816" group="0" - sex="female" - name="Breast_Physics_Gravity" - label="Breast Physics Gravity" - wearable="physics" - edit_group="physics_breasts" - label_min="Less" - label_max="More" - value_default="0" + name="Loose Lower Clothing" + label="Pants Fit" + show_simple="true" + wearable="pants" + edit_group="pants" + edit_group_order="2.5" + label_min="Tight Pants" + label_max="Loose Pants" value_min="0" - value_max="1"> - <param_driver /> - </param> + value_max="1" + camera_distance="1.8" + camera_angle="30" + camera_elevation="-.3"> + <param_driver> + <driven + id="516" /> - <param - id="1077" - group="0" - sex="female" - name="Breast_Physics_Side_Spring" - label="Breast Physics Side Spring" - wearable="physics" - edit_group="physics_breasts" - label_min="Less" - label_max="More" - value_default=".1" - value_min="0" - value_max="1"> - <param_driver /> + <driven + id="913" + min1="0.1" + max1="0.5" + max2="1" + min2="1" /> + </param_driver> </param> <param - id="1078" + id="814" group="0" - sex="female" - name="Breast_Physics_Side_Gain" - label="Breast Physics Side Gain" - wearable="physics" - edit_group="physics_breasts" - label_min="Less" - label_max="More" - value_default="10" - value_min="1" - value_max="100"> - <param_driver /> - </param> - - <param - id="1079" - group="0" - sex="female" - name="Breast_Physics_Side_Damping" - label="Breast Physics Side Damping" - wearable="physics" - edit_group="physics" - label_min="Less" - label_max="More" - value_default=".05" - value_min="0" - value_max=".1"> - <param_driver /> - </param> - - <param - id="1080" - group="0" - sex="female" - name="Breast_Physics_Side_Drag" - label="Breast Physics Side Drag" - wearable="physics" - edit_group="physics_breasts" - label_min="Less" - label_max="More" - value_default=".15" - value_min="0" - value_max=".5"> - <param_driver /> - </param> - - <param - id="1081" - group="0" - sex="female" - name="Breast_Physics_Side_Max_Velocity" - label="Breast Physics Side Max Speed" - wearable="physics" - edit_group="physics_breasts" - label_min="Less" - label_max="More" - value_default="0" - value_min="0" - value_max="10"> - <param_driver /> - </param> - - - <param - id="1082" - group="0" - sex="female" - name="Breast_Physics_UpDown_Spring" - label="Breast Physics UpDown Spring" - wearable="physics" - edit_group="physics_breasts" - label_min="Less" - label_max="More" - value_default=".1" - value_min="0" - value_max="1"> - <param_driver /> - </param> - - <param - id="1083" - group="0" - sex="female" - name="Breast_Physics_UpDown_Gain" - label="Breast Physics UpDown Gain" - wearable="physics" - edit_group="physics_breasts" - label_min="Less" - label_max="More" - value_default="10" - value_min="1" - value_max="100"> - <param_driver /> - </param> - - <param - id="1084" - group="0" - sex="female" - name="Breast_Physics_UpDown_Damping" - label="Breast Physics UpDown Damping" - wearable="physics" - edit_group="physics_breasts" - label_min="Less" - label_max="More" - value_default=".05" - value_min="0" - value_max=".1" - camera_elevation=".3" - camera_distance=".8"> - <param_driver /> - </param> - - <param - id="1085" - group="0" - sex="female" - name="Breast_Physics_UpDown_Drag" - label="Breast Physics UpDown Drag" - wearable="physics" - edit_group="physics_breasts" - label_min="Less" - label_max="More" - value_default=".15" - value_min="0" - value_max=".5"> - <param_driver /> - </param> - - <param - id="1086" - group="0" - sex="female" - name="Breast_Physics_UpDown_Max_Velocity" - label="Breast Physics UpDown Max Speed" - wearable="physics" - edit_group="physics_breasts" - label_min="Less" - label_max="More" - value_default="0" + wearable="pants" + edit_group="pants" + edit_group_order="2" + name="Waist Height" + label_min="Low" + label_max="High" value_min="0" - value_max="10"> - <param_driver /> - </param> - - <param - id="1104" - group="1" - wearable="shape" - edit_group="physics_butt" - name="Butt_Physics_UpDown_Controller" - label="Butt Physics UpDown Controller" - label_min="Down" - label_max="Up" - value_min="-1" - value_max="1" - value_default="0"> - <param_driver> - <driven - id="1089" /> - </param_driver> - </param> - - <param - id="1105" - group="1" - wearable="shape" - edit_group="physics_butt" - name="Butt_Physics_LeftRight_Controller" - label="Butt Physics LeftRight Controller" - label_min="Down" - label_max="Up" - value_min="-1" value_max="1" - value_default="0"> - <param_driver> - <driven - id="1090" /> - </param_driver> - </param> - - <param - id="507" - group="0" - sex="female" - name="Breast_Physics_UpDown_Controller" - label="Breast Physics UpDown Controller" - wearable="shape" - edit_group="shape_torso" - edit_group_order="7" - label_min="Less" - label_max="More" - value_default="0" - value_min="-1.5" - value_max="2" - camera_elevation=".3" - camera_distance=".8"> + value_default="1" + camera_distance="1.2" + camera_angle="30" + camera_elevation="-.3"> <param_driver> <driven - id="1087" /> - </param_driver> - </param> + id="614" /> - <param - id="684" - group="0" - sex="female" - name="Breast_Physics_Side_Controller" - label="Breast Physics Side Controller" - wearable="shape" - edit_group="shape_torso" - edit_group_order="8" - label_min="Less" - label_max="More" - value_default="0" - value_min="-.3" - value_max="1.3"> - <param_driver> <driven - id="1088" /> - </param_driver> - </param> + id="1017" /> - <param - id="828" - group="0" - name="Loose Upper Clothing" - label="Shirt Fit" - show_simple="true" - wearable="shirt" - edit_group="shirt" - edit_group_order="4" - label_min="Tight Shirt" - label_max="Loose Shirt" - value_min="0" - value_max="1" - camera_distance="1.2" - camera_angle="30" - camera_elevation=".2"> - <param_driver> <driven - id="628" /> + id="1035" /> <driven - id="899" - min1="0.1" - max1="0.5" + id="914" + min1="0" + max1=".98" max2="1" min2="1" /> </param_driver> </param> <param - id="816" + id="815" group="0" - name="Loose Lower Clothing" - label="Pants Fit" - show_simple="true" wearable="pants" edit_group="pants" - edit_group_order="2.5" - label_min="Tight Pants" - label_max="Loose Pants" + edit_group_order="1" + name="Pants Length" + show_simple="true" + label_min="Short" + label_max="Long" value_min="0" value_max="1" + value_default=".8" + simple_percent_min="20" + simple_percent_max="100" camera_distance="1.8" camera_angle="30" camera_elevation="-.3"> <param_driver> <driven - id="516" /> - - <driven - id="913" - min1="0.1" - max1="0.5" - max2="1" - min2="1" /> - </param_driver> - </param> - - <param - id="814" - group="0" - wearable="pants" - edit_group="pants" - edit_group_order="2" - name="Waist Height" - label_min="Low" - label_max="High" - value_min="0" - value_max="1" - value_default="1" - camera_distance="1.2" - camera_angle="30" - camera_elevation="-.3"> - <param_driver> - <driven - id="614" /> - - <driven - id="1017" /> - - <driven - id="1035" /> - - <driven - id="914" - min1="0" - max1=".98" - max2="1" - min2="1" /> - </param_driver> - </param> - - <param - id="815" - group="0" - wearable="pants" - edit_group="pants" - edit_group_order="1" - name="Pants Length" - show_simple="true" - label_min="Short" - label_max="Long" - value_min="0" - value_max="1" - value_default=".8" - simple_percent_min="20" - simple_percent_max="100" - camera_distance="1.8" - camera_angle="30" - camera_elevation="-.3"> - <param_driver> - <driven - id="615" - min1="0" - max1=".9" - max2="1" - min2="1" /> + id="615" + min1="0" + max1=".9" + max2="1" + min2="1" /> <driven id="1018" @@ -10143,153 +9845,6 @@ render_pass="bump"> </param_driver> </param> - <param - id="1091" - group="1" - wearable="physics" - edit_group="physics_belly" - edit_group_order="14" - name="Belly_Physics_UpDown_Controller" - label="Belly Physics UpDown Controller" - label_min="Down" - label_max="Up" - value_min="-1" - value_max="1" - value_default="0" - camera_distance="1.4" - camera_angle="30" - camera_elevation=".2"> - <param_driver> - <driven - id="1092" /> - <driven - id="1093" /> - <driven - id="1094" /> - </param_driver> - </param> - - <param - id="1095" - group="0" - name="Belly_Physics_UpDown_Spring" - label="Belly Physics UpDown Spring" - wearable="physics" - edit_group="physics_belly" - label_min="Less" - label_max="More" - value_default=".1" - value_min="0" - value_max="1"> - <param_driver /> - </param> - - <param - id="1096" - group="0" - name="Belly_Physics_UpDown_Gain" - label="Belly Physics UpDown Gain" - wearable="physics" - edit_group="physics_belly" - label_min="Less" - label_max="More" - value_default="10" - value_min="1" - value_max="100"> - <param_driver /> - </param> - - <param - id="1097" - group="0" - name="Belly_Physics_UpDown_Damping" - label="Belly Physics UpDown Damping" - wearable="physics" - edit_group="physics" - label_min="Less" - label_max="More" - value_default=".05" - value_min="0" - value_max=".1"> - <param_driver /> - </param> - - <param - id="1098" - group="0" - name="Belly_Physics_UpDown_Max_Velocity" - label="Belly Physics UpDown Max Speed" - wearable="physics" - edit_group="physics_belly" - label_min="Less" - label_max="More" - value_default="0" - value_min="0" - value_max="10"> - <param_driver /> - </param> - - <param - id="1100" - group="0" - name="Butt_Physics_UpDown_Spring" - label="Butt Physics UpDown Spring" - wearable="physics" - edit_group="physics_butt" - label_min="Less" - label_max="More" - value_default=".1" - value_min="0" - value_max="1"> - <param_driver /> - </param> - - <param - id="1101" - group="0" - name="Butt_Physics_UpDown_Gain" - label="Butt Physics UpDown Gain" - wearable="physics" - edit_group="physics_butt" - label_min="Less" - label_max="More" - value_default="10" - value_min="1" - value_max="100"> - <param_driver /> - </param> - - <param - id="1102" - group="0" - name="Butt_Physics_UpDown_Damping" - label="Butt Physics UpDown Damping" - wearable="physics_butt" - edit_group="physics" - label_min="Less" - label_max="More" - value_default=".05" - value_min="0" - value_max=".1"> - <param_driver /> - </param> - - <param - id="1103" - group="0" - name="Butt_Physics_UpDown_Max_Velocity" - label="Butt Physics UpDown Max Speed" - wearable="physics" - edit_group="physics_butt" - label_min="Less" - label_max="More" - value_default="0" - value_min="0" - value_max="10"> - <param_driver /> - </param> - - <param id="637" group="0" @@ -12124,6 +11679,389 @@ render_pass="bump"> </param_driver> </param> + <!-- ==PHYSICS PARAMETERS======================================= --> + + <param + id="507" + group="0" + sex="female" + name="Breast_Physics_UpDown_Controller" + label="Breast Physics UpDown Controller" + wearable="shape" + edit_group="shape_torso" + edit_group_order="7" + value_default="0" + value_min="-1.5" + value_max="2" + camera_elevation=".3" + camera_distance=".8"> + <param_driver> + <driven + id="1150" /> + </param_driver> + </param> + + <param + id="684" + group="0" + sex="female" + name="Breast_Physics_Side_Controller" + label="Breast Physics Side Controller" + wearable="shape" + edit_group="shape_torso" + edit_group_order="8" + value_default="0" + value_min="-.3" + value_max="1.3"> + <param_driver> + <driven + id="1151" /> + </param_driver> + </param> + + <param + id="1120" + group="1" + wearable="physics" + edit_group="physics_belly" + edit_group_order="14" + name="Belly_Physics_UpDown_Controller" + label="Belly Physics UpDown Controller" + label_min="Down" + label_max="Up" + value_min="-1" + value_max="1" + value_default="0" + camera_distance="1.4" + camera_angle="30" + camera_elevation=".2"> + <param_driver> + <driven + id="1152" /> + <driven + id="1153" /> + <driven + id="1154" /> + </param_driver> + </param> + + <param + id="1100" + group="1" + wearable="shape" + edit_group="physics_butt" + name="Butt_Physics_UpDown_Controller" + label="Butt Physics UpDown Controller" + value_min="-1" + value_max="1" + value_default="0"> + <param_driver> + <driven + id="1155" /> + </param_driver> + </param> + + <param + id="1101" + group="1" + wearable="shape" + edit_group="physics_butt" + name="Butt_Physics_LeftRight_Controller" + label="Butt Physics LeftRight Controller" + value_min="-1" + value_max="1" + value_default="0"> + <param_driver> + <driven + id="1156" /> + </param_driver> + </param> + + <param + id="1110" + group="0" + sex="female" + name="Breast_Physics_Mass" + label="Breast Physics Mass" + wearable="physics" + edit_group="physics_breasts" + value_default=".1" + value_min=".1" + value_max="1"> + <param_driver /> + </param> + <param + id="1111" + group="0" + sex="female" + name="Breast_Physics_Smoothing" + label="Breast Physics Smoothing" + wearable="physics" + edit_group="physics_breasts" + value_default="2" + value_min="1" + value_max="10"> + <param_driver /> + </param> + <param + id="1112" + group="0" + sex="female" + name="Breast_Physics_Gravity" + label="Breast Physics Gravity" + wearable="physics" + edit_group="physics_breasts" + value_default="0" + value_min="0" + value_max=".1"> + <param_driver /> + </param> + <param + id="1113" + group="0" + sex="female" + name="Breast_Physics_Side_Spring" + label="Breast Physics Side Spring" + wearable="physics" + edit_group="physics_breasts" + value_default=".1" + value_min="0" + value_max="1"> + <param_driver /> + </param> + <param + id="1114" + group="0" + sex="female" + name="Breast_Physics_Side_Gain" + label="Breast Physics Side Gain" + wearable="physics" + edit_group="physics_breasts" + value_default="10" + value_min="1" + value_max="100"> + <param_driver /> + </param> + <param + id="1115" + group="0" + sex="female" + name="Breast_Physics_Side_Damping" + label="Breast Physics Side Damping" + wearable="physics" + edit_group="physics" + value_default=".05" + value_min="0" + value_max=".1"> + <param_driver /> + </param> + <param + id="1116" + group="0" + sex="female" + name="Breast_Physics_Side_Drag" + label="Breast Physics Side Drag" + wearable="physics" + edit_group="physics_breasts" + value_default=".15" + value_min="0" + value_max=".5"> + <param_driver /> + </param> + <param + id="1117" + group="0" + sex="female" + name="Breast_Physics_Side_Max_Velocity" + label="Breast Physics Side Max Speed" + wearable="physics" + edit_group="physics_breasts" + value_default="0" + value_min="0" + value_max="10"> + <param_driver /> + </param> + <param + id="1118" + group="0" + sex="female" + name="Breast_Physics_UpDown_Spring" + label="Breast Physics UpDown Spring" + wearable="physics" + edit_group="physics_breasts" + value_default=".1" + value_min="0" + value_max="1"> + <param_driver /> + </param> + <param + id="1119" + group="0" + sex="female" + name="Breast_Physics_UpDown_Gain" + label="Breast Physics UpDown Gain" + wearable="physics" + edit_group="physics_breasts" + value_default="10" + value_min="1" + value_max="100"> + <param_driver /> + </param> + <param + id="1120" + group="0" + sex="female" + name="Breast_Physics_UpDown_Damping" + label="Breast Physics UpDown Damping" + wearable="physics" + edit_group="physics_breasts" + value_default=".05" + value_min="0" + value_max=".1" + camera_elevation=".3" + camera_distance=".8"> + <param_driver /> + </param> + <param + id="1121" + group="0" + sex="female" + name="Breast_Physics_UpDown_Drag" + label="Breast Physics UpDown Drag" + wearable="physics" + edit_group="physics_breasts" + value_default=".15" + value_min="0" + value_max=".5"> + <param_driver /> + </param> + <param + id="1122" + group="0" + sex="female" + name="Breast_Physics_UpDown_Max_Velocity" + label="Breast Physics UpDown Max Speed" + wearable="physics" + edit_group="physics_breasts" + value_default="0" + value_min="0" + value_max="10"> + <param_driver /> + </param> + + <param + id="1130" + group="0" + name="Belly_Physics_UpDown_Spring" + label="Belly Physics UpDown Spring" + wearable="physics" + edit_group="physics_belly" + label_min="Less" + label_max="More" + value_default=".1" + value_min="0" + value_max="1"> + <param_driver /> + </param> + <param + id="1131" + group="0" + name="Belly_Physics_UpDown_Gain" + label="Belly Physics UpDown Gain" + wearable="physics" + edit_group="physics_belly" + label_min="Less" + label_max="More" + value_default="10" + value_min="1" + value_max="100"> + <param_driver /> + </param> + <param + id="1132" + group="0" + name="Belly_Physics_UpDown_Damping" + label="Belly Physics UpDown Damping" + wearable="physics" + edit_group="physics" + label_min="Less" + label_max="More" + value_default=".05" + value_min="0" + value_max=".1"> + <param_driver /> + </param> + <param + id="1133" + group="0" + name="Belly_Physics_UpDown_Max_Velocity" + label="Belly Physics UpDown Max Speed" + wearable="physics" + edit_group="physics_belly" + label_min="Less" + label_max="More" + value_default="0" + value_min="0" + value_max="10"> + <param_driver /> + </param> + + <param + id="1140" + group="0" + name="Butt_Physics_UpDown_Spring" + label="Butt Physics UpDown Spring" + wearable="physics" + edit_group="physics_butt" + label_min="Less" + label_max="More" + value_default=".1" + value_min="0" + value_max="1"> + <param_driver /> + </param> + <param + id="1141" + group="0" + name="Butt_Physics_UpDown_Gain" + label="Butt Physics UpDown Gain" + wearable="physics" + edit_group="physics_butt" + label_min="Less" + label_max="More" + value_default="10" + value_min="1" + value_max="100"> + <param_driver /> + </param> + <param + id="1142" + group="0" + name="Butt_Physics_UpDown_Damping" + label="Butt Physics UpDown Damping" + wearable="physics_butt" + edit_group="physics" + label_min="Less" + label_max="More" + value_default=".05" + value_min="0" + value_max=".1"> + <param_driver /> + </param> + <param + id="1143" + group="0" + name="Butt_Physics_UpDown_Max_Velocity" + label="Butt Physics UpDown Max Speed" + wearable="physics" + edit_group="physics_butt" + label_min="Less" + label_max="More" + value_default="0" + value_min="0" + value_max="10"> + <param_driver /> + </param> </driver_parameters> diff --git a/indra/newview/llpolymesh.cpp b/indra/newview/llpolymesh.cpp index a28357b4a9..32d57cddc3 100644 --- a/indra/newview/llpolymesh.cpp +++ b/indra/newview/llpolymesh.cpp @@ -611,21 +611,21 @@ BOOL LLPolyMeshSharedData::loadMesh( const std::string& fileName ) { mMorphData.insert(clone_morph_param(morph_data, LLVector3(0,0,0.05f), - "Belly_Torso_Physics_UpDown_Driven")); + "Belly_Physics_Torso_UpDown_Driven")); } if (!strcmp(morphName, "Big_Belly_Legs")) { mMorphData.insert(clone_morph_param(morph_data, LLVector3(0,0,0.05f), - "Belly_Legs_Physics_UpDown_Driven")); + "Belly_Physics_Legs_UpDown_Driven")); } if (!strcmp(morphName, "skirt_belly")) { mMorphData.insert(clone_morph_param(morph_data, LLVector3(0,0,0.05f), - "Belly_Skirt_Physics_UpDown_Driven")); + "Belly_Physics_Skirt_UpDown_Driven")); } if (!strcmp(morphName, "Small_Butt")) -- cgit v1.2.3 From dfb243cd953423e69afb0e9ea48efc9047226763 Mon Sep 17 00:00:00 2001 From: "Linden Staff@LINDEN-E5E9EA17.lindenlab.com" <Linden Staff@LINDEN-E5E9EA17.lindenlab.com> Date: Wed, 30 Mar 2011 16:20:59 -0700 Subject: SOCIAL-853 FIX As a new user, I would like Second Life to start up with a maximized window to fully immerse myself in the experience * Added virtual meetsRequirementsForMaximizedStart() function to determine whether or not to start the initial experience in a maximized window Reviewed by Richard --- indra/newview/llappviewer.cpp | 40 ++++++++++++++++++++++++++++++++-------- indra/newview/llappviewer.h | 1 + 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index f6fe7ecd01..c993acb283 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -78,7 +78,6 @@ #include "llvoicechannel.h" #include "llvoavatarself.h" #include "llsidetray.h" -#include "llfeaturemanager.h" #include "llurlmatch.h" #include "lltextutil.h" #include "lllogininstance.h" @@ -755,7 +754,7 @@ bool LLAppViewer::init() // // Various introspection concerning the libs we're using - particularly - // the libs involved in getting to a full login screen. + // the libs involved in getting to a full login screen. // LL_INFOS("InitInfo") << "J2C Engine is: " << LLImageJ2C::getEngineInfo() << LL_ENDL; LL_INFOS("InitInfo") << "libcurl version is: " << LLCurl::getVersionString() << LL_ENDL; @@ -2731,6 +2730,20 @@ void LLAppViewer::checkForCrash(void) } +// +// This function decides whether the client machine meets the minimum requirements to +// run in a maximized window, per the consensus of davep, boa and nyx on 3/30/2011. +// +bool LLAppViewer::meetsRequirementsForMaximizedStart() +{ + bool maximizedOk = (LLFeatureManager::getInstance()->getGPUClass() >= GPU_CLASS_2); + + const U32 one_gigabyte_kb = 1024 * 1024; + maximizedOk &= (gSysMemory.getPhysicalMemoryKB() >= one_gigabyte_kb); + + return maximizedOk; +} + bool LLAppViewer::initWindow() { LL_INFOS("AppInit") << "Initializing window..." << LL_ENDL; @@ -2750,7 +2763,8 @@ bool LLAppViewer::initWindow() const S32 NEVER_SUBMIT_REPORT = 2; bool use_watchdog = false; int watchdog_enabled_setting = gSavedSettings.getS32("WatchdogEnabled"); - if(watchdog_enabled_setting == -1){ + if(watchdog_enabled_setting == -1) + { use_watchdog = !LLFeatureManager::getInstance()->isFeatureAvailable("WatchdogDisabled"); } else @@ -2767,11 +2781,6 @@ bool LLAppViewer::initWindow() LLNotificationsUI::LLNotificationManager::getInstance(); - if (gSavedSettings.getBOOL("WindowMaximized")) - { - gViewerWindow->mWindow->maximize(); - } - if (!gNoRender) { // @@ -2801,6 +2810,21 @@ bool LLAppViewer::initWindow() LLAppViewer::instance()->forceErrorLLError(); } + // + // Determine if the window should start maximized on initial run based + // on graphics capability + // + if (gSavedSettings.getBOOL("FirstLoginThisInstall") && meetsRequirementsForMaximizedStart()) + { + LL_INFOS("AppInit") << "This client met the requirements for a maximized initial screen." << LL_ENDL; + gSavedSettings.setBOOL("WindowMaximized", TRUE); + } + + if (gSavedSettings.getBOOL("WindowMaximized")) + { + gViewerWindow->mWindow->maximize(); + } + LLUI::sWindow = gViewerWindow->getWindow(); // Show watch cursor diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index 0226211735..61ee6a7cf1 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -187,6 +187,7 @@ protected: virtual std::string generateSerialNumber() = 0; // Platforms specific classes generate this. + virtual bool meetsRequirementsForMaximizedStart(); // Used on first login to decide to launch maximized private: -- cgit v1.2.3 From 993ad22f9ffeae6d20f75dc409cf0128ca167a0e Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Wed, 30 Mar 2011 19:28:03 -0400 Subject: Cleanup to logically group physics params in avatar_lad.xml. Added more controls for belly & butt. Cleaned up code around physics parameter initialization. --- indra/newview/character/avatar_lad.xml | 191 ++++++++++++++++++++--- indra/newview/llphysicsmotion.cpp | 204 ++++++++++++++----------- indra/newview/skins/default/xui/en/strings.xml | 25 ++- 3 files changed, 300 insertions(+), 120 deletions(-) diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index 51be7f52fa..ee2cc5ffeb 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -11952,54 +11952,94 @@ render_pass="bump"> <param id="1130" group="0" + name="Belly_Physics_Mass" + label="Belly Physics Mass" + wearable="physics" + edit_group="physics_belly" + value_default=".1" + value_min=".1" + value_max="1"> + <param_driver /> + </param> + <param + id="1131" + group="0" + name="Belly_Physics_Smoothing" + label="Belly Physics Smoothing" + wearable="physics" + edit_group="physics_belly" + value_default="2" + value_min="1" + value_max="10"> + <param_driver /> + </param> + <param + id="1132" + group="0" + name="Belly_Physics_Gravity" + label="Belly Physics Gravity" + wearable="physics" + edit_group="physics_belly" + value_default="0" + value_min="0" + value_max=".1"> + <param_driver /> + </param> + <param + id="1133" + group="0" name="Belly_Physics_UpDown_Spring" label="Belly Physics UpDown Spring" wearable="physics" edit_group="physics_belly" - label_min="Less" - label_max="More" value_default=".1" value_min="0" value_max="1"> <param_driver /> </param> <param - id="1131" + id="1134" group="0" name="Belly_Physics_UpDown_Gain" label="Belly Physics UpDown Gain" wearable="physics" edit_group="physics_belly" - label_min="Less" - label_max="More" value_default="10" value_min="1" value_max="100"> <param_driver /> </param> <param - id="1132" + id="1135" group="0" name="Belly_Physics_UpDown_Damping" label="Belly Physics UpDown Damping" wearable="physics" edit_group="physics" - label_min="Less" - label_max="More" value_default=".05" value_min="0" value_max=".1"> <param_driver /> </param> - <param - id="1133" + <param + id="1136" + group="0" + name="Belly_Physics_UpDown_Drag" + label="Belly Physics UpDown Drag" + wearable="physics" + edit_group="physics_belly" + value_default=".15" + value_min="0" + value_max=".5"> + <param_driver /> + </param> + <param + id="1137" group="0" name="Belly_Physics_UpDown_Max_Velocity" label="Belly Physics UpDown Max Speed" wearable="physics" edit_group="physics_belly" - label_min="Less" - label_max="More" value_default="0" value_min="0" value_max="10"> @@ -12009,54 +12049,155 @@ render_pass="bump"> <param id="1140" group="0" + name="Butt_Physics_Mass" + label="Butt Physics Mass" + wearable="physics" + edit_group="physics_butt" + value_default=".1" + value_min=".1" + value_max="1"> + <param_driver /> + </param> + <param + id="1141" + group="0" + name="Butt_Physics_Smoothing" + label="Butt Physics Smoothing" + wearable="physics" + edit_group="physics_butt" + value_default="2" + value_min="1" + value_max="10"> + <param_driver /> + </param> + <param + id="1142" + group="0" + name="Butt_Physics_Gravity" + label="Butt Physics Gravity" + wearable="physics" + edit_group="physics_butt" + value_default="0" + value_min="0" + value_max=".1"> + <param_driver /> + </param> + <param + id="1143" + group="0" name="Butt_Physics_UpDown_Spring" label="Butt Physics UpDown Spring" wearable="physics" edit_group="physics_butt" - label_min="Less" - label_max="More" value_default=".1" value_min="0" value_max="1"> <param_driver /> </param> <param - id="1141" + id="1144" group="0" name="Butt_Physics_UpDown_Gain" label="Butt Physics UpDown Gain" wearable="physics" edit_group="physics_butt" - label_min="Less" - label_max="More" value_default="10" value_min="1" value_max="100"> <param_driver /> </param> <param - id="1142" + id="1145" group="0" name="Butt_Physics_UpDown_Damping" label="Butt Physics UpDown Damping" - wearable="physics_butt" + wearable="physics" edit_group="physics" - label_min="Less" - label_max="More" value_default=".05" value_min="0" value_max=".1"> <param_driver /> </param> - <param - id="1143" + <param + id="1146" + group="0" + name="Butt_Physics_UpDown_Drag" + label="Butt Physics UpDown Drag" + wearable="physics" + edit_group="physics_butt" + value_default=".15" + value_min="0" + value_max=".5"> + <param_driver /> + </param> + <param + id="1147" group="0" name="Butt_Physics_UpDown_Max_Velocity" label="Butt Physics UpDown Max Speed" wearable="physics" edit_group="physics_butt" - label_min="Less" - label_max="More" + value_default="0" + value_min="0" + value_max="10"> + <param_driver /> + </param> + + <param + id="1143" + group="0" + name="Butt_Physics_LeftRight_Spring" + label="Butt Physics LeftRight Spring" + wearable="physics" + edit_group="physics_butt" + value_default=".1" + value_min="0" + value_max="1"> + <param_driver /> + </param> + <param + id="1144" + group="0" + name="Butt_Physics_LeftRight_Gain" + label="Butt Physics LeftRight Gain" + wearable="physics" + edit_group="physics_butt" + value_default="10" + value_min="1" + value_max="100"> + <param_driver /> + </param> + <param + id="1145" + group="0" + name="Butt_Physics_LeftRight_Damping" + label="Butt Physics LeftRight Damping" + wearable="physics" + edit_group="physics" + value_default=".05" + value_min="0" + value_max=".1"> + <param_driver /> + </param> + <param + id="1146" + group="0" + name="Butt_Physics_LeftRight_Drag" + label="Butt Physics LeftRight Drag" + wearable="physics" + edit_group="physics_butt" + value_default=".15" + value_min="0" + value_max=".5"> + <param_driver /> + </param> + <param + id="1147" + group="0" + name="Butt_Physics_LeftRight_Max_Velocity" + label="Butt Physics LeftRight Max Speed" + wearable="physics" + edit_group="physics_butt" value_default="0" value_min="0" value_max="10"> diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 4048c66262..fd83f4d482 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -238,102 +238,130 @@ LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter mMotions.clear(); - controller_map_t controller_breast_inout; - controller_breast_inout["Mass"] = "Breast_Physics_Mass"; - controller_breast_inout["Smoothing"] = "Breast_Physics_Smoothing"; - controller_breast_inout["Gravity"] = "Breast_Physics_Gravity"; - controller_breast_inout["Damping"] = "Breast_Physics_Side_Damping"; - controller_breast_inout["Drag"] = "Breast_Physics_Side_Drag"; - controller_breast_inout["MaxSpeed"] = "Breast_Physics_Side_Max_Velocity"; - controller_breast_inout["Spring"] = "Breast_Physics_Side_Spring"; - controller_breast_inout["Gain"] = "Breast_Physics_Side_Gain"; - - LLPhysicsMotion *motion_breast_inout = new LLPhysicsMotion("Breast_Physics_Side_Controller", - "", - "mChest", - character, - LLVector3(-1,0,0), - controller_breast_inout); - if (!motion_breast_inout->initialize()) - return STATUS_FAILURE; - addMotion(motion_breast_inout); - - controller_map_t controller_breast_updown; - controller_breast_updown["Mass"] = "Breast_Physics_Mass"; - controller_breast_updown["Smoothing"] = "Breast_Physics_Smoothing"; - controller_breast_updown["Gravity"] = "Breast_Physics_Gravity"; - controller_breast_updown["Damping"] = "Breast_Physics_UpDown_Damping"; - controller_breast_updown["Drag"] = "Breast_Physics_UpDown_Drag"; - controller_breast_updown["MaxSpeed"] = "Breast_Physics_UpDown_Max_Velocity"; - controller_breast_updown["Spring"] = "Breast_Physics_UpDown_Spring"; - controller_breast_updown["Gain"] = "Breast_Physics_UpDown_Gain"; - - LLPhysicsMotion *motion_breast_updown = new LLPhysicsMotion("Breast_Physics_UpDown_Controller", - "", - "mChest", - character, - LLVector3(0,0,1), - controller_breast_updown); - if (!motion_breast_updown->initialize()) + // Breast Cleavage { - llassert_always(FALSE); - return STATUS_FAILURE; + controller_map_t controller; + controller["Mass"] = "Breast_Physics_Mass"; + controller["Smoothing"] = "Breast_Physics_Smoothing"; + controller["Gravity"] = "Breast_Physics_Gravity"; + controller["Damping"] = "Breast_Physics_Side_Damping"; + controller["Drag"] = "Breast_Physics_Side_Drag"; + controller["MaxSpeed"] = "Breast_Physics_Side_Max_Velocity"; + controller["Spring"] = "Breast_Physics_Side_Spring"; + controller["Gain"] = "Breast_Physics_Side_Gain"; + LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_Side_Controller", + "", + "mChest", + character, + LLVector3(-1,0,0), + controller); + if (!motion->initialize()) + { + llassert_always(FALSE); + return STATUS_FAILURE; + } + addMotion(motion); + } + + // Breast Bounce + { + controller_map_t controller; + controller["Mass"] = "Breast_Physics_Mass"; + controller["Smoothing"] = "Breast_Physics_Smoothing"; + controller["Gravity"] = "Breast_Physics_Gravity"; + controller["Damping"] = "Breast_Physics_UpDown_Damping"; + controller["Drag"] = "Breast_Physics_UpDown_Drag"; + controller["MaxSpeed"] = "Breast_Physics_UpDown_Max_Velocity"; + controller["Spring"] = "Breast_Physics_UpDown_Spring"; + controller["Gain"] = "Breast_Physics_UpDown_Gain"; + LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_UpDown_Controller", + "", + "mChest", + character, + LLVector3(0,0,1), + controller); + if (!motion->initialize()) + { + llassert_always(FALSE); + return STATUS_FAILURE; + } + addMotion(motion); } - addMotion(motion_breast_updown); - - controller_map_t controller_butt_updown; - controller_butt_updown["Damping"] = "Butt_Physics_Updown_Damping"; - controller_butt_updown["MaxSpeed"] = "Butt_Physics_Updown_Max_Velocity"; - controller_butt_updown["Spring"] = "Butt_Physics_Updown_Spring"; - controller_butt_updown["Gain"] = "Butt_Physics_Updown_Gain"; - LLPhysicsMotion *motion_butt_updown = new LLPhysicsMotion("Butt_Physics_UpDown_Controller", - "", - "mPelvis", - character, - LLVector3(0,0,1), - controller_butt_updown); - if (!motion_butt_updown->initialize()) + + // Butt Bounce { - llassert_always(FALSE); - return STATUS_FAILURE; + controller_map_t controller; + controller["Mass"] = "Butt_Physics_Mass"; + controller["Smoothing"] = "Butt_Physics_Smoothing"; + controller["Gravity"] = "Butt_Physics_Gravity"; + controller["Damping"] = "Butt_Physics_UpDown_Damping"; + controller["Drag"] = "Butt_Physics_UpDown_Drag"; + controller["MaxSpeed"] = "Butt_Physics_UpDown_Max_Velocity"; + controller["Spring"] = "Butt_Physics_UpDown_Spring"; + controller["Gain"] = "Butt_Physics_UpDown_Gain"; + LLPhysicsMotion *motion = new LLPhysicsMotion("Butt_Physics_UpDown_Controller", + "", + "mPelvis", + character, + LLVector3(0,0,1), + controller); + if (!motion->initialize()) + { + llassert_always(FALSE); + return STATUS_FAILURE; + } + addMotion(motion); } - addMotion(motion_butt_updown); - - controller_map_t controller_butt_leftright; - controller_butt_leftright["Damping"] = "Butt_Physics_Updown_Damping"; - controller_butt_leftright["MaxSpeed"] = "Butt_Physics_Updown_Max_Velocity"; - controller_butt_leftright["Spring"] = "Butt_Physics_Updown_Spring"; - controller_butt_leftright["Gain"] = "Butt_Physics_Updown_Gain"; - LLPhysicsMotion *motion_butt_leftright = new LLPhysicsMotion("Butt_Physics_LeftRight_Controller", - "", - "mPelvis", - character, - LLVector3(0,1,0), - controller_butt_leftright); - if (!motion_butt_leftright->initialize()) + + // Butt LeftRight { - llassert_always(FALSE); - return STATUS_FAILURE; + controller_map_t controller; + controller["Mass"] = "Butt_Physics_Mass"; + controller["Smoothing"] = "Butt_Physics_Smoothing"; + controller["Gravity"] = "Butt_Physics_Gravity"; + controller["Damping"] = "Butt_Physics_LeftRight_Damping"; + controller["Drag"] = "Butt_Physics_LeftRight_Drag"; + controller["MaxSpeed"] = "Butt_Physics_LeftRight_Max_Velocity"; + controller["Spring"] = "Butt_Physics_LeftRight_Spring"; + controller["Gain"] = "Butt_Physics_LeftRight_Gain"; + LLPhysicsMotion *motion = new LLPhysicsMotion("Butt_Physics_LeftRight_Controller", + "", + "mPelvis", + character, + LLVector3(0,1,0), + controller); + if (!motion->initialize()) + { + llassert_always(FALSE); + return STATUS_FAILURE; + } + addMotion(motion); } - addMotion(motion_butt_leftright); - - controller_map_t controller_belly_updown; - controller_belly_updown["Damping"] = "Belly_Physics_Updown_Damping"; - controller_belly_updown["MaxSpeed"] = "Belly_Physics_Updown_Max_Velocity"; - controller_belly_updown["Spring"] = "Belly_Physics_Updown_Spring"; - controller_belly_updown["Gain"] = "Belly_Physics_Updown_Gain"; - LLPhysicsMotion *motion_belly_updown = new LLPhysicsMotion("Belly_Physics_UpDown_Controller", - "", - "mChest", - character, - LLVector3(0,0,-1), - controller_belly_updown); - if (!motion_belly_updown->initialize()) + + // Belly Bounce { - llassert_always(FALSE); - return STATUS_FAILURE; + controller_map_t controller; + controller["Mass"] = "Belly_Physics_Mass"; + controller["Smoothing"] = "Belly_Physics_Smoothing"; + controller["Gravity"] = "Belly_Physics_Gravity"; + controller["Damping"] = "Belly_Physics_UpDown_Damping"; + controller["Drag"] = "Belly_Physics_UpDown_Drag"; + controller["MaxSpeed"] = "Belly_Physics_UpDown_Max_Velocity"; + controller["Spring"] = "Belly_Physics_UpDown_Spring"; + controller["Gain"] = "Belly_Physics_UpDown_Gain"; + LLPhysicsMotion *motion = new LLPhysicsMotion("Belly_Physics_UpDown_Controller", + "", + "mPelvis", + character, + LLVector3(0,0,-1), + controller); + if (!motion->initialize()) + { + llassert_always(FALSE); + return STATUS_FAILURE; + } + addMotion(motion); } - addMotion(motion_belly_updown); return STATUS_SUCCESS; } diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 9570e28d26..e12f7c679e 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2514,28 +2514,39 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="Breast Physics Mass">Breast Mass</string> <string name="Breast Physics Smoothing">Breast Smoothing</string> <string name="Breast Physics Gravity">Breast Gravity</string> - <string name="Breast Physics Side Spring">Breast Side Spring</string> <string name="Breast Physics Side Gain">Breast Side Gain</string> <string name="Breast Physics Side Damping">Breast Side Damping</string> <string name="Breast Physics Side Drag">Breast Side Drag</string> <string name="Breast Physics Side Max Speed">Breast Side Max Speed</string> - <string name="Breast Physics UpDown Spring">Breast UpDown Spring</string> <string name="Breast Physics UpDown Gain">Breast UpDown Gain</string> <string name="Breast Physics UpDown Damping">Breast UpDown Damping</string> <string name="Breast Physics UpDown Drag">Breast UpDown Drag</string> <string name="Breast Physics UpDown Max Speed">Breast UpDown Max Speed</string> -<string name="Belly Physics UpDown Spring">Belly Updown Spring</string> -<string name="Belly Physics UpDown Gain">Belly Updown Gain</string> -<string name="Belly Physics UpDown Damping">Belly Updown Damping</string> -<string name="Belly Physics UpDown Max Speed">Belly Updown Max Speed</string> - +<string name="Belly Physics Mass">Belly Mass</string> +<string name="Belly Physics Smoothing">Belly Smoothing</string> +<string name="Belly Physics Gravity">Belly Gravity</string> +<string name="Belly Physics UpDown Spring">Belly UpDown Spring</string> +<string name="Belly Physics UpDown Gain">Belly UpDown Gain</string> +<string name="Belly Physics UpDown Damping">Belly UpDown Damping</string> +<string name="Belly Physics UpDown Drag">Belly UpDown Drag</string> +<string name="Belly Physics UpDown Max Speed">Belly UpDown Max Speed</string> + +<string name="Butt Physics Mass">Butt Mass</string> +<string name="Butt Physics Smoothing">Butt Smoothing</string> +<string name="Butt Physics Gravity">Butt Gravity</string> <string name="Butt Physics UpDown Spring">Butt UpDown Spring</string> <string name="Butt Physics UpDown Gain">Butt UpDown Gain</string> <string name="Butt Physics UpDown Damping">Butt UpDown Damping</string> +<string name="Butt Physics UpDown Drag">Butt UpDown Drag</string> <string name="Butt Physics UpDown Max Speed">Butt UpDown Max Speed</string> +<string name="Butt Physics LeftRight Spring">Butt LeftRight Spring</string> +<string name="Butt Physics LeftRight Gain">Butt LeftRight Gain</string> +<string name="Butt Physics LeftRight Damping">Butt LeftRight Damping</string> +<string name="Butt Physics LeftRight Drag">Butt LeftRight Drag</string> +<string name="Butt Physics LeftRight Max Speed">Butt LeftRight Max Speed</string> <string name="Bushy Eyebrows">Bushy Eyebrows</string> <string name="Bushy Hair">Bushy Hair</string> -- cgit v1.2.3 From 3c6e91e16d1de25f7a4cfe168ee7e3cb2f037cd8 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Wed, 30 Mar 2011 19:49:35 -0400 Subject: Corrections for butt motion in avatar_lad.xml. Reduced extent of belly motion. --- indra/newview/character/avatar_lad.xml | 56 ++++++++++++++-------------------- indra/newview/llpolymesh.cpp | 6 ++-- 2 files changed, 26 insertions(+), 36 deletions(-) diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index ee2cc5ffeb..5a10b2f57b 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -4294,7 +4294,7 @@ ############# --> <param - id="1150" + id="1200" group="1" sex="female" name="Breast_Gravity" @@ -4307,7 +4307,7 @@ </param> <param - id="1151" + id="1201" group="1" sex="female" name="Breast_Female_Cleavage" @@ -4320,7 +4320,7 @@ </param> <param - id="1154" + id="1204" group="1" name="Belly_Physics_Torso_UpDown_Driven" wearable="physics" @@ -4840,7 +4840,7 @@ ############# --> <param - id="1152" + id="1202" group="1" name="Belly_Physics_Legs_UpDown_Driven" wearable="physics" @@ -4852,7 +4852,7 @@ <param - id="1155" + id="1205" group="1" name="Butt_Physics_UpDown_Driven" wearable="physics" @@ -4862,7 +4862,7 @@ </param> <param - id="1156" + id="1206" group="1" name="Butt_Physics_LeftRight_Driven" wearable="physics" @@ -11697,7 +11697,7 @@ render_pass="bump"> camera_distance=".8"> <param_driver> <driven - id="1150" /> + id="1200" /> </param_driver> </param> @@ -11715,7 +11715,7 @@ render_pass="bump"> value_max="1.3"> <param_driver> <driven - id="1151" /> + id="1201" /> </param_driver> </param> @@ -11723,25 +11723,18 @@ render_pass="bump"> id="1120" group="1" wearable="physics" - edit_group="physics_belly" - edit_group_order="14" name="Belly_Physics_UpDown_Controller" label="Belly Physics UpDown Controller" - label_min="Down" - label_max="Up" value_min="-1" value_max="1" - value_default="0" - camera_distance="1.4" - camera_angle="30" - camera_elevation=".2"> + value_default="0"> <param_driver> <driven - id="1152" /> + id="1202" /> <driven - id="1153" /> + id="1203" /> <driven - id="1154" /> + id="1204" /> </param_driver> </param> @@ -11749,7 +11742,6 @@ render_pass="bump"> id="1100" group="1" wearable="shape" - edit_group="physics_butt" name="Butt_Physics_UpDown_Controller" label="Butt Physics UpDown Controller" value_min="-1" @@ -11757,7 +11749,7 @@ render_pass="bump"> value_default="0"> <param_driver> <driven - id="1155" /> + id="1205" /> </param_driver> </param> @@ -11765,7 +11757,6 @@ render_pass="bump"> id="1101" group="1" wearable="shape" - edit_group="physics_butt" name="Butt_Physics_LeftRight_Controller" label="Butt Physics LeftRight Controller" value_min="-1" @@ -11773,7 +11764,7 @@ render_pass="bump"> value_default="0"> <param_driver> <driven - id="1156" /> + id="1206" /> </param_driver> </param> @@ -11849,7 +11840,7 @@ render_pass="bump"> name="Breast_Physics_Side_Damping" label="Breast Physics Side Damping" wearable="physics" - edit_group="physics" + edit_group="physics_breasts" value_default=".05" value_min="0" value_max=".1"> @@ -12015,7 +12006,7 @@ render_pass="bump"> name="Belly_Physics_UpDown_Damping" label="Belly Physics UpDown Damping" wearable="physics" - edit_group="physics" + edit_group="physics_belly" value_default=".05" value_min="0" value_max=".1"> @@ -12112,7 +12103,7 @@ render_pass="bump"> name="Butt_Physics_UpDown_Damping" label="Butt Physics UpDown Damping" wearable="physics" - edit_group="physics" + edit_group="physics_butt" value_default=".05" value_min="0" value_max=".1"> @@ -12142,9 +12133,8 @@ render_pass="bump"> value_max="10"> <param_driver /> </param> - <param - id="1143" + id="1148" group="0" name="Butt_Physics_LeftRight_Spring" label="Butt Physics LeftRight Spring" @@ -12156,7 +12146,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="1144" + id="1149" group="0" name="Butt_Physics_LeftRight_Gain" label="Butt Physics LeftRight Gain" @@ -12168,19 +12158,19 @@ render_pass="bump"> <param_driver /> </param> <param - id="1145" + id="1150" group="0" name="Butt_Physics_LeftRight_Damping" label="Butt Physics LeftRight Damping" wearable="physics" - edit_group="physics" + edit_group="physics_butt" value_default=".05" value_min="0" value_max=".1"> <param_driver /> </param> <param - id="1146" + id="1151" group="0" name="Butt_Physics_LeftRight_Drag" label="Butt Physics LeftRight Drag" @@ -12192,7 +12182,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="1147" + id="1152" group="0" name="Butt_Physics_LeftRight_Max_Velocity" label="Butt Physics LeftRight Max Speed" diff --git a/indra/newview/llpolymesh.cpp b/indra/newview/llpolymesh.cpp index 32d57cddc3..e736690da5 100644 --- a/indra/newview/llpolymesh.cpp +++ b/indra/newview/llpolymesh.cpp @@ -610,21 +610,21 @@ BOOL LLPolyMeshSharedData::loadMesh( const std::string& fileName ) if (!strcmp(morphName, "Big_Belly_Torso")) { mMorphData.insert(clone_morph_param(morph_data, - LLVector3(0,0,0.05f), + LLVector3(0,0,0.03f), "Belly_Physics_Torso_UpDown_Driven")); } if (!strcmp(morphName, "Big_Belly_Legs")) { mMorphData.insert(clone_morph_param(morph_data, - LLVector3(0,0,0.05f), + LLVector3(0,0,0.03f), "Belly_Physics_Legs_UpDown_Driven")); } if (!strcmp(morphName, "skirt_belly")) { mMorphData.insert(clone_morph_param(morph_data, - LLVector3(0,0,0.05f), + LLVector3(0,0,0.03f), "Belly_Physics_Skirt_UpDown_Driven")); } -- cgit v1.2.3 From 27f8b19040231c3cfb637d31c0a8a1de8b061e8c Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Wed, 30 Mar 2011 22:16:35 -0400 Subject: Increased butt physics range. Added more logic to not center camera during edit physics mode. --- indra/newview/llpolymesh.cpp | 4 ++-- indra/newview/llsidepanelappearance.cpp | 11 +++++++++++ indra/newview/skins/default/xui/en/panel_edit_physics.xml | 4 ++-- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/indra/newview/llpolymesh.cpp b/indra/newview/llpolymesh.cpp index e736690da5..6d6fb2fa0e 100644 --- a/indra/newview/llpolymesh.cpp +++ b/indra/newview/llpolymesh.cpp @@ -631,13 +631,13 @@ BOOL LLPolyMeshSharedData::loadMesh( const std::string& fileName ) if (!strcmp(morphName, "Small_Butt")) { mMorphData.insert(clone_morph_param(morph_data, - LLVector3(0,0,0.01f), + LLVector3(0,0,0.015f), "Butt_Physics_UpDown_Driven")); } if (!strcmp(morphName, "Small_Butt")) { mMorphData.insert(clone_morph_param(morph_data, - LLVector3(0,0.01f,0), + LLVector3(0,0.015f,0), "Butt_Physics_LeftRight_Driven")); } } diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index b3488a507a..16729f045a 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -204,6 +204,8 @@ void LLSidepanelAppearance::updateToVisibility(const LLSD &new_visibility) llwarns << "Visibility change to invalid wearable" << llendl; return; } + // Disable camera switch is currently just for WT_PHYSICS type since we don't want to freeze the avatar + // when editing its physics. const BOOL disable_camera_motion = LLWearableType::getDisableCameraSwitch(wearable_ptr->getType()); if (!gAgentCamera.cameraCustomizeAvatar() && !disable_camera_motion && @@ -313,6 +315,15 @@ void LLSidepanelAppearance::showOutfitEditPanel() mOutfitEdit->resetAccordionState(); } + // If we're exiting the edit wearable view, and the camera was not focused on the avatar + // (e.g. such as if we were editing a physics param), then skip the outfits edit mode since + // otherwise this would trigger the camera focus mode. + if (mEditWearable != NULL && mEditWearable->getVisible() && !gAgentCamera.cameraCustomizeAvatar()) + { + showOutfitsInventoryPanel(); + return; + } + toggleMyOutfitsPanel(FALSE); toggleWearableEditPanel(FALSE, NULL, TRUE); // don't switch out of edit appearance mode toggleOutfitEditPanel(TRUE); diff --git a/indra/newview/skins/default/xui/en/panel_edit_physics.xml b/indra/newview/skins/default/xui/en/panel_edit_physics.xml index 0eb9c703ca..6e89a8cb1a 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_physics.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_physics.xml @@ -27,8 +27,8 @@ height ="300" layout="topleft" left="0" - name="wearable_accordion" - single_expansion="true" + single_expansion="true" + name="physics_accordion" top="0" width="313"> <accordion_tab -- cgit v1.2.3 From 61056a68cd1952ee062a5ae3207b9670a31e4c55 Mon Sep 17 00:00:00 2001 From: Merov Linden <merov@lindenlab.com> Date: Wed, 30 Mar 2011 19:43:35 -0700 Subject: STORM-1121 : Suppress the debug cmake instruction --- indra/integration_tests/CMakeLists.txt | 3 --- 1 file changed, 3 deletions(-) diff --git a/indra/integration_tests/CMakeLists.txt b/indra/integration_tests/CMakeLists.txt index 63a053479b..ced2b3dbcf 100644 --- a/indra/integration_tests/CMakeLists.txt +++ b/indra/integration_tests/CMakeLists.txt @@ -1,7 +1,4 @@ # -*- cmake -*- -# For STORM-1121 debug. Will delete when ready -SET (LLIMAGE_LIBTEST ON CACHE BOOL "Force build of llimage_libtest for testing") - add_subdirectory(llui_libtest) IF (LLIMAGE_LIBTEST) MESSAGE(STATUS "Build llimage_libtest") -- cgit v1.2.3 From 1ceb29bdacb309ed374128feae879953c2e13820 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Wed, 30 Mar 2011 23:17:58 -0400 Subject: Change in physics parameter names. Split some physics parameters into separate accordions based on updown/leftright. Fixed a minor issue with physics edit tab height. --- indra/newview/character/avatar_lad.xml | 236 +++++++++++---------- indra/newview/llpaneleditwearable.cpp | 18 +- indra/newview/llphysicsmotion.cpp | 14 +- .../skins/default/xui/en/panel_edit_physics.xml | 46 +++- indra/newview/skins/default/xui/en/strings.xml | 71 ++++--- 5 files changed, 213 insertions(+), 172 deletions(-) diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index 5a10b2f57b..a7e529adff 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -11705,8 +11705,8 @@ render_pass="bump"> id="684" group="0" sex="female" - name="Breast_Physics_Side_Controller" - label="Breast Physics Side Controller" + name="Breast_Physics_InOut_Controller" + label="Breast Physics InOut Controller" wearable="shape" edit_group="shape_torso" edit_group_order="8" @@ -11775,7 +11775,7 @@ render_pass="bump"> name="Breast_Physics_Mass" label="Breast Physics Mass" wearable="physics" - edit_group="physics_breasts" + edit_group="physics_breasts_updown" value_default=".1" value_min=".1" value_max="1"> @@ -11788,7 +11788,7 @@ render_pass="bump"> name="Breast_Physics_Smoothing" label="Breast Physics Smoothing" wearable="physics" - edit_group="physics_breasts" + edit_group="physics_breasts_updown" value_default="2" value_min="1" value_max="10"> @@ -11801,144 +11801,146 @@ render_pass="bump"> name="Breast_Physics_Gravity" label="Breast Physics Gravity" wearable="physics" - edit_group="physics_breasts" + edit_group="physics_breasts_updown" value_default="0" value_min="0" value_max=".1"> <param_driver /> </param> - <param + + <param id="1113" group="0" sex="female" - name="Breast_Physics_Side_Spring" - label="Breast Physics Side Spring" + name="Breast_Physics_UpDown_Max_Velocity" + label="Breast Physics UpDown Max Speed" + wearable="physics" + edit_group="physics_breasts_updown" + value_default="0" + value_min="0" + value_max="10"> + <param_driver /> + </param> + <param + id="1114" + group="0" + sex="female" + name="Breast_Physics_UpDown_Spring" + label="Breast Physics UpDown Spring" wearable="physics" - edit_group="physics_breasts" + edit_group="physics_breasts_updown" value_default=".1" value_min="0" value_max="1"> <param_driver /> </param> <param - id="1114" + id="1115" group="0" sex="female" - name="Breast_Physics_Side_Gain" - label="Breast Physics Side Gain" + name="Breast_Physics_UpDown_Gain" + label="Breast Physics UpDown Gain" wearable="physics" - edit_group="physics_breasts" + edit_group="physics_breasts_updown" value_default="10" value_min="1" value_max="100"> <param_driver /> </param> <param - id="1115" + id="1116" group="0" sex="female" - name="Breast_Physics_Side_Damping" - label="Breast Physics Side Damping" + name="Breast_Physics_UpDown_Damping" + label="Breast Physics UpDown Damping" wearable="physics" - edit_group="physics_breasts" + edit_group="physics_breasts_updown" value_default=".05" value_min="0" - value_max=".1"> + value_max=".1" + camera_elevation=".3" + camera_distance=".8"> <param_driver /> </param> <param - id="1116" + id="1117" group="0" sex="female" - name="Breast_Physics_Side_Drag" - label="Breast Physics Side Drag" + name="Breast_Physics_UpDown_Drag" + label="Breast Physics UpDown Drag" wearable="physics" - edit_group="physics_breasts" + edit_group="physics_breasts_updown" value_default=".15" value_min="0" value_max=".5"> <param_driver /> </param> + <param - id="1117" + id="1118" group="0" sex="female" - name="Breast_Physics_Side_Max_Velocity" - label="Breast Physics Side Max Speed" + name="Breast_Physics_InOut_Max_Velocity" + label="Breast Physics InOut Max Speed" wearable="physics" - edit_group="physics_breasts" + edit_group="physics_breasts_inout" value_default="0" value_min="0" value_max="10"> <param_driver /> </param> <param - id="1118" + id="1119" group="0" sex="female" - name="Breast_Physics_UpDown_Spring" - label="Breast Physics UpDown Spring" + name="Breast_Physics_InOut_Spring" + label="Breast Physics InOut Spring" wearable="physics" - edit_group="physics_breasts" + edit_group="physics_breasts_inout" value_default=".1" value_min="0" value_max="1"> <param_driver /> </param> <param - id="1119" + id="1120" group="0" sex="female" - name="Breast_Physics_UpDown_Gain" - label="Breast Physics UpDown Gain" + name="Breast_Physics_InOut_Gain" + label="Breast Physics InOut Gain" wearable="physics" - edit_group="physics_breasts" + edit_group="physics_breasts_inout" value_default="10" value_min="1" value_max="100"> <param_driver /> </param> <param - id="1120" + id="1121" group="0" sex="female" - name="Breast_Physics_UpDown_Damping" - label="Breast Physics UpDown Damping" + name="Breast_Physics_InOut_Damping" + label="Breast Physics InOut Damping" wearable="physics" - edit_group="physics_breasts" + edit_group="physics_breasts_inout" value_default=".05" value_min="0" - value_max=".1" - camera_elevation=".3" - camera_distance=".8"> + value_max=".1"> <param_driver /> </param> <param - id="1121" + id="1122" group="0" sex="female" - name="Breast_Physics_UpDown_Drag" - label="Breast Physics UpDown Drag" + name="Breast_Physics_InOut_Drag" + label="Breast Physics InOut Drag" wearable="physics" - edit_group="physics_breasts" + edit_group="physics_breasts_inout" value_default=".15" value_min="0" value_max=".5"> <param_driver /> </param> - <param - id="1122" - group="0" - sex="female" - name="Breast_Physics_UpDown_Max_Velocity" - label="Breast Physics UpDown Max Speed" - wearable="physics" - edit_group="physics_breasts" - value_default="0" - value_min="0" - value_max="10"> - <param_driver /> - </param> <param id="1130" @@ -11946,7 +11948,7 @@ render_pass="bump"> name="Belly_Physics_Mass" label="Belly Physics Mass" wearable="physics" - edit_group="physics_belly" + edit_group="physics_belly_updown" value_default=".1" value_min=".1" value_max="1"> @@ -11958,7 +11960,7 @@ render_pass="bump"> name="Belly_Physics_Smoothing" label="Belly Physics Smoothing" wearable="physics" - edit_group="physics_belly" + edit_group="physics_belly_updown" value_default="2" value_min="1" value_max="10"> @@ -11970,72 +11972,72 @@ render_pass="bump"> name="Belly_Physics_Gravity" label="Belly Physics Gravity" wearable="physics" - edit_group="physics_belly" + edit_group="physics_belly_updown" value_default="0" value_min="0" value_max=".1"> <param_driver /> </param> - <param + <param id="1133" group="0" + name="Belly_Physics_UpDown_Max_Velocity" + label="Belly Physics UpDown Max Speed" + wearable="physics" + edit_group="physics_belly_updown" + value_default="0" + value_min="0" + value_max="10"> + <param_driver /> + </param> + <param + id="1134" + group="0" name="Belly_Physics_UpDown_Spring" label="Belly Physics UpDown Spring" wearable="physics" - edit_group="physics_belly" + edit_group="physics_belly_updown" value_default=".1" value_min="0" value_max="1"> <param_driver /> </param> <param - id="1134" + id="1135" group="0" name="Belly_Physics_UpDown_Gain" label="Belly Physics UpDown Gain" wearable="physics" - edit_group="physics_belly" + edit_group="physics_belly_updown" value_default="10" value_min="1" value_max="100"> <param_driver /> </param> <param - id="1135" + id="1136" group="0" name="Belly_Physics_UpDown_Damping" label="Belly Physics UpDown Damping" wearable="physics" - edit_group="physics_belly" + edit_group="physics_belly_updown" value_default=".05" value_min="0" value_max=".1"> <param_driver /> </param> <param - id="1136" + id="1137" group="0" name="Belly_Physics_UpDown_Drag" label="Belly Physics UpDown Drag" wearable="physics" - edit_group="physics_belly" + edit_group="physics_belly_updown" value_default=".15" value_min="0" value_max=".5"> <param_driver /> </param> - <param - id="1137" - group="0" - name="Belly_Physics_UpDown_Max_Velocity" - label="Belly Physics UpDown Max Speed" - wearable="physics" - edit_group="physics_belly" - value_default="0" - value_min="0" - value_max="10"> - <param_driver /> - </param> <param id="1140" @@ -12043,7 +12045,7 @@ render_pass="bump"> name="Butt_Physics_Mass" label="Butt Physics Mass" wearable="physics" - edit_group="physics_butt" + edit_group="physics_butt_updown" value_default=".1" value_min=".1" value_max="1"> @@ -12055,7 +12057,7 @@ render_pass="bump"> name="Butt_Physics_Smoothing" label="Butt Physics Smoothing" wearable="physics" - edit_group="physics_butt" + edit_group="physics_butt_updown" value_default="2" value_min="1" value_max="10"> @@ -12067,132 +12069,134 @@ render_pass="bump"> name="Butt_Physics_Gravity" label="Butt Physics Gravity" wearable="physics" - edit_group="physics_butt" + edit_group="physics_butt_updown" value_default="0" value_min="0" value_max=".1"> <param_driver /> </param> - <param + <param id="1143" group="0" + name="Butt_Physics_UpDown_Max_Velocity" + label="Butt Physics UpDown Max Speed" + wearable="physics" + edit_group="physics_butt_updown" + value_default="0" + value_min="0" + value_max="10"> + <param_driver /> + </param> + <param + id="1144" + group="0" name="Butt_Physics_UpDown_Spring" label="Butt Physics UpDown Spring" wearable="physics" - edit_group="physics_butt" + edit_group="physics_butt_updown" value_default=".1" value_min="0" value_max="1"> <param_driver /> </param> <param - id="1144" + id="1145" group="0" name="Butt_Physics_UpDown_Gain" label="Butt Physics UpDown Gain" wearable="physics" - edit_group="physics_butt" + edit_group="physics_butt_updown" value_default="10" value_min="1" value_max="100"> <param_driver /> </param> <param - id="1145" + id="1146" group="0" name="Butt_Physics_UpDown_Damping" label="Butt Physics UpDown Damping" wearable="physics" - edit_group="physics_butt" + edit_group="physics_butt_updown" value_default=".05" value_min="0" value_max=".1"> <param_driver /> </param> <param - id="1146" + id="1147" group="0" name="Butt_Physics_UpDown_Drag" label="Butt Physics UpDown Drag" wearable="physics" - edit_group="physics_butt" + edit_group="physics_butt_updown" value_default=".15" value_min="0" value_max=".5"> <param_driver /> </param> + <param - id="1147" + id="1148" group="0" - name="Butt_Physics_UpDown_Max_Velocity" - label="Butt Physics UpDown Max Speed" + name="Butt_Physics_LeftRight_Max_Velocity" + label="Butt Physics LeftRight Max Speed" wearable="physics" - edit_group="physics_butt" + edit_group="physics_butt_leftright" value_default="0" value_min="0" value_max="10"> <param_driver /> </param> <param - id="1148" + id="1149" group="0" name="Butt_Physics_LeftRight_Spring" label="Butt Physics LeftRight Spring" wearable="physics" - edit_group="physics_butt" + edit_group="physics_butt_leftright" value_default=".1" value_min="0" value_max="1"> <param_driver /> </param> <param - id="1149" + id="1150" group="0" name="Butt_Physics_LeftRight_Gain" label="Butt Physics LeftRight Gain" wearable="physics" - edit_group="physics_butt" + edit_group="physics_butt_leftright" value_default="10" value_min="1" value_max="100"> <param_driver /> </param> <param - id="1150" + id="1151" group="0" name="Butt_Physics_LeftRight_Damping" label="Butt Physics LeftRight Damping" wearable="physics" - edit_group="physics_butt" + edit_group="physics_butt_leftright" value_default=".05" value_min="0" value_max=".1"> <param_driver /> </param> <param - id="1151" + id="1152" group="0" name="Butt_Physics_LeftRight_Drag" label="Butt Physics LeftRight Drag" wearable="physics" - edit_group="physics_butt" + edit_group="physics_butt_leftright" value_default=".15" value_min="0" value_max=".5"> <param_driver /> </param> - <param - id="1152" - group="0" - name="Butt_Physics_LeftRight_Max_Velocity" - label="Butt Physics LeftRight Max Speed" - wearable="physics" - edit_group="physics_butt" - value_default="0" - value_min="0" - value_max="10"> - <param_driver /> - </param> + </driver_parameters> diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp index d04604a644..a7ee5a03b7 100644 --- a/indra/newview/llpaneleditwearable.cpp +++ b/indra/newview/llpaneleditwearable.cpp @@ -95,9 +95,11 @@ enum ESubpart { SUBPART_SKIRT, SUBPART_ALPHA, SUBPART_TATTOO, - SUBPART_PHYSICS_BREASTS, - SUBPART_PHYSICS_BELLY, - SUBPART_PHYSICS_BUTT + SUBPART_PHYSICS_BREASTS_UPDOWN, + SUBPART_PHYSICS_BREASTS_INOUT, + SUBPART_PHYSICS_BELLY_UPDOWN, + SUBPART_PHYSICS_BUTT_UPDOWN, + SUBPART_PHYSICS_BUTT_LEFTRIGHT }; using namespace LLVOAvatarDefines; @@ -236,7 +238,7 @@ LLEditWearableDictionary::Wearables::Wearables() addEntry(LLWearableType::WT_SKIRT, new WearableEntry(LLWearableType::WT_SKIRT,"edit_skirt_title","skirt_desc_text",1,1,1, TEX_SKIRT, TEX_SKIRT, SUBPART_SKIRT)); addEntry(LLWearableType::WT_ALPHA, new WearableEntry(LLWearableType::WT_ALPHA,"edit_alpha_title","alpha_desc_text",0,5,1, TEX_LOWER_ALPHA, TEX_UPPER_ALPHA, TEX_HEAD_ALPHA, TEX_EYES_ALPHA, TEX_HAIR_ALPHA, SUBPART_ALPHA)); addEntry(LLWearableType::WT_TATTOO, new WearableEntry(LLWearableType::WT_TATTOO,"edit_tattoo_title","tattoo_desc_text",1,3,1, TEX_HEAD_TATTOO, TEX_LOWER_TATTOO, TEX_UPPER_TATTOO, TEX_HEAD_TATTOO, SUBPART_TATTOO)); - addEntry(LLWearableType::WT_PHYSICS, new WearableEntry(LLWearableType::WT_PHYSICS,"edit_physics_title","physics_desc_text",0,0,3, SUBPART_PHYSICS_BREASTS, SUBPART_PHYSICS_BELLY, SUBPART_PHYSICS_BUTT)); + addEntry(LLWearableType::WT_PHYSICS, new WearableEntry(LLWearableType::WT_PHYSICS,"edit_physics_title","physics_desc_text",0,0,5, SUBPART_PHYSICS_BREASTS_UPDOWN, SUBPART_PHYSICS_BREASTS_INOUT, SUBPART_PHYSICS_BELLY_UPDOWN, SUBPART_PHYSICS_BUTT_UPDOWN, SUBPART_PHYSICS_BUTT_LEFTRIGHT)); } LLEditWearableDictionary::WearableEntry::WearableEntry(LLWearableType::EType type, @@ -307,9 +309,11 @@ LLEditWearableDictionary::Subparts::Subparts() addEntry(SUBPART_UNDERPANTS, new SubpartEntry(SUBPART_UNDERPANTS, "mPelvis", "underpants", "underpants_main_param_list", "underpants_main_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH)); addEntry(SUBPART_ALPHA, new SubpartEntry(SUBPART_ALPHA, "mPelvis", "alpha", "alpha_main_param_list", "alpha_main_tab", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f),SEX_BOTH)); addEntry(SUBPART_TATTOO, new SubpartEntry(SUBPART_TATTOO, "mPelvis", "tattoo", "tattoo_main_param_list", "tattoo_main_tab", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f),SEX_BOTH)); - addEntry(SUBPART_PHYSICS_BREASTS, new SubpartEntry(SUBPART_PHYSICS_BREASTS, "mTorso", "physics_breasts", "physics_breasts_param_list", "physics_breasts_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_FEMALE)); - addEntry(SUBPART_PHYSICS_BELLY, new SubpartEntry(SUBPART_PHYSICS_BELLY, "mTorso", "physics_belly", "physics_belly_param_list", "physics_belly_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH)); - addEntry(SUBPART_PHYSICS_BUTT, new SubpartEntry(SUBPART_PHYSICS_BUTT, "mTorso", "physics_butt", "physics_butt_param_list", "physics_butt_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH)); + addEntry(SUBPART_PHYSICS_BREASTS_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BREASTS_UPDOWN, "mTorso", "physics_breasts_updown", "physics_breasts_updown_param_list", "physics_breasts_updown_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_FEMALE)); + addEntry(SUBPART_PHYSICS_BREASTS_INOUT, new SubpartEntry(SUBPART_PHYSICS_BREASTS_INOUT, "mTorso", "physics_breasts_inout", "physics_breasts_inout_param_list", "physics_breasts_inout_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_FEMALE)); + addEntry(SUBPART_PHYSICS_BELLY_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BELLY_UPDOWN, "mTorso", "physics_belly_updown", "physics_belly_updown_param_list", "physics_belly_updown_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH)); + addEntry(SUBPART_PHYSICS_BUTT_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BUTT_UPDOWN, "mTorso", "physics_butt_updown", "physics_butt_updown_param_list", "physics_butt_updown_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH)); + addEntry(SUBPART_PHYSICS_BUTT_LEFTRIGHT, new SubpartEntry(SUBPART_PHYSICS_BUTT_LEFTRIGHT, "mTorso", "physics_butt_leftright", "physics_butt_leftright_param_list", "physics_butt_leftright_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH)); } LLEditWearableDictionary::SubpartEntry::SubpartEntry(ESubpart part, diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index fd83f4d482..e6fe6fe924 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -244,12 +244,12 @@ LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter controller["Mass"] = "Breast_Physics_Mass"; controller["Smoothing"] = "Breast_Physics_Smoothing"; controller["Gravity"] = "Breast_Physics_Gravity"; - controller["Damping"] = "Breast_Physics_Side_Damping"; - controller["Drag"] = "Breast_Physics_Side_Drag"; - controller["MaxSpeed"] = "Breast_Physics_Side_Max_Velocity"; - controller["Spring"] = "Breast_Physics_Side_Spring"; - controller["Gain"] = "Breast_Physics_Side_Gain"; - LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_Side_Controller", + controller["Damping"] = "Breast_Physics_InOut_Damping"; + controller["Drag"] = "Breast_Physics_InOut_Drag"; + controller["MaxSpeed"] = "Breast_Physics_InOut_Max_Velocity"; + controller["Spring"] = "Breast_Physics_InOut_Spring"; + controller["Gain"] = "Breast_Physics_InOut_Gain"; + LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_InOut_Controller", "", "mChest", character, @@ -630,7 +630,7 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) if ((pixel_area > area_for_this_setting) || is_self) { const F32 position_diff_local = llabs(mPositionLastUpdate_local-position_new_local_clamped); - const F32 min_delta = (1.01f-lod_factor)*0.75f; // 75% is just an experimental magic number. + const F32 min_delta = (1.01f-lod_factor)*0.5f; // 75% is just an experimental magic number. if (llabs(position_diff_local) > min_delta) { update_visuals = TRUE; diff --git a/indra/newview/skins/default/xui/en/panel_edit_physics.xml b/indra/newview/skins/default/xui/en/panel_edit_physics.xml index 6e89a8cb1a..94cb68abbc 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_physics.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_physics.xml @@ -22,9 +22,8 @@ top_pad="10" width="313"> <accordion - fit_parent="true" follows="all" - height ="300" + height ="388" layout="topleft" left="0" single_expansion="true" @@ -35,13 +34,27 @@ layout="topleft" fit_panel="false" min_height="50" - name="physics_breasts_tab" - title="Breasts"> + name="physics_breasts_updown_tab" + title="Breasts Bounce"> <scrolling_panel_list follows="all" layout="topleft" left="0" - name="physics_breasts_param_list" + name="physics_breasts_updown_param_list" + top="0" + width="303" /> + </accordion_tab> + <accordion_tab + layout="topleft" + fit_panel="false" + min_height="50" + name="physics_breasts_inout_tab" + title="Breasts Cleavage"> + <scrolling_panel_list + follows="all" + layout="topleft" + left="0" + name="physics_breasts_inout_param_list" top="0" width="303" /> </accordion_tab> @@ -50,12 +63,12 @@ fit_panel="false" min_height="50" name="physics_belly_tab" - title="Belly"> + title="Belly Bounce"> <scrolling_panel_list follows="all" layout="topleft" left="0" - name="physics_belly_param_list" + name="physics_belly_updown_param_list" top="0" width="303" /> </accordion_tab> @@ -65,12 +78,27 @@ fit_panel="false" min_height="50" name="physics_butt_tab" - title="Butt"> + title="Butt Bounce"> + <scrolling_panel_list + follows="all" + layout="topleft" + left="0" + name="physics_butt_updown_param_list" + top="0" + width="303" /> + </accordion_tab> + + <accordion_tab + layout="topleft" + fit_panel="false" + min_height="50" + name="physics_butt_leftright_tab" + title="Butt Sway"> <scrolling_panel_list follows="all" layout="topleft" left="0" - name="physics_butt_param_list" + name="physics_butt_leftright_param_list" top="0" width="303" /> </accordion_tab> diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index e12f7c679e..88b5eb7e23 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2501,7 +2501,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="Bow Legged">Bow Legged</string> <string name="Breast Physics UpDown Controller">Breast Buoyancy</string> -<string name="Breast Physics Side Controller">Breast Cleavage</string> +<string name="Breast Physics InOut Controller">Breast Cleavage</string> <string name="Breast Size">Breast Size</string> <string name="Bridge Width">Bridge Width</string> <string name="Broad">Broad</string> @@ -2511,42 +2511,47 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="Bulbous">Bulbous</string> <string name="Bulbous Nose">Bulbous Nose</string> -<string name="Breast Physics Mass">Breast Mass</string> -<string name="Breast Physics Smoothing">Breast Smoothing</string> -<string name="Breast Physics Gravity">Breast Gravity</string> -<string name="Breast Physics Side Spring">Breast Side Spring</string> -<string name="Breast Physics Side Gain">Breast Side Gain</string> -<string name="Breast Physics Side Damping">Breast Side Damping</string> -<string name="Breast Physics Side Drag">Breast Side Drag</string> -<string name="Breast Physics Side Max Speed">Breast Side Max Speed</string> -<string name="Breast Physics UpDown Spring">Breast UpDown Spring</string> -<string name="Breast Physics UpDown Gain">Breast UpDown Gain</string> -<string name="Breast Physics UpDown Damping">Breast UpDown Damping</string> -<string name="Breast Physics UpDown Drag">Breast UpDown Drag</string> -<string name="Breast Physics UpDown Max Speed">Breast UpDown Max Speed</string> - -<string name="Belly Physics Mass">Belly Mass</string> -<string name="Belly Physics Smoothing">Belly Smoothing</string> -<string name="Belly Physics Gravity">Belly Gravity</string> -<string name="Belly Physics UpDown Spring">Belly UpDown Spring</string> -<string name="Belly Physics UpDown Gain">Belly UpDown Gain</string> -<string name="Belly Physics UpDown Damping">Belly UpDown Damping</string> -<string name="Belly Physics UpDown Drag">Belly UpDown Drag</string> -<string name="Belly Physics UpDown Max Speed">Belly UpDown Max Speed</string> +<string name="Breast Physics Mass">Mass</string> +<string name="Breast Physics Smoothing">Smoothing</string> +<string name="Breast Physics Gravity">Gravity</string> + +<string name="Breast Physics InOut Max Speed">Max Effect</string> +<string name="Breast Physics InOut Spring">Spring</string> +<string name="Breast Physics InOut Gain">Gain</string> +<string name="Breast Physics InOut Damping">Damping</string> +<string name="Breast Physics InOut Drag">Drag</string> + +<string name="Breast Physics UpDown Max Speed">Max Effect</string> +<string name="Breast Physics UpDown Spring">Spring</string> +<string name="Breast Physics UpDown Gain">Gain</string> +<string name="Breast Physics UpDown Damping">Damping</string> +<string name="Breast Physics UpDown Drag">Drag</string> + +<string name="Belly Physics Mass">Mass</string> +<string name="Belly Physics Smoothing">Smoothing</string> +<string name="Belly Physics Gravity">Gravity</string> + +<string name="Belly Physics UpDown Max Speed">Max Effect</string> +<string name="Belly Physics UpDown Spring">Spring</string> +<string name="Belly Physics UpDown Gain">Gain</string> +<string name="Belly Physics UpDown Damping">Damping</string> +<string name="Belly Physics UpDown Drag">Drag</string> <string name="Butt Physics Mass">Butt Mass</string> <string name="Butt Physics Smoothing">Butt Smoothing</string> <string name="Butt Physics Gravity">Butt Gravity</string> -<string name="Butt Physics UpDown Spring">Butt UpDown Spring</string> -<string name="Butt Physics UpDown Gain">Butt UpDown Gain</string> -<string name="Butt Physics UpDown Damping">Butt UpDown Damping</string> -<string name="Butt Physics UpDown Drag">Butt UpDown Drag</string> -<string name="Butt Physics UpDown Max Speed">Butt UpDown Max Speed</string> -<string name="Butt Physics LeftRight Spring">Butt LeftRight Spring</string> -<string name="Butt Physics LeftRight Gain">Butt LeftRight Gain</string> -<string name="Butt Physics LeftRight Damping">Butt LeftRight Damping</string> -<string name="Butt Physics LeftRight Drag">Butt LeftRight Drag</string> -<string name="Butt Physics LeftRight Max Speed">Butt LeftRight Max Speed</string> + +<string name="Butt Physics UpDown Max Speed">Max Effect</string> +<string name="Butt Physics UpDown Spring">Spring</string> +<string name="Butt Physics UpDown Gain">Gain</string> +<string name="Butt Physics UpDown Damping">Damping</string> +<string name="Butt Physics UpDown Drag">Drag</string> + +<string name="Butt Physics LeftRight Max Speed">Max Effect</string> +<string name="Butt Physics LeftRight Spring">Spring</string> +<string name="Butt Physics LeftRight Gain">Gain</string> +<string name="Butt Physics LeftRight Damping">Damping</string> +<string name="Butt Physics LeftRight Drag">Drag</string> <string name="Bushy Eyebrows">Bushy Eyebrows</string> <string name="Bushy Hair">Bushy Hair</string> -- cgit v1.2.3 From 90b6b7e1b70a9bc8eb5def793616149fa0fceb4d Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Thu, 31 Mar 2011 11:38:34 -0400 Subject: Created Advanced Physics panel. Made a bunch of aesthetic changes to physics panel accordion. --- indra/newview/character/avatar_lad.xml | 28 +++++------ indra/newview/llpaneleditwearable.cpp | 8 +-- .../skins/default/xui/en/panel_edit_physics.xml | 58 ++++++++++++++-------- .../default/xui/en/panel_scrolling_param_base.xml | 13 ++--- indra/newview/skins/default/xui/en/strings.xml | 22 ++++---- 5 files changed, 74 insertions(+), 55 deletions(-) diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index a7e529adff..4585ba658c 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -11775,7 +11775,7 @@ render_pass="bump"> name="Breast_Physics_Mass" label="Breast Physics Mass" wearable="physics" - edit_group="physics_breasts_updown" + edit_group="physics_advanced" value_default=".1" value_min=".1" value_max="1"> @@ -11788,7 +11788,7 @@ render_pass="bump"> name="Breast_Physics_Smoothing" label="Breast Physics Smoothing" wearable="physics" - edit_group="physics_breasts_updown" + edit_group="physics_advanced" value_default="2" value_min="1" value_max="10"> @@ -11801,7 +11801,7 @@ render_pass="bump"> name="Breast_Physics_Gravity" label="Breast Physics Gravity" wearable="physics" - edit_group="physics_breasts_updown" + edit_group="physics_advanced" value_default="0" value_min="0" value_max=".1"> @@ -11869,7 +11869,7 @@ render_pass="bump"> name="Breast_Physics_UpDown_Drag" label="Breast Physics UpDown Drag" wearable="physics" - edit_group="physics_breasts_updown" + edit_group="physics_advanced" value_default=".15" value_min="0" value_max=".5"> @@ -11935,7 +11935,7 @@ render_pass="bump"> name="Breast_Physics_InOut_Drag" label="Breast Physics InOut Drag" wearable="physics" - edit_group="physics_breasts_inout" + edit_group="physics_advanced" value_default=".15" value_min="0" value_max=".5"> @@ -11948,7 +11948,7 @@ render_pass="bump"> name="Belly_Physics_Mass" label="Belly Physics Mass" wearable="physics" - edit_group="physics_belly_updown" + edit_group="physics_advanced" value_default=".1" value_min=".1" value_max="1"> @@ -11960,7 +11960,7 @@ render_pass="bump"> name="Belly_Physics_Smoothing" label="Belly Physics Smoothing" wearable="physics" - edit_group="physics_belly_updown" + edit_group="physics_advanced" value_default="2" value_min="1" value_max="10"> @@ -11972,7 +11972,7 @@ render_pass="bump"> name="Belly_Physics_Gravity" label="Belly Physics Gravity" wearable="physics" - edit_group="physics_belly_updown" + edit_group="physics_advanced" value_default="0" value_min="0" value_max=".1"> @@ -12032,7 +12032,7 @@ render_pass="bump"> name="Belly_Physics_UpDown_Drag" label="Belly Physics UpDown Drag" wearable="physics" - edit_group="physics_belly_updown" + edit_group="physics_advanced" value_default=".15" value_min="0" value_max=".5"> @@ -12045,7 +12045,7 @@ render_pass="bump"> name="Butt_Physics_Mass" label="Butt Physics Mass" wearable="physics" - edit_group="physics_butt_updown" + edit_group="physics_advanced" value_default=".1" value_min=".1" value_max="1"> @@ -12057,7 +12057,7 @@ render_pass="bump"> name="Butt_Physics_Smoothing" label="Butt Physics Smoothing" wearable="physics" - edit_group="physics_butt_updown" + edit_group="physics_advanced" value_default="2" value_min="1" value_max="10"> @@ -12069,7 +12069,7 @@ render_pass="bump"> name="Butt_Physics_Gravity" label="Butt Physics Gravity" wearable="physics" - edit_group="physics_butt_updown" + edit_group="physics_advanced" value_default="0" value_min="0" value_max=".1"> @@ -12129,7 +12129,7 @@ render_pass="bump"> name="Butt_Physics_UpDown_Drag" label="Butt Physics UpDown Drag" wearable="physics" - edit_group="physics_butt_updown" + edit_group="physics_advanced" value_default=".15" value_min="0" value_max=".5"> @@ -12190,7 +12190,7 @@ render_pass="bump"> name="Butt_Physics_LeftRight_Drag" label="Butt Physics LeftRight Drag" wearable="physics" - edit_group="physics_butt_leftright" + edit_group="physics_advanced" value_default=".15" value_min="0" value_max=".5"> diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp index a7ee5a03b7..4db9a154ea 100644 --- a/indra/newview/llpaneleditwearable.cpp +++ b/indra/newview/llpaneleditwearable.cpp @@ -99,7 +99,8 @@ enum ESubpart { SUBPART_PHYSICS_BREASTS_INOUT, SUBPART_PHYSICS_BELLY_UPDOWN, SUBPART_PHYSICS_BUTT_UPDOWN, - SUBPART_PHYSICS_BUTT_LEFTRIGHT + SUBPART_PHYSICS_BUTT_LEFTRIGHT, + SUBPART_PHYSICS_ADVANCED, }; using namespace LLVOAvatarDefines; @@ -238,7 +239,7 @@ LLEditWearableDictionary::Wearables::Wearables() addEntry(LLWearableType::WT_SKIRT, new WearableEntry(LLWearableType::WT_SKIRT,"edit_skirt_title","skirt_desc_text",1,1,1, TEX_SKIRT, TEX_SKIRT, SUBPART_SKIRT)); addEntry(LLWearableType::WT_ALPHA, new WearableEntry(LLWearableType::WT_ALPHA,"edit_alpha_title","alpha_desc_text",0,5,1, TEX_LOWER_ALPHA, TEX_UPPER_ALPHA, TEX_HEAD_ALPHA, TEX_EYES_ALPHA, TEX_HAIR_ALPHA, SUBPART_ALPHA)); addEntry(LLWearableType::WT_TATTOO, new WearableEntry(LLWearableType::WT_TATTOO,"edit_tattoo_title","tattoo_desc_text",1,3,1, TEX_HEAD_TATTOO, TEX_LOWER_TATTOO, TEX_UPPER_TATTOO, TEX_HEAD_TATTOO, SUBPART_TATTOO)); - addEntry(LLWearableType::WT_PHYSICS, new WearableEntry(LLWearableType::WT_PHYSICS,"edit_physics_title","physics_desc_text",0,0,5, SUBPART_PHYSICS_BREASTS_UPDOWN, SUBPART_PHYSICS_BREASTS_INOUT, SUBPART_PHYSICS_BELLY_UPDOWN, SUBPART_PHYSICS_BUTT_UPDOWN, SUBPART_PHYSICS_BUTT_LEFTRIGHT)); + addEntry(LLWearableType::WT_PHYSICS, new WearableEntry(LLWearableType::WT_PHYSICS,"edit_physics_title","physics_desc_text",0,0,6, SUBPART_PHYSICS_BREASTS_UPDOWN, SUBPART_PHYSICS_BREASTS_INOUT, SUBPART_PHYSICS_BELLY_UPDOWN, SUBPART_PHYSICS_BUTT_UPDOWN, SUBPART_PHYSICS_BUTT_LEFTRIGHT, SUBPART_PHYSICS_ADVANCED)); } LLEditWearableDictionary::WearableEntry::WearableEntry(LLWearableType::EType type, @@ -313,7 +314,8 @@ LLEditWearableDictionary::Subparts::Subparts() addEntry(SUBPART_PHYSICS_BREASTS_INOUT, new SubpartEntry(SUBPART_PHYSICS_BREASTS_INOUT, "mTorso", "physics_breasts_inout", "physics_breasts_inout_param_list", "physics_breasts_inout_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_FEMALE)); addEntry(SUBPART_PHYSICS_BELLY_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BELLY_UPDOWN, "mTorso", "physics_belly_updown", "physics_belly_updown_param_list", "physics_belly_updown_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH)); addEntry(SUBPART_PHYSICS_BUTT_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BUTT_UPDOWN, "mTorso", "physics_butt_updown", "physics_butt_updown_param_list", "physics_butt_updown_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH)); - addEntry(SUBPART_PHYSICS_BUTT_LEFTRIGHT, new SubpartEntry(SUBPART_PHYSICS_BUTT_LEFTRIGHT, "mTorso", "physics_butt_leftright", "physics_butt_leftright_param_list", "physics_butt_leftright_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH)); + addEntry(SUBPART_PHYSICS_BUTT_LEFTRIGHT, new SubpartEntry(SUBPART_PHYSICS_BUTT_LEFTRIGHT, "mTorso", "physics_butt_leftright", "physics_butt_leftright_param_list", "physics_butt_leftright_tab", LLVector3d(0.f, 0.f, 0.f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH)); + addEntry(SUBPART_PHYSICS_ADVANCED, new SubpartEntry(SUBPART_PHYSICS_ADVANCED, "mTorso", "physics_advanced", "physics_advanced_param_list", "physics_advanced_tab", LLVector3d(0.f, 0.f, 0.f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH)); } LLEditWearableDictionary::SubpartEntry::SubpartEntry(ESubpart part, diff --git a/indra/newview/skins/default/xui/en/panel_edit_physics.xml b/indra/newview/skins/default/xui/en/panel_edit_physics.xml index 94cb68abbc..c6f974f4f1 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_physics.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_physics.xml @@ -8,98 +8,114 @@ name="edit_physics_panel" top_pad="10" width="333" > - <panel + <panel border="false" bg_alpha_color="DkGray2" bg_opaque_color="DkGray2" background_visible="true" background_opaque="true" follows="all" - height="300" + height="388" + label="" layout="topleft" - left="10" + left="10" name="accordion_panel" - top_pad="10" + top_pad="0" width="313"> <accordion follows="all" height ="388" layout="topleft" left="0" - single_expansion="true" + single_expansion="true" + fit_parent="true" name="physics_accordion" top="0" width="313"> <accordion_tab layout="topleft" - fit_panel="false" + fit_panel="false" min_height="50" name="physics_breasts_updown_tab" title="Breasts Bounce"> <scrolling_panel_list follows="all" - layout="topleft" - left="0" + layout="topleft" + left="10" name="physics_breasts_updown_param_list" - top="0" + top="10" width="303" /> </accordion_tab> <accordion_tab layout="topleft" - fit_panel="false" + fit_panel="false" min_height="50" name="physics_breasts_inout_tab" title="Breasts Cleavage"> <scrolling_panel_list follows="all" - layout="topleft" + layout="topleft" left="0" name="physics_breasts_inout_param_list" - top="0" + top_pad="50" width="303" /> </accordion_tab> <accordion_tab layout="topleft" - fit_panel="false" + fit_panel="false" min_height="50" name="physics_belly_tab" title="Belly Bounce"> <scrolling_panel_list follows="all" - layout="topleft" + layout="topleft" left="0" name="physics_belly_updown_param_list" - top="0" + top_pad="40" width="303" /> </accordion_tab> <accordion_tab layout="topleft" - fit_panel="false" + fit_panel="false" min_height="50" name="physics_butt_tab" title="Butt Bounce"> <scrolling_panel_list follows="all" - layout="topleft" + layout="topleft" left="0" name="physics_butt_updown_param_list" - top="0" + top_pad="30" width="303" /> </accordion_tab> <accordion_tab layout="topleft" - fit_panel="false" + fit_panel="false" min_height="50" name="physics_butt_leftright_tab" title="Butt Sway"> <scrolling_panel_list follows="all" - layout="topleft" + layout="topleft" left="0" name="physics_butt_leftright_param_list" - top="0" + top_pad="20" + width="303" /> + </accordion_tab> + <accordion_tab + layout="topleft" + fit_panel="false" + min_height="50" + name="physics_advanced_tab" + title="Advanced Parameters"> + <scrolling_panel_list + follows="all" + layout="topleft" + left="0" + name="physics_advanced_param_list" + top_pad="10" width="303" /> </accordion_tab> </accordion> diff --git a/indra/newview/skins/default/xui/en/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/en/panel_scrolling_param_base.xml index 177a2fe9f0..1351f75623 100644 --- a/indra/newview/skins/default/xui/en/panel_scrolling_param_base.xml +++ b/indra/newview/skins/default/xui/en/panel_scrolling_param_base.xml @@ -3,21 +3,22 @@ layout="topleft" left="0" name="LLScrollingPanelParamBase" - height="20" + height="16" width="290"> <slider can_edit_text="true" decimal_digits="0" enabled="false" - height="16" + height="12" increment="1" initial_value="0" label="[DESC]" + label_width="125" layout="bottom|left" - left="6" + left="16" max_val="100" name="param slider" - bottom="1" - width="274" - slider_label.font.style="BOLD" /> + bottom="0" + width="264" + /> </panel> diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 88b5eb7e23..6f03606869 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2511,31 +2511,31 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="Bulbous">Bulbous</string> <string name="Bulbous Nose">Bulbous Nose</string> -<string name="Breast Physics Mass">Mass</string> -<string name="Breast Physics Smoothing">Smoothing</string> -<string name="Breast Physics Gravity">Gravity</string> +<string name="Breast Physics Mass">Breast Mass</string> +<string name="Breast Physics Smoothing">Breast Smoothing</string> +<string name="Breast Physics Gravity">Breast Gravity</string> <string name="Breast Physics InOut Max Speed">Max Effect</string> <string name="Breast Physics InOut Spring">Spring</string> <string name="Breast Physics InOut Gain">Gain</string> <string name="Breast Physics InOut Damping">Damping</string> -<string name="Breast Physics InOut Drag">Drag</string> +<string name="Breast Physics InOut Drag">Breast Cleavage Drag</string> <string name="Breast Physics UpDown Max Speed">Max Effect</string> <string name="Breast Physics UpDown Spring">Spring</string> <string name="Breast Physics UpDown Gain">Gain</string> <string name="Breast Physics UpDown Damping">Damping</string> -<string name="Breast Physics UpDown Drag">Drag</string> +<string name="Breast Physics UpDown Drag">Breast Bounce Drag</string> -<string name="Belly Physics Mass">Mass</string> -<string name="Belly Physics Smoothing">Smoothing</string> -<string name="Belly Physics Gravity">Gravity</string> +<string name="Belly Physics Mass">Belly Mass</string> +<string name="Belly Physics Smoothing">Belly Smoothing</string> +<string name="Belly Physics Gravity">Belly Gravity</string> <string name="Belly Physics UpDown Max Speed">Max Effect</string> <string name="Belly Physics UpDown Spring">Spring</string> <string name="Belly Physics UpDown Gain">Gain</string> <string name="Belly Physics UpDown Damping">Damping</string> -<string name="Belly Physics UpDown Drag">Drag</string> +<string name="Belly Physics UpDown Drag">Belly Bounce Drag</string> <string name="Butt Physics Mass">Butt Mass</string> <string name="Butt Physics Smoothing">Butt Smoothing</string> @@ -2545,13 +2545,13 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="Butt Physics UpDown Spring">Spring</string> <string name="Butt Physics UpDown Gain">Gain</string> <string name="Butt Physics UpDown Damping">Damping</string> -<string name="Butt Physics UpDown Drag">Drag</string> +<string name="Butt Physics UpDown Drag">Butt Bounce Drag</string> <string name="Butt Physics LeftRight Max Speed">Max Effect</string> <string name="Butt Physics LeftRight Spring">Spring</string> <string name="Butt Physics LeftRight Gain">Gain</string> <string name="Butt Physics LeftRight Damping">Damping</string> -<string name="Butt Physics LeftRight Drag">Drag</string> +<string name="Butt Physics LeftRight Drag">Butt Sway Drag</string> <string name="Bushy Eyebrows">Bushy Eyebrows</string> <string name="Bushy Hair">Bushy Hair</string> -- cgit v1.2.3 From 926e506d0ad67e4ba9370efae60f5641c932b672 Mon Sep 17 00:00:00 2001 From: Andrew de Laix <alain@lindenlab.com> Date: Thu, 31 Mar 2011 16:17:12 +0000 Subject: d'oh, forgot to add back some q libs to the build when reverting to older linux package; here they are. --- indra/cmake/WebKitLibPlugin.cmake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/indra/cmake/WebKitLibPlugin.cmake b/indra/cmake/WebKitLibPlugin.cmake index b599982afb..0f5a81c020 100644 --- a/indra/cmake/WebKitLibPlugin.cmake +++ b/indra/cmake/WebKitLibPlugin.cmake @@ -67,6 +67,8 @@ elseif (LINUX) QtNetwork QtGui QtCore + qgif + qjpeg jpeg fontconfig X11 -- cgit v1.2.3 From f18c2b6dd80f6240478902fdb81d3ae1eb8e21b5 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Thu, 31 Mar 2011 12:24:08 -0400 Subject: Took out avatar physics demo code that was disabling camera reset on avatar movement. --- indra/newview/llagentcamera.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index 4118b1df98..f01d5ff1f5 100644 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -277,7 +277,6 @@ LLAgentCamera::~LLAgentCamera() //----------------------------------------------------------------------------- void LLAgentCamera::resetView(BOOL reset_camera, BOOL change_camera) { - if (TRUE) return; // Disabling reset for avatar physics demo-ing. if (gAgent.getAutoPilot()) { gAgent.stopAutoPilot(TRUE); -- cgit v1.2.3 From 54137df1489d7d25630fe141821904b7bc73c83f Mon Sep 17 00:00:00 2001 From: Paul ProductEngine <pguslisty@productengine.com> Date: Thu, 31 Mar 2011 21:03:41 +0300 Subject: STORM-1110 FIXED Remove old 1.23 purple text from alerts, anywhere else it appears - Removed code setting purple color - Removed "AlertTextColor" color as it's no longer needed --- indra/newview/lltoastalertpanel.cpp | 5 ----- indra/newview/skins/default/colors.xml | 3 --- 2 files changed, 8 deletions(-) diff --git a/indra/newview/lltoastalertpanel.cpp b/indra/newview/lltoastalertpanel.cpp index 8b2f066d41..0f337825e9 100644 --- a/indra/newview/lltoastalertpanel.cpp +++ b/indra/newview/lltoastalertpanel.cpp @@ -220,7 +220,6 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal } static LLUIColor alert_caution_text_color = LLUIColorTable::instance().getColor("AlertCautionTextColor"); - static LLUIColor alert_text_color = LLUIColorTable::instance().getColor("AlertTextColor"); if (mCaution) { LLIconCtrl* icon = LLUICtrlFactory::getInstance()->createFromFile<LLIconCtrl>("alert_icon.xml", this, LLPanel::child_registry_t::instance()); @@ -233,10 +232,6 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal msg_x += 32 + HPAD; msg_box->setColor( alert_caution_text_color ); } - else - { - msg_box->setColor( alert_text_color ); - } LLRect rect; rect.setLeftTopAndSize( msg_x, msg_y, text_rect.getWidth(), text_rect.getHeight() ); diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml index 75aec21f93..72a4dd7f63 100644 --- a/indra/newview/skins/default/colors.xml +++ b/indra/newview/skins/default/colors.xml @@ -114,9 +114,6 @@ <color name="AlertCautionTextColor" reference="LtYellow" /> - <color - name="AlertTextColor" - value="0.58 0.66 0.84 1" /> <color name="AvatarListItemIconDefaultColor" reference="White" /> -- cgit v1.2.3 From 107ca5d7c8f7a511e6606a91930b893edbfe884e Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Thu, 31 Mar 2011 15:41:01 -0400 Subject: Simple fix for out-of-bounds parameter issues. --- indra/newview/llphysicsmotion.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index e6fe6fe924..157d13e1a4 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -482,12 +482,13 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) F32 behavior_maxspeed = getParamValue("MaxSpeed"); if (physics_test) behavior_maxspeed = 100.0f; - /* + if (behavior_maxspeed == 0) return FALSE; - */ - F32 position_current_local = mPosition_local; // Normalized [0,1] range + F32 position_current_local = llclamp(mPosition_local, + 0.0f, + 1.0f); // Normalized [0,1] range // Normalize the param position to be from [0,1]. // We have to use normalized values because there may be more than one driven param, -- cgit v1.2.3 From ba0c369aa20cdbfd7940a2435dd3c6630f0d54ae Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Thu, 31 Mar 2011 15:56:33 -0400 Subject: Tweaking of avatar physics detail slider. --- indra/newview/llphysicsmotion.cpp | 2 +- .../skins/default/xui/en/panel_preferences_graphics1.xml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 157d13e1a4..73de1cef3f 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -631,7 +631,7 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) if ((pixel_area > area_for_this_setting) || is_self) { const F32 position_diff_local = llabs(mPositionLastUpdate_local-position_new_local_clamped); - const F32 min_delta = (1.01f-lod_factor)*0.5f; // 75% is just an experimental magic number. + const F32 min_delta = (1.01f-lod_factor)*0.4f; if (llabs(position_diff_local) > min_delta) { update_visuals = TRUE; diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml index 6904cfa50e..d74197d965 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml @@ -331,16 +331,16 @@ control_name="RenderAvatarPhysicsLODFactor" follows="left|top" height="16" - increment="0.125" - initial_value="160" + initial_value="100" + increment=".05" label=" Avatar Physics:" label_width="85" layout="topleft" - left_delta="-6" + left_delta="-16" name="AvatarPhysicsDetail" show_text="false" top_pad="12" - width="154"> + width="160"> <slider.commit_callback function="Pref.UpdateSliderText" parameter="AvatarPhysicsDetailText" /> @@ -351,7 +351,7 @@ follows="left|top" height="12" layout="topleft" - left_delta="160" + left_delta="165" name="AvatarPhysicsDetailText" top_pad="-16" width="128"> -- cgit v1.2.3 From c9c192e2c476e73807d23cdda0814cb221a96b95 Mon Sep 17 00:00:00 2001 From: "Twisted Laws twisted_laws@hotmail.com" <Twisted Laws twisted_laws@hotmail.com> Date: Thu, 31 Mar 2011 16:46:25 -0400 Subject: Storm 954 - corrected use of braces --- indra/newview/llworld.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index 8ace747d60..6a2b4cf0a5 100644 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -1469,9 +1469,13 @@ void LLWorld::getAvatars(uuid_vec_t* avatar_ids, std::vector<LLVector3d>* positi if(dist_vec(pos_global, relative_to) <= radius) { if(positions != NULL) + { positions->push_back(pos_global); + } if(avatar_ids !=NULL) + { avatar_ids->push_back(uuid); + } } } } -- cgit v1.2.3 From e952f77a505cf274ca0b3ea95b504a51e757806a Mon Sep 17 00:00:00 2001 From: Dessie Linden <dessie@lindenlab.com> Date: Thu, 31 Mar 2011 14:11:55 -0700 Subject: Added tag DRTVWR-45_2.6.2-beta1, 2.6.2-beta1 for changeset d1203046bb65 --- .hgtags | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.hgtags b/.hgtags index 4983b7f300..c9be75621f 100644 --- a/.hgtags +++ b/.hgtags @@ -89,3 +89,5 @@ c5bdef3aaa2744626aef3c217ce29e1900d357b3 2.6.1-beta1 9e4641f4a7870c0f565a25a2971368d5a29516a1 DRTVWR-41_2.6.0-beta2 9e4641f4a7870c0f565a25a2971368d5a29516a1 2.6.0-beta2 56b2778c743c2a964d82e1caf11084d76a87de2c 2.6.2-start +d1203046bb653b763f835b04d184646949d8dd5c DRTVWR-45_2.6.2-beta1 +d1203046bb653b763f835b04d184646949d8dd5c 2.6.2-beta1 -- cgit v1.2.3 From 44ad672b9e0a5ba1eef3ef7c71da3eb887f4fe0a Mon Sep 17 00:00:00 2001 From: "Christian Goetze (CG)" <cg@lindenlab.com> Date: Thu, 31 Mar 2011 15:43:47 -0700 Subject: Apply server side code to message template verification onto the viewer tree. --- build.sh | 5 ++++- indra/cmake/TemplateCheck.cmake | 2 +- indra/cmake/Variables.cmake | 2 ++ scripts/template_verifier.py | 2 +- 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/build.sh b/build.sh index 1c28f5a255..92c2222c73 100755 --- a/build.sh +++ b/build.sh @@ -53,6 +53,8 @@ pre_build() local build_dir="$2" begin_section "Pre$variant" #export PATH="/cygdrive/c/Program Files/Microsoft Visual Studio 8/Common7/IDE/:$PATH" + [ -n "$master_message_template_checkout" ] && [ -r "$master_message_template_checkout/message_template.msg" ]\ + && template_verifier_master_url="-DTEMPLATE_VERIFIER_MASTER_URL=file://$master_message_template_checkout/message_template.msg" python develop.py \ --incredibuild \ --unattended \ @@ -67,7 +69,8 @@ pre_build() -DLOCALIZESETUP:BOOL=ON \ -DPACKAGE:BOOL=ON \ -DCMAKE_VERBOSE_MAKEFILE:BOOL=TRUE \ - -DLL_TESTS:BOOL="$run_tests" + -DLL_TESTS:BOOL="$run_tests" \ + -DTEMPLATE_VERIFIER_OPTIONS:STRING="$template_verifier_options" $template_verifier_master_url end_section "Pre$variant" } diff --git a/indra/cmake/TemplateCheck.cmake b/indra/cmake/TemplateCheck.cmake index 24805b4214..2fada2eda9 100644 --- a/indra/cmake/TemplateCheck.cmake +++ b/indra/cmake/TemplateCheck.cmake @@ -8,7 +8,7 @@ macro (check_message_template _target) PRE_LINK COMMAND ${PYTHON_EXECUTABLE} ARGS ${SCRIPTS_DIR}/template_verifier.py - --mode=development --cache_master ${TEMPLATE_VERIFIER_OPTIONS} + --mode=development --cache_master --master_url=${TEMPLATE_VERIFIER_MASTER_URL} ${TEMPLATE_VERIFIER_OPTIONS} COMMENT "Verifying message template - See http://wiki.secondlife.com/wiki/Template_verifier.py" ) endmacro (check_message_template) diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake index 5dc0cabf03..0d7156b91d 100644 --- a/indra/cmake/Variables.cmake +++ b/indra/cmake/Variables.cmake @@ -41,6 +41,8 @@ if (EXISTS ${CMAKE_SOURCE_DIR}/Server.cmake) set(INSTALL_PROPRIETARY ON CACHE BOOL "Install proprietary binaries") endif (EXISTS ${CMAKE_SOURCE_DIR}/Server.cmake) +set(TEMPLATE_VERIFIER_OPTIONS "" CACHE STRING "Options for scripts/template_verifier.py") +set(TEMPLATE_VERIFIER_MASTER_URL "http://bitbucket.org/lindenlab/master-message-template/raw/tip/message_template.msg" CACHE STRING "Location of the master message template") if (${CMAKE_SYSTEM_NAME} MATCHES "Windows") set(WINDOWS ON BOOL FORCE) diff --git a/scripts/template_verifier.py b/scripts/template_verifier.py index 113607e02a..b44410cdd8 100644 --- a/scripts/template_verifier.py +++ b/scripts/template_verifier.py @@ -229,7 +229,7 @@ http://wiki.secondlife.com/wiki/Template_verifier.py """) parser.add_option( '-u', '--master_url', type='string', dest='master_url', - default='http://secondlife.com/app/message_template/master_message_template.msg', + default='http://bitbucket.org/lindenlab/master-message-template/raw/tip/message_template.msg', help="""The url of the master message template.""") parser.add_option( '-c', '--cache_master', action='store_true', dest='cache_master', -- cgit v1.2.3 From 6540ccd307128df192ed728ff5b25c6a6e27050c Mon Sep 17 00:00:00 2001 From: Kelly Washington <kelly@lindenlab.com> Date: Thu, 31 Mar 2011 16:15:48 -0700 Subject: Updated message template hash. --- scripts/messages/message_template.msg.sha1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/messages/message_template.msg.sha1 b/scripts/messages/message_template.msg.sha1 index dcd172cdf6..4b1ba7e2d3 100644 --- a/scripts/messages/message_template.msg.sha1 +++ b/scripts/messages/message_template.msg.sha1 @@ -1 +1 @@ -a7f6fe7e34c9c92b7315c6fb56ad32b8f651d4fb \ No newline at end of file +ee062c94248e9af06df5284f7186893a135084c9 \ No newline at end of file -- cgit v1.2.3 From dc00f42dd7ff59143869e17010ed435db009ae12 Mon Sep 17 00:00:00 2001 From: Merov Linden <merov@lindenlab.com> Date: Thu, 31 Mar 2011 23:00:50 -0700 Subject: STORM-746 : Code formatting and clean up, add comments, no functional changes --- indra/llkdu/llimagej2ckdu.cpp | 404 +++++++++++++++++++++--------------------- indra/llkdu/llkdumem.cpp | 22 +-- indra/llkdu/llkdumem.h | 44 ++--- 3 files changed, 237 insertions(+), 233 deletions(-) diff --git a/indra/llkdu/llimagej2ckdu.cpp b/indra/llkdu/llimagej2ckdu.cpp index 10ea5685e8..61b16c80e6 100644 --- a/indra/llkdu/llimagej2ckdu.cpp +++ b/indra/llkdu/llimagej2ckdu.cpp @@ -34,35 +34,35 @@ class kdc_flow_control { -public: // Member functions - kdc_flow_control(kdu_image_in_base *img_in, kdu_codestream codestream); - ~kdc_flow_control(); - bool advance_components(); - void process_components(); +public: + kdc_flow_control(kdu_image_in_base *img_in, kdu_codestream codestream); + ~kdc_flow_control(); + bool advance_components(); + void process_components(); + +private: -private: // Data - - struct kdc_component_flow_control { - public: // Data - kdu_image_in_base *reader; - int vert_subsampling; - int ratio_counter; /* Initialized to 0, decremented by `count_delta'; + struct kdc_component_flow_control { + public: + kdu_image_in_base *reader; + int vert_subsampling; + int ratio_counter; /* Initialized to 0, decremented by `count_delta'; when < 0, a new line must be processed, after which it is incremented by `vert_subsampling'. */ - int initial_lines; - int remaining_lines; - kdu_line_buf *line; - }; - - kdu_codestream codestream; - kdu_dims valid_tile_indices; - kdu_coords tile_idx; - kdu_tile tile; - int num_components; - kdc_component_flow_control *components; - int count_delta; // Holds the minimum of the `vert_subsampling' fields - kdu_multi_analysis engine; - kdu_long max_buffer_memory; + int initial_lines; + int remaining_lines; + kdu_line_buf *line; + }; + + kdu_codestream codestream; + kdu_dims valid_tile_indices; + kdu_coords tile_idx; + kdu_tile tile; + int num_components; + kdc_component_flow_control *components; + int count_delta; // Holds the minimum of the `vert_subsampling' fields + kdu_multi_analysis engine; + kdu_long max_buffer_memory; }; // @@ -72,7 +72,8 @@ void set_default_colour_weights(kdu_params *siz); const char* engineInfoLLImageJ2CKDU() { - return "KDU v6.4.1"; + std::string version = llformat("KDU %s", KDU_CORE_VERSION); + return version.c_str(); } LLImageJ2CKDU* createLLImageJ2CKDU() @@ -113,8 +114,8 @@ public: kdu_tile_comp mComps[4]; kdu_line_buf mLines[4]; kdu_pull_ifc mEngines[4]; - bool mReversible[4]; // Some components may be reversible and others not. - int mBitDepths[4]; // Original bit-depth may be quite different from 8. + bool mReversible[4]; // Some components may be reversible and others not + int mBitDepths[4]; // Original bit-depth may be quite different from 8 kdu_tile mTile; kdu_byte *mBuf; @@ -153,7 +154,7 @@ class LLKDUMessageError : public kdu_message public: /*virtual*/ void put_text(const char *s); /*virtual*/ void put_text(const kdu_uint16 *s); - /*virtual*/ void flush(bool end_of_message=false); + /*virtual*/ void flush(bool end_of_message = false); static LLKDUMessageError sDefaultMessage; }; @@ -179,7 +180,7 @@ void LLKDUMessageError::put_text(const kdu_uint16 *s) void LLKDUMessageError::flush(bool end_of_message) { - if( end_of_message ) + if (end_of_message) { throw "KDU throwing an exception"; } @@ -210,7 +211,7 @@ void transfer_bytes(kdu_byte *dest, kdu_line_buf &src, int gap, int precision); void LLImageJ2CKDU::setupCodeStream(LLImageJ2C &base, BOOL keep_codestream, ECodeStreamMode mode) { S32 data_size = base.getDataSize(); - S32 max_bytes = base.getMaxBytes() ? base.getMaxBytes() : data_size; + S32 max_bytes = (base.getMaxBytes() ? base.getMaxBytes() : data_size); // // Initialization @@ -247,21 +248,21 @@ void LLImageJ2CKDU::setupCodeStream(LLImageJ2C &base, BOOL keep_codestream, ECod // Set the maximum number of bytes to use from the codestream mCodeStreamp->set_max_bytes(max_bytes); - // If you want to flip or rotate the image for some reason, change + // If you want to flip or rotate the image for some reason, change // the resolution, or identify a restricted region of interest, this is // the place to do it. You may use "kdu_codestream::change_appearance" // and "kdu_codestream::apply_input_restrictions" for this purpose. - // If you wish to truncate the code-stream prior to decompression, you + // If you wish to truncate the code-stream prior to decompression, you // may use "kdu_codestream::set_max_bytes". - // If you wish to retain all compressed data so that the material + // If you wish to retain all compressed data so that the material // can be decompressed multiple times, possibly with different appearance // parameters, you should call "kdu_codestream::set_persistent" here. - // There are a variety of other features which must be enabled at + // There are a variety of other features which must be enabled at // this point if you want to take advantage of them. See the // descriptions appearing with the "kdu_codestream" interface functions // in "kdu_compressed.h" for an itemized account of these capabilities. - switch( mode ) + switch (mode) { case MODE_FAST: mCodeStreamp->set_fast(); @@ -343,7 +344,7 @@ BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco kdu_dims dims; mCodeStreamp->get_dims(0,dims); S32 channels = base.getComponents() - first_channel; - if( channels > max_channel_count ) + if (channels > max_channel_count) { channels = max_channel_count; } @@ -426,7 +427,7 @@ BOOL LLImageJ2CKDU::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco // canvas coordinate system. Comparing the two tells // us where the current tile is in the buffer. S32 channels = base.getComponents() - first_channel; - if( channels > max_channel_count ) + if (channels > max_channel_count) { channels = max_channel_count; } @@ -452,14 +453,14 @@ BOOL LLImageJ2CKDU::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco return FALSE; } } - catch( const char* msg ) + catch (const char* msg) { base.setLastError(ll_safe_string(msg)); base.decodeFailed(); cleanupCodeStream(); return TRUE; // done } - catch( ... ) + catch (...) { base.setLastError( "Unknown J2C error" ); base.decodeFailed(); @@ -482,28 +483,17 @@ BOOL LLImageJ2CKDU::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time, BOOL reversible) { - // Collect simple arguments. - bool transpose, vflip, hflip; - bool allow_rate_prediction, mem, quiet, no_weights; - int cpu_iterations; - std::ostream *record_stream; - - transpose = false; - record_stream = NULL; - allow_rate_prediction = true; - no_weights = false; - cpu_iterations = -1; - mem = false; - quiet = false; - vflip = true; - hflip = false; + // Declare and set simple arguments + bool transpose = false; + bool vflip = true; + bool hflip = false; try { - // Set up input image files. + // Set up input image files siz_params siz; - // Should set rate someplace here. + // Should set rate someplace here LLKDUMemIn mem_in(raw_image.getData(), raw_image.getDataSize(), raw_image.getWidth(), @@ -521,12 +511,12 @@ BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, co siz.set(Sprecision,0,0,8); // Image samples have original bit-depth of 8 siz.set(Ssigned,0,0,false); // Image samples are originally unsigned - kdu_params *siz_ref = &siz; siz_ref->finalize(); - siz_params transformed_siz; // Use this one to construct code-strea + kdu_params *siz_ref = &siz; + siz_ref->finalize(); + siz_params transformed_siz; // Use this one to construct code-stream transformed_siz.copy_from(&siz,-1,-1,-1,0,transpose,false,false); - // Construct the `kdu_codestream' object and parse all remaining arguments. - + // Construct the `kdu_codestream' object and parse all remaining arguments U32 max_output_size = base.getWidth()*base.getHeight()*base.getComponents(); if (max_output_size < 1000) { @@ -538,8 +528,7 @@ BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, co LLKDUMemTarget output(output_buffer, output_size, base.getWidth()*base.getHeight()*base.getComponents()); if (output_size > max_output_size) { - llerrs << llformat("LLImageJ2C::encode output_size(%d) > max_output_size(%d)", - output_size,max_output_size) << llendl; + llerrs << llformat("LLImageJ2C::encode output_size(%d) > max_output_size(%d)", output_size,max_output_size) << llendl; } kdu_codestream codestream; @@ -558,15 +547,18 @@ BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, co kdu_long layer_bytes[64]; U32 max_bytes = 0; - if ((num_components >= 3) && !no_weights) + if (num_components >= 3) { + // Note that we always use YCC and not YUV + // *TODO: Verify this doesn't screws up reversible textures (like sculpties) as YCC is not reversible but YUV is... set_default_colour_weights(codestream.access_siz()); } if (reversible) { - // If we're doing reversible, assume we're not using quality layers. + // If we're doing reversible (i.e. lossless compression), assumes we're not using quality layers. // Yes, I know this is incorrect! + // *TODO: Indeed, this is incorrect and unecessary... Try using the regular layer setting... codestream.access_siz()->parse_string("Creversible=yes"); codestream.access_siz()->parse_string("Clayers=1"); num_layer_specs = 1; @@ -577,6 +569,7 @@ BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, co // Rate is the argument passed into the LLImageJ2C which // specifies the target compression rate. The default is 8:1. // Possibly if max_bytes < 500, we should just use the default setting? + // *TODO: mRate is actually always 8:1 in the viewer. Test different values. Also force to reversible for small (< 500 bytes) textures. if (base.mRate != 0.f) { max_bytes = (U32)(base.mRate*base.getWidth()*base.getHeight()*base.getComponents()); @@ -617,42 +610,39 @@ BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, co codestream.access_siz()->parse_string(layer_string.c_str()); } } + + // *TODO : Add precinct specification here + //std::string precincts_string = llformat("Cprecincts={128,128}"); + //codestream.access_siz()->parse_string(precincts_string.c_str()); + codestream.access_siz()->finalize_all(); - if (cpu_iterations >= 0) - { - codestream.collect_timing_stats(cpu_iterations); - } codestream.change_appearance(transpose,vflip,hflip); // Now we are ready for sample data processing. - kdc_flow_control *tile = new kdc_flow_control(&mem_in,codestream); - bool done = false; - while (!done) - { - // Process line by line - done = true; - if (tile->advance_components()) - { - done = false; - tile->process_components(); - } - } + kdc_flow_control *tile = new kdc_flow_control(&mem_in,codestream); + bool done = false; + while (!done) + { + // Process line by line + if (tile->advance_components()) + { + tile->process_components(); + } + else + { + done = true; + } + } // Produce the compressed output - codestream.flush(layer_bytes,num_layer_specs); + codestream.flush(layer_bytes,num_layer_specs); // Cleanup - delete tile; - + delete tile; codestream.destroy(); - if (record_stream != NULL) - { - delete record_stream; - } // Now that we're done encoding, create the new data buffer for the compressed // image and stick it there. - base.copyData(output_buffer, output_size); base.updateData(); // set width, height delete[] output_buffer; @@ -674,19 +664,19 @@ BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, co BOOL LLImageJ2CKDU::getMetadata(LLImageJ2C &base) { // *FIX: kdu calls our callback function if there's an error, and - // then bombs. To regain control, we throw an exception, and + // then bombs. To regain control, we throw an exception, and // catch it here. try { setupCodeStream(base, FALSE, MODE_FAST); return TRUE; } - catch( const char* msg ) + catch (const char* msg) { base.setLastError(ll_safe_string(msg)); return FALSE; } - catch( ... ) + catch (...) { base.setLastError( "Unknown J2C error" ); return FALSE; @@ -699,37 +689,49 @@ void set_default_colour_weights(kdu_params *siz) assert(cod != NULL); bool can_use_ycc = true; - bool rev0=false; - int depth0=0, sub_x0=1, sub_y0=1; - for (int c=0; c < 3; c++) + bool rev0 = false; + int depth0 = 0, sub_x0 = 1, sub_y0 = 1; + for (int c = 0; c < 3; c++) { - int depth=0; siz->get(Sprecision,c,0,depth); - int sub_y=1; siz->get(Ssampling,c,0,sub_y); - int sub_x=1; siz->get(Ssampling,c,1,sub_x); + int depth = 0; siz->get(Sprecision,c,0,depth); + int sub_y = 1; siz->get(Ssampling,c,0,sub_y); + int sub_x = 1; siz->get(Ssampling,c,1,sub_x); kdu_params *coc = cod->access_relation(-1,c); - bool rev=false; coc->get(Creversible,0,0,rev); + bool rev = false; coc->get(Creversible,0,0,rev); if (c == 0) - { rev0=rev; depth0=depth; sub_x0=sub_x; sub_y0=sub_y; } - else if ((rev != rev0) || (depth != depth0) || - (sub_x != sub_x0) || (sub_y != sub_y0)) + { + rev0 = rev; depth0 = depth; sub_x0 = sub_x; sub_y0 = sub_y; + } + else if ((rev != rev0) || (depth != depth0) || + (sub_x != sub_x0) || (sub_y != sub_y0)) + { can_use_ycc = false; + } } if (!can_use_ycc) + { return; + } bool use_ycc; if (!cod->get(Cycc,0,0,use_ycc)) + { cod->set(Cycc,0,0,use_ycc=true); + } if (!use_ycc) + { return; + } float weight; - if (cod->get(Clev_weights,0,0,weight) || - cod->get(Cband_weights,0,0,weight)) - return; // Weights already specified explicitly. + if (cod->get(Clev_weights,0,0,weight) || cod->get(Cband_weights,0,0,weight)) + { + // Weights already specified explicitly -> nothing to do + return; + } - /* These example weights are adapted from numbers generated by Marcus Nadenau - at EPFL, for a viewing distance of 15 cm and a display resolution of - 300 DPI. */ + // These example weights are adapted from numbers generated by Marcus Nadenau + // at EPFL, for a viewing distance of 15 cm and a display resolution of + // 300 DPI. cod->parse_string("Cband_weights:C0=" "{0.0901},{0.2758},{0.2758}," @@ -775,7 +777,7 @@ all necessary level shifting, type conversion, rounding and truncation. */ val += 128; if (val & ((-1)<<8)) { - val = (val<0)?0:255; + val = (val < 0 ? 0 : 255); } *dest = (kdu_byte) val; } @@ -793,7 +795,7 @@ all necessary level shifting, type conversion, rounding and truncation. */ val += 128; if (val & ((-1)<<8)) { - val = (val<0)?0:255; + val = (val < 0 ? 0 : 255); } *dest = (kdu_byte) val; } @@ -816,7 +818,7 @@ all necessary level shifting, type conversion, rounding and truncation. */ val += 128; if (val & ((-1)<<8)) { - val = (val<0)?0:255; + val = (val < 0 ? 0 : 255); } *dest = (kdu_byte) val; } @@ -835,7 +837,7 @@ all necessary level shifting, type conversion, rounding and truncation. */ val += 128; if (val & ((-1)<<8)) { - val = (val<0)?0:(256-(1<<upshift)); + val = (val < 0 ? 0 : 256 - (1<<upshift)); } *dest = (kdu_byte) val; } @@ -857,7 +859,7 @@ all necessary level shifting, type conversion, rounding and truncation. */ val += 128; if (val & ((-1)<<8)) { - val = (val<0)?0:255; + val = (val < 0 ? 0 : 255); } *dest = (kdu_byte) val; } @@ -873,7 +875,7 @@ all necessary level shifting, type conversion, rounding and truncation. */ val += 128; if (val & ((-1)<<8)) { - val = (val<0)?0:(256-(1<<upshift)); + val = (val < 0 ? 0 : 256 - (1<<upshift)); } *dest = (kdu_byte) val; } @@ -892,17 +894,17 @@ LLKDUDecodeState::LLKDUDecodeState(kdu_tile tile, kdu_byte *buf, S32 row_gap) mNumComponents = tile.get_num_components(); - llassert(mNumComponents<=4); + llassert(mNumComponents <= 4); mUseYCC = tile.get_ycc(); - for (c=0; c<4; ++c) + for (c = 0; c < 4; ++c) { mReversible[c] = false; mBitDepths[c] = 0; } // Open tile-components and create processing engines and resources - for (c=0; c < mNumComponents; c++) + for (c = 0; c < mNumComponents; c++) { mComps[c] = mTile.access_component(c); mReversible[c] = mComps[c].get_reversible(); @@ -929,7 +931,7 @@ LLKDUDecodeState::LLKDUDecodeState(kdu_tile tile, kdu_byte *buf, S32 row_gap) } } mAllocator.finalize(); // Actually creates buffering resources - for (c=0; c < mNumComponents; c++) + for (c = 0; c < mNumComponents; c++) { mLines[c].create(); // Grabs resources from the allocator. } @@ -937,13 +939,11 @@ LLKDUDecodeState::LLKDUDecodeState(kdu_tile tile, kdu_byte *buf, S32 row_gap) LLKDUDecodeState::~LLKDUDecodeState() { - S32 c; // Cleanup - for (c=0; c < mNumComponents; c++) + for (S32 c = 0; c < mNumComponents; c++) { mEngines[c].destroy(); // engines are interfaces; no default destructors } - mTile.close(); } @@ -962,7 +962,7 @@ separation between consecutive rows in the real buffer. */ LLTimer decode_timer; while (mDims.size.y--) { - for (c=0; c < mNumComponents; c++) + for (c = 0; c < mNumComponents; c++) { mEngines[c].pull(mLines[c],true); } @@ -970,7 +970,7 @@ separation between consecutive rows in the real buffer. */ { kdu_convert_ycc_to_rgb(mLines[0],mLines[1],mLines[2]); } - for (c=0; c < mNumComponents; c++) + for (c = 0; c < mNumComponents; c++) { transfer_bytes(mBuf+c,mLines[c],mNumComponents,mBitDepths[c]); } @@ -990,96 +990,100 @@ separation between consecutive rows in the real buffer. */ kdc_flow_control::kdc_flow_control (kdu_image_in_base *img_in, kdu_codestream codestream) { - int n; - - this->codestream = codestream; - codestream.get_valid_tiles(valid_tile_indices); - tile_idx = valid_tile_indices.pos; - tile = codestream.open_tile(tile_idx,NULL); - - // Set up the individual components - num_components = codestream.get_num_components(true); - components = new kdc_component_flow_control[num_components]; - count_delta = 0; - kdc_component_flow_control *comp = components; - for (n = 0; n < num_components; n++, comp++) - { - comp->line = NULL; - comp->reader = img_in; - kdu_coords subsampling; - codestream.get_subsampling(n,subsampling,true); - kdu_dims dims; - codestream.get_tile_dims(tile_idx,n,dims,true); - comp->vert_subsampling = subsampling.y; - if ((n == 0) || (comp->vert_subsampling < count_delta)) - { - count_delta = comp->vert_subsampling; - } - comp->ratio_counter = 0; - comp->remaining_lines = comp->initial_lines = dims.size.y; - } - assert(num_components >= 0); - - tile.set_components_of_interest(num_components); - max_buffer_memory = engine.create(codestream,tile,false,NULL,false,1,NULL,NULL,false); + int n; + + this->codestream = codestream; + codestream.get_valid_tiles(valid_tile_indices); + tile_idx = valid_tile_indices.pos; + tile = codestream.open_tile(tile_idx,NULL); + + // Set up the individual components + num_components = codestream.get_num_components(true); + components = new kdc_component_flow_control[num_components]; + count_delta = 0; + kdc_component_flow_control *comp = components; + for (n = 0; n < num_components; n++, comp++) + { + comp->line = NULL; + comp->reader = img_in; + kdu_coords subsampling; + codestream.get_subsampling(n,subsampling,true); + kdu_dims dims; + codestream.get_tile_dims(tile_idx,n,dims,true); + comp->vert_subsampling = subsampling.y; + if ((n == 0) || (comp->vert_subsampling < count_delta)) + { + count_delta = comp->vert_subsampling; + } + comp->ratio_counter = 0; + comp->remaining_lines = comp->initial_lines = dims.size.y; + } + assert(num_components >= 0); + + tile.set_components_of_interest(num_components); + max_buffer_memory = engine.create(codestream,tile,false,NULL,false,1,NULL,NULL,false); } kdc_flow_control::~kdc_flow_control() { - if (components != NULL) - delete[] components; - if (engine.exists()) - engine.destroy(); + if (components != NULL) + { + delete[] components; + } + if (engine.exists()) + { + engine.destroy(); + } } bool kdc_flow_control::advance_components() { - bool found_line = false; - while (!found_line) - { - bool all_done = true; - kdc_component_flow_control *comp = components; - for (int n = 0; n < num_components; n++, comp++) - { - assert(comp->ratio_counter >= 0); - if (comp->remaining_lines > 0) - { - all_done = false; - comp->ratio_counter -= count_delta; - if (comp->ratio_counter < 0) - { - found_line = true; - comp->line = engine.exchange_line(n,NULL,NULL); - assert(comp->line != NULL); + bool found_line = false; + while (!found_line) + { + bool all_done = true; + kdc_component_flow_control *comp = components; + for (int n = 0; n < num_components; n++, comp++) + { + assert(comp->ratio_counter >= 0); + if (comp->remaining_lines > 0) + { + all_done = false; + comp->ratio_counter -= count_delta; + if (comp->ratio_counter < 0) + { + found_line = true; + comp->line = engine.exchange_line(n,NULL,NULL); + assert(comp->line != NULL); if (comp->line->get_width()) { comp->reader->get(n,*(comp->line),0); } - } - } - } - if (all_done) - { - return false; - } - } - return true; + } + } + } + if (all_done) + { + return false; + } + } + return true; } void kdc_flow_control::process_components() { - kdc_component_flow_control *comp = components; - for (int n = 0; n < num_components; n++, comp++) - { - if (comp->ratio_counter < 0) - { - comp->ratio_counter += comp->vert_subsampling; - assert(comp->ratio_counter >= 0); - assert(comp->remaining_lines > 0); - comp->remaining_lines--; - assert(comp->line != NULL); - engine.exchange_line(n,comp->line,NULL); - comp->line = NULL; - } - } + kdc_component_flow_control *comp = components; + for (int n = 0; n < num_components; n++, comp++) + { + if (comp->ratio_counter < 0) + { + comp->ratio_counter += comp->vert_subsampling; + assert(comp->ratio_counter >= 0); + assert(comp->remaining_lines > 0); + comp->remaining_lines--; + assert(comp->line != NULL); + engine.exchange_line(n,comp->line,NULL); + comp->line = NULL; + } + } } diff --git a/indra/llkdu/llkdumem.cpp b/indra/llkdu/llkdumem.cpp index 1f549cbbe0..0347475559 100644 --- a/indra/llkdu/llkdumem.cpp +++ b/indra/llkdu/llkdumem.cpp @@ -47,12 +47,12 @@ LLKDUMemIn::LLKDUMemIn(const U8 *data, num_components = in_num_components; alignment_bytes = 0; - for (n=0; n<3; ++n) + for (n = 0; n < 3; ++n) { precision[n] = 0; } - for (n=0; n < num_components; ++n) + for (n = 0; n < num_components; ++n) { siz->set(Sdims,n,0,rows); siz->set(Sdims,n,1,cols); @@ -80,12 +80,12 @@ LLKDUMemIn::~LLKDUMemIn() } image_line_buf *tmp; while ((tmp=incomplete_lines) != NULL) - { + { incomplete_lines = tmp->next; delete tmp; } while ((tmp=free_lines) != NULL) - { + { free_lines = tmp->next; delete tmp; } @@ -98,16 +98,16 @@ bool LLKDUMemIn::get(int comp_idx, kdu_line_buf &line, int x_tnum) assert((idx >= 0) && (idx < num_components)); x_tnum = x_tnum*num_components+idx; image_line_buf *scan, *prev=NULL; - for (scan=incomplete_lines; scan != NULL; prev=scan, scan=scan->next) - { + for (scan = incomplete_lines; scan != NULL; prev = scan, scan = scan->next) + { assert(scan->next_x_tnum >= x_tnum); if (scan->next_x_tnum == x_tnum) { break; } - } + } if (scan == NULL) - { // Need to read a new image line. + { // Need to read a new image line. assert(x_tnum == 0); // Must consume in very specific order. if (num_unread_rows == 0) { @@ -134,7 +134,7 @@ bool LLKDUMemIn::get(int comp_idx, kdu_line_buf &line, int x_tnum) num_unread_rows--; scan->accessed_samples = 0; scan->next_x_tnum = 0; - } + } assert((cols-scan->accessed_samples) >= line.get_width()); @@ -161,7 +161,7 @@ bool LLKDUMemIn::get(int comp_idx, kdu_line_buf &line, int x_tnum) } } else - { + { kdu_sample16 *dp = line.get_buf16(); if (line.is_absolute()) { // 16-bit absolute integers @@ -177,7 +177,7 @@ bool LLKDUMemIn::get(int comp_idx, kdu_line_buf &line, int x_tnum) dp->ival = (((kdu_int16)(*sp)) - 128) << (KDU_FIX_POINT-8); } } - } + } scan->next_x_tnum++; if (idx == (num_components-1)) diff --git a/indra/llkdu/llkdumem.h b/indra/llkdu/llkdumem.h index 7064de4408..9d923fc367 100644 --- a/indra/llkdu/llkdumem.h +++ b/indra/llkdu/llkdumem.h @@ -39,7 +39,7 @@ class LLKDUMemSource: public kdu_compressed_source { -public: // Member functions +public: LLKDUMemSource(U8 *input_buffer, U32 size) { mData = input_buffer; @@ -47,11 +47,11 @@ public: // Member functions mCurPos = 0; } - ~LLKDUMemSource() + ~LLKDUMemSource() { } - int read(kdu_byte *buf, int num_bytes) + int read(kdu_byte *buf, int num_bytes) { U32 num_out; num_out = num_bytes; @@ -70,7 +70,7 @@ public: // Member functions mCurPos = 0; } -private: // Data +private: U8 *mData; U32 mSize; U32 mCurPos; @@ -78,7 +78,7 @@ private: // Data class LLKDUMemTarget: public kdu_compressed_target { -public: // Member functions +public: LLKDUMemTarget(U8 *output_buffer, U32 &output_size, const U32 buffer_size) { mData = output_buffer; @@ -87,11 +87,11 @@ public: // Member functions mOutputSize = &output_size; } - ~LLKDUMemTarget() - { + ~LLKDUMemTarget() + { } - bool write(const kdu_byte *buf, int num_bytes) + bool write(const kdu_byte *buf, int num_bytes) { U32 num_out; num_out = num_bytes; @@ -108,7 +108,7 @@ public: // Member functions return true; } -private: // Data +private: U8 *mData; U32 mSize; U32 mCurPos; @@ -117,27 +117,27 @@ private: // Data class LLKDUMemIn : public kdu_image_in_base { -public: // Member functions - LLKDUMemIn(const U8 *data, +public: + LLKDUMemIn(const U8 *data, const U32 size, const U16 rows, const U16 cols, U8 in_num_components, siz_params *siz); - ~LLKDUMemIn(); + ~LLKDUMemIn(); - bool get(int comp_idx, kdu_line_buf &line, int x_tnum); + bool get(int comp_idx, kdu_line_buf &line, int x_tnum); -private: // Data +private: const U8 *mData; - int first_comp_idx; - int num_components; - int rows, cols; - int alignment_bytes; // Number of 0's at end of each line. - int precision[3]; - image_line_buf *incomplete_lines; // Each "sample" represents a full pixel - image_line_buf *free_lines; - int num_unread_rows; + int first_comp_idx; + int num_components; + int rows, cols; + int alignment_bytes; // Number of 0's at end of each line. + int precision[3]; + image_line_buf *incomplete_lines; // Each "sample" represents a full pixel + image_line_buf *free_lines; + int num_unread_rows; U32 mCurPos; U32 mDataSize; -- cgit v1.2.3 From 760e672e80de881c0a501dd0b44cfac1342b11c2 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Fri, 1 Apr 2011 00:10:05 -0700 Subject: SOCIAL-822 FIX UI and Sizing issues with hints in Basic and Advanced modes --- indra/newview/llhints.cpp | 8 +++++--- indra/newview/skins/default/xui/en/panel_hint.xml | 4 ++-- indra/newview/skins/default/xui/en/panel_hint_image.xml | 8 ++++---- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/indra/newview/llhints.cpp b/indra/newview/llhints.cpp index 97f0e36a0c..722d67caf9 100644 --- a/indra/newview/llhints.cpp +++ b/indra/newview/llhints.cpp @@ -192,7 +192,7 @@ BOOL LLHintPopup::postBuild() S32 delta_height = text_bounds.getHeight() - hint_text.getRect().getHeight(); reshape(getRect().getWidth(), getRect().getHeight() + delta_height); hint_text.reshape(hint_text.getRect().getWidth(), hint_text.getRect().getHeight() + delta_height); - hint_text.translate(0, -delta_height); +// hint_text.translate(0, -delta_height); return TRUE; } @@ -219,8 +219,10 @@ void LLHintPopup::draw() S32 image_height = hint_image.isNull() ? 0 : hint_image->getHeight(); S32 image_width = hint_image.isNull() ? 0 : hint_image->getWidth(); - S32 delta_height = image_height - hint_icon.getRect().getHeight(); - hint_icon.getParent()->reshape(image_width, image_height); + S32 delta_height = image_height - hint_icon.getParent()->getParent()->getRect().getHeight(); + hint_icon.getParent()->reshape(image_width, hint_icon.getParent()->getRect().getHeight()); + hint_icon.getParent()->getParent()->reshape(hint_icon.getParent()->getParent()->getRect().getWidth(), image_height); + hint_icon.getParent()->getParent()->translate(0, -delta_height); LLRect hint_rect = getLocalRect(); reshape(hint_rect.getWidth(), hint_rect.getHeight() + delta_height); diff --git a/indra/newview/skins/default/xui/en/panel_hint.xml b/indra/newview/skins/default/xui/en/panel_hint.xml index c883fd8a1d..f7434f0330 100644 --- a/indra/newview/skins/default/xui/en/panel_hint.xml +++ b/indra/newview/skins/default/xui/en/panel_hint.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel width="205" - height="100"> + height="34"> <text name="hint_title" font="SansSerifMedium" left="8" @@ -15,7 +15,7 @@ left="8" right="197" top="26" - bottom="92" + bottom="26" follows="left|right|bottom" text_color="Black" wrap="true"/> diff --git a/indra/newview/skins/default/xui/en/panel_hint_image.xml b/indra/newview/skins/default/xui/en/panel_hint_image.xml index 30dd1836f1..df05d50dc5 100644 --- a/indra/newview/skins/default/xui/en/panel_hint_image.xml +++ b/indra/newview/skins/default/xui/en/panel_hint_image.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel width="305" - height="140" + height="40" layout="topleft"> <text name="hint_title" font="SansSerifMedium" @@ -16,7 +16,7 @@ top="25" width="305" height="0" - follows="all" + follows="left|top|right" orientation="horizontal"> <layout_panel auto_resize="true" width="100"/> <layout_panel auto_resize="true" width="0"> @@ -32,8 +32,8 @@ <text name="hint_text" left="8" right="297" - top_pad="5" - bottom="120" + top="30" + bottom="30" follows="left|right|bottom" text_color="Black" wrap="true"/> -- cgit v1.2.3 From cf4d929888025552050e66f3b359e49ed131af8d Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Fri, 1 Apr 2011 06:49:19 -0400 Subject: STORM-956 update message template --- scripts/messages/message_template.msg | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/scripts/messages/message_template.msg b/scripts/messages/message_template.msg index 77dc940335..d292653d3f 100644 --- a/scripts/messages/message_template.msg +++ b/scripts/messages/message_template.msg @@ -2966,7 +2966,7 @@ version 2.0 { BillableFactor F32 } { ObjectBonusFactor F32 } { WaterHeight F32 } - { TerrainRaiseLimit F32 } + { TerrainRaiseLimit F32 } { TerrainLowerLimit F32 } { PricePerMeter S32 } { RedirectGridX S32 } @@ -4242,6 +4242,10 @@ version 2.0 Buttons Variable { ButtonLabel Variable 1 } } + { + OwnerData Variable + { OwnerID LLUUID } + } } @@ -6762,6 +6766,8 @@ version 2.0 } // And, the money transfer +// *NOTE: Unused as of 2010-04-06, because all back-end money transactions +// are done with web services via L$ API. JC { MoneyTransferBackend Low 312 Trusted Zerocoded { -- cgit v1.2.3 From 2c584790d0505ebff13d29e9f068aefcffe54f01 Mon Sep 17 00:00:00 2001 From: Boroondas Gupte <hg@boroon.dasgupta.ch> Date: Fri, 1 Apr 2011 09:14:52 -0400 Subject: VWR-24487 make PREHASH variables char const* const --- doc/contributions.txt | 1 + indra/llmessage/message.cpp | 8 +- indra/llmessage/message_prehash.cpp | 2684 ++++++++++---------- indra/llmessage/message_prehash.h | 2684 ++++++++++---------- indra/llprimitive/llprimitive.cpp | 4 +- indra/llprimitive/llprimitive.h | 4 +- indra/llprimitive/llvolumemessage.cpp | 6 +- indra/llprimitive/llvolumemessage.h | 6 +- indra/llui/tests/llurlentry_stub.cpp | 4 +- indra/newview/tests/llremoteparcelrequest_test.cpp | 4 +- 10 files changed, 2703 insertions(+), 2702 deletions(-) diff --git a/doc/contributions.txt b/doc/contributions.txt index f59539d94c..870fee9260 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -206,6 +206,7 @@ Boroondas Gupte VWR-20583 VWR-20891 VWR-23455 + VWR-24487 WEB-262 Bulli Schumann CT-218 diff --git a/indra/llmessage/message.cpp b/indra/llmessage/message.cpp index 2f0d815be5..d0b0e178b8 100644 --- a/indra/llmessage/message.cpp +++ b/indra/llmessage/message.cpp @@ -2441,12 +2441,12 @@ void dump_prehash_files() " * Generated from message template version number %.3f\n" " */\n", gMessageSystem->mMessageFileVersionNumber); - fprintf(fp, "\n\nextern F32 gPrehashVersionNumber;\n\n"); + fprintf(fp, "\n\nextern F32 const gPrehashVersionNumber;\n\n"); for (i = 0; i < MESSAGE_NUMBER_OF_HASH_BUCKETS; i++) { if (!LLMessageStringTable::getInstance()->mEmpty[i] && LLMessageStringTable::getInstance()->mString[i][0] != '.') { - fprintf(fp, "extern char * _PREHASH_%s;\n", LLMessageStringTable::getInstance()->mString[i]); + fprintf(fp, "extern char const* const _PREHASH_%s;\n", LLMessageStringTable::getInstance()->mString[i]); } } fprintf(fp, "\n\n#endif\n"); @@ -2471,12 +2471,12 @@ void dump_prehash_files() gMessageSystem->mMessageFileVersionNumber); fprintf(fp, "#include \"linden_common.h\"\n"); fprintf(fp, "#include \"message.h\"\n\n"); - fprintf(fp, "\n\nF32 gPrehashVersionNumber = %.3ff;\n\n", gMessageSystem->mMessageFileVersionNumber); + fprintf(fp, "\n\nF32 const gPrehashVersionNumber = %.3ff;\n\n", gMessageSystem->mMessageFileVersionNumber); for (i = 0; i < MESSAGE_NUMBER_OF_HASH_BUCKETS; i++) { if (!LLMessageStringTable::getInstance()->mEmpty[i] && LLMessageStringTable::getInstance()->mString[i][0] != '.') { - fprintf(fp, "char * _PREHASH_%s = LLMessageStringTable::getInstance()->getString(\"%s\");\n", LLMessageStringTable::getInstance()->mString[i], LLMessageStringTable::getInstance()->mString[i]); + fprintf(fp, "char const* const _PREHASH_%s = LLMessageStringTable::getInstance()->getString(\"%s\");\n", LLMessageStringTable::getInstance()->mString[i], LLMessageStringTable::getInstance()->mString[i]); } } fclose(fp); diff --git a/indra/llmessage/message_prehash.cpp b/indra/llmessage/message_prehash.cpp index eb1e366149..5d03615e53 100644 --- a/indra/llmessage/message_prehash.cpp +++ b/indra/llmessage/message_prehash.cpp @@ -32,1346 +32,1346 @@ -F32 gPrehashVersionNumber = 2.000f; +F32 const gPrehashVersionNumber = 2.000f; -char* _PREHASH_X = LLMessageStringTable::getInstance()->getString("X"); -char* _PREHASH_Y = LLMessageStringTable::getInstance()->getString("Y"); -char* _PREHASH_Z = LLMessageStringTable::getInstance()->getString("Z"); -char* _PREHASH_AddFlags = LLMessageStringTable::getInstance()->getString("AddFlags"); -char* _PREHASH_FailureInfo = LLMessageStringTable::getInstance()->getString("FailureInfo"); -char* _PREHASH_MapData = LLMessageStringTable::getInstance()->getString("MapData"); -char* _PREHASH_AddItem = LLMessageStringTable::getInstance()->getString("AddItem"); -char* _PREHASH_MeanCollision = LLMessageStringTable::getInstance()->getString("MeanCollision"); -char* _PREHASH_RezScript = LLMessageStringTable::getInstance()->getString("RezScript"); -char* _PREHASH_AvatarSitResponse = LLMessageStringTable::getInstance()->getString("AvatarSitResponse"); -char* _PREHASH_InventoryAssetResponse = LLMessageStringTable::getInstance()->getString("InventoryAssetResponse"); -char* _PREHASH_KillObject = LLMessageStringTable::getInstance()->getString("KillObject"); -char* _PREHASH_ProposalID = LLMessageStringTable::getInstance()->getString("ProposalID"); -char* _PREHASH_SerialNum = LLMessageStringTable::getInstance()->getString("SerialNum"); -char* _PREHASH_Duration = LLMessageStringTable::getInstance()->getString("Duration"); -char* _PREHASH_ScriptQuestion = LLMessageStringTable::getInstance()->getString("ScriptQuestion"); -char* _PREHASH_AddCircuitCode = LLMessageStringTable::getInstance()->getString("AddCircuitCode"); -char* _PREHASH_UseCircuitCode = LLMessageStringTable::getInstance()->getString("UseCircuitCode"); -char* _PREHASH_ViewerCircuitCode = LLMessageStringTable::getInstance()->getString("ViewerCircuitCode"); -char* _PREHASH_ScriptAnswerYes = LLMessageStringTable::getInstance()->getString("ScriptAnswerYes"); -char* _PREHASH_PartnerID = LLMessageStringTable::getInstance()->getString("PartnerID"); -char* _PREHASH_DirLandQuery = LLMessageStringTable::getInstance()->getString("DirLandQuery"); -char* _PREHASH_TeleportStart = LLMessageStringTable::getInstance()->getString("TeleportStart"); -char* _PREHASH_AboutText = LLMessageStringTable::getInstance()->getString("AboutText"); -char* _PREHASH_VisualParam = LLMessageStringTable::getInstance()->getString("VisualParam"); -char* _PREHASH_GroupPrims = LLMessageStringTable::getInstance()->getString("GroupPrims"); -char* _PREHASH_SelectedPrims = LLMessageStringTable::getInstance()->getString("SelectedPrims"); -char* _PREHASH_ID = LLMessageStringTable::getInstance()->getString("ID"); -char* _PREHASH_UUIDNameRequest = LLMessageStringTable::getInstance()->getString("UUIDNameRequest"); -char* _PREHASH_UUIDGroupNameRequest = LLMessageStringTable::getInstance()->getString("UUIDGroupNameRequest"); -char* _PREHASH_GroupAccountTransactionsRequest = LLMessageStringTable::getInstance()->getString("GroupAccountTransactionsRequest"); -char* _PREHASH_MapNameRequest = LLMessageStringTable::getInstance()->getString("MapNameRequest"); -char* _PREHASH_UpdateSimulator = LLMessageStringTable::getInstance()->getString("UpdateSimulator"); -char* _PREHASH_BillableFactor = LLMessageStringTable::getInstance()->getString("BillableFactor"); -char* _PREHASH_ObjectBonusFactor = LLMessageStringTable::getInstance()->getString("ObjectBonusFactor"); -char* _PREHASH_EnableSimulator = LLMessageStringTable::getInstance()->getString("EnableSimulator"); -char* _PREHASH_DisableSimulator = LLMessageStringTable::getInstance()->getString("DisableSimulator"); -char* _PREHASH_ConfirmEnableSimulator = LLMessageStringTable::getInstance()->getString("ConfirmEnableSimulator"); -char* _PREHASH_LayerType = LLMessageStringTable::getInstance()->getString("LayerType"); -char* _PREHASH_OwnerRole = LLMessageStringTable::getInstance()->getString("OwnerRole"); -char* _PREHASH_ParcelOverlay = LLMessageStringTable::getInstance()->getString("ParcelOverlay"); -char* _PREHASH_GroupOwned = LLMessageStringTable::getInstance()->getString("GroupOwned"); -char* _PREHASH_IP = LLMessageStringTable::getInstance()->getString("IP"); -char* _PREHASH_ChatFromViewer = LLMessageStringTable::getInstance()->getString("ChatFromViewer"); -char* _PREHASH_AvgAgentsInView = LLMessageStringTable::getInstance()->getString("AvgAgentsInView"); -char* _PREHASH_AgentsInView = LLMessageStringTable::getInstance()->getString("AgentsInView"); -char* _PREHASH_GroupTitle = LLMessageStringTable::getInstance()->getString("GroupTitle"); -char* _PREHASH_MapLayerReply = LLMessageStringTable::getInstance()->getString("MapLayerReply"); -char* _PREHASH_CompoundMsgID = LLMessageStringTable::getInstance()->getString("CompoundMsgID"); -char* _PREHASH_CameraConstraint = LLMessageStringTable::getInstance()->getString("CameraConstraint"); -char* _PREHASH_DownloadTotals = LLMessageStringTable::getInstance()->getString("DownloadTotals"); -char* _PREHASH_GenCounter = LLMessageStringTable::getInstance()->getString("GenCounter"); -char* _PREHASH_FrozenData = LLMessageStringTable::getInstance()->getString("FrozenData"); -char* _PREHASH_ChildAgentDying = LLMessageStringTable::getInstance()->getString("ChildAgentDying"); -char* _PREHASH_To = LLMessageStringTable::getInstance()->getString("To"); -char* _PREHASH_CopyInventoryFromNotecard = LLMessageStringTable::getInstance()->getString("CopyInventoryFromNotecard"); -char* _PREHASH_RezObjectFromNotecard = LLMessageStringTable::getInstance()->getString("RezObjectFromNotecard"); -char* _PREHASH_ParcelDirFeeCurrent = LLMessageStringTable::getInstance()->getString("ParcelDirFeeCurrent"); -char* _PREHASH_SeedCapability = LLMessageStringTable::getInstance()->getString("SeedCapability"); -char* _PREHASH_ObjectDuplicate = LLMessageStringTable::getInstance()->getString("ObjectDuplicate"); -char* _PREHASH_InventoryData = LLMessageStringTable::getInstance()->getString("InventoryData"); -char* _PREHASH_ReplyData = LLMessageStringTable::getInstance()->getString("ReplyData"); -char* _PREHASH_ResetList = LLMessageStringTable::getInstance()->getString("ResetList"); -char* _PREHASH_MediaID = LLMessageStringTable::getInstance()->getString("MediaID"); -char* _PREHASH_RelatedRights = LLMessageStringTable::getInstance()->getString("RelatedRights"); -char* _PREHASH_RedirectGridX = LLMessageStringTable::getInstance()->getString("RedirectGridX"); -char* _PREHASH_RedirectGridY = LLMessageStringTable::getInstance()->getString("RedirectGridY"); -char* _PREHASH_TransferID = LLMessageStringTable::getInstance()->getString("TransferID"); -char* _PREHASH_TexturesChanged = LLMessageStringTable::getInstance()->getString("TexturesChanged"); -char* _PREHASH_UserLookAt = LLMessageStringTable::getInstance()->getString("UserLookAt"); -char* _PREHASH_TestBlock1 = LLMessageStringTable::getInstance()->getString("TestBlock1"); -char* _PREHASH_SensedData = LLMessageStringTable::getInstance()->getString("SensedData"); -char* _PREHASH_UpdateBlock = LLMessageStringTable::getInstance()->getString("UpdateBlock"); -char* _PREHASH_ClassifiedGodDelete = LLMessageStringTable::getInstance()->getString("ClassifiedGodDelete"); -char* _PREHASH_ObjectGrabUpdate = LLMessageStringTable::getInstance()->getString("ObjectGrabUpdate"); -char* _PREHASH_LocationPos = LLMessageStringTable::getInstance()->getString("LocationPos"); -char* _PREHASH_TaxDate = LLMessageStringTable::getInstance()->getString("TaxDate"); -char* _PREHASH_StartDateTime = LLMessageStringTable::getInstance()->getString("StartDateTime"); -char* _PREHASH_ObjectUpdateCached = LLMessageStringTable::getInstance()->getString("ObjectUpdateCached"); -char* _PREHASH_Packets = LLMessageStringTable::getInstance()->getString("Packets"); -char* _PREHASH_FailureType = LLMessageStringTable::getInstance()->getString("FailureType"); -char* _PREHASH_UpdateGroupInfo = LLMessageStringTable::getInstance()->getString("UpdateGroupInfo"); -char* _PREHASH_ObjectPermissions = LLMessageStringTable::getInstance()->getString("ObjectPermissions"); -char* _PREHASH_RevokePermissions = LLMessageStringTable::getInstance()->getString("RevokePermissions"); -char* _PREHASH_UpdateFlags = LLMessageStringTable::getInstance()->getString("UpdateFlags"); -char* _PREHASH_ObjectExportSelected = LLMessageStringTable::getInstance()->getString("ObjectExportSelected"); -char* _PREHASH_RezSelected = LLMessageStringTable::getInstance()->getString("RezSelected"); -char* _PREHASH_AutoPilot = LLMessageStringTable::getInstance()->getString("AutoPilot"); -char* _PREHASH_UpdateMuteListEntry = LLMessageStringTable::getInstance()->getString("UpdateMuteListEntry"); -char* _PREHASH_RemoveMuteListEntry = LLMessageStringTable::getInstance()->getString("RemoveMuteListEntry"); -char* _PREHASH_SetSimStatusInDatabase = LLMessageStringTable::getInstance()->getString("SetSimStatusInDatabase"); -char* _PREHASH_SetSimPresenceInDatabase = LLMessageStringTable::getInstance()->getString("SetSimPresenceInDatabase"); -char* _PREHASH_CameraProperty = LLMessageStringTable::getInstance()->getString("CameraProperty"); -char* _PREHASH_BrushSize = LLMessageStringTable::getInstance()->getString("BrushSize"); -char* _PREHASH_SimulatorSetMap = LLMessageStringTable::getInstance()->getString("SimulatorSetMap"); -char* _PREHASH_RegionPresenceRequestByRegionID = LLMessageStringTable::getInstance()->getString("RegionPresenceRequestByRegionID"); -char* _PREHASH_ParcelObjectOwnersReply = LLMessageStringTable::getInstance()->getString("ParcelObjectOwnersReply"); -char* _PREHASH_GroupMembersReply = LLMessageStringTable::getInstance()->getString("GroupMembersReply"); -char* _PREHASH_GroupRoleMembersReply = LLMessageStringTable::getInstance()->getString("GroupRoleMembersReply"); -char* _PREHASH_RequestRegionInfo = LLMessageStringTable::getInstance()->getString("RequestRegionInfo"); -char* _PREHASH_AABBMax = LLMessageStringTable::getInstance()->getString("AABBMax"); -char* _PREHASH_RequestPayPrice = LLMessageStringTable::getInstance()->getString("RequestPayPrice"); -char* _PREHASH_SimulatorPresentAtLocation = LLMessageStringTable::getInstance()->getString("SimulatorPresentAtLocation"); -char* _PREHASH_AgentRequestSit = LLMessageStringTable::getInstance()->getString("AgentRequestSit"); -char* _PREHASH_AABBMin = LLMessageStringTable::getInstance()->getString("AABBMin"); -char* _PREHASH_ClassifiedFlags = LLMessageStringTable::getInstance()->getString("ClassifiedFlags"); -char* _PREHASH_ControlFlags = LLMessageStringTable::getInstance()->getString("ControlFlags"); -char* _PREHASH_TeleportRequest = LLMessageStringTable::getInstance()->getString("TeleportRequest"); -char* _PREHASH_ScriptTeleportRequest = LLMessageStringTable::getInstance()->getString("ScriptTeleportRequest"); -char* _PREHASH_EstateCovenantRequest = LLMessageStringTable::getInstance()->getString("EstateCovenantRequest"); -char* _PREHASH_DateUTC = LLMessageStringTable::getInstance()->getString("DateUTC"); -char* _PREHASH_TaskIDs = LLMessageStringTable::getInstance()->getString("TaskIDs"); -char* _PREHASH_RequestResult = LLMessageStringTable::getInstance()->getString("RequestResult"); -char* _PREHASH_CanAcceptAgents = LLMessageStringTable::getInstance()->getString("CanAcceptAgents"); -char* _PREHASH_ObjectSaleInfo = LLMessageStringTable::getInstance()->getString("ObjectSaleInfo"); -char* _PREHASH_KillChildAgents = LLMessageStringTable::getInstance()->getString("KillChildAgents"); -char* _PREHASH_Balance = LLMessageStringTable::getInstance()->getString("Balance"); -char* _PREHASH_DerezContainer = LLMessageStringTable::getInstance()->getString("DerezContainer"); -char* _PREHASH_ObjectData = LLMessageStringTable::getInstance()->getString("ObjectData"); -char* _PREHASH_CameraAtAxis = LLMessageStringTable::getInstance()->getString("CameraAtAxis"); -char* _PREHASH_InfoBlock = LLMessageStringTable::getInstance()->getString("InfoBlock"); -char* _PREHASH_OwnershipCost = LLMessageStringTable::getInstance()->getString("OwnershipCost"); -char* _PREHASH_AvatarNotesUpdate = LLMessageStringTable::getInstance()->getString("AvatarNotesUpdate"); -char* _PREHASH_PID = LLMessageStringTable::getInstance()->getString("PID"); -char* _PREHASH_DirPopularReply = LLMessageStringTable::getInstance()->getString("DirPopularReply"); -char* _PREHASH_TerrainHeightRange00 = LLMessageStringTable::getInstance()->getString("TerrainHeightRange00"); -char* _PREHASH_SimData = LLMessageStringTable::getInstance()->getString("SimData"); -char* _PREHASH_TerrainHeightRange01 = LLMessageStringTable::getInstance()->getString("TerrainHeightRange01"); -char* _PREHASH_TerrainHeightRange10 = LLMessageStringTable::getInstance()->getString("TerrainHeightRange10"); -char* _PREHASH_TerrainHeightRange11 = LLMessageStringTable::getInstance()->getString("TerrainHeightRange11"); -char* _PREHASH_UpdateInventoryItem = LLMessageStringTable::getInstance()->getString("UpdateInventoryItem"); -char* _PREHASH_UpdateCreateInventoryItem = LLMessageStringTable::getInstance()->getString("UpdateCreateInventoryItem"); -char* _PREHASH_MoveInventoryItem = LLMessageStringTable::getInstance()->getString("MoveInventoryItem"); -char* _PREHASH_CopyInventoryItem = LLMessageStringTable::getInstance()->getString("CopyInventoryItem"); -char* _PREHASH_LinkInventoryItem = LLMessageStringTable::getInstance()->getString("LinkInventoryItem"); -char* _PREHASH_RemoveInventoryItem = LLMessageStringTable::getInstance()->getString("RemoveInventoryItem"); -char* _PREHASH_CreateInventoryItem = LLMessageStringTable::getInstance()->getString("CreateInventoryItem"); -char* _PREHASH_PathTwistBegin = LLMessageStringTable::getInstance()->getString("PathTwistBegin"); -char* _PREHASH_CRC = LLMessageStringTable::getInstance()->getString("CRC"); -char* _PREHASH_AttachmentPoint = LLMessageStringTable::getInstance()->getString("AttachmentPoint"); -char* _PREHASH_TelehubBlock = LLMessageStringTable::getInstance()->getString("TelehubBlock"); -char* _PREHASH_FOVBlock = LLMessageStringTable::getInstance()->getString("FOVBlock"); -char* _PREHASH_StartLocationData = LLMessageStringTable::getInstance()->getString("StartLocationData"); -char* _PREHASH_PositionData = LLMessageStringTable::getInstance()->getString("PositionData"); -char* _PREHASH_TimeSinceLast = LLMessageStringTable::getInstance()->getString("TimeSinceLast"); -char* _PREHASH_MapImage = LLMessageStringTable::getInstance()->getString("MapImage"); -char* _PREHASH_Objects = LLMessageStringTable::getInstance()->getString("Objects"); -char* _PREHASH_URL = LLMessageStringTable::getInstance()->getString("URL"); -char* _PREHASH_CreationDate = LLMessageStringTable::getInstance()->getString("CreationDate"); -char* _PREHASH_JointPivot = LLMessageStringTable::getInstance()->getString("JointPivot"); -char* _PREHASH_FPS = LLMessageStringTable::getInstance()->getString("FPS"); -char* _PREHASH_HasTelehub = LLMessageStringTable::getInstance()->getString("HasTelehub"); -char* _PREHASH_PathEnd = LLMessageStringTable::getInstance()->getString("PathEnd"); -char* _PREHASH_ScriptDataReply = LLMessageStringTable::getInstance()->getString("ScriptDataReply"); -char* _PREHASH_MapBlockReply = LLMessageStringTable::getInstance()->getString("MapBlockReply"); -char* _PREHASH_PropertiesData = LLMessageStringTable::getInstance()->getString("PropertiesData"); -char* _PREHASH_ViewerEffect = LLMessageStringTable::getInstance()->getString("ViewerEffect"); -char* _PREHASH_FreezeUser = LLMessageStringTable::getInstance()->getString("FreezeUser"); -char* _PREHASH_OwnerPrims = LLMessageStringTable::getInstance()->getString("OwnerPrims"); -char* _PREHASH_ObjectGrab = LLMessageStringTable::getInstance()->getString("ObjectGrab"); -char* _PREHASH_ToAgentID = LLMessageStringTable::getInstance()->getString("ToAgentID"); -char* _PREHASH_SimulatorMapUpdate = LLMessageStringTable::getInstance()->getString("SimulatorMapUpdate"); -char* _PREHASH_TransferPacket = LLMessageStringTable::getInstance()->getString("TransferPacket"); -char* _PREHASH_ObjectName = LLMessageStringTable::getInstance()->getString("ObjectName"); -char* _PREHASH_GroupPowers = LLMessageStringTable::getInstance()->getString("GroupPowers"); -char* _PREHASH_OriginalName = LLMessageStringTable::getInstance()->getString("OriginalName"); -char* _PREHASH_CompletePingCheck = LLMessageStringTable::getInstance()->getString("CompletePingCheck"); -char* _PREHASH_OnlineStatus = LLMessageStringTable::getInstance()->getString("OnlineStatus"); -char* _PREHASH_ObjectDrop = LLMessageStringTable::getInstance()->getString("ObjectDrop"); -char* _PREHASH_UseBigPackets = LLMessageStringTable::getInstance()->getString("UseBigPackets"); -char* _PREHASH_GroupNoticesListReply = LLMessageStringTable::getInstance()->getString("GroupNoticesListReply"); -char* _PREHASH_ParcelAccessListReply = LLMessageStringTable::getInstance()->getString("ParcelAccessListReply"); -char* _PREHASH_RpcChannelReply = LLMessageStringTable::getInstance()->getString("RpcChannelReply"); -char* _PREHASH_RegionPresenceResponse = LLMessageStringTable::getInstance()->getString("RegionPresenceResponse"); -char* _PREHASH_CharterMember = LLMessageStringTable::getInstance()->getString("CharterMember"); -char* _PREHASH_EdgeData = LLMessageStringTable::getInstance()->getString("EdgeData"); -char* _PREHASH_NameData = LLMessageStringTable::getInstance()->getString("NameData"); -char* _PREHASH_RegionPushOverride = LLMessageStringTable::getInstance()->getString("RegionPushOverride"); -char* _PREHASH_SimName = LLMessageStringTable::getInstance()->getString("SimName"); -char* _PREHASH_UserReport = LLMessageStringTable::getInstance()->getString("UserReport"); -char* _PREHASH_DownloadPriority = LLMessageStringTable::getInstance()->getString("DownloadPriority"); -char* _PREHASH_ToAgentId = LLMessageStringTable::getInstance()->getString("ToAgentId"); -char* _PREHASH_DirPopularQuery = LLMessageStringTable::getInstance()->getString("DirPopularQuery"); -char* _PREHASH_Mag = LLMessageStringTable::getInstance()->getString("Mag"); -char* _PREHASH_ParcelPropertiesRequestByID = LLMessageStringTable::getInstance()->getString("ParcelPropertiesRequestByID"); -char* _PREHASH_ObjectLink = LLMessageStringTable::getInstance()->getString("ObjectLink"); -char* _PREHASH_RpcScriptReplyInbound = LLMessageStringTable::getInstance()->getString("RpcScriptReplyInbound"); -char* _PREHASH_RezData = LLMessageStringTable::getInstance()->getString("RezData"); -char* _PREHASH_RemoveInventoryObjects = LLMessageStringTable::getInstance()->getString("RemoveInventoryObjects"); -char* _PREHASH_GroupProposalBallot = LLMessageStringTable::getInstance()->getString("GroupProposalBallot"); -char* _PREHASH_RPCServerIP = LLMessageStringTable::getInstance()->getString("RPCServerIP"); -char* _PREHASH_Far = LLMessageStringTable::getInstance()->getString("Far"); -char* _PREHASH_GodSessionID = LLMessageStringTable::getInstance()->getString("GodSessionID"); -char* _PREHASH_FLAboutText = LLMessageStringTable::getInstance()->getString("FLAboutText"); -char* _PREHASH_RegionHandshakeReply = LLMessageStringTable::getInstance()->getString("RegionHandshakeReply"); -char* _PREHASH_GroupActiveProposalItemReply = LLMessageStringTable::getInstance()->getString("GroupActiveProposalItemReply"); -char* _PREHASH_MapItemReply = LLMessageStringTable::getInstance()->getString("MapItemReply"); -char* _PREHASH_Seconds = LLMessageStringTable::getInstance()->getString("Seconds"); -char* _PREHASH_UpdateUserInfo = LLMessageStringTable::getInstance()->getString("UpdateUserInfo"); -char* _PREHASH_AggregatePermTexturesOwner = LLMessageStringTable::getInstance()->getString("AggregatePermTexturesOwner"); -char* _PREHASH_Set = LLMessageStringTable::getInstance()->getString("Set"); -char* _PREHASH_NewName = LLMessageStringTable::getInstance()->getString("NewName"); -char* _PREHASH_Key = LLMessageStringTable::getInstance()->getString("Key"); -char* _PREHASH_AgentID = LLMessageStringTable::getInstance()->getString("AgentID"); -char* _PREHASH_EventNotificationRemoveRequest = LLMessageStringTable::getInstance()->getString("EventNotificationRemoveRequest"); -char* _PREHASH_NewFolderID = LLMessageStringTable::getInstance()->getString("NewFolderID"); -char* _PREHASH_Arc = LLMessageStringTable::getInstance()->getString("Arc"); -char* _PREHASH_RegionX = LLMessageStringTable::getInstance()->getString("RegionX"); -char* _PREHASH_RegionY = LLMessageStringTable::getInstance()->getString("RegionY"); -char* _PREHASH_RequestData = LLMessageStringTable::getInstance()->getString("RequestData"); -char* _PREHASH_Msg = LLMessageStringTable::getInstance()->getString("Msg"); -char* _PREHASH_Top = LLMessageStringTable::getInstance()->getString("Top"); -char* _PREHASH_MiscStats = LLMessageStringTable::getInstance()->getString("MiscStats"); -char* _PREHASH_ImageID = LLMessageStringTable::getInstance()->getString("ImageID"); -char* _PREHASH_DataPacket = LLMessageStringTable::getInstance()->getString("DataPacket"); -char* _PREHASH_You = LLMessageStringTable::getInstance()->getString("You"); -char* _PREHASH_ScriptControlChange = LLMessageStringTable::getInstance()->getString("ScriptControlChange"); -char* _PREHASH_LoadURL = LLMessageStringTable::getInstance()->getString("LoadURL"); -char* _PREHASH_SetCPURatio = LLMessageStringTable::getInstance()->getString("SetCPURatio"); -char* _PREHASH_NameValueData = LLMessageStringTable::getInstance()->getString("NameValueData"); -char* _PREHASH_AtomicPassObject = LLMessageStringTable::getInstance()->getString("AtomicPassObject"); -char* _PREHASH_ErrorMessage = LLMessageStringTable::getInstance()->getString("ErrorMessage"); -char* _PREHASH_ViewerFrozenMessage = LLMessageStringTable::getInstance()->getString("ViewerFrozenMessage"); -char* _PREHASH_HealthMessage = LLMessageStringTable::getInstance()->getString("HealthMessage"); -char* _PREHASH_LogTextMessage = LLMessageStringTable::getInstance()->getString("LogTextMessage"); -char* _PREHASH_TimeDilation = LLMessageStringTable::getInstance()->getString("TimeDilation"); -char* _PREHASH_RemoveContribution = LLMessageStringTable::getInstance()->getString("RemoveContribution"); -char* _PREHASH_Contribution = LLMessageStringTable::getInstance()->getString("Contribution"); -char* _PREHASH_SetGroupContribution = LLMessageStringTable::getInstance()->getString("SetGroupContribution"); -char* _PREHASH_Offline = LLMessageStringTable::getInstance()->getString("Offline"); -char* _PREHASH_AgentIsNowWearing = LLMessageStringTable::getInstance()->getString("AgentIsNowWearing"); -char* _PREHASH_Members = LLMessageStringTable::getInstance()->getString("Members"); -char* _PREHASH_FailedResends = LLMessageStringTable::getInstance()->getString("FailedResends"); -char* _PREHASH_SecPerDay = LLMessageStringTable::getInstance()->getString("SecPerDay"); -char* _PREHASH_CameraCenter = LLMessageStringTable::getInstance()->getString("CameraCenter"); -char* _PREHASH_CameraLeftAxis = LLMessageStringTable::getInstance()->getString("CameraLeftAxis"); -char* _PREHASH_ExBlock = LLMessageStringTable::getInstance()->getString("ExBlock"); -char* _PREHASH_Channel = LLMessageStringTable::getInstance()->getString("Channel"); -char* _PREHASH_NetTest = LLMessageStringTable::getInstance()->getString("NetTest"); -char* _PREHASH_DiscardLevel = LLMessageStringTable::getInstance()->getString("DiscardLevel"); -char* _PREHASH_LayerID = LLMessageStringTable::getInstance()->getString("LayerID"); -char* _PREHASH_GrabOffset = LLMessageStringTable::getInstance()->getString("GrabOffset"); -char* _PREHASH_SimPort = LLMessageStringTable::getInstance()->getString("SimPort"); -char* _PREHASH_PricePerMeter = LLMessageStringTable::getInstance()->getString("PricePerMeter"); -char* _PREHASH_RegionFlags = LLMessageStringTable::getInstance()->getString("RegionFlags"); -char* _PREHASH_VoteResult = LLMessageStringTable::getInstance()->getString("VoteResult"); -char* _PREHASH_ParcelDirFeeEstimate = LLMessageStringTable::getInstance()->getString("ParcelDirFeeEstimate"); -char* _PREHASH_ModifyBlock = LLMessageStringTable::getInstance()->getString("ModifyBlock"); -char* _PREHASH_InventoryBlock = LLMessageStringTable::getInstance()->getString("InventoryBlock"); -char* _PREHASH_ReplyBlock = LLMessageStringTable::getInstance()->getString("ReplyBlock"); -char* _PREHASH_ValidUntil = LLMessageStringTable::getInstance()->getString("ValidUntil"); -char* _PREHASH_VelocityInterpolateOn = LLMessageStringTable::getInstance()->getString("VelocityInterpolateOn"); -char* _PREHASH_ClassifiedDelete = LLMessageStringTable::getInstance()->getString("ClassifiedDelete"); -char* _PREHASH_RegionDenyAnonymous = LLMessageStringTable::getInstance()->getString("RegionDenyAnonymous"); -char* _PREHASH_FLImageID = LLMessageStringTable::getInstance()->getString("FLImageID"); -char* _PREHASH_AllowPublish = LLMessageStringTable::getInstance()->getString("AllowPublish"); -char* _PREHASH_SitName = LLMessageStringTable::getInstance()->getString("SitName"); -char* _PREHASH_RegionsVisited = LLMessageStringTable::getInstance()->getString("RegionsVisited"); -char* _PREHASH_DirClassifiedReply = LLMessageStringTable::getInstance()->getString("DirClassifiedReply"); -char* _PREHASH_AvatarClassifiedReply = LLMessageStringTable::getInstance()->getString("AvatarClassifiedReply"); -char* _PREHASH_MediaURL = LLMessageStringTable::getInstance()->getString("MediaURL"); -char* _PREHASH_CompleteAgentMovement = LLMessageStringTable::getInstance()->getString("CompleteAgentMovement"); -char* _PREHASH_ClassifiedID = LLMessageStringTable::getInstance()->getString("ClassifiedID"); -char* _PREHASH_LocalID = LLMessageStringTable::getInstance()->getString("LocalID"); -char* _PREHASH_SpaceIP = LLMessageStringTable::getInstance()->getString("SpaceIP"); -char* _PREHASH_RemoveItem = LLMessageStringTable::getInstance()->getString("RemoveItem"); -char* _PREHASH_LogFailedMoneyTransaction = LLMessageStringTable::getInstance()->getString("LogFailedMoneyTransaction"); -char* _PREHASH_ViewerStartAuction = LLMessageStringTable::getInstance()->getString("ViewerStartAuction"); -char* _PREHASH_StartAuction = LLMessageStringTable::getInstance()->getString("StartAuction"); -char* _PREHASH_DuplicateFlags = LLMessageStringTable::getInstance()->getString("DuplicateFlags"); -char* _PREHASH_RegionInfo2 = LLMessageStringTable::getInstance()->getString("RegionInfo2"); -char* _PREHASH_TextColor = LLMessageStringTable::getInstance()->getString("TextColor"); -char* _PREHASH_SlaveID = LLMessageStringTable::getInstance()->getString("SlaveID"); -char* _PREHASH_Charter = LLMessageStringTable::getInstance()->getString("Charter"); -char* _PREHASH_AlertData = LLMessageStringTable::getInstance()->getString("AlertData"); -char* _PREHASH_AlertInfo = LLMessageStringTable::getInstance()->getString("AlertInfo"); -char* _PREHASH_TargetBlock = LLMessageStringTable::getInstance()->getString("TargetBlock"); -char* _PREHASH_CheckParcelAuctions = LLMessageStringTable::getInstance()->getString("CheckParcelAuctions"); -char* _PREHASH_ParcelAuctions = LLMessageStringTable::getInstance()->getString("ParcelAuctions"); -char* _PREHASH_OwnerIsGroup = LLMessageStringTable::getInstance()->getString("OwnerIsGroup"); -char* _PREHASH_NameValuePair = LLMessageStringTable::getInstance()->getString("NameValuePair"); -char* _PREHASH_RemoveNameValuePair = LLMessageStringTable::getInstance()->getString("RemoveNameValuePair"); -char* _PREHASH_BulkUpdateInventory = LLMessageStringTable::getInstance()->getString("BulkUpdateInventory"); -char* _PREHASH_UpdateTaskInventory = LLMessageStringTable::getInstance()->getString("UpdateTaskInventory"); -char* _PREHASH_RemoveTaskInventory = LLMessageStringTable::getInstance()->getString("RemoveTaskInventory"); -char* _PREHASH_MoveTaskInventory = LLMessageStringTable::getInstance()->getString("MoveTaskInventory"); -char* _PREHASH_RequestTaskInventory = LLMessageStringTable::getInstance()->getString("RequestTaskInventory"); -char* _PREHASH_ReplyTaskInventory = LLMessageStringTable::getInstance()->getString("ReplyTaskInventory"); -char* _PREHASH_AggregatePermInventory = LLMessageStringTable::getInstance()->getString("AggregatePermInventory"); -char* _PREHASH_GroupAccountTransactionsReply = LLMessageStringTable::getInstance()->getString("GroupAccountTransactionsReply"); -char* _PREHASH_SimulatorInfo = LLMessageStringTable::getInstance()->getString("SimulatorInfo"); -char* _PREHASH_WearableData = LLMessageStringTable::getInstance()->getString("WearableData"); -char* _PREHASH_Enabled = LLMessageStringTable::getInstance()->getString("Enabled"); -char* _PREHASH_Savings = LLMessageStringTable::getInstance()->getString("Savings"); -char* _PREHASH_SimulatorLoad = LLMessageStringTable::getInstance()->getString("SimulatorLoad"); -char* _PREHASH_InternalRegionIP = LLMessageStringTable::getInstance()->getString("InternalRegionIP"); -char* _PREHASH_ExternalRegionIP = LLMessageStringTable::getInstance()->getString("ExternalRegionIP"); -char* _PREHASH_TotalPairs = LLMessageStringTable::getInstance()->getString("TotalPairs"); -char* _PREHASH_CreateGroupRequest = LLMessageStringTable::getInstance()->getString("CreateGroupRequest"); -char* _PREHASH_JoinGroupRequest = LLMessageStringTable::getInstance()->getString("JoinGroupRequest"); -char* _PREHASH_LeaveGroupRequest = LLMessageStringTable::getInstance()->getString("LeaveGroupRequest"); -char* _PREHASH_InviteGroupRequest = LLMessageStringTable::getInstance()->getString("InviteGroupRequest"); -char* _PREHASH_LiveHelpGroupRequest = LLMessageStringTable::getInstance()->getString("LiveHelpGroupRequest"); -char* _PREHASH_PriceParcelClaimFactor = LLMessageStringTable::getInstance()->getString("PriceParcelClaimFactor"); -char* _PREHASH_BillableArea = LLMessageStringTable::getInstance()->getString("BillableArea"); -char* _PREHASH_ObjectID = LLMessageStringTable::getInstance()->getString("ObjectID"); -char* _PREHASH_ObjectFlagUpdate = LLMessageStringTable::getInstance()->getString("ObjectFlagUpdate"); -char* _PREHASH_GroupRoleUpdate = LLMessageStringTable::getInstance()->getString("GroupRoleUpdate"); -char* _PREHASH_RequestInventoryAsset = LLMessageStringTable::getInstance()->getString("RequestInventoryAsset"); -char* _PREHASH_ChangedGrid = LLMessageStringTable::getInstance()->getString("ChangedGrid"); -char* _PREHASH_AgentDropGroup = LLMessageStringTable::getInstance()->getString("AgentDropGroup"); -char* _PREHASH_Details = LLMessageStringTable::getInstance()->getString("Details"); -char* _PREHASH_LocationX = LLMessageStringTable::getInstance()->getString("LocationX"); -char* _PREHASH_SaleType = LLMessageStringTable::getInstance()->getString("SaleType"); -char* _PREHASH_LocationY = LLMessageStringTable::getInstance()->getString("LocationY"); -char* _PREHASH_LocationZ = LLMessageStringTable::getInstance()->getString("LocationZ"); -char* _PREHASH_EconomyData = LLMessageStringTable::getInstance()->getString("EconomyData"); -char* _PREHASH_HeadRotation = LLMessageStringTable::getInstance()->getString("HeadRotation"); -char* _PREHASH_DeleteOnCompletion = LLMessageStringTable::getInstance()->getString("DeleteOnCompletion"); -char* _PREHASH_PublicPort = LLMessageStringTable::getInstance()->getString("PublicPort"); -char* _PREHASH_DirClassifiedQuery = LLMessageStringTable::getInstance()->getString("DirClassifiedQuery"); -char* _PREHASH_CallbackID = LLMessageStringTable::getInstance()->getString("CallbackID"); -char* _PREHASH_RequestParcelTransfer = LLMessageStringTable::getInstance()->getString("RequestParcelTransfer"); -char* _PREHASH_RoleCount = LLMessageStringTable::getInstance()->getString("RoleCount"); -char* _PREHASH_ObjectCapacity = LLMessageStringTable::getInstance()->getString("ObjectCapacity"); -char* _PREHASH_RequestID = LLMessageStringTable::getInstance()->getString("RequestID"); -char* _PREHASH_RequestXfer = LLMessageStringTable::getInstance()->getString("RequestXfer"); -char* _PREHASH_ObjectTaxCurrent = LLMessageStringTable::getInstance()->getString("ObjectTaxCurrent"); -char* _PREHASH_LightTaxCurrent = LLMessageStringTable::getInstance()->getString("LightTaxCurrent"); -char* _PREHASH_LandTaxCurrent = LLMessageStringTable::getInstance()->getString("LandTaxCurrent"); -char* _PREHASH_GroupTaxCurrent = LLMessageStringTable::getInstance()->getString("GroupTaxCurrent"); -char* _PREHASH_FetchInventoryDescendents = LLMessageStringTable::getInstance()->getString("FetchInventoryDescendents"); -char* _PREHASH_InventoryDescendents = LLMessageStringTable::getInstance()->getString("InventoryDescendents"); -char* _PREHASH_Descendents = LLMessageStringTable::getInstance()->getString("Descendents"); -char* _PREHASH_PurgeInventoryDescendents = LLMessageStringTable::getInstance()->getString("PurgeInventoryDescendents"); -char* _PREHASH_ShowDir = LLMessageStringTable::getInstance()->getString("ShowDir"); -char* _PREHASH_IsOwner = LLMessageStringTable::getInstance()->getString("IsOwner"); -char* _PREHASH_Timestamp = LLMessageStringTable::getInstance()->getString("Timestamp"); -char* _PREHASH_GlobalPos = LLMessageStringTable::getInstance()->getString("GlobalPos"); -char* _PREHASH_GrabOffsetInitial = LLMessageStringTable::getInstance()->getString("GrabOffsetInitial"); -char* _PREHASH_IsTrial = LLMessageStringTable::getInstance()->getString("IsTrial"); -char* _PREHASH_ObjectDuplicateOnRay = LLMessageStringTable::getInstance()->getString("ObjectDuplicateOnRay"); -char* _PREHASH_GroupMembershipCount = LLMessageStringTable::getInstance()->getString("GroupMembershipCount"); -char* _PREHASH_MethodData = LLMessageStringTable::getInstance()->getString("MethodData"); -char* _PREHASH_ActivateGestures = LLMessageStringTable::getInstance()->getString("ActivateGestures"); -char* _PREHASH_DeactivateGestures = LLMessageStringTable::getInstance()->getString("DeactivateGestures"); -char* _PREHASH_ProposalData = LLMessageStringTable::getInstance()->getString("ProposalData"); -char* _PREHASH_PosGlobal = LLMessageStringTable::getInstance()->getString("PosGlobal"); -char* _PREHASH_SearchID = LLMessageStringTable::getInstance()->getString("SearchID"); -char* _PREHASH_RezMultipleAttachmentsFromInv = LLMessageStringTable::getInstance()->getString("RezMultipleAttachmentsFromInv"); -char* _PREHASH_SearchName = LLMessageStringTable::getInstance()->getString("SearchName"); -char* _PREHASH_VersionString = LLMessageStringTable::getInstance()->getString("VersionString"); -char* _PREHASH_CreateGroupReply = LLMessageStringTable::getInstance()->getString("CreateGroupReply"); -char* _PREHASH_LeaveGroupReply = LLMessageStringTable::getInstance()->getString("LeaveGroupReply"); -char* _PREHASH_ActualArea = LLMessageStringTable::getInstance()->getString("ActualArea"); -char* _PREHASH_Message = LLMessageStringTable::getInstance()->getString("Message"); -char* _PREHASH_ClickAction = LLMessageStringTable::getInstance()->getString("ClickAction"); -char* _PREHASH_AssetUploadComplete = LLMessageStringTable::getInstance()->getString("AssetUploadComplete"); -char* _PREHASH_RequestType = LLMessageStringTable::getInstance()->getString("RequestType"); -char* _PREHASH_UUID = LLMessageStringTable::getInstance()->getString("UUID"); -char* _PREHASH_BaseMask = LLMessageStringTable::getInstance()->getString("BaseMask"); -char* _PREHASH_NetBlock = LLMessageStringTable::getInstance()->getString("NetBlock"); -char* _PREHASH_GlobalX = LLMessageStringTable::getInstance()->getString("GlobalX"); -char* _PREHASH_GlobalY = LLMessageStringTable::getInstance()->getString("GlobalY"); -char* _PREHASH_CopyRotates = LLMessageStringTable::getInstance()->getString("CopyRotates"); -char* _PREHASH_KickUserAck = LLMessageStringTable::getInstance()->getString("KickUserAck"); -char* _PREHASH_TopPick = LLMessageStringTable::getInstance()->getString("TopPick"); //legacy var need to be deleted -angela -char* _PREHASH_SessionID = LLMessageStringTable::getInstance()->getString("SessionID"); -char* _PREHASH_GlobalZ = LLMessageStringTable::getInstance()->getString("GlobalZ"); -char* _PREHASH_DeclineFriendship = LLMessageStringTable::getInstance()->getString("DeclineFriendship"); -char* _PREHASH_FormFriendship = LLMessageStringTable::getInstance()->getString("FormFriendship"); -char* _PREHASH_TerminateFriendship = LLMessageStringTable::getInstance()->getString("TerminateFriendship"); -char* _PREHASH_TaskData = LLMessageStringTable::getInstance()->getString("TaskData"); -char* _PREHASH_SimWideMaxPrims = LLMessageStringTable::getInstance()->getString("SimWideMaxPrims"); -char* _PREHASH_TotalPrims = LLMessageStringTable::getInstance()->getString("TotalPrims"); -char* _PREHASH_ProfileBegin = LLMessageStringTable::getInstance()->getString("ProfileBegin"); -char* _PREHASH_Request = LLMessageStringTable::getInstance()->getString("Request"); -char* _PREHASH_GroupAccountDetailsRequest = LLMessageStringTable::getInstance()->getString("GroupAccountDetailsRequest"); -char* _PREHASH_GroupActiveProposalsRequest = LLMessageStringTable::getInstance()->getString("GroupActiveProposalsRequest"); -char* _PREHASH_StringValue = LLMessageStringTable::getInstance()->getString("StringValue"); -char* _PREHASH_Version = LLMessageStringTable::getInstance()->getString("Version"); -char* _PREHASH_OtherCount = LLMessageStringTable::getInstance()->getString("OtherCount"); -char* _PREHASH_MemberCount = LLMessageStringTable::getInstance()->getString("MemberCount"); -char* _PREHASH_ChatData = LLMessageStringTable::getInstance()->getString("ChatData"); -char* _PREHASH_IsGroupOwned = LLMessageStringTable::getInstance()->getString("IsGroupOwned"); -char* _PREHASH_EnergyEfficiency = LLMessageStringTable::getInstance()->getString("EnergyEfficiency"); -char* _PREHASH_PickInfoUpdate = LLMessageStringTable::getInstance()->getString("PickInfoUpdate"); -char* _PREHASH_PickDelete = LLMessageStringTable::getInstance()->getString("PickDelete"); -char* _PREHASH_ScriptReset = LLMessageStringTable::getInstance()->getString("ScriptReset"); -char* _PREHASH_Requester = LLMessageStringTable::getInstance()->getString("Requester"); -char* _PREHASH_ForSale = LLMessageStringTable::getInstance()->getString("ForSale"); -char* _PREHASH_NearestLandingRegionReply = LLMessageStringTable::getInstance()->getString("NearestLandingRegionReply"); -char* _PREHASH_ParcelID = LLMessageStringTable::getInstance()->getString("ParcelID"); -char* _PREHASH_Godlike = LLMessageStringTable::getInstance()->getString("Godlike"); -char* _PREHASH_TotalDebits = LLMessageStringTable::getInstance()->getString("TotalDebits"); -char* _PREHASH_Direction = LLMessageStringTable::getInstance()->getString("Direction"); -char* _PREHASH_HealthData = LLMessageStringTable::getInstance()->getString("HealthData"); -char* _PREHASH_LeftAxis = LLMessageStringTable::getInstance()->getString("LeftAxis"); -char* _PREHASH_LocationBlock = LLMessageStringTable::getInstance()->getString("LocationBlock"); -char* _PREHASH_ObjectImage = LLMessageStringTable::getInstance()->getString("ObjectImage"); -char* _PREHASH_TerrainStartHeight00 = LLMessageStringTable::getInstance()->getString("TerrainStartHeight00"); -char* _PREHASH_TerrainStartHeight01 = LLMessageStringTable::getInstance()->getString("TerrainStartHeight01"); -char* _PREHASH_TerrainStartHeight10 = LLMessageStringTable::getInstance()->getString("TerrainStartHeight10"); -char* _PREHASH_TerrainStartHeight11 = LLMessageStringTable::getInstance()->getString("TerrainStartHeight11"); -char* _PREHASH_WaterHeight = LLMessageStringTable::getInstance()->getString("WaterHeight"); -char* _PREHASH_FetchInventoryReply = LLMessageStringTable::getInstance()->getString("FetchInventoryReply"); -char* _PREHASH_GroupAccountSummaryReply = LLMessageStringTable::getInstance()->getString("GroupAccountSummaryReply"); -char* _PREHASH_AttachedSound = LLMessageStringTable::getInstance()->getString("AttachedSound"); -char* _PREHASH_ParamInUse = LLMessageStringTable::getInstance()->getString("ParamInUse"); -char* _PREHASH_GodKickUser = LLMessageStringTable::getInstance()->getString("GodKickUser"); -char* _PREHASH_PickName = LLMessageStringTable::getInstance()->getString("PickName"); -char* _PREHASH_TaskName = LLMessageStringTable::getInstance()->getString("TaskName"); -char* _PREHASH_ObjectCount = LLMessageStringTable::getInstance()->getString("ObjectCount"); -char* _PREHASH_RegionPresenceRequestByHandle = LLMessageStringTable::getInstance()->getString("RegionPresenceRequestByHandle"); -char* _PREHASH_RezSingleAttachmentFromInv = LLMessageStringTable::getInstance()->getString("RezSingleAttachmentFromInv"); -char* _PREHASH_ChildAgentUpdate = LLMessageStringTable::getInstance()->getString("ChildAgentUpdate"); -char* _PREHASH_IsOwnerGroup = LLMessageStringTable::getInstance()->getString("IsOwnerGroup"); -char* _PREHASH_AgentHeightWidth = LLMessageStringTable::getInstance()->getString("AgentHeightWidth"); -char* _PREHASH_VerticalAngle = LLMessageStringTable::getInstance()->getString("VerticalAngle"); -char* _PREHASH_WearableType = LLMessageStringTable::getInstance()->getString("WearableType"); -char* _PREHASH_AggregatePermNextOwner = LLMessageStringTable::getInstance()->getString("AggregatePermNextOwner"); -char* _PREHASH_ShowInList = LLMessageStringTable::getInstance()->getString("ShowInList"); -char* _PREHASH_UpdateParcel = LLMessageStringTable::getInstance()->getString("UpdateParcel"); -char* _PREHASH_SetAlwaysRun = LLMessageStringTable::getInstance()->getString("SetAlwaysRun"); -char* _PREHASH_NVPair = LLMessageStringTable::getInstance()->getString("NVPair"); -char* _PREHASH_SearchType = LLMessageStringTable::getInstance()->getString("SearchType"); -char* _PREHASH_ObjectSpinStart = LLMessageStringTable::getInstance()->getString("ObjectSpinStart"); -char* _PREHASH_UseEstateSun = LLMessageStringTable::getInstance()->getString("UseEstateSun"); -char* _PREHASH_RegionID = LLMessageStringTable::getInstance()->getString("RegionID"); -char* _PREHASH_AbuseRegionID = LLMessageStringTable::getInstance()->getString("AbuseRegionID"); -char* _PREHASH_Creator = LLMessageStringTable::getInstance()->getString("Creator"); -char* _PREHASH_ProposalText = LLMessageStringTable::getInstance()->getString("ProposalText"); -char* _PREHASH_DirEventsReply = LLMessageStringTable::getInstance()->getString("DirEventsReply"); -char* _PREHASH_EventInfoReply = LLMessageStringTable::getInstance()->getString("EventInfoReply"); -char* _PREHASH_UserInfoReply = LLMessageStringTable::getInstance()->getString("UserInfoReply"); -char* _PREHASH_PathRadiusOffset = LLMessageStringTable::getInstance()->getString("PathRadiusOffset"); -char* _PREHASH_TextureData = LLMessageStringTable::getInstance()->getString("TextureData"); -char* _PREHASH_ChatPass = LLMessageStringTable::getInstance()->getString("ChatPass"); -char* _PREHASH_TargetID = LLMessageStringTable::getInstance()->getString("TargetID"); -char* _PREHASH_DefaultPayPrice = LLMessageStringTable::getInstance()->getString("DefaultPayPrice"); -char* _PREHASH_UserLocation = LLMessageStringTable::getInstance()->getString("UserLocation"); -char* _PREHASH_MaxPrims = LLMessageStringTable::getInstance()->getString("MaxPrims"); -char* _PREHASH_LandmarkID = LLMessageStringTable::getInstance()->getString("LandmarkID"); -char* _PREHASH_InitiateDownload = LLMessageStringTable::getInstance()->getString("InitiateDownload"); -char* _PREHASH_Name = LLMessageStringTable::getInstance()->getString("Name"); -char* _PREHASH_OtherCleanTime = LLMessageStringTable::getInstance()->getString("OtherCleanTime"); -char* _PREHASH_ParcelSetOtherCleanTime = LLMessageStringTable::getInstance()->getString("ParcelSetOtherCleanTime"); -char* _PREHASH_TeleportPriceExponent = LLMessageStringTable::getInstance()->getString("TeleportPriceExponent"); -char* _PREHASH_Gain = LLMessageStringTable::getInstance()->getString("Gain"); -char* _PREHASH_PacketAck = LLMessageStringTable::getInstance()->getString("PacketAck"); -char* _PREHASH_PathSkew = LLMessageStringTable::getInstance()->getString("PathSkew"); -char* _PREHASH_SimulatorShutdownRequest = LLMessageStringTable::getInstance()->getString("SimulatorShutdownRequest"); -char* _PREHASH_NearestLandingRegionRequest = LLMessageStringTable::getInstance()->getString("NearestLandingRegionRequest"); -char* _PREHASH_OtherID = LLMessageStringTable::getInstance()->getString("OtherID"); -char* _PREHASH_MemberID = LLMessageStringTable::getInstance()->getString("MemberID"); -char* _PREHASH_MapLayerRequest = LLMessageStringTable::getInstance()->getString("MapLayerRequest"); -char* _PREHASH_ObjectScale = LLMessageStringTable::getInstance()->getString("ObjectScale"); -char* _PREHASH_TargetIP = LLMessageStringTable::getInstance()->getString("TargetIP"); -char* _PREHASH_Redo = LLMessageStringTable::getInstance()->getString("Redo"); -char* _PREHASH_MoneyBalance = LLMessageStringTable::getInstance()->getString("MoneyBalance"); -char* _PREHASH_TrackAgent = LLMessageStringTable::getInstance()->getString("TrackAgent"); -char* _PREHASH_MaxX = LLMessageStringTable::getInstance()->getString("MaxX"); -char* _PREHASH_Data = LLMessageStringTable::getInstance()->getString("Data"); -char* _PREHASH_MaxY = LLMessageStringTable::getInstance()->getString("MaxY"); -char* _PREHASH_TextureAnim = LLMessageStringTable::getInstance()->getString("TextureAnim"); -char* _PREHASH_ReturnIDs = LLMessageStringTable::getInstance()->getString("ReturnIDs"); -char* _PREHASH_Date = LLMessageStringTable::getInstance()->getString("Date"); -char* _PREHASH_AgentWearablesUpdate = LLMessageStringTable::getInstance()->getString("AgentWearablesUpdate"); -char* _PREHASH_AgentDataUpdate = LLMessageStringTable::getInstance()->getString("AgentDataUpdate"); -char* _PREHASH_GroupDataUpdate = LLMessageStringTable::getInstance()->getString("GroupDataUpdate"); -char* _PREHASH_Hash = LLMessageStringTable::getInstance()->getString("Hash"); -char* _PREHASH_AgentGroupDataUpdate = LLMessageStringTable::getInstance()->getString("AgentGroupDataUpdate"); -char* _PREHASH_Left = LLMessageStringTable::getInstance()->getString("Left"); -char* _PREHASH_Mask = LLMessageStringTable::getInstance()->getString("Mask"); -char* _PREHASH_ForceMouselook = LLMessageStringTable::getInstance()->getString("ForceMouselook"); -char* _PREHASH_Success = LLMessageStringTable::getInstance()->getString("Success"); -char* _PREHASH_ObjectGroup = LLMessageStringTable::getInstance()->getString("ObjectGroup"); -char* _PREHASH_SunHour = LLMessageStringTable::getInstance()->getString("SunHour"); -char* _PREHASH_MinX = LLMessageStringTable::getInstance()->getString("MinX"); -char* _PREHASH_ScriptSensorReply = LLMessageStringTable::getInstance()->getString("ScriptSensorReply"); -char* _PREHASH_MinY = LLMessageStringTable::getInstance()->getString("MinY"); -char* _PREHASH_Command = LLMessageStringTable::getInstance()->getString("Command"); -char* _PREHASH_Desc = LLMessageStringTable::getInstance()->getString("Desc"); -char* _PREHASH_AttachmentNeedsSave = LLMessageStringTable::getInstance()->getString("AttachmentNeedsSave"); -char* _PREHASH_HistoryItemData = LLMessageStringTable::getInstance()->getString("HistoryItemData"); -char* _PREHASH_AgentCachedTexture = LLMessageStringTable::getInstance()->getString("AgentCachedTexture"); -char* _PREHASH_Subject = LLMessageStringTable::getInstance()->getString("Subject"); -char* _PREHASH_East = LLMessageStringTable::getInstance()->getString("East"); -char* _PREHASH_QueryReplies = LLMessageStringTable::getInstance()->getString("QueryReplies"); -char* _PREHASH_ObjectCategory = LLMessageStringTable::getInstance()->getString("ObjectCategory"); -char* _PREHASH_Time = LLMessageStringTable::getInstance()->getString("Time"); -char* _PREHASH_CreateLandmarkForEvent = LLMessageStringTable::getInstance()->getString("CreateLandmarkForEvent"); -char* _PREHASH_ParentID = LLMessageStringTable::getInstance()->getString("ParentID"); -char* _PREHASH_Ping = LLMessageStringTable::getInstance()->getString("Ping"); -char* _PREHASH_Perp = LLMessageStringTable::getInstance()->getString("Perp"); -char* _PREHASH_Code = LLMessageStringTable::getInstance()->getString("Code"); -char* _PREHASH_InvType = LLMessageStringTable::getInstance()->getString("InvType"); -char* _PREHASH_AgentFOV = LLMessageStringTable::getInstance()->getString("AgentFOV"); -char* _PREHASH_Audible = LLMessageStringTable::getInstance()->getString("Audible"); -char* _PREHASH_AuctionData = LLMessageStringTable::getInstance()->getString("AuctionData"); -char* _PREHASH_IDBlock = LLMessageStringTable::getInstance()->getString("IDBlock"); -char* _PREHASH_West = LLMessageStringTable::getInstance()->getString("West"); -char* _PREHASH_Undo = LLMessageStringTable::getInstance()->getString("Undo"); -char* _PREHASH_TotalNumItems = LLMessageStringTable::getInstance()->getString("TotalNumItems"); -char* _PREHASH_Info = LLMessageStringTable::getInstance()->getString("Info"); -char* _PREHASH_Area = LLMessageStringTable::getInstance()->getString("Area"); -char* _PREHASH_SimCrashed = LLMessageStringTable::getInstance()->getString("SimCrashed"); -char* _PREHASH_Text = LLMessageStringTable::getInstance()->getString("Text"); -char* _PREHASH_PriceGroupCreate = LLMessageStringTable::getInstance()->getString("PriceGroupCreate"); -char* _PREHASH_ObjectShape = LLMessageStringTable::getInstance()->getString("ObjectShape"); -char* _PREHASH_GroupRoleDataReply = LLMessageStringTable::getInstance()->getString("GroupRoleDataReply"); -char* _PREHASH_MuteCRC = LLMessageStringTable::getInstance()->getString("MuteCRC"); -char* _PREHASH_Size = LLMessageStringTable::getInstance()->getString("Size"); -char* _PREHASH_FromAddress = LLMessageStringTable::getInstance()->getString("FromAddress"); -char* _PREHASH_Body = LLMessageStringTable::getInstance()->getString("Body"); -char* _PREHASH_FileData = LLMessageStringTable::getInstance()->getString("FileData"); -char* _PREHASH_List = LLMessageStringTable::getInstance()->getString("List"); -char* _PREHASH_KickUser = LLMessageStringTable::getInstance()->getString("KickUser"); -char* _PREHASH_OtherPrims = LLMessageStringTable::getInstance()->getString("OtherPrims"); -char* _PREHASH_RunTime = LLMessageStringTable::getInstance()->getString("RunTime"); -char* _PREHASH_GrantUserRights = LLMessageStringTable::getInstance()->getString("GrantUserRights"); -char* _PREHASH_RpcScriptRequestInboundForward = LLMessageStringTable::getInstance()->getString("RpcScriptRequestInboundForward"); -char* _PREHASH_More = LLMessageStringTable::getInstance()->getString("More"); -char* _PREHASH_Majority = LLMessageStringTable::getInstance()->getString("Majority"); -char* _PREHASH_MetersTraveled = LLMessageStringTable::getInstance()->getString("MetersTraveled"); -char* _PREHASH_Stat = LLMessageStringTable::getInstance()->getString("Stat"); -char* _PREHASH_SoundID = LLMessageStringTable::getInstance()->getString("SoundID"); -char* _PREHASH_Item = LLMessageStringTable::getInstance()->getString("Item"); -char* _PREHASH_User = LLMessageStringTable::getInstance()->getString("User"); -char* _PREHASH_Prey = LLMessageStringTable::getInstance()->getString("Prey"); -char* _PREHASH_RayStart = LLMessageStringTable::getInstance()->getString("RayStart"); -char* _PREHASH_UsecSinceStart = LLMessageStringTable::getInstance()->getString("UsecSinceStart"); -char* _PREHASH_ParcelData = LLMessageStringTable::getInstance()->getString("ParcelData"); -char* _PREHASH_CameraUpAxis = LLMessageStringTable::getInstance()->getString("CameraUpAxis"); -char* _PREHASH_ScriptDialog = LLMessageStringTable::getInstance()->getString("ScriptDialog"); -char* _PREHASH_MasterParcelData = LLMessageStringTable::getInstance()->getString("MasterParcelData"); -char* _PREHASH_Invalid = LLMessageStringTable::getInstance()->getString("Invalid"); -char* _PREHASH_ProfileCurve = LLMessageStringTable::getInstance()->getString("ProfileCurve"); -char* _PREHASH_ParcelAccessListUpdate = LLMessageStringTable::getInstance()->getString("ParcelAccessListUpdate"); -char* _PREHASH_MuteListUpdate = LLMessageStringTable::getInstance()->getString("MuteListUpdate"); -char* _PREHASH_SendPacket = LLMessageStringTable::getInstance()->getString("SendPacket"); -char* _PREHASH_SendXferPacket = LLMessageStringTable::getInstance()->getString("SendXferPacket"); -char* _PREHASH_RegionDenyIdentified = LLMessageStringTable::getInstance()->getString("RegionDenyIdentified"); -char* _PREHASH_NotecardItemID = LLMessageStringTable::getInstance()->getString("NotecardItemID"); -char* _PREHASH_LastName = LLMessageStringTable::getInstance()->getString("LastName"); -char* _PREHASH_From = LLMessageStringTable::getInstance()->getString("From"); -char* _PREHASH_RoleChange = LLMessageStringTable::getInstance()->getString("RoleChange"); -char* _PREHASH_Port = LLMessageStringTable::getInstance()->getString("Port"); -char* _PREHASH_MemberTitle = LLMessageStringTable::getInstance()->getString("MemberTitle"); -char* _PREHASH_LogParcelChanges = LLMessageStringTable::getInstance()->getString("LogParcelChanges"); -char* _PREHASH_AgentCachedTextureResponse = LLMessageStringTable::getInstance()->getString("AgentCachedTextureResponse"); -char* _PREHASH_DeRezObject = LLMessageStringTable::getInstance()->getString("DeRezObject"); -char* _PREHASH_IsTemporary = LLMessageStringTable::getInstance()->getString("IsTemporary"); -char* _PREHASH_InsigniaID = LLMessageStringTable::getInstance()->getString("InsigniaID"); -char* _PREHASH_CheckFlags = LLMessageStringTable::getInstance()->getString("CheckFlags"); -char* _PREHASH_EventID = LLMessageStringTable::getInstance()->getString("EventID"); -char* _PREHASH_Selected = LLMessageStringTable::getInstance()->getString("Selected"); -char* _PREHASH_FromAgentId = LLMessageStringTable::getInstance()->getString("FromAgentId"); -char* _PREHASH_Type = LLMessageStringTable::getInstance()->getString("Type"); -char* _PREHASH_ChatType = LLMessageStringTable::getInstance()->getString("ChatType"); -char* _PREHASH_ReportData = LLMessageStringTable::getInstance()->getString("ReportData"); -char* _PREHASH_RequestBlock = LLMessageStringTable::getInstance()->getString("RequestBlock"); -char* _PREHASH_GrantData = LLMessageStringTable::getInstance()->getString("GrantData"); -char* _PREHASH_DetachAttachmentIntoInv = LLMessageStringTable::getInstance()->getString("DetachAttachmentIntoInv"); -char* _PREHASH_ParcelDisableObjects = LLMessageStringTable::getInstance()->getString("ParcelDisableObjects"); -char* _PREHASH_Sections = LLMessageStringTable::getInstance()->getString("Sections"); -char* _PREHASH_GodLevel = LLMessageStringTable::getInstance()->getString("GodLevel"); -char* _PREHASH_PayPriceReply = LLMessageStringTable::getInstance()->getString("PayPriceReply"); -char* _PREHASH_QueryID = LLMessageStringTable::getInstance()->getString("QueryID"); -char* _PREHASH_CameraEyeOffset = LLMessageStringTable::getInstance()->getString("CameraEyeOffset"); -char* _PREHASH_AgentPosition = LLMessageStringTable::getInstance()->getString("AgentPosition"); -char* _PREHASH_GrabPosition = LLMessageStringTable::getInstance()->getString("GrabPosition"); -char* _PREHASH_OnlineNotification = LLMessageStringTable::getInstance()->getString("OnlineNotification"); -char* _PREHASH_OfflineNotification = LLMessageStringTable::getInstance()->getString("OfflineNotification"); -char* _PREHASH_SendPostcard = LLMessageStringTable::getInstance()->getString("SendPostcard"); -char* _PREHASH_RequestFlags = LLMessageStringTable::getInstance()->getString("RequestFlags"); -char* _PREHASH_GroupAccountSummaryRequest = LLMessageStringTable::getInstance()->getString("GroupAccountSummaryRequest"); -char* _PREHASH_GroupVoteHistoryRequest = LLMessageStringTable::getInstance()->getString("GroupVoteHistoryRequest"); -char* _PREHASH_ParamValue = LLMessageStringTable::getInstance()->getString("ParamValue"); -char* _PREHASH_MaxAgents = LLMessageStringTable::getInstance()->getString("MaxAgents"); -char* _PREHASH_CreateNewOutfitAttachments = LLMessageStringTable::getInstance()->getString("CreateNewOutfitAttachments"); -char* _PREHASH_RegionHandle = LLMessageStringTable::getInstance()->getString("RegionHandle"); -char* _PREHASH_TeleportProgress = LLMessageStringTable::getInstance()->getString("TeleportProgress"); -char* _PREHASH_AgentQuitCopy = LLMessageStringTable::getInstance()->getString("AgentQuitCopy"); -char* _PREHASH_AvatarInterestsUpdate = LLMessageStringTable::getInstance()->getString("AvatarInterestsUpdate"); -char* _PREHASH_GroupNoticeID = LLMessageStringTable::getInstance()->getString("GroupNoticeID"); -char* _PREHASH_ParcelName = LLMessageStringTable::getInstance()->getString("ParcelName"); -char* _PREHASH_PriceObjectRent = LLMessageStringTable::getInstance()->getString("PriceObjectRent"); -char* _PREHASH_OfferCallingCard = LLMessageStringTable::getInstance()->getString("OfferCallingCard"); -char* _PREHASH_AcceptCallingCard = LLMessageStringTable::getInstance()->getString("AcceptCallingCard"); -char* _PREHASH_DeclineCallingCard = LLMessageStringTable::getInstance()->getString("DeclineCallingCard"); -char* _PREHASH_AgentAccess = LLMessageStringTable::getInstance()->getString("AgentAccess"); -char* _PREHASH_AgentLegacyAccess = LLMessageStringTable::getInstance()->getString("AgentLegacyAccess"); -char* _PREHASH_AgentMaxAccess = LLMessageStringTable::getInstance()->getString("AgentMaxAccess"); -char* _PREHASH_DataHomeLocationReply = LLMessageStringTable::getInstance()->getString("DataHomeLocationReply"); -char* _PREHASH_EventLocationReply = LLMessageStringTable::getInstance()->getString("EventLocationReply"); -char* _PREHASH_TerseDateID = LLMessageStringTable::getInstance()->getString("TerseDateID"); -char* _PREHASH_ObjectOwner = LLMessageStringTable::getInstance()->getString("ObjectOwner"); -char* _PREHASH_AssetID = LLMessageStringTable::getInstance()->getString("AssetID"); -char* _PREHASH_AlertMessage = LLMessageStringTable::getInstance()->getString("AlertMessage"); -char* _PREHASH_AgentAlertMessage = LLMessageStringTable::getInstance()->getString("AgentAlertMessage"); -char* _PREHASH_EstateOwnerMessage = LLMessageStringTable::getInstance()->getString("EstateOwnerMessage"); -char* _PREHASH_ParcelMediaCommandMessage = LLMessageStringTable::getInstance()->getString("ParcelMediaCommandMessage"); -char* _PREHASH_Auction = LLMessageStringTable::getInstance()->getString("Auction"); -char* _PREHASH_Category = LLMessageStringTable::getInstance()->getString("Category"); -char* _PREHASH_FilePath = LLMessageStringTable::getInstance()->getString("FilePath"); -char* _PREHASH_ItemFlags = LLMessageStringTable::getInstance()->getString("ItemFlags"); -char* _PREHASH_Invoice = LLMessageStringTable::getInstance()->getString("Invoice"); -char* _PREHASH_IntervalDays = LLMessageStringTable::getInstance()->getString("IntervalDays"); -char* _PREHASH_PathScaleX = LLMessageStringTable::getInstance()->getString("PathScaleX"); -char* _PREHASH_FromTaskID = LLMessageStringTable::getInstance()->getString("FromTaskID"); -char* _PREHASH_PathScaleY = LLMessageStringTable::getInstance()->getString("PathScaleY"); -char* _PREHASH_TimeInfo = LLMessageStringTable::getInstance()->getString("TimeInfo"); -char* _PREHASH_PublicCount = LLMessageStringTable::getInstance()->getString("PublicCount"); -char* _PREHASH_ParcelJoin = LLMessageStringTable::getInstance()->getString("ParcelJoin"); -char* _PREHASH_GroupRolesCount = LLMessageStringTable::getInstance()->getString("GroupRolesCount"); -char* _PREHASH_SimulatorBlock = LLMessageStringTable::getInstance()->getString("SimulatorBlock"); -char* _PREHASH_GroupID = LLMessageStringTable::getInstance()->getString("GroupID"); -char* _PREHASH_AgentVel = LLMessageStringTable::getInstance()->getString("AgentVel"); -char* _PREHASH_RequestImage = LLMessageStringTable::getInstance()->getString("RequestImage"); -char* _PREHASH_NetStats = LLMessageStringTable::getInstance()->getString("NetStats"); -char* _PREHASH_AgentPos = LLMessageStringTable::getInstance()->getString("AgentPos"); -char* _PREHASH_AgentSit = LLMessageStringTable::getInstance()->getString("AgentSit"); -char* _PREHASH_Material = LLMessageStringTable::getInstance()->getString("Material"); -char* _PREHASH_ObjectDeGrab = LLMessageStringTable::getInstance()->getString("ObjectDeGrab"); -char* _PREHASH_VelocityInterpolateOff = LLMessageStringTable::getInstance()->getString("VelocityInterpolateOff"); -char* _PREHASH_AuthorizedBuyerID = LLMessageStringTable::getInstance()->getString("AuthorizedBuyerID"); -char* _PREHASH_AvatarPropertiesReply = LLMessageStringTable::getInstance()->getString("AvatarPropertiesReply"); -char* _PREHASH_GroupProfileReply = LLMessageStringTable::getInstance()->getString("GroupProfileReply"); -char* _PREHASH_SimOwner = LLMessageStringTable::getInstance()->getString("SimOwner"); -char* _PREHASH_SalePrice = LLMessageStringTable::getInstance()->getString("SalePrice"); -char* _PREHASH_Animation = LLMessageStringTable::getInstance()->getString("Animation"); -char* _PREHASH_OwnerID = LLMessageStringTable::getInstance()->getString("OwnerID"); -char* _PREHASH_NearestLandingRegionUpdated = LLMessageStringTable::getInstance()->getString("NearestLandingRegionUpdated"); -char* _PREHASH_PassToAgent = LLMessageStringTable::getInstance()->getString("PassToAgent"); -char* _PREHASH_PreyAgent = LLMessageStringTable::getInstance()->getString("PreyAgent"); -char* _PREHASH_SimStats = LLMessageStringTable::getInstance()->getString("SimStats"); -char* _PREHASH_LogoutReply = LLMessageStringTable::getInstance()->getString("LogoutReply"); -char* _PREHASH_FeatureDisabled = LLMessageStringTable::getInstance()->getString("FeatureDisabled"); -char* _PREHASH_PhysicalAvatarEventList = LLMessageStringTable::getInstance()->getString("PhysicalAvatarEventList"); -char* _PREHASH_ObjectLocalID = LLMessageStringTable::getInstance()->getString("ObjectLocalID"); -char* _PREHASH_Dropped = LLMessageStringTable::getInstance()->getString("Dropped"); -char* _PREHASH_WebProfilesDisabled = LLMessageStringTable::getInstance()->getString("WebProfilesDisabled"); -char* _PREHASH_Destination = LLMessageStringTable::getInstance()->getString("Destination"); -char* _PREHASH_MasterID = LLMessageStringTable::getInstance()->getString("MasterID"); -char* _PREHASH_TransferData = LLMessageStringTable::getInstance()->getString("TransferData"); -char* _PREHASH_WantToMask = LLMessageStringTable::getInstance()->getString("WantToMask"); -char* _PREHASH_ParcelSelectObjects = LLMessageStringTable::getInstance()->getString("ParcelSelectObjects"); -char* _PREHASH_ExtraParams = LLMessageStringTable::getInstance()->getString("ExtraParams"); -char* _PREHASH_CreatorID = LLMessageStringTable::getInstance()->getString("CreatorID"); -char* _PREHASH_Summary = LLMessageStringTable::getInstance()->getString("Summary"); -char* _PREHASH_BuyObjectInventory = LLMessageStringTable::getInstance()->getString("BuyObjectInventory"); -char* _PREHASH_FetchInventory = LLMessageStringTable::getInstance()->getString("FetchInventory"); -char* _PREHASH_InventoryID = LLMessageStringTable::getInstance()->getString("InventoryID"); -char* _PREHASH_PacketNumber = LLMessageStringTable::getInstance()->getString("PacketNumber"); -char* _PREHASH_SetFollowCamProperties = LLMessageStringTable::getInstance()->getString("SetFollowCamProperties"); -char* _PREHASH_ClearFollowCamProperties = LLMessageStringTable::getInstance()->getString("ClearFollowCamProperties"); -char* _PREHASH_SequenceID = LLMessageStringTable::getInstance()->getString("SequenceID"); -char* _PREHASH_DataServerLogout = LLMessageStringTable::getInstance()->getString("DataServerLogout"); -char* _PREHASH_NameValue = LLMessageStringTable::getInstance()->getString("NameValue"); -char* _PREHASH_PathShearX = LLMessageStringTable::getInstance()->getString("PathShearX"); -char* _PREHASH_PathShearY = LLMessageStringTable::getInstance()->getString("PathShearY"); -char* _PREHASH_Velocity = LLMessageStringTable::getInstance()->getString("Velocity"); -char* _PREHASH_SecPerYear = LLMessageStringTable::getInstance()->getString("SecPerYear"); -char* _PREHASH_FirstName = LLMessageStringTable::getInstance()->getString("FirstName"); -char* _PREHASH_AttachedSoundGainChange = LLMessageStringTable::getInstance()->getString("AttachedSoundGainChange"); -char* _PREHASH_LocationID = LLMessageStringTable::getInstance()->getString("LocationID"); -char* _PREHASH_Running = LLMessageStringTable::getInstance()->getString("Running"); -char* _PREHASH_AgentThrottle = LLMessageStringTable::getInstance()->getString("AgentThrottle"); -char* _PREHASH_NeighborList = LLMessageStringTable::getInstance()->getString("NeighborList"); -char* _PREHASH_PathTaperX = LLMessageStringTable::getInstance()->getString("PathTaperX"); -char* _PREHASH_PathTaperY = LLMessageStringTable::getInstance()->getString("PathTaperY"); -char* _PREHASH_AgentRelated = LLMessageStringTable::getInstance()->getString("AgentRelated"); -char* _PREHASH_GranterBlock = LLMessageStringTable::getInstance()->getString("GranterBlock"); -char* _PREHASH_UseCachedMuteList = LLMessageStringTable::getInstance()->getString("UseCachedMuteList"); -char* _PREHASH_FailStats = LLMessageStringTable::getInstance()->getString("FailStats"); -char* _PREHASH_Tempfile = LLMessageStringTable::getInstance()->getString("Tempfile"); -char* _PREHASH_BuyerID = LLMessageStringTable::getInstance()->getString("BuyerID"); -char* _PREHASH_DirPeopleReply = LLMessageStringTable::getInstance()->getString("DirPeopleReply"); -char* _PREHASH_TransferInfo = LLMessageStringTable::getInstance()->getString("TransferInfo"); -char* _PREHASH_AvatarPickerRequestBackend = LLMessageStringTable::getInstance()->getString("AvatarPickerRequestBackend"); -char* _PREHASH_AvatarPropertiesRequestBackend = LLMessageStringTable::getInstance()->getString("AvatarPropertiesRequestBackend"); -char* _PREHASH_UpdateData = LLMessageStringTable::getInstance()->getString("UpdateData"); -char* _PREHASH_SimFPS = LLMessageStringTable::getInstance()->getString("SimFPS"); -char* _PREHASH_ReporterID = LLMessageStringTable::getInstance()->getString("ReporterID"); -char* _PREHASH_ButtonLabel = LLMessageStringTable::getInstance()->getString("ButtonLabel"); -char* _PREHASH_GranterID = LLMessageStringTable::getInstance()->getString("GranterID"); -char* _PREHASH_WantToText = LLMessageStringTable::getInstance()->getString("WantToText"); -char* _PREHASH_ReportType = LLMessageStringTable::getInstance()->getString("ReportType"); -char* _PREHASH_SimulatorReady = LLMessageStringTable::getInstance()->getString("SimulatorReady"); -char* _PREHASH_DataBlock = LLMessageStringTable::getInstance()->getString("DataBlock"); -char* _PREHASH_AnimationSourceList = LLMessageStringTable::getInstance()->getString("AnimationSourceList"); -char* _PREHASH_SubscribeLoad = LLMessageStringTable::getInstance()->getString("SubscribeLoad"); -char* _PREHASH_UnsubscribeLoad = LLMessageStringTable::getInstance()->getString("UnsubscribeLoad"); -char* _PREHASH_Packet = LLMessageStringTable::getInstance()->getString("Packet"); -char* _PREHASH_UndoLand = LLMessageStringTable::getInstance()->getString("UndoLand"); -char* _PREHASH_SimAccess = LLMessageStringTable::getInstance()->getString("SimAccess"); -char* _PREHASH_AbuserID = LLMessageStringTable::getInstance()->getString("AbuserID"); -char* _PREHASH_MembershipFee = LLMessageStringTable::getInstance()->getString("MembershipFee"); -char* _PREHASH_InviteGroupResponse = LLMessageStringTable::getInstance()->getString("InviteGroupResponse"); -char* _PREHASH_CreateInventoryFolder = LLMessageStringTable::getInstance()->getString("CreateInventoryFolder"); -char* _PREHASH_UpdateInventoryFolder = LLMessageStringTable::getInstance()->getString("UpdateInventoryFolder"); -char* _PREHASH_MoveInventoryFolder = LLMessageStringTable::getInstance()->getString("MoveInventoryFolder"); -char* _PREHASH_RemoveInventoryFolder = LLMessageStringTable::getInstance()->getString("RemoveInventoryFolder"); -char* _PREHASH_MoneyData = LLMessageStringTable::getInstance()->getString("MoneyData"); -char* _PREHASH_ObjectDeselect = LLMessageStringTable::getInstance()->getString("ObjectDeselect"); -char* _PREHASH_NewAssetID = LLMessageStringTable::getInstance()->getString("NewAssetID"); -char* _PREHASH_ObjectAdd = LLMessageStringTable::getInstance()->getString("ObjectAdd"); -char* _PREHASH_RayEndIsIntersection = LLMessageStringTable::getInstance()->getString("RayEndIsIntersection"); -char* _PREHASH_CompleteAuction = LLMessageStringTable::getInstance()->getString("CompleteAuction"); -char* _PREHASH_CircuitCode = LLMessageStringTable::getInstance()->getString("CircuitCode"); -char* _PREHASH_AgentMovementComplete = LLMessageStringTable::getInstance()->getString("AgentMovementComplete"); -char* _PREHASH_ViewerIP = LLMessageStringTable::getInstance()->getString("ViewerIP"); -char* _PREHASH_Header = LLMessageStringTable::getInstance()->getString("Header"); -char* _PREHASH_GestureFlags = LLMessageStringTable::getInstance()->getString("GestureFlags"); -char* _PREHASH_XferID = LLMessageStringTable::getInstance()->getString("XferID"); -char* _PREHASH_StatValue = LLMessageStringTable::getInstance()->getString("StatValue"); -char* _PREHASH_TaskID = LLMessageStringTable::getInstance()->getString("TaskID"); -char* _PREHASH_PickID = LLMessageStringTable::getInstance()->getString("PickID"); -char* _PREHASH_RayEnd = LLMessageStringTable::getInstance()->getString("RayEnd"); -char* _PREHASH_Throttles = LLMessageStringTable::getInstance()->getString("Throttles"); -char* _PREHASH_RebakeAvatarTextures = LLMessageStringTable::getInstance()->getString("RebakeAvatarTextures"); -char* _PREHASH_UpAxis = LLMessageStringTable::getInstance()->getString("UpAxis"); -char* _PREHASH_AgentTextures = LLMessageStringTable::getInstance()->getString("AgentTextures"); -char* _PREHASH_NotecardData = LLMessageStringTable::getInstance()->getString("NotecardData"); -char* _PREHASH_Radius = LLMessageStringTable::getInstance()->getString("Radius"); -char* _PREHASH_OffCircuit = LLMessageStringTable::getInstance()->getString("OffCircuit"); -char* _PREHASH_Access = LLMessageStringTable::getInstance()->getString("Access"); -char* _PREHASH_TitleRoleID = LLMessageStringTable::getInstance()->getString("TitleRoleID"); -char* _PREHASH_SquareMetersCredit = LLMessageStringTable::getInstance()->getString("SquareMetersCredit"); -char* _PREHASH_Filename = LLMessageStringTable::getInstance()->getString("Filename"); -char* _PREHASH_ClassifiedInfoRequest = LLMessageStringTable::getInstance()->getString("ClassifiedInfoRequest"); -char* _PREHASH_ParcelInfoRequest = LLMessageStringTable::getInstance()->getString("ParcelInfoRequest"); -char* _PREHASH_ParcelObjectOwnersRequest = LLMessageStringTable::getInstance()->getString("ParcelObjectOwnersRequest"); -char* _PREHASH_TeleportLandmarkRequest = LLMessageStringTable::getInstance()->getString("TeleportLandmarkRequest"); -char* _PREHASH_EventInfoRequest = LLMessageStringTable::getInstance()->getString("EventInfoRequest"); -char* _PREHASH_MoneyBalanceRequest = LLMessageStringTable::getInstance()->getString("MoneyBalanceRequest"); -char* _PREHASH_GroupMembersRequest = LLMessageStringTable::getInstance()->getString("GroupMembersRequest"); -char* _PREHASH_GroupRoleMembersRequest = LLMessageStringTable::getInstance()->getString("GroupRoleMembersRequest"); -char* _PREHASH_ChatFromSimulator = LLMessageStringTable::getInstance()->getString("ChatFromSimulator"); -char* _PREHASH_OldFolderID = LLMessageStringTable::getInstance()->getString("OldFolderID"); -char* _PREHASH_UserInfoRequest = LLMessageStringTable::getInstance()->getString("UserInfoRequest"); -char* _PREHASH_TextureID = LLMessageStringTable::getInstance()->getString("TextureID"); -char* _PREHASH_ProfileURL = LLMessageStringTable::getInstance()->getString("ProfileURL"); -char* _PREHASH_Handle = LLMessageStringTable::getInstance()->getString("Handle"); -char* _PREHASH_ButtonIndex = LLMessageStringTable::getInstance()->getString("ButtonIndex"); -char* _PREHASH_GetScriptRunning = LLMessageStringTable::getInstance()->getString("GetScriptRunning"); -char* _PREHASH_SetScriptRunning = LLMessageStringTable::getInstance()->getString("SetScriptRunning"); -char* _PREHASH_Health = LLMessageStringTable::getInstance()->getString("Health"); -char* _PREHASH_CircuitInfo = LLMessageStringTable::getInstance()->getString("CircuitInfo"); -char* _PREHASH_ObjectBuy = LLMessageStringTable::getInstance()->getString("ObjectBuy"); -char* _PREHASH_ProfileEnd = LLMessageStringTable::getInstance()->getString("ProfileEnd"); -char* _PREHASH_Effect = LLMessageStringTable::getInstance()->getString("Effect"); -char* _PREHASH_TestMessage = LLMessageStringTable::getInstance()->getString("TestMessage"); -char* _PREHASH_ScriptMailRegistration = LLMessageStringTable::getInstance()->getString("ScriptMailRegistration"); -char* _PREHASH_AgentSetAppearance = LLMessageStringTable::getInstance()->getString("AgentSetAppearance"); -char* _PREHASH_AvatarAppearance = LLMessageStringTable::getInstance()->getString("AvatarAppearance"); -char* _PREHASH_RegionData = LLMessageStringTable::getInstance()->getString("RegionData"); -char* _PREHASH_RequestingRegionData = LLMessageStringTable::getInstance()->getString("RequestingRegionData"); -char* _PREHASH_LandingRegionData = LLMessageStringTable::getInstance()->getString("LandingRegionData"); -char* _PREHASH_SitTransform = LLMessageStringTable::getInstance()->getString("SitTransform"); -char* _PREHASH_TerrainBase0 = LLMessageStringTable::getInstance()->getString("TerrainBase0"); -char* _PREHASH_SkillsMask = LLMessageStringTable::getInstance()->getString("SkillsMask"); -char* _PREHASH_AtAxis = LLMessageStringTable::getInstance()->getString("AtAxis"); -char* _PREHASH_TerrainBase1 = LLMessageStringTable::getInstance()->getString("TerrainBase1"); -char* _PREHASH_Reason = LLMessageStringTable::getInstance()->getString("Reason"); -char* _PREHASH_TerrainBase2 = LLMessageStringTable::getInstance()->getString("TerrainBase2"); -char* _PREHASH_TerrainBase3 = LLMessageStringTable::getInstance()->getString("TerrainBase3"); -char* _PREHASH_Params = LLMessageStringTable::getInstance()->getString("Params"); -char* _PREHASH_PingID = LLMessageStringTable::getInstance()->getString("PingID"); -char* _PREHASH_Change = LLMessageStringTable::getInstance()->getString("Change"); -char* _PREHASH_Height = LLMessageStringTable::getInstance()->getString("Height"); -char* _PREHASH_Region = LLMessageStringTable::getInstance()->getString("Region"); -char* _PREHASH_TelehubInfo = LLMessageStringTable::getInstance()->getString("TelehubInfo"); -char* _PREHASH_StateSave = LLMessageStringTable::getInstance()->getString("StateSave"); -char* _PREHASH_RoleData = LLMessageStringTable::getInstance()->getString("RoleData"); -char* _PREHASH_AgentAnimation = LLMessageStringTable::getInstance()->getString("AgentAnimation"); -char* _PREHASH_AvatarAnimation = LLMessageStringTable::getInstance()->getString("AvatarAnimation"); -char* _PREHASH_LogDwellTime = LLMessageStringTable::getInstance()->getString("LogDwellTime"); -char* _PREHASH_ParcelGodMarkAsContent = LLMessageStringTable::getInstance()->getString("ParcelGodMarkAsContent"); -char* _PREHASH_UsePhysics = LLMessageStringTable::getInstance()->getString("UsePhysics"); -char* _PREHASH_RegionDenyTransacted = LLMessageStringTable::getInstance()->getString("RegionDenyTransacted"); -char* _PREHASH_JointType = LLMessageStringTable::getInstance()->getString("JointType"); -char* _PREHASH_ObjectTaxEstimate = LLMessageStringTable::getInstance()->getString("ObjectTaxEstimate"); -char* _PREHASH_LightTaxEstimate = LLMessageStringTable::getInstance()->getString("LightTaxEstimate"); -char* _PREHASH_LandTaxEstimate = LLMessageStringTable::getInstance()->getString("LandTaxEstimate"); -char* _PREHASH_TeleportLandingStatusChanged = LLMessageStringTable::getInstance()->getString("TeleportLandingStatusChanged"); -char* _PREHASH_GroupTaxEstimate = LLMessageStringTable::getInstance()->getString("GroupTaxEstimate"); -char* _PREHASH_AvgViewerFPS = LLMessageStringTable::getInstance()->getString("AvgViewerFPS"); -char* _PREHASH_Buttons = LLMessageStringTable::getInstance()->getString("Buttons"); -char* _PREHASH_Sender = LLMessageStringTable::getInstance()->getString("Sender"); -char* _PREHASH_Dialog = LLMessageStringTable::getInstance()->getString("Dialog"); -char* _PREHASH_TargetData = LLMessageStringTable::getInstance()->getString("TargetData"); -char* _PREHASH_DestID = LLMessageStringTable::getInstance()->getString("DestID"); -char* _PREHASH_PricePublicObjectDelete = LLMessageStringTable::getInstance()->getString("PricePublicObjectDelete"); -char* _PREHASH_ObjectDelete = LLMessageStringTable::getInstance()->getString("ObjectDelete"); -char* _PREHASH_Delete = LLMessageStringTable::getInstance()->getString("Delete"); -char* _PREHASH_EventGodDelete = LLMessageStringTable::getInstance()->getString("EventGodDelete"); -char* _PREHASH_LastTaxDate = LLMessageStringTable::getInstance()->getString("LastTaxDate"); -char* _PREHASH_MapImageID = LLMessageStringTable::getInstance()->getString("MapImageID"); -char* _PREHASH_EndDateTime = LLMessageStringTable::getInstance()->getString("EndDateTime"); -char* _PREHASH_TerrainDetail0 = LLMessageStringTable::getInstance()->getString("TerrainDetail0"); -char* _PREHASH_TerrainDetail1 = LLMessageStringTable::getInstance()->getString("TerrainDetail1"); -char* _PREHASH_TerrainDetail2 = LLMessageStringTable::getInstance()->getString("TerrainDetail2"); -char* _PREHASH_TerrainDetail3 = LLMessageStringTable::getInstance()->getString("TerrainDetail3"); -char* _PREHASH_Offset = LLMessageStringTable::getInstance()->getString("Offset"); -char* _PREHASH_ObjectDelink = LLMessageStringTable::getInstance()->getString("ObjectDelink"); -char* _PREHASH_TargetObject = LLMessageStringTable::getInstance()->getString("TargetObject"); -char* _PREHASH_IsEstateManager = LLMessageStringTable::getInstance()->getString("IsEstateManager"); -char* _PREHASH_CancelAuction = LLMessageStringTable::getInstance()->getString("CancelAuction"); -char* _PREHASH_ObjectDetach = LLMessageStringTable::getInstance()->getString("ObjectDetach"); -char* _PREHASH_Compressed = LLMessageStringTable::getInstance()->getString("Compressed"); -char* _PREHASH_PathBegin = LLMessageStringTable::getInstance()->getString("PathBegin"); -char* _PREHASH_BypassRaycast = LLMessageStringTable::getInstance()->getString("BypassRaycast"); -char* _PREHASH_WinnerID = LLMessageStringTable::getInstance()->getString("WinnerID"); -char* _PREHASH_ChannelType = LLMessageStringTable::getInstance()->getString("ChannelType"); -char* _PREHASH_NonExemptMembers = LLMessageStringTable::getInstance()->getString("NonExemptMembers"); -char* _PREHASH_Agents = LLMessageStringTable::getInstance()->getString("Agents"); -char* _PREHASH_MemberData = LLMessageStringTable::getInstance()->getString("MemberData"); -char* _PREHASH_ToGroupID = LLMessageStringTable::getInstance()->getString("ToGroupID"); -char* _PREHASH_ImageNotInDatabase = LLMessageStringTable::getInstance()->getString("ImageNotInDatabase"); -char* _PREHASH_StartDate = LLMessageStringTable::getInstance()->getString("StartDate"); -char* _PREHASH_AnimID = LLMessageStringTable::getInstance()->getString("AnimID"); -char* _PREHASH_Serial = LLMessageStringTable::getInstance()->getString("Serial"); -char* _PREHASH_AbuseRegionName = LLMessageStringTable::getInstance()->getString("AbuseRegionName"); -char* _PREHASH_ModifyLand = LLMessageStringTable::getInstance()->getString("ModifyLand"); -char* _PREHASH_Digest = LLMessageStringTable::getInstance()->getString("Digest"); -char* _PREHASH_Victim = LLMessageStringTable::getInstance()->getString("Victim"); -char* _PREHASH_Script = LLMessageStringTable::getInstance()->getString("Script"); -char* _PREHASH_PickInfoReply = LLMessageStringTable::getInstance()->getString("PickInfoReply"); -char* _PREHASH_MoneyBalanceReply = LLMessageStringTable::getInstance()->getString("MoneyBalanceReply"); -char* _PREHASH_RoutedMoneyBalanceReply = LLMessageStringTable::getInstance()->getString("RoutedMoneyBalanceReply"); -char* _PREHASH_RoleID = LLMessageStringTable::getInstance()->getString("RoleID"); -char* _PREHASH_RegionInfo = LLMessageStringTable::getInstance()->getString("RegionInfo"); -char* _PREHASH_GodUpdateRegionInfo = LLMessageStringTable::getInstance()->getString("GodUpdateRegionInfo"); -char* _PREHASH_StartAnim = LLMessageStringTable::getInstance()->getString("StartAnim"); -char* _PREHASH_Action = LLMessageStringTable::getInstance()->getString("Action"); -char* _PREHASH_Location = LLMessageStringTable::getInstance()->getString("Location"); -char* _PREHASH_Rights = LLMessageStringTable::getInstance()->getString("Rights"); -char* _PREHASH_SearchDir = LLMessageStringTable::getInstance()->getString("SearchDir"); -char* _PREHASH_TransferRequest = LLMessageStringTable::getInstance()->getString("TransferRequest"); -char* _PREHASH_ScriptSensorRequest = LLMessageStringTable::getInstance()->getString("ScriptSensorRequest"); -char* _PREHASH_MoneyTransferRequest = LLMessageStringTable::getInstance()->getString("MoneyTransferRequest"); -char* _PREHASH_EjectGroupMemberRequest = LLMessageStringTable::getInstance()->getString("EjectGroupMemberRequest"); -char* _PREHASH_SkillsText = LLMessageStringTable::getInstance()->getString("SkillsText"); -char* _PREHASH_Resent = LLMessageStringTable::getInstance()->getString("Resent"); -char* _PREHASH_Center = LLMessageStringTable::getInstance()->getString("Center"); -char* _PREHASH_SharedData = LLMessageStringTable::getInstance()->getString("SharedData"); -char* _PREHASH_PSBlock = LLMessageStringTable::getInstance()->getString("PSBlock"); -char* _PREHASH_UUIDNameBlock = LLMessageStringTable::getInstance()->getString("UUIDNameBlock"); -char* _PREHASH_GroupTitleUpdate = LLMessageStringTable::getInstance()->getString("GroupTitleUpdate"); -char* _PREHASH_Method = LLMessageStringTable::getInstance()->getString("Method"); -char* _PREHASH_TouchName = LLMessageStringTable::getInstance()->getString("TouchName"); -char* _PREHASH_UpdateType = LLMessageStringTable::getInstance()->getString("UpdateType"); -char* _PREHASH_KickedFromEstateID = LLMessageStringTable::getInstance()->getString("KickedFromEstateID"); -char* _PREHASH_CandidateID = LLMessageStringTable::getInstance()->getString("CandidateID"); -char* _PREHASH_ParamData = LLMessageStringTable::getInstance()->getString("ParamData"); -char* _PREHASH_GodlikeMessage = LLMessageStringTable::getInstance()->getString("GodlikeMessage"); -char* _PREHASH_SystemMessage = LLMessageStringTable::getInstance()->getString("SystemMessage"); -char* _PREHASH_BodyRotation = LLMessageStringTable::getInstance()->getString("BodyRotation"); -char* _PREHASH_SearchRegions = LLMessageStringTable::getInstance()->getString("SearchRegions"); -char* _PREHASH_AnimationData = LLMessageStringTable::getInstance()->getString("AnimationData"); -char* _PREHASH_StatID = LLMessageStringTable::getInstance()->getString("StatID"); -char* _PREHASH_ItemID = LLMessageStringTable::getInstance()->getString("ItemID"); -char* _PREHASH_ScriptDialogReply = LLMessageStringTable::getInstance()->getString("ScriptDialogReply"); -char* _PREHASH_RegionIDAndHandleReply = LLMessageStringTable::getInstance()->getString("RegionIDAndHandleReply"); -char* _PREHASH_CameraAtOffset = LLMessageStringTable::getInstance()->getString("CameraAtOffset"); -char* _PREHASH_VoteID = LLMessageStringTable::getInstance()->getString("VoteID"); -char* _PREHASH_ParcelGodForceOwner = LLMessageStringTable::getInstance()->getString("ParcelGodForceOwner"); -char* _PREHASH_Filter = LLMessageStringTable::getInstance()->getString("Filter"); -char* _PREHASH_InviteData = LLMessageStringTable::getInstance()->getString("InviteData"); -char* _PREHASH_PCode = LLMessageStringTable::getInstance()->getString("PCode"); -char* _PREHASH_SearchPos = LLMessageStringTable::getInstance()->getString("SearchPos"); -char* _PREHASH_PreyID = LLMessageStringTable::getInstance()->getString("PreyID"); -char* _PREHASH_TerrainLowerLimit = LLMessageStringTable::getInstance()->getString("TerrainLowerLimit"); -char* _PREHASH_EventFlags = LLMessageStringTable::getInstance()->getString("EventFlags"); -char* _PREHASH_TallyVotes = LLMessageStringTable::getInstance()->getString("TallyVotes"); -char* _PREHASH_Result = LLMessageStringTable::getInstance()->getString("Result"); -char* _PREHASH_LookAt = LLMessageStringTable::getInstance()->getString("LookAt"); -char* _PREHASH_SearchOrder = LLMessageStringTable::getInstance()->getString("SearchOrder"); -char* _PREHASH_PayButton = LLMessageStringTable::getInstance()->getString("PayButton"); -char* _PREHASH_SelfCount = LLMessageStringTable::getInstance()->getString("SelfCount"); -char* _PREHASH_PacketCount = LLMessageStringTable::getInstance()->getString("PacketCount"); -char* _PREHASH_ParcelBuyPass = LLMessageStringTable::getInstance()->getString("ParcelBuyPass"); -char* _PREHASH_OldItemID = LLMessageStringTable::getInstance()->getString("OldItemID"); -char* _PREHASH_RegionPort = LLMessageStringTable::getInstance()->getString("RegionPort"); -char* _PREHASH_PriceEnergyUnit = LLMessageStringTable::getInstance()->getString("PriceEnergyUnit"); -char* _PREHASH_Bitmap = LLMessageStringTable::getInstance()->getString("Bitmap"); -char* _PREHASH_CacheMissType = LLMessageStringTable::getInstance()->getString("CacheMissType"); -char* _PREHASH_VFileID = LLMessageStringTable::getInstance()->getString("VFileID"); -char* _PREHASH_GroupInsigniaID = LLMessageStringTable::getInstance()->getString("GroupInsigniaID"); -char* _PREHASH_Online = LLMessageStringTable::getInstance()->getString("Online"); -char* _PREHASH_KickFlags = LLMessageStringTable::getInstance()->getString("KickFlags"); -char* _PREHASH_CovenantID = LLMessageStringTable::getInstance()->getString("CovenantID"); -char* _PREHASH_SysCPU = LLMessageStringTable::getInstance()->getString("SysCPU"); -char* _PREHASH_EMail = LLMessageStringTable::getInstance()->getString("EMail"); -char* _PREHASH_AggregatePermTextures = LLMessageStringTable::getInstance()->getString("AggregatePermTextures"); -char* _PREHASH_ChatChannel = LLMessageStringTable::getInstance()->getString("ChatChannel"); -char* _PREHASH_ReturnID = LLMessageStringTable::getInstance()->getString("ReturnID"); -char* _PREHASH_ObjectAttach = LLMessageStringTable::getInstance()->getString("ObjectAttach"); -char* _PREHASH_TargetPort = LLMessageStringTable::getInstance()->getString("TargetPort"); -char* _PREHASH_ObjectSpinStop = LLMessageStringTable::getInstance()->getString("ObjectSpinStop"); -char* _PREHASH_FullID = LLMessageStringTable::getInstance()->getString("FullID"); -char* _PREHASH_ActivateGroup = LLMessageStringTable::getInstance()->getString("ActivateGroup"); -char* _PREHASH_SysGPU = LLMessageStringTable::getInstance()->getString("SysGPU"); -char* _PREHASH_AvatarInterestsReply = LLMessageStringTable::getInstance()->getString("AvatarInterestsReply"); -char* _PREHASH_StartLure = LLMessageStringTable::getInstance()->getString("StartLure"); -char* _PREHASH_SysRAM = LLMessageStringTable::getInstance()->getString("SysRAM"); -char* _PREHASH_ObjectPosition = LLMessageStringTable::getInstance()->getString("ObjectPosition"); -char* _PREHASH_SitPosition = LLMessageStringTable::getInstance()->getString("SitPosition"); -char* _PREHASH_StartTime = LLMessageStringTable::getInstance()->getString("StartTime"); -char* _PREHASH_BornOn = LLMessageStringTable::getInstance()->getString("BornOn"); -char* _PREHASH_CameraCollidePlane = LLMessageStringTable::getInstance()->getString("CameraCollidePlane"); -char* _PREHASH_EconomyDataRequest = LLMessageStringTable::getInstance()->getString("EconomyDataRequest"); -char* _PREHASH_TeleportLureRequest = LLMessageStringTable::getInstance()->getString("TeleportLureRequest"); -char* _PREHASH_FolderID = LLMessageStringTable::getInstance()->getString("FolderID"); -char* _PREHASH_RegionHandleRequest = LLMessageStringTable::getInstance()->getString("RegionHandleRequest"); -char* _PREHASH_ScriptDataRequest = LLMessageStringTable::getInstance()->getString("ScriptDataRequest"); -char* _PREHASH_GroupRoleDataRequest = LLMessageStringTable::getInstance()->getString("GroupRoleDataRequest"); -char* _PREHASH_GroupTitlesRequest = LLMessageStringTable::getInstance()->getString("GroupTitlesRequest"); -char* _PREHASH_AgentWearablesRequest = LLMessageStringTable::getInstance()->getString("AgentWearablesRequest"); -char* _PREHASH_MapBlockRequest = LLMessageStringTable::getInstance()->getString("MapBlockRequest"); -char* _PREHASH_LureID = LLMessageStringTable::getInstance()->getString("LureID"); -char* _PREHASH_CopyCenters = LLMessageStringTable::getInstance()->getString("CopyCenters"); -char* _PREHASH_ParamList = LLMessageStringTable::getInstance()->getString("ParamList"); -char* _PREHASH_InventorySerial = LLMessageStringTable::getInstance()->getString("InventorySerial"); -char* _PREHASH_EdgeDataPacket = LLMessageStringTable::getInstance()->getString("EdgeDataPacket"); -char* _PREHASH_AvatarPickerReply = LLMessageStringTable::getInstance()->getString("AvatarPickerReply"); -char* _PREHASH_ParcelDwellReply = LLMessageStringTable::getInstance()->getString("ParcelDwellReply"); -char* _PREHASH_IsForSale = LLMessageStringTable::getInstance()->getString("IsForSale"); -char* _PREHASH_MuteID = LLMessageStringTable::getInstance()->getString("MuteID"); -char* _PREHASH_MeanCollisionAlert = LLMessageStringTable::getInstance()->getString("MeanCollisionAlert"); -char* _PREHASH_CanAcceptTasks = LLMessageStringTable::getInstance()->getString("CanAcceptTasks"); -char* _PREHASH_ItemData = LLMessageStringTable::getInstance()->getString("ItemData"); -char* _PREHASH_AnimationList = LLMessageStringTable::getInstance()->getString("AnimationList"); -char* _PREHASH_Reputation = LLMessageStringTable::getInstance()->getString("Reputation"); -char* _PREHASH_IntValue = LLMessageStringTable::getInstance()->getString("IntValue"); -char* _PREHASH_TargetType = LLMessageStringTable::getInstance()->getString("TargetType"); -char* _PREHASH_Amount = LLMessageStringTable::getInstance()->getString("Amount"); -char* _PREHASH_HasAttachment = LLMessageStringTable::getInstance()->getString("HasAttachment"); -char* _PREHASH_UpdateAttachment = LLMessageStringTable::getInstance()->getString("UpdateAttachment"); -char* _PREHASH_RemoveAttachment = LLMessageStringTable::getInstance()->getString("RemoveAttachment"); -char* _PREHASH_HeightWidthBlock = LLMessageStringTable::getInstance()->getString("HeightWidthBlock"); -char* _PREHASH_RequestObjectPropertiesFamily = LLMessageStringTable::getInstance()->getString("RequestObjectPropertiesFamily"); -char* _PREHASH_ObjectPropertiesFamily = LLMessageStringTable::getInstance()->getString("ObjectPropertiesFamily"); -char* _PREHASH_UserData = LLMessageStringTable::getInstance()->getString("UserData"); -char* _PREHASH_IsReadable = LLMessageStringTable::getInstance()->getString("IsReadable"); -char* _PREHASH_PathCurve = LLMessageStringTable::getInstance()->getString("PathCurve"); -char* _PREHASH_Status = LLMessageStringTable::getInstance()->getString("Status"); -char* _PREHASH_FromGroup = LLMessageStringTable::getInstance()->getString("FromGroup"); -char* _PREHASH_AlreadyVoted = LLMessageStringTable::getInstance()->getString("AlreadyVoted"); -char* _PREHASH_PlacesReply = LLMessageStringTable::getInstance()->getString("PlacesReply"); -char* _PREHASH_DirPlacesReply = LLMessageStringTable::getInstance()->getString("DirPlacesReply"); -char* _PREHASH_ParcelBuy = LLMessageStringTable::getInstance()->getString("ParcelBuy"); -char* _PREHASH_DirFindQueryBackend = LLMessageStringTable::getInstance()->getString("DirFindQueryBackend"); -char* _PREHASH_DirPlacesQueryBackend = LLMessageStringTable::getInstance()->getString("DirPlacesQueryBackend"); -char* _PREHASH_DirClassifiedQueryBackend = LLMessageStringTable::getInstance()->getString("DirClassifiedQueryBackend"); -char* _PREHASH_DirLandQueryBackend = LLMessageStringTable::getInstance()->getString("DirLandQueryBackend"); -char* _PREHASH_DirPopularQueryBackend = LLMessageStringTable::getInstance()->getString("DirPopularQueryBackend"); -char* _PREHASH_HistoryData = LLMessageStringTable::getInstance()->getString("HistoryData"); -char* _PREHASH_SnapshotID = LLMessageStringTable::getInstance()->getString("SnapshotID"); -char* _PREHASH_Aspect = LLMessageStringTable::getInstance()->getString("Aspect"); -char* _PREHASH_ParamSize = LLMessageStringTable::getInstance()->getString("ParamSize"); -char* _PREHASH_VoteCast = LLMessageStringTable::getInstance()->getString("VoteCast"); -char* _PREHASH_CastsShadows = LLMessageStringTable::getInstance()->getString("CastsShadows"); -char* _PREHASH_EveryoneMask = LLMessageStringTable::getInstance()->getString("EveryoneMask"); -char* _PREHASH_ObjectSpinUpdate = LLMessageStringTable::getInstance()->getString("ObjectSpinUpdate"); -char* _PREHASH_MaturePublish = LLMessageStringTable::getInstance()->getString("MaturePublish"); -char* _PREHASH_UseExistingAsset = LLMessageStringTable::getInstance()->getString("UseExistingAsset"); -char* _PREHASH_Powers = LLMessageStringTable::getInstance()->getString("Powers"); -char* _PREHASH_ParcelLocalID = LLMessageStringTable::getInstance()->getString("ParcelLocalID"); -char* _PREHASH_TeleportCancel = LLMessageStringTable::getInstance()->getString("TeleportCancel"); -char* _PREHASH_UnixTime = LLMessageStringTable::getInstance()->getString("UnixTime"); -char* _PREHASH_QueryFlags = LLMessageStringTable::getInstance()->getString("QueryFlags"); -char* _PREHASH_AlwaysRun = LLMessageStringTable::getInstance()->getString("AlwaysRun"); -char* _PREHASH_Bottom = LLMessageStringTable::getInstance()->getString("Bottom"); -char* _PREHASH_ButtonData = LLMessageStringTable::getInstance()->getString("ButtonData"); -char* _PREHASH_SoundData = LLMessageStringTable::getInstance()->getString("SoundData"); -char* _PREHASH_ViewerStats = LLMessageStringTable::getInstance()->getString("ViewerStats"); -char* _PREHASH_RegionHandshake = LLMessageStringTable::getInstance()->getString("RegionHandshake"); -char* _PREHASH_ObjectDescription = LLMessageStringTable::getInstance()->getString("ObjectDescription"); -char* _PREHASH_Description = LLMessageStringTable::getInstance()->getString("Description"); -char* _PREHASH_ParamType = LLMessageStringTable::getInstance()->getString("ParamType"); -char* _PREHASH_UUIDNameReply = LLMessageStringTable::getInstance()->getString("UUIDNameReply"); -char* _PREHASH_UUIDGroupNameReply = LLMessageStringTable::getInstance()->getString("UUIDGroupNameReply"); -char* _PREHASH_SaveAssetIntoInventory = LLMessageStringTable::getInstance()->getString("SaveAssetIntoInventory"); -char* _PREHASH_UserInfo = LLMessageStringTable::getInstance()->getString("UserInfo"); -char* _PREHASH_AnimSequenceID = LLMessageStringTable::getInstance()->getString("AnimSequenceID"); -char* _PREHASH_NVPairs = LLMessageStringTable::getInstance()->getString("NVPairs"); -char* _PREHASH_GroupNoticesListRequest = LLMessageStringTable::getInstance()->getString("GroupNoticesListRequest"); -char* _PREHASH_ParcelAccessListRequest = LLMessageStringTable::getInstance()->getString("ParcelAccessListRequest"); -char* _PREHASH_MuteListRequest = LLMessageStringTable::getInstance()->getString("MuteListRequest"); -char* _PREHASH_RpcChannelRequest = LLMessageStringTable::getInstance()->getString("RpcChannelRequest"); -char* _PREHASH_LandStatRequest = LLMessageStringTable::getInstance()->getString("LandStatRequest"); -char* _PREHASH_PlacesQuery = LLMessageStringTable::getInstance()->getString("PlacesQuery"); -char* _PREHASH_DirPlacesQuery = LLMessageStringTable::getInstance()->getString("DirPlacesQuery"); -char* _PREHASH_SortOrder = LLMessageStringTable::getInstance()->getString("SortOrder"); -char* _PREHASH_Hunter = LLMessageStringTable::getInstance()->getString("Hunter"); -char* _PREHASH_SunAngVelocity = LLMessageStringTable::getInstance()->getString("SunAngVelocity"); -char* _PREHASH_BinaryBucket = LLMessageStringTable::getInstance()->getString("BinaryBucket"); -char* _PREHASH_ImagePacket = LLMessageStringTable::getInstance()->getString("ImagePacket"); -char* _PREHASH_StartGroupProposal = LLMessageStringTable::getInstance()->getString("StartGroupProposal"); -char* _PREHASH_EnergyLevel = LLMessageStringTable::getInstance()->getString("EnergyLevel"); -char* _PREHASH_PriceForListing = LLMessageStringTable::getInstance()->getString("PriceForListing"); -char* _PREHASH_Scale = LLMessageStringTable::getInstance()->getString("Scale"); -char* _PREHASH_EstateCovenantReply = LLMessageStringTable::getInstance()->getString("EstateCovenantReply"); -char* _PREHASH_ParentEstateID = LLMessageStringTable::getInstance()->getString("ParentEstateID"); -char* _PREHASH_Extra2 = LLMessageStringTable::getInstance()->getString("Extra2"); -char* _PREHASH_Throttle = LLMessageStringTable::getInstance()->getString("Throttle"); -char* _PREHASH_SimIP = LLMessageStringTable::getInstance()->getString("SimIP"); -char* _PREHASH_GodID = LLMessageStringTable::getInstance()->getString("GodID"); -char* _PREHASH_TeleportMinPrice = LLMessageStringTable::getInstance()->getString("TeleportMinPrice"); -char* _PREHASH_VoteItem = LLMessageStringTable::getInstance()->getString("VoteItem"); -char* _PREHASH_ObjectRotation = LLMessageStringTable::getInstance()->getString("ObjectRotation"); -char* _PREHASH_SitRotation = LLMessageStringTable::getInstance()->getString("SitRotation"); -char* _PREHASH_SnapSelection = LLMessageStringTable::getInstance()->getString("SnapSelection"); -char* _PREHASH_SoundTrigger = LLMessageStringTable::getInstance()->getString("SoundTrigger"); -char* _PREHASH_TerrainRaiseLimit = LLMessageStringTable::getInstance()->getString("TerrainRaiseLimit"); -char* _PREHASH_Quorum = LLMessageStringTable::getInstance()->getString("Quorum"); -char* _PREHASH_AgentBlock = LLMessageStringTable::getInstance()->getString("AgentBlock"); -char* _PREHASH_CommandBlock = LLMessageStringTable::getInstance()->getString("CommandBlock"); -char* _PREHASH_PricePublicObjectDecay = LLMessageStringTable::getInstance()->getString("PricePublicObjectDecay"); -char* _PREHASH_SpawnPointPos = LLMessageStringTable::getInstance()->getString("SpawnPointPos"); -char* _PREHASH_VolumeDetail = LLMessageStringTable::getInstance()->getString("VolumeDetail"); -char* _PREHASH_FromAgentName = LLMessageStringTable::getInstance()->getString("FromAgentName"); -char* _PREHASH_Range = LLMessageStringTable::getInstance()->getString("Range"); -char* _PREHASH_DirectoryVisibility = LLMessageStringTable::getInstance()->getString("DirectoryVisibility"); -char* _PREHASH_PublicIP = LLMessageStringTable::getInstance()->getString("PublicIP"); -char* _PREHASH_TeleportFailed = LLMessageStringTable::getInstance()->getString("TeleportFailed"); -char* _PREHASH_PreloadSound = LLMessageStringTable::getInstance()->getString("PreloadSound"); -char* _PREHASH_ScreenshotID = LLMessageStringTable::getInstance()->getString("ScreenshotID"); -char* _PREHASH_CovenantTimestamp = LLMessageStringTable::getInstance()->getString("CovenantTimestamp"); -char* _PREHASH_OldestUnacked = LLMessageStringTable::getInstance()->getString("OldestUnacked"); -char* _PREHASH_SimulatorIP = LLMessageStringTable::getInstance()->getString("SimulatorIP"); -char* _PREHASH_Value = LLMessageStringTable::getInstance()->getString("Value"); -char* _PREHASH_JointAxisOrAnchor = LLMessageStringTable::getInstance()->getString("JointAxisOrAnchor"); -char* _PREHASH_Test0 = LLMessageStringTable::getInstance()->getString("Test0"); -char* _PREHASH_Test1 = LLMessageStringTable::getInstance()->getString("Test1"); -char* _PREHASH_Test2 = LLMessageStringTable::getInstance()->getString("Test2"); -char* _PREHASH_SunPhase = LLMessageStringTable::getInstance()->getString("SunPhase"); -char* _PREHASH_ParcelDivide = LLMessageStringTable::getInstance()->getString("ParcelDivide"); -char* _PREHASH_PriceObjectClaim = LLMessageStringTable::getInstance()->getString("PriceObjectClaim"); -char* _PREHASH_Field = LLMessageStringTable::getInstance()->getString("Field"); -char* _PREHASH_Ratio = LLMessageStringTable::getInstance()->getString("Ratio"); -char* _PREHASH_JoinGroupReply = LLMessageStringTable::getInstance()->getString("JoinGroupReply"); -char* _PREHASH_LiveHelpGroupReply = LLMessageStringTable::getInstance()->getString("LiveHelpGroupReply"); -char* _PREHASH_Score = LLMessageStringTable::getInstance()->getString("Score"); -char* _PREHASH_Image = LLMessageStringTable::getInstance()->getString("Image"); -char* _PREHASH_ObjectClickAction = LLMessageStringTable::getInstance()->getString("ObjectClickAction"); -char* _PREHASH_Parameter = LLMessageStringTable::getInstance()->getString("Parameter"); -char* _PREHASH_Flags = LLMessageStringTable::getInstance()->getString("Flags"); -char* _PREHASH_Plane = LLMessageStringTable::getInstance()->getString("Plane"); -char* _PREHASH_Width = LLMessageStringTable::getInstance()->getString("Width"); -char* _PREHASH_Right = LLMessageStringTable::getInstance()->getString("Right"); -char* _PREHASH_DirFindQuery = LLMessageStringTable::getInstance()->getString("DirFindQuery"); -char* _PREHASH_Textures = LLMessageStringTable::getInstance()->getString("Textures"); -char* _PREHASH_EventData = LLMessageStringTable::getInstance()->getString("EventData"); -char* _PREHASH_Final = LLMessageStringTable::getInstance()->getString("Final"); -char* _PREHASH_System = LLMessageStringTable::getInstance()->getString("System"); -char* _PREHASH_TelehubPos = LLMessageStringTable::getInstance()->getString("TelehubPos"); -char* _PREHASH_ReportAutosaveCrash = LLMessageStringTable::getInstance()->getString("ReportAutosaveCrash"); -char* _PREHASH_CreateTrustedCircuit = LLMessageStringTable::getInstance()->getString("CreateTrustedCircuit"); -char* _PREHASH_DenyTrustedCircuit = LLMessageStringTable::getInstance()->getString("DenyTrustedCircuit"); -char* _PREHASH_RequestTrustedCircuit = LLMessageStringTable::getInstance()->getString("RequestTrustedCircuit"); -char* _PREHASH_Codec = LLMessageStringTable::getInstance()->getString("Codec"); -char* _PREHASH_Modal = LLMessageStringTable::getInstance()->getString("Modal"); -char* _PREHASH_ChildAgentUnknown = LLMessageStringTable::getInstance()->getString("ChildAgentUnknown"); -char* _PREHASH_LandingType = LLMessageStringTable::getInstance()->getString("LandingType"); -char* _PREHASH_ScriptRunningReply = LLMessageStringTable::getInstance()->getString("ScriptRunningReply"); -char* _PREHASH_Reply = LLMessageStringTable::getInstance()->getString("Reply"); -char* _PREHASH_GroupAccountDetailsReply = LLMessageStringTable::getInstance()->getString("GroupAccountDetailsReply"); -char* _PREHASH_TelehubRot = LLMessageStringTable::getInstance()->getString("TelehubRot"); -char* _PREHASH_AcceptFriendship = LLMessageStringTable::getInstance()->getString("AcceptFriendship"); -char* _PREHASH_ItemType = LLMessageStringTable::getInstance()->getString("ItemType"); -char* _PREHASH_DwellInfo = LLMessageStringTable::getInstance()->getString("DwellInfo"); -char* _PREHASH_AgentResume = LLMessageStringTable::getInstance()->getString("AgentResume"); -char* _PREHASH_MailFilter = LLMessageStringTable::getInstance()->getString("MailFilter"); -char* _PREHASH_Disconnect = LLMessageStringTable::getInstance()->getString("Disconnect"); -char* _PREHASH_SimPosition = LLMessageStringTable::getInstance()->getString("SimPosition"); -char* _PREHASH_SimWideTotalPrims = LLMessageStringTable::getInstance()->getString("SimWideTotalPrims"); -char* _PREHASH_Index = LLMessageStringTable::getInstance()->getString("Index"); -char* _PREHASH_SimFilename = LLMessageStringTable::getInstance()->getString("SimFilename"); -char* _PREHASH_LastOwnerID = LLMessageStringTable::getInstance()->getString("LastOwnerID"); -char* _PREHASH_GroupNoticeRequest = LLMessageStringTable::getInstance()->getString("GroupNoticeRequest"); -char* _PREHASH_EmailMessageRequest = LLMessageStringTable::getInstance()->getString("EmailMessageRequest"); -char* _PREHASH_MapItemRequest = LLMessageStringTable::getInstance()->getString("MapItemRequest"); -char* _PREHASH_AgentCount = LLMessageStringTable::getInstance()->getString("AgentCount"); -char* _PREHASH_MessageBlock = LLMessageStringTable::getInstance()->getString("MessageBlock"); -char* _PREHASH_FuseBlock = LLMessageStringTable::getInstance()->getString("FuseBlock"); -char* _PREHASH_AgentGroupData = LLMessageStringTable::getInstance()->getString("AgentGroupData"); -char* _PREHASH_ClassifiedInfoUpdate = LLMessageStringTable::getInstance()->getString("ClassifiedInfoUpdate"); -char* _PREHASH_RegionPos = LLMessageStringTable::getInstance()->getString("RegionPos"); -char* _PREHASH_ParcelMediaUpdate = LLMessageStringTable::getInstance()->getString("ParcelMediaUpdate"); -char* _PREHASH_NoticeID = LLMessageStringTable::getInstance()->getString("NoticeID"); -char* _PREHASH_GridX = LLMessageStringTable::getInstance()->getString("GridX"); -char* _PREHASH_GridY = LLMessageStringTable::getInstance()->getString("GridY"); -char* _PREHASH_Title = LLMessageStringTable::getInstance()->getString("Title"); -char* _PREHASH_AuctionID = LLMessageStringTable::getInstance()->getString("AuctionID"); -char* _PREHASH_VoteType = LLMessageStringTable::getInstance()->getString("VoteType"); -char* _PREHASH_CategoryID = LLMessageStringTable::getInstance()->getString("CategoryID"); -char* _PREHASH_Token = LLMessageStringTable::getInstance()->getString("Token"); -char* _PREHASH_AggregatePerms = LLMessageStringTable::getInstance()->getString("AggregatePerms"); -char* _PREHASH_ObjectSelect = LLMessageStringTable::getInstance()->getString("ObjectSelect"); -char* _PREHASH_ForceObjectSelect = LLMessageStringTable::getInstance()->getString("ForceObjectSelect"); -char* _PREHASH_Price = LLMessageStringTable::getInstance()->getString("Price"); -char* _PREHASH_SunDirection = LLMessageStringTable::getInstance()->getString("SunDirection"); -char* _PREHASH_FromName = LLMessageStringTable::getInstance()->getString("FromName"); -char* _PREHASH_ChangeInventoryItemFlags = LLMessageStringTable::getInstance()->getString("ChangLLInventoryItemFlags"); -char* _PREHASH_Force = LLMessageStringTable::getInstance()->getString("Force"); -char* _PREHASH_TransactionBlock = LLMessageStringTable::getInstance()->getString("TransactionBlock"); -char* _PREHASH_PowersMask = LLMessageStringTable::getInstance()->getString("PowersMask"); -char* _PREHASH_Stamp = LLMessageStringTable::getInstance()->getString("Stamp"); -char* _PREHASH_TotalCredits = LLMessageStringTable::getInstance()->getString("TotalCredits"); -char* _PREHASH_State = LLMessageStringTable::getInstance()->getString("State"); -char* _PREHASH_TextureIndex = LLMessageStringTable::getInstance()->getString("TextureIndex"); -char* _PREHASH_InviteeID = LLMessageStringTable::getInstance()->getString("InviteeID"); -char* _PREHASH_ParcelReclaim = LLMessageStringTable::getInstance()->getString("ParcelReclaim"); -char* _PREHASH_Money = LLMessageStringTable::getInstance()->getString("Money"); -char* _PREHASH_PathTwist = LLMessageStringTable::getInstance()->getString("PathTwist"); -char* _PREHASH_AuthBuyerID = LLMessageStringTable::getInstance()->getString("AuthBuyerID"); -char* _PREHASH_Color = LLMessageStringTable::getInstance()->getString("Color"); -char* _PREHASH_SourceType = LLMessageStringTable::getInstance()->getString("SourceType"); -char* _PREHASH_World = LLMessageStringTable::getInstance()->getString("World"); -char* _PREHASH_QueryData = LLMessageStringTable::getInstance()->getString("QueryData"); -char* _PREHASH_Users = LLMessageStringTable::getInstance()->getString("Users"); -char* _PREHASH_SysOS = LLMessageStringTable::getInstance()->getString("SysOS"); -char* _PREHASH_Notes = LLMessageStringTable::getInstance()->getString("Notes"); -char* _PREHASH_AvatarID = LLMessageStringTable::getInstance()->getString("AvatarID"); -char* _PREHASH_FounderID = LLMessageStringTable::getInstance()->getString("FounderID"); -char* _PREHASH_EndPointID = LLMessageStringTable::getInstance()->getString("EndPointID"); -char* _PREHASH_LocationLookAt = LLMessageStringTable::getInstance()->getString("LocationLookAt"); -char* _PREHASH_Sound = LLMessageStringTable::getInstance()->getString("Sound"); -char* _PREHASH_Cover = LLMessageStringTable::getInstance()->getString("Cover"); -char* _PREHASH_TotalObjectCount = LLMessageStringTable::getInstance()->getString("TotalObjectCount"); -char* _PREHASH_TextureEntry = LLMessageStringTable::getInstance()->getString("TextureEntry"); -char* _PREHASH_SquareMetersCommitted = LLMessageStringTable::getInstance()->getString("SquareMetersCommitted"); -char* _PREHASH_ChannelID = LLMessageStringTable::getInstance()->getString("ChannelID"); -char* _PREHASH_Dwell = LLMessageStringTable::getInstance()->getString("Dwell"); -char* _PREHASH_North = LLMessageStringTable::getInstance()->getString("North"); -char* _PREHASH_AgentUpdate = LLMessageStringTable::getInstance()->getString("AgentUpdate"); -char* _PREHASH_PickGodDelete = LLMessageStringTable::getInstance()->getString("PickGodDelete"); -char* _PREHASH_HostName = LLMessageStringTable::getInstance()->getString("HostName"); -char* _PREHASH_PriceParcelClaim = LLMessageStringTable::getInstance()->getString("PriceParcelClaim"); -char* _PREHASH_ParcelClaim = LLMessageStringTable::getInstance()->getString("ParcelClaim"); -char* _PREHASH_AgentPowers = LLMessageStringTable::getInstance()->getString("AgentPowers"); -char* _PREHASH_ProfileHollow = LLMessageStringTable::getInstance()->getString("ProfileHollow"); -char* _PREHASH_GroupRoleChanges = LLMessageStringTable::getInstance()->getString("GroupRoleChanges"); -char* _PREHASH_Count = LLMessageStringTable::getInstance()->getString("Count"); -char* _PREHASH_South = LLMessageStringTable::getInstance()->getString("South"); -char* _PREHASH_ObjectUpdateCompressed = LLMessageStringTable::getInstance()->getString("ObjectUpdateCompressed"); -char* _PREHASH_MuteFlags = LLMessageStringTable::getInstance()->getString("MuteFlags"); -char* _PREHASH_Group = LLMessageStringTable::getInstance()->getString("Group"); -char* _PREHASH_AgentPause = LLMessageStringTable::getInstance()->getString("AgentPause"); -char* _PREHASH_LanguagesText = LLMessageStringTable::getInstance()->getString("LanguagesText"); -char* _PREHASH_Error = LLMessageStringTable::getInstance()->getString("Error"); -char* _PREHASH_InternalScriptMail = LLMessageStringTable::getInstance()->getString("InternalScriptMail"); -char* _PREHASH_FindAgent = LLMessageStringTable::getInstance()->getString("FindAgent"); -char* _PREHASH_AgentData = LLMessageStringTable::getInstance()->getString("AgentData"); -char* _PREHASH_FolderData = LLMessageStringTable::getInstance()->getString("FolderData"); -char* _PREHASH_AssetBlock = LLMessageStringTable::getInstance()->getString("AssetBlock"); -char* _PREHASH_AcceptNotices = LLMessageStringTable::getInstance()->getString("AcceptNotices"); -char* _PREHASH_SetGroupAcceptNotices = LLMessageStringTable::getInstance()->getString("SetGroupAcceptNotices"); -char* _PREHASH_CloseCircuit = LLMessageStringTable::getInstance()->getString("CloseCircuit"); -char* _PREHASH_TeleportFinish = LLMessageStringTable::getInstance()->getString("TeleportFinish"); -char* _PREHASH_PathRevolutions = LLMessageStringTable::getInstance()->getString("PathRevolutions"); -char* _PREHASH_ClassifiedInfoReply = LLMessageStringTable::getInstance()->getString("ClassifiedInfoReply"); -char* _PREHASH_ParcelInfoReply = LLMessageStringTable::getInstance()->getString("ParcelInfoReply"); -char* _PREHASH_AutosaveData = LLMessageStringTable::getInstance()->getString("AutosaveData"); -char* _PREHASH_SetStartLocation = LLMessageStringTable::getInstance()->getString("SetStartLocation"); -char* _PREHASH_PassHours = LLMessageStringTable::getInstance()->getString("PassHours"); -char* _PREHASH_AttachmentPt = LLMessageStringTable::getInstance()->getString("AttachmentPt"); -char* _PREHASH_ParcelFlags = LLMessageStringTable::getInstance()->getString("ParcelFlags"); -char* _PREHASH_NumVotes = LLMessageStringTable::getInstance()->getString("NumVotes"); -char* _PREHASH_AvatarPickerRequest = LLMessageStringTable::getInstance()->getString("AvatarPickerRequest"); -char* _PREHASH_TeleportLocationRequest = LLMessageStringTable::getInstance()->getString("TeleportLocationRequest"); -char* _PREHASH_DataHomeLocationRequest = LLMessageStringTable::getInstance()->getString("DataHomeLocationRequest"); -char* _PREHASH_EventNotificationAddRequest = LLMessageStringTable::getInstance()->getString("EventNotificationAddRequest"); -char* _PREHASH_ParcelDwellRequest = LLMessageStringTable::getInstance()->getString("ParcelDwellRequest"); -char* _PREHASH_EventLocationRequest = LLMessageStringTable::getInstance()->getString("EventLocationRequest"); -char* _PREHASH_SetStartLocationRequest = LLMessageStringTable::getInstance()->getString("SetStartLocationRequest"); -char* _PREHASH_QueryStart = LLMessageStringTable::getInstance()->getString("QueryStart"); -char* _PREHASH_EjectData = LLMessageStringTable::getInstance()->getString("EjectData"); -char* _PREHASH_AvatarTextureUpdate = LLMessageStringTable::getInstance()->getString("AvatarTextureUpdate"); -char* _PREHASH_RPCServerPort = LLMessageStringTable::getInstance()->getString("RPCServerPort"); -char* _PREHASH_Bytes = LLMessageStringTable::getInstance()->getString("Bytes"); -char* _PREHASH_Extra = LLMessageStringTable::getInstance()->getString("Extra"); -char* _PREHASH_ForceScriptControlRelease = LLMessageStringTable::getInstance()->getString("ForceScriptControlRelease"); -char* _PREHASH_ParcelRelease = LLMessageStringTable::getInstance()->getString("ParcelRelease"); -char* _PREHASH_VFileType = LLMessageStringTable::getInstance()->getString("VFileType"); -char* _PREHASH_EjectGroupMemberReply = LLMessageStringTable::getInstance()->getString("EjectGroupMemberReply"); -char* _PREHASH_ImageData = LLMessageStringTable::getInstance()->getString("ImageData"); -char* _PREHASH_SimulatorViewerTimeMessage = LLMessageStringTable::getInstance()->getString("SimulatorViewerTimeMessage"); -char* _PREHASH_Rotation = LLMessageStringTable::getInstance()->getString("Rotation"); -char* _PREHASH_Selection = LLMessageStringTable::getInstance()->getString("Selection"); -char* _PREHASH_TransactionData = LLMessageStringTable::getInstance()->getString("TransactionData"); -char* _PREHASH_OperationData = LLMessageStringTable::getInstance()->getString("OperationData"); -char* _PREHASH_ExpirationDate = LLMessageStringTable::getInstance()->getString("ExpirationDate"); -char* _PREHASH_ParcelDeedToGroup = LLMessageStringTable::getInstance()->getString("ParcelDeedToGroup"); -char* _PREHASH_AvatarPicksReply = LLMessageStringTable::getInstance()->getString("AvatarPicksReply"); -char* _PREHASH_GroupTitlesReply = LLMessageStringTable::getInstance()->getString("GroupTitlesReply"); -char* _PREHASH_AgentInfo = LLMessageStringTable::getInstance()->getString("AgentInfo"); -char* _PREHASH_MoneyTransferBackend = LLMessageStringTable::getInstance()->getString("MoneyTransferBackend"); -char* _PREHASH_NextOwnerMask = LLMessageStringTable::getInstance()->getString("NextOwnerMask"); -char* _PREHASH_MuteData = LLMessageStringTable::getInstance()->getString("MuteData"); -char* _PREHASH_PassPrice = LLMessageStringTable::getInstance()->getString("PassPrice"); -char* _PREHASH_SourceID = LLMessageStringTable::getInstance()->getString("SourceID"); -char* _PREHASH_ChangeUserRights = LLMessageStringTable::getInstance()->getString("ChangeUserRights"); -char* _PREHASH_TeleportFlags = LLMessageStringTable::getInstance()->getString("TeleportFlags"); -char* _PREHASH_SlaveParcelData = LLMessageStringTable::getInstance()->getString("SlaveParcelData"); -char* _PREHASH_AssetData = LLMessageStringTable::getInstance()->getString("AssetData"); -char* _PREHASH_MultipleObjectUpdate = LLMessageStringTable::getInstance()->getString("MultipleObjectUpdate"); -char* _PREHASH_ObjectUpdate = LLMessageStringTable::getInstance()->getString("ObjectUpdate"); -char* _PREHASH_ImprovedTerseObjectUpdate = LLMessageStringTable::getInstance()->getString("ImprovedTerseObjectUpdate"); -char* _PREHASH_ConfirmXferPacket = LLMessageStringTable::getInstance()->getString("ConfirmXferPacket"); -char* _PREHASH_StartPingCheck = LLMessageStringTable::getInstance()->getString("StartPingCheck"); -char* _PREHASH_SimWideDeletes = LLMessageStringTable::getInstance()->getString("SimWideDeletes"); -char* _PREHASH_LandStatReply = LLMessageStringTable::getInstance()->getString("LandStatReply"); -char* _PREHASH_IsPhantom = LLMessageStringTable::getInstance()->getString("IsPhantom"); -char* _PREHASH_AgentList = LLMessageStringTable::getInstance()->getString("AgentList"); -char* _PREHASH_SimApproved = LLMessageStringTable::getInstance()->getString("SimApproved"); -char* _PREHASH_RezObject = LLMessageStringTable::getInstance()->getString("RezObject"); -char* _PREHASH_TaskLocalID = LLMessageStringTable::getInstance()->getString("TaskLocalID"); -char* _PREHASH_ClaimDate = LLMessageStringTable::getInstance()->getString("ClaimDate"); -char* _PREHASH_MergeParcel = LLMessageStringTable::getInstance()->getString("MergeParcel"); -char* _PREHASH_Priority = LLMessageStringTable::getInstance()->getString("Priority"); -char* _PREHASH_QueryText = LLMessageStringTable::getInstance()->getString("QueryText"); -char* _PREHASH_GroupNoticeAdd = LLMessageStringTable::getInstance()->getString("GroupNoticeAdd"); -char* _PREHASH_ReturnType = LLMessageStringTable::getInstance()->getString("ReturnType"); -char* _PREHASH_FetchFolders = LLMessageStringTable::getInstance()->getString("FetchFolders"); -char* _PREHASH_SimulatorPublicHostBlock = LLMessageStringTable::getInstance()->getString("SimulatorPublicHostBlock"); -char* _PREHASH_HeaderData = LLMessageStringTable::getInstance()->getString("HeaderData"); -char* _PREHASH_RequestMultipleObjects = LLMessageStringTable::getInstance()->getString("RequestMultipleObjects"); -char* _PREHASH_RetrieveInstantMessages = LLMessageStringTable::getInstance()->getString("RetrieveInstantMessages"); -char* _PREHASH_OpenCircuit = LLMessageStringTable::getInstance()->getString("OpenCircuit"); -char* _PREHASH_CrossedRegion = LLMessageStringTable::getInstance()->getString("CrossedRegion"); -char* _PREHASH_DirGroupsReply = LLMessageStringTable::getInstance()->getString("DirGroupsReply"); -char* _PREHASH_AvatarGroupsReply = LLMessageStringTable::getInstance()->getString("AvatarGroupsReply"); -char* _PREHASH_EmailMessageReply = LLMessageStringTable::getInstance()->getString("EmailMessageReply"); -char* _PREHASH_GroupVoteHistoryItemReply = LLMessageStringTable::getInstance()->getString("GroupVoteHistoryItemReply"); -char* _PREHASH_ViewerPosition = LLMessageStringTable::getInstance()->getString("ViewerPosition"); -char* _PREHASH_Position = LLMessageStringTable::getInstance()->getString("Position"); -char* _PREHASH_ParentEstate = LLMessageStringTable::getInstance()->getString("ParentEstate"); -char* _PREHASH_EstateName = LLMessageStringTable::getInstance()->getString("EstateName"); -char* _PREHASH_MuteName = LLMessageStringTable::getInstance()->getString("MuteName"); -char* _PREHASH_ParcelRename = LLMessageStringTable::getInstance()->getString("ParcelRename"); -char* _PREHASH_ViewerFilename = LLMessageStringTable::getInstance()->getString("ViewerFilename"); -char* _PREHASH_UserReportInternal = LLMessageStringTable::getInstance()->getString("UserReportInternal"); -char* _PREHASH_AvatarPropertiesRequest = LLMessageStringTable::getInstance()->getString("AvatarPropertiesRequest"); -char* _PREHASH_ParcelPropertiesRequest = LLMessageStringTable::getInstance()->getString("ParcelPropertiesRequest"); -char* _PREHASH_GroupProfileRequest = LLMessageStringTable::getInstance()->getString("GroupProfileRequest"); -char* _PREHASH_AgentDataUpdateRequest = LLMessageStringTable::getInstance()->getString("AgentDataUpdateRequest"); -char* _PREHASH_PriceObjectScaleFactor = LLMessageStringTable::getInstance()->getString("PriceObjectScaleFactor"); -char* _PREHASH_OpenEnrollment = LLMessageStringTable::getInstance()->getString("OpenEnrollment"); -char* _PREHASH_GroupData = LLMessageStringTable::getInstance()->getString("GroupData"); -char* _PREHASH_RequestGodlikePowers = LLMessageStringTable::getInstance()->getString("RequestGodlikePowers"); -char* _PREHASH_GrantGodlikePowers = LLMessageStringTable::getInstance()->getString("GrantGodlikePowers"); -char* _PREHASH_TransactionID = LLMessageStringTable::getInstance()->getString("TransactionID"); -char* _PREHASH_DestinationID = LLMessageStringTable::getInstance()->getString("DestinationID"); -char* _PREHASH_Controls = LLMessageStringTable::getInstance()->getString("Controls"); -char* _PREHASH_FirstDetachAll = LLMessageStringTable::getInstance()->getString("FirstDetachAll"); -char* _PREHASH_EstateID = LLMessageStringTable::getInstance()->getString("EstateID"); -char* _PREHASH_ImprovedInstantMessage = LLMessageStringTable::getInstance()->getString("ImprovedInstantMessage"); -char* _PREHASH_CheckParcelSales = LLMessageStringTable::getInstance()->getString("CheckParcelSales"); -char* _PREHASH_ParcelSales = LLMessageStringTable::getInstance()->getString("ParcelSales"); -char* _PREHASH_CurrentInterval = LLMessageStringTable::getInstance()->getString("CurrentInterval"); -char* _PREHASH_PriceRentLight = LLMessageStringTable::getInstance()->getString("PriceRentLight"); -char* _PREHASH_MediaAutoScale = LLMessageStringTable::getInstance()->getString("MediaAutoScale"); -char* _PREHASH_NeighborBlock = LLMessageStringTable::getInstance()->getString("NeighborBlock"); -char* _PREHASH_LayerData = LLMessageStringTable::getInstance()->getString("LayerData"); -char* _PREHASH_NVPairData = LLMessageStringTable::getInstance()->getString("NVPairData"); -char* _PREHASH_TeleportLocal = LLMessageStringTable::getInstance()->getString("TeleportLocal"); -char* _PREHASH_EjecteeID = LLMessageStringTable::getInstance()->getString("EjecteeID"); -char* _PREHASH_VoteInitiator = LLMessageStringTable::getInstance()->getString("VoteInitiator"); -char* _PREHASH_TypeData = LLMessageStringTable::getInstance()->getString("TypeData"); -char* _PREHASH_OwnerIDs = LLMessageStringTable::getInstance()->getString("OwnerIDs"); -char* _PREHASH_SystemKickUser = LLMessageStringTable::getInstance()->getString("SystemKickUser"); -char* _PREHASH_TransactionTime = LLMessageStringTable::getInstance()->getString("TransactionTime"); -char* _PREHASH_TimeToLive = LLMessageStringTable::getInstance()->getString("TimeToLive"); -char* _PREHASH_OldAgentID = LLMessageStringTable::getInstance()->getString("OldAgentID"); -char* _PREHASH_MusicURL = LLMessageStringTable::getInstance()->getString("MusicURL"); -char* _PREHASH_ParcelPrimBonus = LLMessageStringTable::getInstance()->getString("ParcelPrimBonus"); -char* _PREHASH_EjectUser = LLMessageStringTable::getInstance()->getString("EjectUser"); -char* _PREHASH_CoarseLocationUpdate = LLMessageStringTable::getInstance()->getString("CoarseLocationUpdate"); -char* _PREHASH_ChildAgentPositionUpdate = LLMessageStringTable::getInstance()->getString("ChildAgentPositionUpdate"); -char* _PREHASH_StoreLocal = LLMessageStringTable::getInstance()->getString("StoreLocal"); -char* _PREHASH_GroupName = LLMessageStringTable::getInstance()->getString("GroupName"); -char* _PREHASH_PriceParcelRent = LLMessageStringTable::getInstance()->getString("PriceParcelRent"); -char* _PREHASH_SimStatus = LLMessageStringTable::getInstance()->getString("SimStatus"); -char* _PREHASH_TransactionSuccess = LLMessageStringTable::getInstance()->getString("TransactionSuccess"); -char* _PREHASH_LureType = LLMessageStringTable::getInstance()->getString("LureType"); -char* _PREHASH_GroupMask = LLMessageStringTable::getInstance()->getString("GroupMask"); -char* _PREHASH_SitObject = LLMessageStringTable::getInstance()->getString("SitObject"); -char* _PREHASH_Override = LLMessageStringTable::getInstance()->getString("Override"); -char* _PREHASH_LocomotionState = LLMessageStringTable::getInstance()->getString("LocomotionState"); -char* _PREHASH_PriceUpload = LLMessageStringTable::getInstance()->getString("PriceUpload"); -char* _PREHASH_RemoveParcel = LLMessageStringTable::getInstance()->getString("RemoveParcel"); -char* _PREHASH_ConfirmAuctionStart = LLMessageStringTable::getInstance()->getString("ConfirmAuctionStart"); -char* _PREHASH_RpcScriptRequestInbound = LLMessageStringTable::getInstance()->getString("RpcScriptRequestInbound"); -char* _PREHASH_ActiveGroupID = LLMessageStringTable::getInstance()->getString("ActiveGroupID"); -char* _PREHASH_ParcelReturnObjects = LLMessageStringTable::getInstance()->getString("ParcelReturnObjects"); -char* _PREHASH_TotalObjects = LLMessageStringTable::getInstance()->getString("TotalObjects"); -char* _PREHASH_ObjectExtraParams = LLMessageStringTable::getInstance()->getString("ObjectExtraParams"); -char* _PREHASH_Questions = LLMessageStringTable::getInstance()->getString("Questions"); -char* _PREHASH_TransferAbort = LLMessageStringTable::getInstance()->getString("TransferAbort"); -char* _PREHASH_TransferInventory = LLMessageStringTable::getInstance()->getString("TransferInventory"); -char* _PREHASH_RayTargetID = LLMessageStringTable::getInstance()->getString("RayTargetID"); -char* _PREHASH_ClaimPrice = LLMessageStringTable::getInstance()->getString("ClaimPrice"); -char* _PREHASH_ObjectProperties = LLMessageStringTable::getInstance()->getString("ObjectProperties"); -char* _PREHASH_ParcelProperties = LLMessageStringTable::getInstance()->getString("ParcelProperties"); -char* _PREHASH_EstateOwnerID = LLMessageStringTable::getInstance()->getString("EstateOwnerID"); -char* _PREHASH_LogoutRequest = LLMessageStringTable::getInstance()->getString("LogoutRequest"); -char* _PREHASH_AssetUploadRequest = LLMessageStringTable::getInstance()->getString("AssetUploadRequest"); -char* _PREHASH_TransactionType = LLMessageStringTable::getInstance()->getString("TransactionType"); -char* _PREHASH_AvatarPropertiesUpdate = LLMessageStringTable::getInstance()->getString("AvatarPropertiesUpdate"); -char* _PREHASH_ParcelPropertiesUpdate = LLMessageStringTable::getInstance()->getString("ParcelPropertiesUpdate"); -char* _PREHASH_FetchItems = LLMessageStringTable::getInstance()->getString("FetchItems"); -char* _PREHASH_AbortXfer = LLMessageStringTable::getInstance()->getString("AbortXfer"); -char* _PREHASH_DeRezAck = LLMessageStringTable::getInstance()->getString("DeRezAck"); -char* _PREHASH_TakeControls = LLMessageStringTable::getInstance()->getString("TakeControls"); -char* _PREHASH_DirLandReply = LLMessageStringTable::getInstance()->getString("DirLandReply"); -char* _PREHASH_MuteType = LLMessageStringTable::getInstance()->getString("MuteType"); -char* _PREHASH_IMViaEMail = LLMessageStringTable::getInstance()->getString("IMViaEMail"); -char* _PREHASH_RentPrice = LLMessageStringTable::getInstance()->getString("RentPrice"); -char* _PREHASH_GenericMessage = LLMessageStringTable::getInstance()->getString("GenericMessage"); -char* _PREHASH_ChildAgentAlive = LLMessageStringTable::getInstance()->getString("ChildAgentAlive"); -char* _PREHASH_AssetType = LLMessageStringTable::getInstance()->getString("AssetType"); -char* _PREHASH_SpawnPointBlock = LLMessageStringTable::getInstance()->getString("SpawnPointBlock"); -char* _PREHASH_AttachmentBlock = LLMessageStringTable::getInstance()->getString("AttachmentBlock"); -char* _PREHASH_ObjectMaterial = LLMessageStringTable::getInstance()->getString("ObjectMaterial"); -char* _PREHASH_OwnerName = LLMessageStringTable::getInstance()->getString("OwnerName"); -char* _PREHASH_AvatarNotesReply = LLMessageStringTable::getInstance()->getString("AvatarNotesReply"); -char* _PREHASH_CacheID = LLMessageStringTable::getInstance()->getString("CacheID"); -char* _PREHASH_OwnerMask = LLMessageStringTable::getInstance()->getString("OwnerMask"); -char* _PREHASH_TransferInventoryAck = LLMessageStringTable::getInstance()->getString("TransferInventoryAck"); -char* _PREHASH_RegionDenyAgeUnverified = LLMessageStringTable::getInstance()->getString("RegionDenyAgeUnverified"); -char* _PREHASH_AgeVerificationBlock = LLMessageStringTable::getInstance()->getString("AgeVerificationBlock"); -char* _PREHASH_UCoord = LLMessageStringTable::getInstance()->getString("UCoord"); -char* _PREHASH_VCoord = LLMessageStringTable::getInstance()->getString("VCoord"); -char* _PREHASH_FaceIndex = LLMessageStringTable::getInstance()->getString("FaceIndex"); -char* _PREHASH_StatusData = LLMessageStringTable::getInstance()->getString("StatusData"); -char* _PREHASH_ProductSKU = LLMessageStringTable::getInstance()->getString("ProductSKU"); +char const* const _PREHASH_X = LLMessageStringTable::getInstance()->getString("X"); +char const* const _PREHASH_Y = LLMessageStringTable::getInstance()->getString("Y"); +char const* const _PREHASH_Z = LLMessageStringTable::getInstance()->getString("Z"); +char const* const _PREHASH_AddFlags = LLMessageStringTable::getInstance()->getString("AddFlags"); +char const* const _PREHASH_FailureInfo = LLMessageStringTable::getInstance()->getString("FailureInfo"); +char const* const _PREHASH_MapData = LLMessageStringTable::getInstance()->getString("MapData"); +char const* const _PREHASH_AddItem = LLMessageStringTable::getInstance()->getString("AddItem"); +char const* const _PREHASH_MeanCollision = LLMessageStringTable::getInstance()->getString("MeanCollision"); +char const* const _PREHASH_RezScript = LLMessageStringTable::getInstance()->getString("RezScript"); +char const* const _PREHASH_AvatarSitResponse = LLMessageStringTable::getInstance()->getString("AvatarSitResponse"); +char const* const _PREHASH_InventoryAssetResponse = LLMessageStringTable::getInstance()->getString("InventoryAssetResponse"); +char const* const _PREHASH_KillObject = LLMessageStringTable::getInstance()->getString("KillObject"); +char const* const _PREHASH_ProposalID = LLMessageStringTable::getInstance()->getString("ProposalID"); +char const* const _PREHASH_SerialNum = LLMessageStringTable::getInstance()->getString("SerialNum"); +char const* const _PREHASH_Duration = LLMessageStringTable::getInstance()->getString("Duration"); +char const* const _PREHASH_ScriptQuestion = LLMessageStringTable::getInstance()->getString("ScriptQuestion"); +char const* const _PREHASH_AddCircuitCode = LLMessageStringTable::getInstance()->getString("AddCircuitCode"); +char const* const _PREHASH_UseCircuitCode = LLMessageStringTable::getInstance()->getString("UseCircuitCode"); +char const* const _PREHASH_ViewerCircuitCode = LLMessageStringTable::getInstance()->getString("ViewerCircuitCode"); +char const* const _PREHASH_ScriptAnswerYes = LLMessageStringTable::getInstance()->getString("ScriptAnswerYes"); +char const* const _PREHASH_PartnerID = LLMessageStringTable::getInstance()->getString("PartnerID"); +char const* const _PREHASH_DirLandQuery = LLMessageStringTable::getInstance()->getString("DirLandQuery"); +char const* const _PREHASH_TeleportStart = LLMessageStringTable::getInstance()->getString("TeleportStart"); +char const* const _PREHASH_AboutText = LLMessageStringTable::getInstance()->getString("AboutText"); +char const* const _PREHASH_VisualParam = LLMessageStringTable::getInstance()->getString("VisualParam"); +char const* const _PREHASH_GroupPrims = LLMessageStringTable::getInstance()->getString("GroupPrims"); +char const* const _PREHASH_SelectedPrims = LLMessageStringTable::getInstance()->getString("SelectedPrims"); +char const* const _PREHASH_ID = LLMessageStringTable::getInstance()->getString("ID"); +char const* const _PREHASH_UUIDNameRequest = LLMessageStringTable::getInstance()->getString("UUIDNameRequest"); +char const* const _PREHASH_UUIDGroupNameRequest = LLMessageStringTable::getInstance()->getString("UUIDGroupNameRequest"); +char const* const _PREHASH_GroupAccountTransactionsRequest = LLMessageStringTable::getInstance()->getString("GroupAccountTransactionsRequest"); +char const* const _PREHASH_MapNameRequest = LLMessageStringTable::getInstance()->getString("MapNameRequest"); +char const* const _PREHASH_UpdateSimulator = LLMessageStringTable::getInstance()->getString("UpdateSimulator"); +char const* const _PREHASH_BillableFactor = LLMessageStringTable::getInstance()->getString("BillableFactor"); +char const* const _PREHASH_ObjectBonusFactor = LLMessageStringTable::getInstance()->getString("ObjectBonusFactor"); +char const* const _PREHASH_EnableSimulator = LLMessageStringTable::getInstance()->getString("EnableSimulator"); +char const* const _PREHASH_DisableSimulator = LLMessageStringTable::getInstance()->getString("DisableSimulator"); +char const* const _PREHASH_ConfirmEnableSimulator = LLMessageStringTable::getInstance()->getString("ConfirmEnableSimulator"); +char const* const _PREHASH_LayerType = LLMessageStringTable::getInstance()->getString("LayerType"); +char const* const _PREHASH_OwnerRole = LLMessageStringTable::getInstance()->getString("OwnerRole"); +char const* const _PREHASH_ParcelOverlay = LLMessageStringTable::getInstance()->getString("ParcelOverlay"); +char const* const _PREHASH_GroupOwned = LLMessageStringTable::getInstance()->getString("GroupOwned"); +char const* const _PREHASH_IP = LLMessageStringTable::getInstance()->getString("IP"); +char const* const _PREHASH_ChatFromViewer = LLMessageStringTable::getInstance()->getString("ChatFromViewer"); +char const* const _PREHASH_AvgAgentsInView = LLMessageStringTable::getInstance()->getString("AvgAgentsInView"); +char const* const _PREHASH_AgentsInView = LLMessageStringTable::getInstance()->getString("AgentsInView"); +char const* const _PREHASH_GroupTitle = LLMessageStringTable::getInstance()->getString("GroupTitle"); +char const* const _PREHASH_MapLayerReply = LLMessageStringTable::getInstance()->getString("MapLayerReply"); +char const* const _PREHASH_CompoundMsgID = LLMessageStringTable::getInstance()->getString("CompoundMsgID"); +char const* const _PREHASH_CameraConstraint = LLMessageStringTable::getInstance()->getString("CameraConstraint"); +char const* const _PREHASH_DownloadTotals = LLMessageStringTable::getInstance()->getString("DownloadTotals"); +char const* const _PREHASH_GenCounter = LLMessageStringTable::getInstance()->getString("GenCounter"); +char const* const _PREHASH_FrozenData = LLMessageStringTable::getInstance()->getString("FrozenData"); +char const* const _PREHASH_ChildAgentDying = LLMessageStringTable::getInstance()->getString("ChildAgentDying"); +char const* const _PREHASH_To = LLMessageStringTable::getInstance()->getString("To"); +char const* const _PREHASH_CopyInventoryFromNotecard = LLMessageStringTable::getInstance()->getString("CopyInventoryFromNotecard"); +char const* const _PREHASH_RezObjectFromNotecard = LLMessageStringTable::getInstance()->getString("RezObjectFromNotecard"); +char const* const _PREHASH_ParcelDirFeeCurrent = LLMessageStringTable::getInstance()->getString("ParcelDirFeeCurrent"); +char const* const _PREHASH_SeedCapability = LLMessageStringTable::getInstance()->getString("SeedCapability"); +char const* const _PREHASH_ObjectDuplicate = LLMessageStringTable::getInstance()->getString("ObjectDuplicate"); +char const* const _PREHASH_InventoryData = LLMessageStringTable::getInstance()->getString("InventoryData"); +char const* const _PREHASH_ReplyData = LLMessageStringTable::getInstance()->getString("ReplyData"); +char const* const _PREHASH_ResetList = LLMessageStringTable::getInstance()->getString("ResetList"); +char const* const _PREHASH_MediaID = LLMessageStringTable::getInstance()->getString("MediaID"); +char const* const _PREHASH_RelatedRights = LLMessageStringTable::getInstance()->getString("RelatedRights"); +char const* const _PREHASH_RedirectGridX = LLMessageStringTable::getInstance()->getString("RedirectGridX"); +char const* const _PREHASH_RedirectGridY = LLMessageStringTable::getInstance()->getString("RedirectGridY"); +char const* const _PREHASH_TransferID = LLMessageStringTable::getInstance()->getString("TransferID"); +char const* const _PREHASH_TexturesChanged = LLMessageStringTable::getInstance()->getString("TexturesChanged"); +char const* const _PREHASH_UserLookAt = LLMessageStringTable::getInstance()->getString("UserLookAt"); +char const* const _PREHASH_TestBlock1 = LLMessageStringTable::getInstance()->getString("TestBlock1"); +char const* const _PREHASH_SensedData = LLMessageStringTable::getInstance()->getString("SensedData"); +char const* const _PREHASH_UpdateBlock = LLMessageStringTable::getInstance()->getString("UpdateBlock"); +char const* const _PREHASH_ClassifiedGodDelete = LLMessageStringTable::getInstance()->getString("ClassifiedGodDelete"); +char const* const _PREHASH_ObjectGrabUpdate = LLMessageStringTable::getInstance()->getString("ObjectGrabUpdate"); +char const* const _PREHASH_LocationPos = LLMessageStringTable::getInstance()->getString("LocationPos"); +char const* const _PREHASH_TaxDate = LLMessageStringTable::getInstance()->getString("TaxDate"); +char const* const _PREHASH_StartDateTime = LLMessageStringTable::getInstance()->getString("StartDateTime"); +char const* const _PREHASH_ObjectUpdateCached = LLMessageStringTable::getInstance()->getString("ObjectUpdateCached"); +char const* const _PREHASH_Packets = LLMessageStringTable::getInstance()->getString("Packets"); +char const* const _PREHASH_FailureType = LLMessageStringTable::getInstance()->getString("FailureType"); +char const* const _PREHASH_UpdateGroupInfo = LLMessageStringTable::getInstance()->getString("UpdateGroupInfo"); +char const* const _PREHASH_ObjectPermissions = LLMessageStringTable::getInstance()->getString("ObjectPermissions"); +char const* const _PREHASH_RevokePermissions = LLMessageStringTable::getInstance()->getString("RevokePermissions"); +char const* const _PREHASH_UpdateFlags = LLMessageStringTable::getInstance()->getString("UpdateFlags"); +char const* const _PREHASH_ObjectExportSelected = LLMessageStringTable::getInstance()->getString("ObjectExportSelected"); +char const* const _PREHASH_RezSelected = LLMessageStringTable::getInstance()->getString("RezSelected"); +char const* const _PREHASH_AutoPilot = LLMessageStringTable::getInstance()->getString("AutoPilot"); +char const* const _PREHASH_UpdateMuteListEntry = LLMessageStringTable::getInstance()->getString("UpdateMuteListEntry"); +char const* const _PREHASH_RemoveMuteListEntry = LLMessageStringTable::getInstance()->getString("RemoveMuteListEntry"); +char const* const _PREHASH_SetSimStatusInDatabase = LLMessageStringTable::getInstance()->getString("SetSimStatusInDatabase"); +char const* const _PREHASH_SetSimPresenceInDatabase = LLMessageStringTable::getInstance()->getString("SetSimPresenceInDatabase"); +char const* const _PREHASH_CameraProperty = LLMessageStringTable::getInstance()->getString("CameraProperty"); +char const* const _PREHASH_BrushSize = LLMessageStringTable::getInstance()->getString("BrushSize"); +char const* const _PREHASH_SimulatorSetMap = LLMessageStringTable::getInstance()->getString("SimulatorSetMap"); +char const* const _PREHASH_RegionPresenceRequestByRegionID = LLMessageStringTable::getInstance()->getString("RegionPresenceRequestByRegionID"); +char const* const _PREHASH_ParcelObjectOwnersReply = LLMessageStringTable::getInstance()->getString("ParcelObjectOwnersReply"); +char const* const _PREHASH_GroupMembersReply = LLMessageStringTable::getInstance()->getString("GroupMembersReply"); +char const* const _PREHASH_GroupRoleMembersReply = LLMessageStringTable::getInstance()->getString("GroupRoleMembersReply"); +char const* const _PREHASH_RequestRegionInfo = LLMessageStringTable::getInstance()->getString("RequestRegionInfo"); +char const* const _PREHASH_AABBMax = LLMessageStringTable::getInstance()->getString("AABBMax"); +char const* const _PREHASH_RequestPayPrice = LLMessageStringTable::getInstance()->getString("RequestPayPrice"); +char const* const _PREHASH_SimulatorPresentAtLocation = LLMessageStringTable::getInstance()->getString("SimulatorPresentAtLocation"); +char const* const _PREHASH_AgentRequestSit = LLMessageStringTable::getInstance()->getString("AgentRequestSit"); +char const* const _PREHASH_AABBMin = LLMessageStringTable::getInstance()->getString("AABBMin"); +char const* const _PREHASH_ClassifiedFlags = LLMessageStringTable::getInstance()->getString("ClassifiedFlags"); +char const* const _PREHASH_ControlFlags = LLMessageStringTable::getInstance()->getString("ControlFlags"); +char const* const _PREHASH_TeleportRequest = LLMessageStringTable::getInstance()->getString("TeleportRequest"); +char const* const _PREHASH_ScriptTeleportRequest = LLMessageStringTable::getInstance()->getString("ScriptTeleportRequest"); +char const* const _PREHASH_EstateCovenantRequest = LLMessageStringTable::getInstance()->getString("EstateCovenantRequest"); +char const* const _PREHASH_DateUTC = LLMessageStringTable::getInstance()->getString("DateUTC"); +char const* const _PREHASH_TaskIDs = LLMessageStringTable::getInstance()->getString("TaskIDs"); +char const* const _PREHASH_RequestResult = LLMessageStringTable::getInstance()->getString("RequestResult"); +char const* const _PREHASH_CanAcceptAgents = LLMessageStringTable::getInstance()->getString("CanAcceptAgents"); +char const* const _PREHASH_ObjectSaleInfo = LLMessageStringTable::getInstance()->getString("ObjectSaleInfo"); +char const* const _PREHASH_KillChildAgents = LLMessageStringTable::getInstance()->getString("KillChildAgents"); +char const* const _PREHASH_Balance = LLMessageStringTable::getInstance()->getString("Balance"); +char const* const _PREHASH_DerezContainer = LLMessageStringTable::getInstance()->getString("DerezContainer"); +char const* const _PREHASH_ObjectData = LLMessageStringTable::getInstance()->getString("ObjectData"); +char const* const _PREHASH_CameraAtAxis = LLMessageStringTable::getInstance()->getString("CameraAtAxis"); +char const* const _PREHASH_InfoBlock = LLMessageStringTable::getInstance()->getString("InfoBlock"); +char const* const _PREHASH_OwnershipCost = LLMessageStringTable::getInstance()->getString("OwnershipCost"); +char const* const _PREHASH_AvatarNotesUpdate = LLMessageStringTable::getInstance()->getString("AvatarNotesUpdate"); +char const* const _PREHASH_PID = LLMessageStringTable::getInstance()->getString("PID"); +char const* const _PREHASH_DirPopularReply = LLMessageStringTable::getInstance()->getString("DirPopularReply"); +char const* const _PREHASH_TerrainHeightRange00 = LLMessageStringTable::getInstance()->getString("TerrainHeightRange00"); +char const* const _PREHASH_SimData = LLMessageStringTable::getInstance()->getString("SimData"); +char const* const _PREHASH_TerrainHeightRange01 = LLMessageStringTable::getInstance()->getString("TerrainHeightRange01"); +char const* const _PREHASH_TerrainHeightRange10 = LLMessageStringTable::getInstance()->getString("TerrainHeightRange10"); +char const* const _PREHASH_TerrainHeightRange11 = LLMessageStringTable::getInstance()->getString("TerrainHeightRange11"); +char const* const _PREHASH_UpdateInventoryItem = LLMessageStringTable::getInstance()->getString("UpdateInventoryItem"); +char const* const _PREHASH_UpdateCreateInventoryItem = LLMessageStringTable::getInstance()->getString("UpdateCreateInventoryItem"); +char const* const _PREHASH_MoveInventoryItem = LLMessageStringTable::getInstance()->getString("MoveInventoryItem"); +char const* const _PREHASH_CopyInventoryItem = LLMessageStringTable::getInstance()->getString("CopyInventoryItem"); +char const* const _PREHASH_LinkInventoryItem = LLMessageStringTable::getInstance()->getString("LinkInventoryItem"); +char const* const _PREHASH_RemoveInventoryItem = LLMessageStringTable::getInstance()->getString("RemoveInventoryItem"); +char const* const _PREHASH_CreateInventoryItem = LLMessageStringTable::getInstance()->getString("CreateInventoryItem"); +char const* const _PREHASH_PathTwistBegin = LLMessageStringTable::getInstance()->getString("PathTwistBegin"); +char const* const _PREHASH_CRC = LLMessageStringTable::getInstance()->getString("CRC"); +char const* const _PREHASH_AttachmentPoint = LLMessageStringTable::getInstance()->getString("AttachmentPoint"); +char const* const _PREHASH_TelehubBlock = LLMessageStringTable::getInstance()->getString("TelehubBlock"); +char const* const _PREHASH_FOVBlock = LLMessageStringTable::getInstance()->getString("FOVBlock"); +char const* const _PREHASH_StartLocationData = LLMessageStringTable::getInstance()->getString("StartLocationData"); +char const* const _PREHASH_PositionData = LLMessageStringTable::getInstance()->getString("PositionData"); +char const* const _PREHASH_TimeSinceLast = LLMessageStringTable::getInstance()->getString("TimeSinceLast"); +char const* const _PREHASH_MapImage = LLMessageStringTable::getInstance()->getString("MapImage"); +char const* const _PREHASH_Objects = LLMessageStringTable::getInstance()->getString("Objects"); +char const* const _PREHASH_URL = LLMessageStringTable::getInstance()->getString("URL"); +char const* const _PREHASH_CreationDate = LLMessageStringTable::getInstance()->getString("CreationDate"); +char const* const _PREHASH_JointPivot = LLMessageStringTable::getInstance()->getString("JointPivot"); +char const* const _PREHASH_FPS = LLMessageStringTable::getInstance()->getString("FPS"); +char const* const _PREHASH_HasTelehub = LLMessageStringTable::getInstance()->getString("HasTelehub"); +char const* const _PREHASH_PathEnd = LLMessageStringTable::getInstance()->getString("PathEnd"); +char const* const _PREHASH_ScriptDataReply = LLMessageStringTable::getInstance()->getString("ScriptDataReply"); +char const* const _PREHASH_MapBlockReply = LLMessageStringTable::getInstance()->getString("MapBlockReply"); +char const* const _PREHASH_PropertiesData = LLMessageStringTable::getInstance()->getString("PropertiesData"); +char const* const _PREHASH_ViewerEffect = LLMessageStringTable::getInstance()->getString("ViewerEffect"); +char const* const _PREHASH_FreezeUser = LLMessageStringTable::getInstance()->getString("FreezeUser"); +char const* const _PREHASH_OwnerPrims = LLMessageStringTable::getInstance()->getString("OwnerPrims"); +char const* const _PREHASH_ObjectGrab = LLMessageStringTable::getInstance()->getString("ObjectGrab"); +char const* const _PREHASH_ToAgentID = LLMessageStringTable::getInstance()->getString("ToAgentID"); +char const* const _PREHASH_SimulatorMapUpdate = LLMessageStringTable::getInstance()->getString("SimulatorMapUpdate"); +char const* const _PREHASH_TransferPacket = LLMessageStringTable::getInstance()->getString("TransferPacket"); +char const* const _PREHASH_ObjectName = LLMessageStringTable::getInstance()->getString("ObjectName"); +char const* const _PREHASH_GroupPowers = LLMessageStringTable::getInstance()->getString("GroupPowers"); +char const* const _PREHASH_OriginalName = LLMessageStringTable::getInstance()->getString("OriginalName"); +char const* const _PREHASH_CompletePingCheck = LLMessageStringTable::getInstance()->getString("CompletePingCheck"); +char const* const _PREHASH_OnlineStatus = LLMessageStringTable::getInstance()->getString("OnlineStatus"); +char const* const _PREHASH_ObjectDrop = LLMessageStringTable::getInstance()->getString("ObjectDrop"); +char const* const _PREHASH_UseBigPackets = LLMessageStringTable::getInstance()->getString("UseBigPackets"); +char const* const _PREHASH_GroupNoticesListReply = LLMessageStringTable::getInstance()->getString("GroupNoticesListReply"); +char const* const _PREHASH_ParcelAccessListReply = LLMessageStringTable::getInstance()->getString("ParcelAccessListReply"); +char const* const _PREHASH_RpcChannelReply = LLMessageStringTable::getInstance()->getString("RpcChannelReply"); +char const* const _PREHASH_RegionPresenceResponse = LLMessageStringTable::getInstance()->getString("RegionPresenceResponse"); +char const* const _PREHASH_CharterMember = LLMessageStringTable::getInstance()->getString("CharterMember"); +char const* const _PREHASH_EdgeData = LLMessageStringTable::getInstance()->getString("EdgeData"); +char const* const _PREHASH_NameData = LLMessageStringTable::getInstance()->getString("NameData"); +char const* const _PREHASH_RegionPushOverride = LLMessageStringTable::getInstance()->getString("RegionPushOverride"); +char const* const _PREHASH_SimName = LLMessageStringTable::getInstance()->getString("SimName"); +char const* const _PREHASH_UserReport = LLMessageStringTable::getInstance()->getString("UserReport"); +char const* const _PREHASH_DownloadPriority = LLMessageStringTable::getInstance()->getString("DownloadPriority"); +char const* const _PREHASH_ToAgentId = LLMessageStringTable::getInstance()->getString("ToAgentId"); +char const* const _PREHASH_DirPopularQuery = LLMessageStringTable::getInstance()->getString("DirPopularQuery"); +char const* const _PREHASH_Mag = LLMessageStringTable::getInstance()->getString("Mag"); +char const* const _PREHASH_ParcelPropertiesRequestByID = LLMessageStringTable::getInstance()->getString("ParcelPropertiesRequestByID"); +char const* const _PREHASH_ObjectLink = LLMessageStringTable::getInstance()->getString("ObjectLink"); +char const* const _PREHASH_RpcScriptReplyInbound = LLMessageStringTable::getInstance()->getString("RpcScriptReplyInbound"); +char const* const _PREHASH_RezData = LLMessageStringTable::getInstance()->getString("RezData"); +char const* const _PREHASH_RemoveInventoryObjects = LLMessageStringTable::getInstance()->getString("RemoveInventoryObjects"); +char const* const _PREHASH_GroupProposalBallot = LLMessageStringTable::getInstance()->getString("GroupProposalBallot"); +char const* const _PREHASH_RPCServerIP = LLMessageStringTable::getInstance()->getString("RPCServerIP"); +char const* const _PREHASH_Far = LLMessageStringTable::getInstance()->getString("Far"); +char const* const _PREHASH_GodSessionID = LLMessageStringTable::getInstance()->getString("GodSessionID"); +char const* const _PREHASH_FLAboutText = LLMessageStringTable::getInstance()->getString("FLAboutText"); +char const* const _PREHASH_RegionHandshakeReply = LLMessageStringTable::getInstance()->getString("RegionHandshakeReply"); +char const* const _PREHASH_GroupActiveProposalItemReply = LLMessageStringTable::getInstance()->getString("GroupActiveProposalItemReply"); +char const* const _PREHASH_MapItemReply = LLMessageStringTable::getInstance()->getString("MapItemReply"); +char const* const _PREHASH_Seconds = LLMessageStringTable::getInstance()->getString("Seconds"); +char const* const _PREHASH_UpdateUserInfo = LLMessageStringTable::getInstance()->getString("UpdateUserInfo"); +char const* const _PREHASH_AggregatePermTexturesOwner = LLMessageStringTable::getInstance()->getString("AggregatePermTexturesOwner"); +char const* const _PREHASH_Set = LLMessageStringTable::getInstance()->getString("Set"); +char const* const _PREHASH_NewName = LLMessageStringTable::getInstance()->getString("NewName"); +char const* const _PREHASH_Key = LLMessageStringTable::getInstance()->getString("Key"); +char const* const _PREHASH_AgentID = LLMessageStringTable::getInstance()->getString("AgentID"); +char const* const _PREHASH_EventNotificationRemoveRequest = LLMessageStringTable::getInstance()->getString("EventNotificationRemoveRequest"); +char const* const _PREHASH_NewFolderID = LLMessageStringTable::getInstance()->getString("NewFolderID"); +char const* const _PREHASH_Arc = LLMessageStringTable::getInstance()->getString("Arc"); +char const* const _PREHASH_RegionX = LLMessageStringTable::getInstance()->getString("RegionX"); +char const* const _PREHASH_RegionY = LLMessageStringTable::getInstance()->getString("RegionY"); +char const* const _PREHASH_RequestData = LLMessageStringTable::getInstance()->getString("RequestData"); +char const* const _PREHASH_Msg = LLMessageStringTable::getInstance()->getString("Msg"); +char const* const _PREHASH_Top = LLMessageStringTable::getInstance()->getString("Top"); +char const* const _PREHASH_MiscStats = LLMessageStringTable::getInstance()->getString("MiscStats"); +char const* const _PREHASH_ImageID = LLMessageStringTable::getInstance()->getString("ImageID"); +char const* const _PREHASH_DataPacket = LLMessageStringTable::getInstance()->getString("DataPacket"); +char const* const _PREHASH_You = LLMessageStringTable::getInstance()->getString("You"); +char const* const _PREHASH_ScriptControlChange = LLMessageStringTable::getInstance()->getString("ScriptControlChange"); +char const* const _PREHASH_LoadURL = LLMessageStringTable::getInstance()->getString("LoadURL"); +char const* const _PREHASH_SetCPURatio = LLMessageStringTable::getInstance()->getString("SetCPURatio"); +char const* const _PREHASH_NameValueData = LLMessageStringTable::getInstance()->getString("NameValueData"); +char const* const _PREHASH_AtomicPassObject = LLMessageStringTable::getInstance()->getString("AtomicPassObject"); +char const* const _PREHASH_ErrorMessage = LLMessageStringTable::getInstance()->getString("ErrorMessage"); +char const* const _PREHASH_ViewerFrozenMessage = LLMessageStringTable::getInstance()->getString("ViewerFrozenMessage"); +char const* const _PREHASH_HealthMessage = LLMessageStringTable::getInstance()->getString("HealthMessage"); +char const* const _PREHASH_LogTextMessage = LLMessageStringTable::getInstance()->getString("LogTextMessage"); +char const* const _PREHASH_TimeDilation = LLMessageStringTable::getInstance()->getString("TimeDilation"); +char const* const _PREHASH_RemoveContribution = LLMessageStringTable::getInstance()->getString("RemoveContribution"); +char const* const _PREHASH_Contribution = LLMessageStringTable::getInstance()->getString("Contribution"); +char const* const _PREHASH_SetGroupContribution = LLMessageStringTable::getInstance()->getString("SetGroupContribution"); +char const* const _PREHASH_Offline = LLMessageStringTable::getInstance()->getString("Offline"); +char const* const _PREHASH_AgentIsNowWearing = LLMessageStringTable::getInstance()->getString("AgentIsNowWearing"); +char const* const _PREHASH_Members = LLMessageStringTable::getInstance()->getString("Members"); +char const* const _PREHASH_FailedResends = LLMessageStringTable::getInstance()->getString("FailedResends"); +char const* const _PREHASH_SecPerDay = LLMessageStringTable::getInstance()->getString("SecPerDay"); +char const* const _PREHASH_CameraCenter = LLMessageStringTable::getInstance()->getString("CameraCenter"); +char const* const _PREHASH_CameraLeftAxis = LLMessageStringTable::getInstance()->getString("CameraLeftAxis"); +char const* const _PREHASH_ExBlock = LLMessageStringTable::getInstance()->getString("ExBlock"); +char const* const _PREHASH_Channel = LLMessageStringTable::getInstance()->getString("Channel"); +char const* const _PREHASH_NetTest = LLMessageStringTable::getInstance()->getString("NetTest"); +char const* const _PREHASH_DiscardLevel = LLMessageStringTable::getInstance()->getString("DiscardLevel"); +char const* const _PREHASH_LayerID = LLMessageStringTable::getInstance()->getString("LayerID"); +char const* const _PREHASH_GrabOffset = LLMessageStringTable::getInstance()->getString("GrabOffset"); +char const* const _PREHASH_SimPort = LLMessageStringTable::getInstance()->getString("SimPort"); +char const* const _PREHASH_PricePerMeter = LLMessageStringTable::getInstance()->getString("PricePerMeter"); +char const* const _PREHASH_RegionFlags = LLMessageStringTable::getInstance()->getString("RegionFlags"); +char const* const _PREHASH_VoteResult = LLMessageStringTable::getInstance()->getString("VoteResult"); +char const* const _PREHASH_ParcelDirFeeEstimate = LLMessageStringTable::getInstance()->getString("ParcelDirFeeEstimate"); +char const* const _PREHASH_ModifyBlock = LLMessageStringTable::getInstance()->getString("ModifyBlock"); +char const* const _PREHASH_InventoryBlock = LLMessageStringTable::getInstance()->getString("InventoryBlock"); +char const* const _PREHASH_ReplyBlock = LLMessageStringTable::getInstance()->getString("ReplyBlock"); +char const* const _PREHASH_ValidUntil = LLMessageStringTable::getInstance()->getString("ValidUntil"); +char const* const _PREHASH_VelocityInterpolateOn = LLMessageStringTable::getInstance()->getString("VelocityInterpolateOn"); +char const* const _PREHASH_ClassifiedDelete = LLMessageStringTable::getInstance()->getString("ClassifiedDelete"); +char const* const _PREHASH_RegionDenyAnonymous = LLMessageStringTable::getInstance()->getString("RegionDenyAnonymous"); +char const* const _PREHASH_FLImageID = LLMessageStringTable::getInstance()->getString("FLImageID"); +char const* const _PREHASH_AllowPublish = LLMessageStringTable::getInstance()->getString("AllowPublish"); +char const* const _PREHASH_SitName = LLMessageStringTable::getInstance()->getString("SitName"); +char const* const _PREHASH_RegionsVisited = LLMessageStringTable::getInstance()->getString("RegionsVisited"); +char const* const _PREHASH_DirClassifiedReply = LLMessageStringTable::getInstance()->getString("DirClassifiedReply"); +char const* const _PREHASH_AvatarClassifiedReply = LLMessageStringTable::getInstance()->getString("AvatarClassifiedReply"); +char const* const _PREHASH_MediaURL = LLMessageStringTable::getInstance()->getString("MediaURL"); +char const* const _PREHASH_CompleteAgentMovement = LLMessageStringTable::getInstance()->getString("CompleteAgentMovement"); +char const* const _PREHASH_ClassifiedID = LLMessageStringTable::getInstance()->getString("ClassifiedID"); +char const* const _PREHASH_LocalID = LLMessageStringTable::getInstance()->getString("LocalID"); +char const* const _PREHASH_SpaceIP = LLMessageStringTable::getInstance()->getString("SpaceIP"); +char const* const _PREHASH_RemoveItem = LLMessageStringTable::getInstance()->getString("RemoveItem"); +char const* const _PREHASH_LogFailedMoneyTransaction = LLMessageStringTable::getInstance()->getString("LogFailedMoneyTransaction"); +char const* const _PREHASH_ViewerStartAuction = LLMessageStringTable::getInstance()->getString("ViewerStartAuction"); +char const* const _PREHASH_StartAuction = LLMessageStringTable::getInstance()->getString("StartAuction"); +char const* const _PREHASH_DuplicateFlags = LLMessageStringTable::getInstance()->getString("DuplicateFlags"); +char const* const _PREHASH_RegionInfo2 = LLMessageStringTable::getInstance()->getString("RegionInfo2"); +char const* const _PREHASH_TextColor = LLMessageStringTable::getInstance()->getString("TextColor"); +char const* const _PREHASH_SlaveID = LLMessageStringTable::getInstance()->getString("SlaveID"); +char const* const _PREHASH_Charter = LLMessageStringTable::getInstance()->getString("Charter"); +char const* const _PREHASH_AlertData = LLMessageStringTable::getInstance()->getString("AlertData"); +char const* const _PREHASH_AlertInfo = LLMessageStringTable::getInstance()->getString("AlertInfo"); +char const* const _PREHASH_TargetBlock = LLMessageStringTable::getInstance()->getString("TargetBlock"); +char const* const _PREHASH_CheckParcelAuctions = LLMessageStringTable::getInstance()->getString("CheckParcelAuctions"); +char const* const _PREHASH_ParcelAuctions = LLMessageStringTable::getInstance()->getString("ParcelAuctions"); +char const* const _PREHASH_OwnerIsGroup = LLMessageStringTable::getInstance()->getString("OwnerIsGroup"); +char const* const _PREHASH_NameValuePair = LLMessageStringTable::getInstance()->getString("NameValuePair"); +char const* const _PREHASH_RemoveNameValuePair = LLMessageStringTable::getInstance()->getString("RemoveNameValuePair"); +char const* const _PREHASH_BulkUpdateInventory = LLMessageStringTable::getInstance()->getString("BulkUpdateInventory"); +char const* const _PREHASH_UpdateTaskInventory = LLMessageStringTable::getInstance()->getString("UpdateTaskInventory"); +char const* const _PREHASH_RemoveTaskInventory = LLMessageStringTable::getInstance()->getString("RemoveTaskInventory"); +char const* const _PREHASH_MoveTaskInventory = LLMessageStringTable::getInstance()->getString("MoveTaskInventory"); +char const* const _PREHASH_RequestTaskInventory = LLMessageStringTable::getInstance()->getString("RequestTaskInventory"); +char const* const _PREHASH_ReplyTaskInventory = LLMessageStringTable::getInstance()->getString("ReplyTaskInventory"); +char const* const _PREHASH_AggregatePermInventory = LLMessageStringTable::getInstance()->getString("AggregatePermInventory"); +char const* const _PREHASH_GroupAccountTransactionsReply = LLMessageStringTable::getInstance()->getString("GroupAccountTransactionsReply"); +char const* const _PREHASH_SimulatorInfo = LLMessageStringTable::getInstance()->getString("SimulatorInfo"); +char const* const _PREHASH_WearableData = LLMessageStringTable::getInstance()->getString("WearableData"); +char const* const _PREHASH_Enabled = LLMessageStringTable::getInstance()->getString("Enabled"); +char const* const _PREHASH_Savings = LLMessageStringTable::getInstance()->getString("Savings"); +char const* const _PREHASH_SimulatorLoad = LLMessageStringTable::getInstance()->getString("SimulatorLoad"); +char const* const _PREHASH_InternalRegionIP = LLMessageStringTable::getInstance()->getString("InternalRegionIP"); +char const* const _PREHASH_ExternalRegionIP = LLMessageStringTable::getInstance()->getString("ExternalRegionIP"); +char const* const _PREHASH_TotalPairs = LLMessageStringTable::getInstance()->getString("TotalPairs"); +char const* const _PREHASH_CreateGroupRequest = LLMessageStringTable::getInstance()->getString("CreateGroupRequest"); +char const* const _PREHASH_JoinGroupRequest = LLMessageStringTable::getInstance()->getString("JoinGroupRequest"); +char const* const _PREHASH_LeaveGroupRequest = LLMessageStringTable::getInstance()->getString("LeaveGroupRequest"); +char const* const _PREHASH_InviteGroupRequest = LLMessageStringTable::getInstance()->getString("InviteGroupRequest"); +char const* const _PREHASH_LiveHelpGroupRequest = LLMessageStringTable::getInstance()->getString("LiveHelpGroupRequest"); +char const* const _PREHASH_PriceParcelClaimFactor = LLMessageStringTable::getInstance()->getString("PriceParcelClaimFactor"); +char const* const _PREHASH_BillableArea = LLMessageStringTable::getInstance()->getString("BillableArea"); +char const* const _PREHASH_ObjectID = LLMessageStringTable::getInstance()->getString("ObjectID"); +char const* const _PREHASH_ObjectFlagUpdate = LLMessageStringTable::getInstance()->getString("ObjectFlagUpdate"); +char const* const _PREHASH_GroupRoleUpdate = LLMessageStringTable::getInstance()->getString("GroupRoleUpdate"); +char const* const _PREHASH_RequestInventoryAsset = LLMessageStringTable::getInstance()->getString("RequestInventoryAsset"); +char const* const _PREHASH_ChangedGrid = LLMessageStringTable::getInstance()->getString("ChangedGrid"); +char const* const _PREHASH_AgentDropGroup = LLMessageStringTable::getInstance()->getString("AgentDropGroup"); +char const* const _PREHASH_Details = LLMessageStringTable::getInstance()->getString("Details"); +char const* const _PREHASH_LocationX = LLMessageStringTable::getInstance()->getString("LocationX"); +char const* const _PREHASH_SaleType = LLMessageStringTable::getInstance()->getString("SaleType"); +char const* const _PREHASH_LocationY = LLMessageStringTable::getInstance()->getString("LocationY"); +char const* const _PREHASH_LocationZ = LLMessageStringTable::getInstance()->getString("LocationZ"); +char const* const _PREHASH_EconomyData = LLMessageStringTable::getInstance()->getString("EconomyData"); +char const* const _PREHASH_HeadRotation = LLMessageStringTable::getInstance()->getString("HeadRotation"); +char const* const _PREHASH_DeleteOnCompletion = LLMessageStringTable::getInstance()->getString("DeleteOnCompletion"); +char const* const _PREHASH_PublicPort = LLMessageStringTable::getInstance()->getString("PublicPort"); +char const* const _PREHASH_DirClassifiedQuery = LLMessageStringTable::getInstance()->getString("DirClassifiedQuery"); +char const* const _PREHASH_CallbackID = LLMessageStringTable::getInstance()->getString("CallbackID"); +char const* const _PREHASH_RequestParcelTransfer = LLMessageStringTable::getInstance()->getString("RequestParcelTransfer"); +char const* const _PREHASH_RoleCount = LLMessageStringTable::getInstance()->getString("RoleCount"); +char const* const _PREHASH_ObjectCapacity = LLMessageStringTable::getInstance()->getString("ObjectCapacity"); +char const* const _PREHASH_RequestID = LLMessageStringTable::getInstance()->getString("RequestID"); +char const* const _PREHASH_RequestXfer = LLMessageStringTable::getInstance()->getString("RequestXfer"); +char const* const _PREHASH_ObjectTaxCurrent = LLMessageStringTable::getInstance()->getString("ObjectTaxCurrent"); +char const* const _PREHASH_LightTaxCurrent = LLMessageStringTable::getInstance()->getString("LightTaxCurrent"); +char const* const _PREHASH_LandTaxCurrent = LLMessageStringTable::getInstance()->getString("LandTaxCurrent"); +char const* const _PREHASH_GroupTaxCurrent = LLMessageStringTable::getInstance()->getString("GroupTaxCurrent"); +char const* const _PREHASH_FetchInventoryDescendents = LLMessageStringTable::getInstance()->getString("FetchInventoryDescendents"); +char const* const _PREHASH_InventoryDescendents = LLMessageStringTable::getInstance()->getString("InventoryDescendents"); +char const* const _PREHASH_Descendents = LLMessageStringTable::getInstance()->getString("Descendents"); +char const* const _PREHASH_PurgeInventoryDescendents = LLMessageStringTable::getInstance()->getString("PurgeInventoryDescendents"); +char const* const _PREHASH_ShowDir = LLMessageStringTable::getInstance()->getString("ShowDir"); +char const* const _PREHASH_IsOwner = LLMessageStringTable::getInstance()->getString("IsOwner"); +char const* const _PREHASH_Timestamp = LLMessageStringTable::getInstance()->getString("Timestamp"); +char const* const _PREHASH_GlobalPos = LLMessageStringTable::getInstance()->getString("GlobalPos"); +char const* const _PREHASH_GrabOffsetInitial = LLMessageStringTable::getInstance()->getString("GrabOffsetInitial"); +char const* const _PREHASH_IsTrial = LLMessageStringTable::getInstance()->getString("IsTrial"); +char const* const _PREHASH_ObjectDuplicateOnRay = LLMessageStringTable::getInstance()->getString("ObjectDuplicateOnRay"); +char const* const _PREHASH_GroupMembershipCount = LLMessageStringTable::getInstance()->getString("GroupMembershipCount"); +char const* const _PREHASH_MethodData = LLMessageStringTable::getInstance()->getString("MethodData"); +char const* const _PREHASH_ActivateGestures = LLMessageStringTable::getInstance()->getString("ActivateGestures"); +char const* const _PREHASH_DeactivateGestures = LLMessageStringTable::getInstance()->getString("DeactivateGestures"); +char const* const _PREHASH_ProposalData = LLMessageStringTable::getInstance()->getString("ProposalData"); +char const* const _PREHASH_PosGlobal = LLMessageStringTable::getInstance()->getString("PosGlobal"); +char const* const _PREHASH_SearchID = LLMessageStringTable::getInstance()->getString("SearchID"); +char const* const _PREHASH_RezMultipleAttachmentsFromInv = LLMessageStringTable::getInstance()->getString("RezMultipleAttachmentsFromInv"); +char const* const _PREHASH_SearchName = LLMessageStringTable::getInstance()->getString("SearchName"); +char const* const _PREHASH_VersionString = LLMessageStringTable::getInstance()->getString("VersionString"); +char const* const _PREHASH_CreateGroupReply = LLMessageStringTable::getInstance()->getString("CreateGroupReply"); +char const* const _PREHASH_LeaveGroupReply = LLMessageStringTable::getInstance()->getString("LeaveGroupReply"); +char const* const _PREHASH_ActualArea = LLMessageStringTable::getInstance()->getString("ActualArea"); +char const* const _PREHASH_Message = LLMessageStringTable::getInstance()->getString("Message"); +char const* const _PREHASH_ClickAction = LLMessageStringTable::getInstance()->getString("ClickAction"); +char const* const _PREHASH_AssetUploadComplete = LLMessageStringTable::getInstance()->getString("AssetUploadComplete"); +char const* const _PREHASH_RequestType = LLMessageStringTable::getInstance()->getString("RequestType"); +char const* const _PREHASH_UUID = LLMessageStringTable::getInstance()->getString("UUID"); +char const* const _PREHASH_BaseMask = LLMessageStringTable::getInstance()->getString("BaseMask"); +char const* const _PREHASH_NetBlock = LLMessageStringTable::getInstance()->getString("NetBlock"); +char const* const _PREHASH_GlobalX = LLMessageStringTable::getInstance()->getString("GlobalX"); +char const* const _PREHASH_GlobalY = LLMessageStringTable::getInstance()->getString("GlobalY"); +char const* const _PREHASH_CopyRotates = LLMessageStringTable::getInstance()->getString("CopyRotates"); +char const* const _PREHASH_KickUserAck = LLMessageStringTable::getInstance()->getString("KickUserAck"); +char const* const _PREHASH_TopPick = LLMessageStringTable::getInstance()->getString("TopPick"); //legacy var need to be deleted -angela +char const* const _PREHASH_SessionID = LLMessageStringTable::getInstance()->getString("SessionID"); +char const* const _PREHASH_GlobalZ = LLMessageStringTable::getInstance()->getString("GlobalZ"); +char const* const _PREHASH_DeclineFriendship = LLMessageStringTable::getInstance()->getString("DeclineFriendship"); +char const* const _PREHASH_FormFriendship = LLMessageStringTable::getInstance()->getString("FormFriendship"); +char const* const _PREHASH_TerminateFriendship = LLMessageStringTable::getInstance()->getString("TerminateFriendship"); +char const* const _PREHASH_TaskData = LLMessageStringTable::getInstance()->getString("TaskData"); +char const* const _PREHASH_SimWideMaxPrims = LLMessageStringTable::getInstance()->getString("SimWideMaxPrims"); +char const* const _PREHASH_TotalPrims = LLMessageStringTable::getInstance()->getString("TotalPrims"); +char const* const _PREHASH_ProfileBegin = LLMessageStringTable::getInstance()->getString("ProfileBegin"); +char const* const _PREHASH_Request = LLMessageStringTable::getInstance()->getString("Request"); +char const* const _PREHASH_GroupAccountDetailsRequest = LLMessageStringTable::getInstance()->getString("GroupAccountDetailsRequest"); +char const* const _PREHASH_GroupActiveProposalsRequest = LLMessageStringTable::getInstance()->getString("GroupActiveProposalsRequest"); +char const* const _PREHASH_StringValue = LLMessageStringTable::getInstance()->getString("StringValue"); +char const* const _PREHASH_Version = LLMessageStringTable::getInstance()->getString("Version"); +char const* const _PREHASH_OtherCount = LLMessageStringTable::getInstance()->getString("OtherCount"); +char const* const _PREHASH_MemberCount = LLMessageStringTable::getInstance()->getString("MemberCount"); +char const* const _PREHASH_ChatData = LLMessageStringTable::getInstance()->getString("ChatData"); +char const* const _PREHASH_IsGroupOwned = LLMessageStringTable::getInstance()->getString("IsGroupOwned"); +char const* const _PREHASH_EnergyEfficiency = LLMessageStringTable::getInstance()->getString("EnergyEfficiency"); +char const* const _PREHASH_PickInfoUpdate = LLMessageStringTable::getInstance()->getString("PickInfoUpdate"); +char const* const _PREHASH_PickDelete = LLMessageStringTable::getInstance()->getString("PickDelete"); +char const* const _PREHASH_ScriptReset = LLMessageStringTable::getInstance()->getString("ScriptReset"); +char const* const _PREHASH_Requester = LLMessageStringTable::getInstance()->getString("Requester"); +char const* const _PREHASH_ForSale = LLMessageStringTable::getInstance()->getString("ForSale"); +char const* const _PREHASH_NearestLandingRegionReply = LLMessageStringTable::getInstance()->getString("NearestLandingRegionReply"); +char const* const _PREHASH_ParcelID = LLMessageStringTable::getInstance()->getString("ParcelID"); +char const* const _PREHASH_Godlike = LLMessageStringTable::getInstance()->getString("Godlike"); +char const* const _PREHASH_TotalDebits = LLMessageStringTable::getInstance()->getString("TotalDebits"); +char const* const _PREHASH_Direction = LLMessageStringTable::getInstance()->getString("Direction"); +char const* const _PREHASH_HealthData = LLMessageStringTable::getInstance()->getString("HealthData"); +char const* const _PREHASH_LeftAxis = LLMessageStringTable::getInstance()->getString("LeftAxis"); +char const* const _PREHASH_LocationBlock = LLMessageStringTable::getInstance()->getString("LocationBlock"); +char const* const _PREHASH_ObjectImage = LLMessageStringTable::getInstance()->getString("ObjectImage"); +char const* const _PREHASH_TerrainStartHeight00 = LLMessageStringTable::getInstance()->getString("TerrainStartHeight00"); +char const* const _PREHASH_TerrainStartHeight01 = LLMessageStringTable::getInstance()->getString("TerrainStartHeight01"); +char const* const _PREHASH_TerrainStartHeight10 = LLMessageStringTable::getInstance()->getString("TerrainStartHeight10"); +char const* const _PREHASH_TerrainStartHeight11 = LLMessageStringTable::getInstance()->getString("TerrainStartHeight11"); +char const* const _PREHASH_WaterHeight = LLMessageStringTable::getInstance()->getString("WaterHeight"); +char const* const _PREHASH_FetchInventoryReply = LLMessageStringTable::getInstance()->getString("FetchInventoryReply"); +char const* const _PREHASH_GroupAccountSummaryReply = LLMessageStringTable::getInstance()->getString("GroupAccountSummaryReply"); +char const* const _PREHASH_AttachedSound = LLMessageStringTable::getInstance()->getString("AttachedSound"); +char const* const _PREHASH_ParamInUse = LLMessageStringTable::getInstance()->getString("ParamInUse"); +char const* const _PREHASH_GodKickUser = LLMessageStringTable::getInstance()->getString("GodKickUser"); +char const* const _PREHASH_PickName = LLMessageStringTable::getInstance()->getString("PickName"); +char const* const _PREHASH_TaskName = LLMessageStringTable::getInstance()->getString("TaskName"); +char const* const _PREHASH_ObjectCount = LLMessageStringTable::getInstance()->getString("ObjectCount"); +char const* const _PREHASH_RegionPresenceRequestByHandle = LLMessageStringTable::getInstance()->getString("RegionPresenceRequestByHandle"); +char const* const _PREHASH_RezSingleAttachmentFromInv = LLMessageStringTable::getInstance()->getString("RezSingleAttachmentFromInv"); +char const* const _PREHASH_ChildAgentUpdate = LLMessageStringTable::getInstance()->getString("ChildAgentUpdate"); +char const* const _PREHASH_IsOwnerGroup = LLMessageStringTable::getInstance()->getString("IsOwnerGroup"); +char const* const _PREHASH_AgentHeightWidth = LLMessageStringTable::getInstance()->getString("AgentHeightWidth"); +char const* const _PREHASH_VerticalAngle = LLMessageStringTable::getInstance()->getString("VerticalAngle"); +char const* const _PREHASH_WearableType = LLMessageStringTable::getInstance()->getString("WearableType"); +char const* const _PREHASH_AggregatePermNextOwner = LLMessageStringTable::getInstance()->getString("AggregatePermNextOwner"); +char const* const _PREHASH_ShowInList = LLMessageStringTable::getInstance()->getString("ShowInList"); +char const* const _PREHASH_UpdateParcel = LLMessageStringTable::getInstance()->getString("UpdateParcel"); +char const* const _PREHASH_SetAlwaysRun = LLMessageStringTable::getInstance()->getString("SetAlwaysRun"); +char const* const _PREHASH_NVPair = LLMessageStringTable::getInstance()->getString("NVPair"); +char const* const _PREHASH_SearchType = LLMessageStringTable::getInstance()->getString("SearchType"); +char const* const _PREHASH_ObjectSpinStart = LLMessageStringTable::getInstance()->getString("ObjectSpinStart"); +char const* const _PREHASH_UseEstateSun = LLMessageStringTable::getInstance()->getString("UseEstateSun"); +char const* const _PREHASH_RegionID = LLMessageStringTable::getInstance()->getString("RegionID"); +char const* const _PREHASH_AbuseRegionID = LLMessageStringTable::getInstance()->getString("AbuseRegionID"); +char const* const _PREHASH_Creator = LLMessageStringTable::getInstance()->getString("Creator"); +char const* const _PREHASH_ProposalText = LLMessageStringTable::getInstance()->getString("ProposalText"); +char const* const _PREHASH_DirEventsReply = LLMessageStringTable::getInstance()->getString("DirEventsReply"); +char const* const _PREHASH_EventInfoReply = LLMessageStringTable::getInstance()->getString("EventInfoReply"); +char const* const _PREHASH_UserInfoReply = LLMessageStringTable::getInstance()->getString("UserInfoReply"); +char const* const _PREHASH_PathRadiusOffset = LLMessageStringTable::getInstance()->getString("PathRadiusOffset"); +char const* const _PREHASH_TextureData = LLMessageStringTable::getInstance()->getString("TextureData"); +char const* const _PREHASH_ChatPass = LLMessageStringTable::getInstance()->getString("ChatPass"); +char const* const _PREHASH_TargetID = LLMessageStringTable::getInstance()->getString("TargetID"); +char const* const _PREHASH_DefaultPayPrice = LLMessageStringTable::getInstance()->getString("DefaultPayPrice"); +char const* const _PREHASH_UserLocation = LLMessageStringTable::getInstance()->getString("UserLocation"); +char const* const _PREHASH_MaxPrims = LLMessageStringTable::getInstance()->getString("MaxPrims"); +char const* const _PREHASH_LandmarkID = LLMessageStringTable::getInstance()->getString("LandmarkID"); +char const* const _PREHASH_InitiateDownload = LLMessageStringTable::getInstance()->getString("InitiateDownload"); +char const* const _PREHASH_Name = LLMessageStringTable::getInstance()->getString("Name"); +char const* const _PREHASH_OtherCleanTime = LLMessageStringTable::getInstance()->getString("OtherCleanTime"); +char const* const _PREHASH_ParcelSetOtherCleanTime = LLMessageStringTable::getInstance()->getString("ParcelSetOtherCleanTime"); +char const* const _PREHASH_TeleportPriceExponent = LLMessageStringTable::getInstance()->getString("TeleportPriceExponent"); +char const* const _PREHASH_Gain = LLMessageStringTable::getInstance()->getString("Gain"); +char const* const _PREHASH_PacketAck = LLMessageStringTable::getInstance()->getString("PacketAck"); +char const* const _PREHASH_PathSkew = LLMessageStringTable::getInstance()->getString("PathSkew"); +char const* const _PREHASH_SimulatorShutdownRequest = LLMessageStringTable::getInstance()->getString("SimulatorShutdownRequest"); +char const* const _PREHASH_NearestLandingRegionRequest = LLMessageStringTable::getInstance()->getString("NearestLandingRegionRequest"); +char const* const _PREHASH_OtherID = LLMessageStringTable::getInstance()->getString("OtherID"); +char const* const _PREHASH_MemberID = LLMessageStringTable::getInstance()->getString("MemberID"); +char const* const _PREHASH_MapLayerRequest = LLMessageStringTable::getInstance()->getString("MapLayerRequest"); +char const* const _PREHASH_ObjectScale = LLMessageStringTable::getInstance()->getString("ObjectScale"); +char const* const _PREHASH_TargetIP = LLMessageStringTable::getInstance()->getString("TargetIP"); +char const* const _PREHASH_Redo = LLMessageStringTable::getInstance()->getString("Redo"); +char const* const _PREHASH_MoneyBalance = LLMessageStringTable::getInstance()->getString("MoneyBalance"); +char const* const _PREHASH_TrackAgent = LLMessageStringTable::getInstance()->getString("TrackAgent"); +char const* const _PREHASH_MaxX = LLMessageStringTable::getInstance()->getString("MaxX"); +char const* const _PREHASH_Data = LLMessageStringTable::getInstance()->getString("Data"); +char const* const _PREHASH_MaxY = LLMessageStringTable::getInstance()->getString("MaxY"); +char const* const _PREHASH_TextureAnim = LLMessageStringTable::getInstance()->getString("TextureAnim"); +char const* const _PREHASH_ReturnIDs = LLMessageStringTable::getInstance()->getString("ReturnIDs"); +char const* const _PREHASH_Date = LLMessageStringTable::getInstance()->getString("Date"); +char const* const _PREHASH_AgentWearablesUpdate = LLMessageStringTable::getInstance()->getString("AgentWearablesUpdate"); +char const* const _PREHASH_AgentDataUpdate = LLMessageStringTable::getInstance()->getString("AgentDataUpdate"); +char const* const _PREHASH_GroupDataUpdate = LLMessageStringTable::getInstance()->getString("GroupDataUpdate"); +char const* const _PREHASH_Hash = LLMessageStringTable::getInstance()->getString("Hash"); +char const* const _PREHASH_AgentGroupDataUpdate = LLMessageStringTable::getInstance()->getString("AgentGroupDataUpdate"); +char const* const _PREHASH_Left = LLMessageStringTable::getInstance()->getString("Left"); +char const* const _PREHASH_Mask = LLMessageStringTable::getInstance()->getString("Mask"); +char const* const _PREHASH_ForceMouselook = LLMessageStringTable::getInstance()->getString("ForceMouselook"); +char const* const _PREHASH_Success = LLMessageStringTable::getInstance()->getString("Success"); +char const* const _PREHASH_ObjectGroup = LLMessageStringTable::getInstance()->getString("ObjectGroup"); +char const* const _PREHASH_SunHour = LLMessageStringTable::getInstance()->getString("SunHour"); +char const* const _PREHASH_MinX = LLMessageStringTable::getInstance()->getString("MinX"); +char const* const _PREHASH_ScriptSensorReply = LLMessageStringTable::getInstance()->getString("ScriptSensorReply"); +char const* const _PREHASH_MinY = LLMessageStringTable::getInstance()->getString("MinY"); +char const* const _PREHASH_Command = LLMessageStringTable::getInstance()->getString("Command"); +char const* const _PREHASH_Desc = LLMessageStringTable::getInstance()->getString("Desc"); +char const* const _PREHASH_AttachmentNeedsSave = LLMessageStringTable::getInstance()->getString("AttachmentNeedsSave"); +char const* const _PREHASH_HistoryItemData = LLMessageStringTable::getInstance()->getString("HistoryItemData"); +char const* const _PREHASH_AgentCachedTexture = LLMessageStringTable::getInstance()->getString("AgentCachedTexture"); +char const* const _PREHASH_Subject = LLMessageStringTable::getInstance()->getString("Subject"); +char const* const _PREHASH_East = LLMessageStringTable::getInstance()->getString("East"); +char const* const _PREHASH_QueryReplies = LLMessageStringTable::getInstance()->getString("QueryReplies"); +char const* const _PREHASH_ObjectCategory = LLMessageStringTable::getInstance()->getString("ObjectCategory"); +char const* const _PREHASH_Time = LLMessageStringTable::getInstance()->getString("Time"); +char const* const _PREHASH_CreateLandmarkForEvent = LLMessageStringTable::getInstance()->getString("CreateLandmarkForEvent"); +char const* const _PREHASH_ParentID = LLMessageStringTable::getInstance()->getString("ParentID"); +char const* const _PREHASH_Ping = LLMessageStringTable::getInstance()->getString("Ping"); +char const* const _PREHASH_Perp = LLMessageStringTable::getInstance()->getString("Perp"); +char const* const _PREHASH_Code = LLMessageStringTable::getInstance()->getString("Code"); +char const* const _PREHASH_InvType = LLMessageStringTable::getInstance()->getString("InvType"); +char const* const _PREHASH_AgentFOV = LLMessageStringTable::getInstance()->getString("AgentFOV"); +char const* const _PREHASH_Audible = LLMessageStringTable::getInstance()->getString("Audible"); +char const* const _PREHASH_AuctionData = LLMessageStringTable::getInstance()->getString("AuctionData"); +char const* const _PREHASH_IDBlock = LLMessageStringTable::getInstance()->getString("IDBlock"); +char const* const _PREHASH_West = LLMessageStringTable::getInstance()->getString("West"); +char const* const _PREHASH_Undo = LLMessageStringTable::getInstance()->getString("Undo"); +char const* const _PREHASH_TotalNumItems = LLMessageStringTable::getInstance()->getString("TotalNumItems"); +char const* const _PREHASH_Info = LLMessageStringTable::getInstance()->getString("Info"); +char const* const _PREHASH_Area = LLMessageStringTable::getInstance()->getString("Area"); +char const* const _PREHASH_SimCrashed = LLMessageStringTable::getInstance()->getString("SimCrashed"); +char const* const _PREHASH_Text = LLMessageStringTable::getInstance()->getString("Text"); +char const* const _PREHASH_PriceGroupCreate = LLMessageStringTable::getInstance()->getString("PriceGroupCreate"); +char const* const _PREHASH_ObjectShape = LLMessageStringTable::getInstance()->getString("ObjectShape"); +char const* const _PREHASH_GroupRoleDataReply = LLMessageStringTable::getInstance()->getString("GroupRoleDataReply"); +char const* const _PREHASH_MuteCRC = LLMessageStringTable::getInstance()->getString("MuteCRC"); +char const* const _PREHASH_Size = LLMessageStringTable::getInstance()->getString("Size"); +char const* const _PREHASH_FromAddress = LLMessageStringTable::getInstance()->getString("FromAddress"); +char const* const _PREHASH_Body = LLMessageStringTable::getInstance()->getString("Body"); +char const* const _PREHASH_FileData = LLMessageStringTable::getInstance()->getString("FileData"); +char const* const _PREHASH_List = LLMessageStringTable::getInstance()->getString("List"); +char const* const _PREHASH_KickUser = LLMessageStringTable::getInstance()->getString("KickUser"); +char const* const _PREHASH_OtherPrims = LLMessageStringTable::getInstance()->getString("OtherPrims"); +char const* const _PREHASH_RunTime = LLMessageStringTable::getInstance()->getString("RunTime"); +char const* const _PREHASH_GrantUserRights = LLMessageStringTable::getInstance()->getString("GrantUserRights"); +char const* const _PREHASH_RpcScriptRequestInboundForward = LLMessageStringTable::getInstance()->getString("RpcScriptRequestInboundForward"); +char const* const _PREHASH_More = LLMessageStringTable::getInstance()->getString("More"); +char const* const _PREHASH_Majority = LLMessageStringTable::getInstance()->getString("Majority"); +char const* const _PREHASH_MetersTraveled = LLMessageStringTable::getInstance()->getString("MetersTraveled"); +char const* const _PREHASH_Stat = LLMessageStringTable::getInstance()->getString("Stat"); +char const* const _PREHASH_SoundID = LLMessageStringTable::getInstance()->getString("SoundID"); +char const* const _PREHASH_Item = LLMessageStringTable::getInstance()->getString("Item"); +char const* const _PREHASH_User = LLMessageStringTable::getInstance()->getString("User"); +char const* const _PREHASH_Prey = LLMessageStringTable::getInstance()->getString("Prey"); +char const* const _PREHASH_RayStart = LLMessageStringTable::getInstance()->getString("RayStart"); +char const* const _PREHASH_UsecSinceStart = LLMessageStringTable::getInstance()->getString("UsecSinceStart"); +char const* const _PREHASH_ParcelData = LLMessageStringTable::getInstance()->getString("ParcelData"); +char const* const _PREHASH_CameraUpAxis = LLMessageStringTable::getInstance()->getString("CameraUpAxis"); +char const* const _PREHASH_ScriptDialog = LLMessageStringTable::getInstance()->getString("ScriptDialog"); +char const* const _PREHASH_MasterParcelData = LLMessageStringTable::getInstance()->getString("MasterParcelData"); +char const* const _PREHASH_Invalid = LLMessageStringTable::getInstance()->getString("Invalid"); +char const* const _PREHASH_ProfileCurve = LLMessageStringTable::getInstance()->getString("ProfileCurve"); +char const* const _PREHASH_ParcelAccessListUpdate = LLMessageStringTable::getInstance()->getString("ParcelAccessListUpdate"); +char const* const _PREHASH_MuteListUpdate = LLMessageStringTable::getInstance()->getString("MuteListUpdate"); +char const* const _PREHASH_SendPacket = LLMessageStringTable::getInstance()->getString("SendPacket"); +char const* const _PREHASH_SendXferPacket = LLMessageStringTable::getInstance()->getString("SendXferPacket"); +char const* const _PREHASH_RegionDenyIdentified = LLMessageStringTable::getInstance()->getString("RegionDenyIdentified"); +char const* const _PREHASH_NotecardItemID = LLMessageStringTable::getInstance()->getString("NotecardItemID"); +char const* const _PREHASH_LastName = LLMessageStringTable::getInstance()->getString("LastName"); +char const* const _PREHASH_From = LLMessageStringTable::getInstance()->getString("From"); +char const* const _PREHASH_RoleChange = LLMessageStringTable::getInstance()->getString("RoleChange"); +char const* const _PREHASH_Port = LLMessageStringTable::getInstance()->getString("Port"); +char const* const _PREHASH_MemberTitle = LLMessageStringTable::getInstance()->getString("MemberTitle"); +char const* const _PREHASH_LogParcelChanges = LLMessageStringTable::getInstance()->getString("LogParcelChanges"); +char const* const _PREHASH_AgentCachedTextureResponse = LLMessageStringTable::getInstance()->getString("AgentCachedTextureResponse"); +char const* const _PREHASH_DeRezObject = LLMessageStringTable::getInstance()->getString("DeRezObject"); +char const* const _PREHASH_IsTemporary = LLMessageStringTable::getInstance()->getString("IsTemporary"); +char const* const _PREHASH_InsigniaID = LLMessageStringTable::getInstance()->getString("InsigniaID"); +char const* const _PREHASH_CheckFlags = LLMessageStringTable::getInstance()->getString("CheckFlags"); +char const* const _PREHASH_EventID = LLMessageStringTable::getInstance()->getString("EventID"); +char const* const _PREHASH_Selected = LLMessageStringTable::getInstance()->getString("Selected"); +char const* const _PREHASH_FromAgentId = LLMessageStringTable::getInstance()->getString("FromAgentId"); +char const* const _PREHASH_Type = LLMessageStringTable::getInstance()->getString("Type"); +char const* const _PREHASH_ChatType = LLMessageStringTable::getInstance()->getString("ChatType"); +char const* const _PREHASH_ReportData = LLMessageStringTable::getInstance()->getString("ReportData"); +char const* const _PREHASH_RequestBlock = LLMessageStringTable::getInstance()->getString("RequestBlock"); +char const* const _PREHASH_GrantData = LLMessageStringTable::getInstance()->getString("GrantData"); +char const* const _PREHASH_DetachAttachmentIntoInv = LLMessageStringTable::getInstance()->getString("DetachAttachmentIntoInv"); +char const* const _PREHASH_ParcelDisableObjects = LLMessageStringTable::getInstance()->getString("ParcelDisableObjects"); +char const* const _PREHASH_Sections = LLMessageStringTable::getInstance()->getString("Sections"); +char const* const _PREHASH_GodLevel = LLMessageStringTable::getInstance()->getString("GodLevel"); +char const* const _PREHASH_PayPriceReply = LLMessageStringTable::getInstance()->getString("PayPriceReply"); +char const* const _PREHASH_QueryID = LLMessageStringTable::getInstance()->getString("QueryID"); +char const* const _PREHASH_CameraEyeOffset = LLMessageStringTable::getInstance()->getString("CameraEyeOffset"); +char const* const _PREHASH_AgentPosition = LLMessageStringTable::getInstance()->getString("AgentPosition"); +char const* const _PREHASH_GrabPosition = LLMessageStringTable::getInstance()->getString("GrabPosition"); +char const* const _PREHASH_OnlineNotification = LLMessageStringTable::getInstance()->getString("OnlineNotification"); +char const* const _PREHASH_OfflineNotification = LLMessageStringTable::getInstance()->getString("OfflineNotification"); +char const* const _PREHASH_SendPostcard = LLMessageStringTable::getInstance()->getString("SendPostcard"); +char const* const _PREHASH_RequestFlags = LLMessageStringTable::getInstance()->getString("RequestFlags"); +char const* const _PREHASH_GroupAccountSummaryRequest = LLMessageStringTable::getInstance()->getString("GroupAccountSummaryRequest"); +char const* const _PREHASH_GroupVoteHistoryRequest = LLMessageStringTable::getInstance()->getString("GroupVoteHistoryRequest"); +char const* const _PREHASH_ParamValue = LLMessageStringTable::getInstance()->getString("ParamValue"); +char const* const _PREHASH_MaxAgents = LLMessageStringTable::getInstance()->getString("MaxAgents"); +char const* const _PREHASH_CreateNewOutfitAttachments = LLMessageStringTable::getInstance()->getString("CreateNewOutfitAttachments"); +char const* const _PREHASH_RegionHandle = LLMessageStringTable::getInstance()->getString("RegionHandle"); +char const* const _PREHASH_TeleportProgress = LLMessageStringTable::getInstance()->getString("TeleportProgress"); +char const* const _PREHASH_AgentQuitCopy = LLMessageStringTable::getInstance()->getString("AgentQuitCopy"); +char const* const _PREHASH_AvatarInterestsUpdate = LLMessageStringTable::getInstance()->getString("AvatarInterestsUpdate"); +char const* const _PREHASH_GroupNoticeID = LLMessageStringTable::getInstance()->getString("GroupNoticeID"); +char const* const _PREHASH_ParcelName = LLMessageStringTable::getInstance()->getString("ParcelName"); +char const* const _PREHASH_PriceObjectRent = LLMessageStringTable::getInstance()->getString("PriceObjectRent"); +char const* const _PREHASH_OfferCallingCard = LLMessageStringTable::getInstance()->getString("OfferCallingCard"); +char const* const _PREHASH_AcceptCallingCard = LLMessageStringTable::getInstance()->getString("AcceptCallingCard"); +char const* const _PREHASH_DeclineCallingCard = LLMessageStringTable::getInstance()->getString("DeclineCallingCard"); +char const* const _PREHASH_AgentAccess = LLMessageStringTable::getInstance()->getString("AgentAccess"); +char const* const _PREHASH_AgentLegacyAccess = LLMessageStringTable::getInstance()->getString("AgentLegacyAccess"); +char const* const _PREHASH_AgentMaxAccess = LLMessageStringTable::getInstance()->getString("AgentMaxAccess"); +char const* const _PREHASH_DataHomeLocationReply = LLMessageStringTable::getInstance()->getString("DataHomeLocationReply"); +char const* const _PREHASH_EventLocationReply = LLMessageStringTable::getInstance()->getString("EventLocationReply"); +char const* const _PREHASH_TerseDateID = LLMessageStringTable::getInstance()->getString("TerseDateID"); +char const* const _PREHASH_ObjectOwner = LLMessageStringTable::getInstance()->getString("ObjectOwner"); +char const* const _PREHASH_AssetID = LLMessageStringTable::getInstance()->getString("AssetID"); +char const* const _PREHASH_AlertMessage = LLMessageStringTable::getInstance()->getString("AlertMessage"); +char const* const _PREHASH_AgentAlertMessage = LLMessageStringTable::getInstance()->getString("AgentAlertMessage"); +char const* const _PREHASH_EstateOwnerMessage = LLMessageStringTable::getInstance()->getString("EstateOwnerMessage"); +char const* const _PREHASH_ParcelMediaCommandMessage = LLMessageStringTable::getInstance()->getString("ParcelMediaCommandMessage"); +char const* const _PREHASH_Auction = LLMessageStringTable::getInstance()->getString("Auction"); +char const* const _PREHASH_Category = LLMessageStringTable::getInstance()->getString("Category"); +char const* const _PREHASH_FilePath = LLMessageStringTable::getInstance()->getString("FilePath"); +char const* const _PREHASH_ItemFlags = LLMessageStringTable::getInstance()->getString("ItemFlags"); +char const* const _PREHASH_Invoice = LLMessageStringTable::getInstance()->getString("Invoice"); +char const* const _PREHASH_IntervalDays = LLMessageStringTable::getInstance()->getString("IntervalDays"); +char const* const _PREHASH_PathScaleX = LLMessageStringTable::getInstance()->getString("PathScaleX"); +char const* const _PREHASH_FromTaskID = LLMessageStringTable::getInstance()->getString("FromTaskID"); +char const* const _PREHASH_PathScaleY = LLMessageStringTable::getInstance()->getString("PathScaleY"); +char const* const _PREHASH_TimeInfo = LLMessageStringTable::getInstance()->getString("TimeInfo"); +char const* const _PREHASH_PublicCount = LLMessageStringTable::getInstance()->getString("PublicCount"); +char const* const _PREHASH_ParcelJoin = LLMessageStringTable::getInstance()->getString("ParcelJoin"); +char const* const _PREHASH_GroupRolesCount = LLMessageStringTable::getInstance()->getString("GroupRolesCount"); +char const* const _PREHASH_SimulatorBlock = LLMessageStringTable::getInstance()->getString("SimulatorBlock"); +char const* const _PREHASH_GroupID = LLMessageStringTable::getInstance()->getString("GroupID"); +char const* const _PREHASH_AgentVel = LLMessageStringTable::getInstance()->getString("AgentVel"); +char const* const _PREHASH_RequestImage = LLMessageStringTable::getInstance()->getString("RequestImage"); +char const* const _PREHASH_NetStats = LLMessageStringTable::getInstance()->getString("NetStats"); +char const* const _PREHASH_AgentPos = LLMessageStringTable::getInstance()->getString("AgentPos"); +char const* const _PREHASH_AgentSit = LLMessageStringTable::getInstance()->getString("AgentSit"); +char const* const _PREHASH_Material = LLMessageStringTable::getInstance()->getString("Material"); +char const* const _PREHASH_ObjectDeGrab = LLMessageStringTable::getInstance()->getString("ObjectDeGrab"); +char const* const _PREHASH_VelocityInterpolateOff = LLMessageStringTable::getInstance()->getString("VelocityInterpolateOff"); +char const* const _PREHASH_AuthorizedBuyerID = LLMessageStringTable::getInstance()->getString("AuthorizedBuyerID"); +char const* const _PREHASH_AvatarPropertiesReply = LLMessageStringTable::getInstance()->getString("AvatarPropertiesReply"); +char const* const _PREHASH_GroupProfileReply = LLMessageStringTable::getInstance()->getString("GroupProfileReply"); +char const* const _PREHASH_SimOwner = LLMessageStringTable::getInstance()->getString("SimOwner"); +char const* const _PREHASH_SalePrice = LLMessageStringTable::getInstance()->getString("SalePrice"); +char const* const _PREHASH_Animation = LLMessageStringTable::getInstance()->getString("Animation"); +char const* const _PREHASH_OwnerID = LLMessageStringTable::getInstance()->getString("OwnerID"); +char const* const _PREHASH_NearestLandingRegionUpdated = LLMessageStringTable::getInstance()->getString("NearestLandingRegionUpdated"); +char const* const _PREHASH_PassToAgent = LLMessageStringTable::getInstance()->getString("PassToAgent"); +char const* const _PREHASH_PreyAgent = LLMessageStringTable::getInstance()->getString("PreyAgent"); +char const* const _PREHASH_SimStats = LLMessageStringTable::getInstance()->getString("SimStats"); +char const* const _PREHASH_LogoutReply = LLMessageStringTable::getInstance()->getString("LogoutReply"); +char const* const _PREHASH_FeatureDisabled = LLMessageStringTable::getInstance()->getString("FeatureDisabled"); +char const* const _PREHASH_PhysicalAvatarEventList = LLMessageStringTable::getInstance()->getString("PhysicalAvatarEventList"); +char const* const _PREHASH_ObjectLocalID = LLMessageStringTable::getInstance()->getString("ObjectLocalID"); +char const* const _PREHASH_Dropped = LLMessageStringTable::getInstance()->getString("Dropped"); +char const* const _PREHASH_WebProfilesDisabled = LLMessageStringTable::getInstance()->getString("WebProfilesDisabled"); +char const* const _PREHASH_Destination = LLMessageStringTable::getInstance()->getString("Destination"); +char const* const _PREHASH_MasterID = LLMessageStringTable::getInstance()->getString("MasterID"); +char const* const _PREHASH_TransferData = LLMessageStringTable::getInstance()->getString("TransferData"); +char const* const _PREHASH_WantToMask = LLMessageStringTable::getInstance()->getString("WantToMask"); +char const* const _PREHASH_ParcelSelectObjects = LLMessageStringTable::getInstance()->getString("ParcelSelectObjects"); +char const* const _PREHASH_ExtraParams = LLMessageStringTable::getInstance()->getString("ExtraParams"); +char const* const _PREHASH_CreatorID = LLMessageStringTable::getInstance()->getString("CreatorID"); +char const* const _PREHASH_Summary = LLMessageStringTable::getInstance()->getString("Summary"); +char const* const _PREHASH_BuyObjectInventory = LLMessageStringTable::getInstance()->getString("BuyObjectInventory"); +char const* const _PREHASH_FetchInventory = LLMessageStringTable::getInstance()->getString("FetchInventory"); +char const* const _PREHASH_InventoryID = LLMessageStringTable::getInstance()->getString("InventoryID"); +char const* const _PREHASH_PacketNumber = LLMessageStringTable::getInstance()->getString("PacketNumber"); +char const* const _PREHASH_SetFollowCamProperties = LLMessageStringTable::getInstance()->getString("SetFollowCamProperties"); +char const* const _PREHASH_ClearFollowCamProperties = LLMessageStringTable::getInstance()->getString("ClearFollowCamProperties"); +char const* const _PREHASH_SequenceID = LLMessageStringTable::getInstance()->getString("SequenceID"); +char const* const _PREHASH_DataServerLogout = LLMessageStringTable::getInstance()->getString("DataServerLogout"); +char const* const _PREHASH_NameValue = LLMessageStringTable::getInstance()->getString("NameValue"); +char const* const _PREHASH_PathShearX = LLMessageStringTable::getInstance()->getString("PathShearX"); +char const* const _PREHASH_PathShearY = LLMessageStringTable::getInstance()->getString("PathShearY"); +char const* const _PREHASH_Velocity = LLMessageStringTable::getInstance()->getString("Velocity"); +char const* const _PREHASH_SecPerYear = LLMessageStringTable::getInstance()->getString("SecPerYear"); +char const* const _PREHASH_FirstName = LLMessageStringTable::getInstance()->getString("FirstName"); +char const* const _PREHASH_AttachedSoundGainChange = LLMessageStringTable::getInstance()->getString("AttachedSoundGainChange"); +char const* const _PREHASH_LocationID = LLMessageStringTable::getInstance()->getString("LocationID"); +char const* const _PREHASH_Running = LLMessageStringTable::getInstance()->getString("Running"); +char const* const _PREHASH_AgentThrottle = LLMessageStringTable::getInstance()->getString("AgentThrottle"); +char const* const _PREHASH_NeighborList = LLMessageStringTable::getInstance()->getString("NeighborList"); +char const* const _PREHASH_PathTaperX = LLMessageStringTable::getInstance()->getString("PathTaperX"); +char const* const _PREHASH_PathTaperY = LLMessageStringTable::getInstance()->getString("PathTaperY"); +char const* const _PREHASH_AgentRelated = LLMessageStringTable::getInstance()->getString("AgentRelated"); +char const* const _PREHASH_GranterBlock = LLMessageStringTable::getInstance()->getString("GranterBlock"); +char const* const _PREHASH_UseCachedMuteList = LLMessageStringTable::getInstance()->getString("UseCachedMuteList"); +char const* const _PREHASH_FailStats = LLMessageStringTable::getInstance()->getString("FailStats"); +char const* const _PREHASH_Tempfile = LLMessageStringTable::getInstance()->getString("Tempfile"); +char const* const _PREHASH_BuyerID = LLMessageStringTable::getInstance()->getString("BuyerID"); +char const* const _PREHASH_DirPeopleReply = LLMessageStringTable::getInstance()->getString("DirPeopleReply"); +char const* const _PREHASH_TransferInfo = LLMessageStringTable::getInstance()->getString("TransferInfo"); +char const* const _PREHASH_AvatarPickerRequestBackend = LLMessageStringTable::getInstance()->getString("AvatarPickerRequestBackend"); +char const* const _PREHASH_AvatarPropertiesRequestBackend = LLMessageStringTable::getInstance()->getString("AvatarPropertiesRequestBackend"); +char const* const _PREHASH_UpdateData = LLMessageStringTable::getInstance()->getString("UpdateData"); +char const* const _PREHASH_SimFPS = LLMessageStringTable::getInstance()->getString("SimFPS"); +char const* const _PREHASH_ReporterID = LLMessageStringTable::getInstance()->getString("ReporterID"); +char const* const _PREHASH_ButtonLabel = LLMessageStringTable::getInstance()->getString("ButtonLabel"); +char const* const _PREHASH_GranterID = LLMessageStringTable::getInstance()->getString("GranterID"); +char const* const _PREHASH_WantToText = LLMessageStringTable::getInstance()->getString("WantToText"); +char const* const _PREHASH_ReportType = LLMessageStringTable::getInstance()->getString("ReportType"); +char const* const _PREHASH_SimulatorReady = LLMessageStringTable::getInstance()->getString("SimulatorReady"); +char const* const _PREHASH_DataBlock = LLMessageStringTable::getInstance()->getString("DataBlock"); +char const* const _PREHASH_AnimationSourceList = LLMessageStringTable::getInstance()->getString("AnimationSourceList"); +char const* const _PREHASH_SubscribeLoad = LLMessageStringTable::getInstance()->getString("SubscribeLoad"); +char const* const _PREHASH_UnsubscribeLoad = LLMessageStringTable::getInstance()->getString("UnsubscribeLoad"); +char const* const _PREHASH_Packet = LLMessageStringTable::getInstance()->getString("Packet"); +char const* const _PREHASH_UndoLand = LLMessageStringTable::getInstance()->getString("UndoLand"); +char const* const _PREHASH_SimAccess = LLMessageStringTable::getInstance()->getString("SimAccess"); +char const* const _PREHASH_AbuserID = LLMessageStringTable::getInstance()->getString("AbuserID"); +char const* const _PREHASH_MembershipFee = LLMessageStringTable::getInstance()->getString("MembershipFee"); +char const* const _PREHASH_InviteGroupResponse = LLMessageStringTable::getInstance()->getString("InviteGroupResponse"); +char const* const _PREHASH_CreateInventoryFolder = LLMessageStringTable::getInstance()->getString("CreateInventoryFolder"); +char const* const _PREHASH_UpdateInventoryFolder = LLMessageStringTable::getInstance()->getString("UpdateInventoryFolder"); +char const* const _PREHASH_MoveInventoryFolder = LLMessageStringTable::getInstance()->getString("MoveInventoryFolder"); +char const* const _PREHASH_RemoveInventoryFolder = LLMessageStringTable::getInstance()->getString("RemoveInventoryFolder"); +char const* const _PREHASH_MoneyData = LLMessageStringTable::getInstance()->getString("MoneyData"); +char const* const _PREHASH_ObjectDeselect = LLMessageStringTable::getInstance()->getString("ObjectDeselect"); +char const* const _PREHASH_NewAssetID = LLMessageStringTable::getInstance()->getString("NewAssetID"); +char const* const _PREHASH_ObjectAdd = LLMessageStringTable::getInstance()->getString("ObjectAdd"); +char const* const _PREHASH_RayEndIsIntersection = LLMessageStringTable::getInstance()->getString("RayEndIsIntersection"); +char const* const _PREHASH_CompleteAuction = LLMessageStringTable::getInstance()->getString("CompleteAuction"); +char const* const _PREHASH_CircuitCode = LLMessageStringTable::getInstance()->getString("CircuitCode"); +char const* const _PREHASH_AgentMovementComplete = LLMessageStringTable::getInstance()->getString("AgentMovementComplete"); +char const* const _PREHASH_ViewerIP = LLMessageStringTable::getInstance()->getString("ViewerIP"); +char const* const _PREHASH_Header = LLMessageStringTable::getInstance()->getString("Header"); +char const* const _PREHASH_GestureFlags = LLMessageStringTable::getInstance()->getString("GestureFlags"); +char const* const _PREHASH_XferID = LLMessageStringTable::getInstance()->getString("XferID"); +char const* const _PREHASH_StatValue = LLMessageStringTable::getInstance()->getString("StatValue"); +char const* const _PREHASH_TaskID = LLMessageStringTable::getInstance()->getString("TaskID"); +char const* const _PREHASH_PickID = LLMessageStringTable::getInstance()->getString("PickID"); +char const* const _PREHASH_RayEnd = LLMessageStringTable::getInstance()->getString("RayEnd"); +char const* const _PREHASH_Throttles = LLMessageStringTable::getInstance()->getString("Throttles"); +char const* const _PREHASH_RebakeAvatarTextures = LLMessageStringTable::getInstance()->getString("RebakeAvatarTextures"); +char const* const _PREHASH_UpAxis = LLMessageStringTable::getInstance()->getString("UpAxis"); +char const* const _PREHASH_AgentTextures = LLMessageStringTable::getInstance()->getString("AgentTextures"); +char const* const _PREHASH_NotecardData = LLMessageStringTable::getInstance()->getString("NotecardData"); +char const* const _PREHASH_Radius = LLMessageStringTable::getInstance()->getString("Radius"); +char const* const _PREHASH_OffCircuit = LLMessageStringTable::getInstance()->getString("OffCircuit"); +char const* const _PREHASH_Access = LLMessageStringTable::getInstance()->getString("Access"); +char const* const _PREHASH_TitleRoleID = LLMessageStringTable::getInstance()->getString("TitleRoleID"); +char const* const _PREHASH_SquareMetersCredit = LLMessageStringTable::getInstance()->getString("SquareMetersCredit"); +char const* const _PREHASH_Filename = LLMessageStringTable::getInstance()->getString("Filename"); +char const* const _PREHASH_ClassifiedInfoRequest = LLMessageStringTable::getInstance()->getString("ClassifiedInfoRequest"); +char const* const _PREHASH_ParcelInfoRequest = LLMessageStringTable::getInstance()->getString("ParcelInfoRequest"); +char const* const _PREHASH_ParcelObjectOwnersRequest = LLMessageStringTable::getInstance()->getString("ParcelObjectOwnersRequest"); +char const* const _PREHASH_TeleportLandmarkRequest = LLMessageStringTable::getInstance()->getString("TeleportLandmarkRequest"); +char const* const _PREHASH_EventInfoRequest = LLMessageStringTable::getInstance()->getString("EventInfoRequest"); +char const* const _PREHASH_MoneyBalanceRequest = LLMessageStringTable::getInstance()->getString("MoneyBalanceRequest"); +char const* const _PREHASH_GroupMembersRequest = LLMessageStringTable::getInstance()->getString("GroupMembersRequest"); +char const* const _PREHASH_GroupRoleMembersRequest = LLMessageStringTable::getInstance()->getString("GroupRoleMembersRequest"); +char const* const _PREHASH_ChatFromSimulator = LLMessageStringTable::getInstance()->getString("ChatFromSimulator"); +char const* const _PREHASH_OldFolderID = LLMessageStringTable::getInstance()->getString("OldFolderID"); +char const* const _PREHASH_UserInfoRequest = LLMessageStringTable::getInstance()->getString("UserInfoRequest"); +char const* const _PREHASH_TextureID = LLMessageStringTable::getInstance()->getString("TextureID"); +char const* const _PREHASH_ProfileURL = LLMessageStringTable::getInstance()->getString("ProfileURL"); +char const* const _PREHASH_Handle = LLMessageStringTable::getInstance()->getString("Handle"); +char const* const _PREHASH_ButtonIndex = LLMessageStringTable::getInstance()->getString("ButtonIndex"); +char const* const _PREHASH_GetScriptRunning = LLMessageStringTable::getInstance()->getString("GetScriptRunning"); +char const* const _PREHASH_SetScriptRunning = LLMessageStringTable::getInstance()->getString("SetScriptRunning"); +char const* const _PREHASH_Health = LLMessageStringTable::getInstance()->getString("Health"); +char const* const _PREHASH_CircuitInfo = LLMessageStringTable::getInstance()->getString("CircuitInfo"); +char const* const _PREHASH_ObjectBuy = LLMessageStringTable::getInstance()->getString("ObjectBuy"); +char const* const _PREHASH_ProfileEnd = LLMessageStringTable::getInstance()->getString("ProfileEnd"); +char const* const _PREHASH_Effect = LLMessageStringTable::getInstance()->getString("Effect"); +char const* const _PREHASH_TestMessage = LLMessageStringTable::getInstance()->getString("TestMessage"); +char const* const _PREHASH_ScriptMailRegistration = LLMessageStringTable::getInstance()->getString("ScriptMailRegistration"); +char const* const _PREHASH_AgentSetAppearance = LLMessageStringTable::getInstance()->getString("AgentSetAppearance"); +char const* const _PREHASH_AvatarAppearance = LLMessageStringTable::getInstance()->getString("AvatarAppearance"); +char const* const _PREHASH_RegionData = LLMessageStringTable::getInstance()->getString("RegionData"); +char const* const _PREHASH_RequestingRegionData = LLMessageStringTable::getInstance()->getString("RequestingRegionData"); +char const* const _PREHASH_LandingRegionData = LLMessageStringTable::getInstance()->getString("LandingRegionData"); +char const* const _PREHASH_SitTransform = LLMessageStringTable::getInstance()->getString("SitTransform"); +char const* const _PREHASH_TerrainBase0 = LLMessageStringTable::getInstance()->getString("TerrainBase0"); +char const* const _PREHASH_SkillsMask = LLMessageStringTable::getInstance()->getString("SkillsMask"); +char const* const _PREHASH_AtAxis = LLMessageStringTable::getInstance()->getString("AtAxis"); +char const* const _PREHASH_TerrainBase1 = LLMessageStringTable::getInstance()->getString("TerrainBase1"); +char const* const _PREHASH_Reason = LLMessageStringTable::getInstance()->getString("Reason"); +char const* const _PREHASH_TerrainBase2 = LLMessageStringTable::getInstance()->getString("TerrainBase2"); +char const* const _PREHASH_TerrainBase3 = LLMessageStringTable::getInstance()->getString("TerrainBase3"); +char const* const _PREHASH_Params = LLMessageStringTable::getInstance()->getString("Params"); +char const* const _PREHASH_PingID = LLMessageStringTable::getInstance()->getString("PingID"); +char const* const _PREHASH_Change = LLMessageStringTable::getInstance()->getString("Change"); +char const* const _PREHASH_Height = LLMessageStringTable::getInstance()->getString("Height"); +char const* const _PREHASH_Region = LLMessageStringTable::getInstance()->getString("Region"); +char const* const _PREHASH_TelehubInfo = LLMessageStringTable::getInstance()->getString("TelehubInfo"); +char const* const _PREHASH_StateSave = LLMessageStringTable::getInstance()->getString("StateSave"); +char const* const _PREHASH_RoleData = LLMessageStringTable::getInstance()->getString("RoleData"); +char const* const _PREHASH_AgentAnimation = LLMessageStringTable::getInstance()->getString("AgentAnimation"); +char const* const _PREHASH_AvatarAnimation = LLMessageStringTable::getInstance()->getString("AvatarAnimation"); +char const* const _PREHASH_LogDwellTime = LLMessageStringTable::getInstance()->getString("LogDwellTime"); +char const* const _PREHASH_ParcelGodMarkAsContent = LLMessageStringTable::getInstance()->getString("ParcelGodMarkAsContent"); +char const* const _PREHASH_UsePhysics = LLMessageStringTable::getInstance()->getString("UsePhysics"); +char const* const _PREHASH_RegionDenyTransacted = LLMessageStringTable::getInstance()->getString("RegionDenyTransacted"); +char const* const _PREHASH_JointType = LLMessageStringTable::getInstance()->getString("JointType"); +char const* const _PREHASH_ObjectTaxEstimate = LLMessageStringTable::getInstance()->getString("ObjectTaxEstimate"); +char const* const _PREHASH_LightTaxEstimate = LLMessageStringTable::getInstance()->getString("LightTaxEstimate"); +char const* const _PREHASH_LandTaxEstimate = LLMessageStringTable::getInstance()->getString("LandTaxEstimate"); +char const* const _PREHASH_TeleportLandingStatusChanged = LLMessageStringTable::getInstance()->getString("TeleportLandingStatusChanged"); +char const* const _PREHASH_GroupTaxEstimate = LLMessageStringTable::getInstance()->getString("GroupTaxEstimate"); +char const* const _PREHASH_AvgViewerFPS = LLMessageStringTable::getInstance()->getString("AvgViewerFPS"); +char const* const _PREHASH_Buttons = LLMessageStringTable::getInstance()->getString("Buttons"); +char const* const _PREHASH_Sender = LLMessageStringTable::getInstance()->getString("Sender"); +char const* const _PREHASH_Dialog = LLMessageStringTable::getInstance()->getString("Dialog"); +char const* const _PREHASH_TargetData = LLMessageStringTable::getInstance()->getString("TargetData"); +char const* const _PREHASH_DestID = LLMessageStringTable::getInstance()->getString("DestID"); +char const* const _PREHASH_PricePublicObjectDelete = LLMessageStringTable::getInstance()->getString("PricePublicObjectDelete"); +char const* const _PREHASH_ObjectDelete = LLMessageStringTable::getInstance()->getString("ObjectDelete"); +char const* const _PREHASH_Delete = LLMessageStringTable::getInstance()->getString("Delete"); +char const* const _PREHASH_EventGodDelete = LLMessageStringTable::getInstance()->getString("EventGodDelete"); +char const* const _PREHASH_LastTaxDate = LLMessageStringTable::getInstance()->getString("LastTaxDate"); +char const* const _PREHASH_MapImageID = LLMessageStringTable::getInstance()->getString("MapImageID"); +char const* const _PREHASH_EndDateTime = LLMessageStringTable::getInstance()->getString("EndDateTime"); +char const* const _PREHASH_TerrainDetail0 = LLMessageStringTable::getInstance()->getString("TerrainDetail0"); +char const* const _PREHASH_TerrainDetail1 = LLMessageStringTable::getInstance()->getString("TerrainDetail1"); +char const* const _PREHASH_TerrainDetail2 = LLMessageStringTable::getInstance()->getString("TerrainDetail2"); +char const* const _PREHASH_TerrainDetail3 = LLMessageStringTable::getInstance()->getString("TerrainDetail3"); +char const* const _PREHASH_Offset = LLMessageStringTable::getInstance()->getString("Offset"); +char const* const _PREHASH_ObjectDelink = LLMessageStringTable::getInstance()->getString("ObjectDelink"); +char const* const _PREHASH_TargetObject = LLMessageStringTable::getInstance()->getString("TargetObject"); +char const* const _PREHASH_IsEstateManager = LLMessageStringTable::getInstance()->getString("IsEstateManager"); +char const* const _PREHASH_CancelAuction = LLMessageStringTable::getInstance()->getString("CancelAuction"); +char const* const _PREHASH_ObjectDetach = LLMessageStringTable::getInstance()->getString("ObjectDetach"); +char const* const _PREHASH_Compressed = LLMessageStringTable::getInstance()->getString("Compressed"); +char const* const _PREHASH_PathBegin = LLMessageStringTable::getInstance()->getString("PathBegin"); +char const* const _PREHASH_BypassRaycast = LLMessageStringTable::getInstance()->getString("BypassRaycast"); +char const* const _PREHASH_WinnerID = LLMessageStringTable::getInstance()->getString("WinnerID"); +char const* const _PREHASH_ChannelType = LLMessageStringTable::getInstance()->getString("ChannelType"); +char const* const _PREHASH_NonExemptMembers = LLMessageStringTable::getInstance()->getString("NonExemptMembers"); +char const* const _PREHASH_Agents = LLMessageStringTable::getInstance()->getString("Agents"); +char const* const _PREHASH_MemberData = LLMessageStringTable::getInstance()->getString("MemberData"); +char const* const _PREHASH_ToGroupID = LLMessageStringTable::getInstance()->getString("ToGroupID"); +char const* const _PREHASH_ImageNotInDatabase = LLMessageStringTable::getInstance()->getString("ImageNotInDatabase"); +char const* const _PREHASH_StartDate = LLMessageStringTable::getInstance()->getString("StartDate"); +char const* const _PREHASH_AnimID = LLMessageStringTable::getInstance()->getString("AnimID"); +char const* const _PREHASH_Serial = LLMessageStringTable::getInstance()->getString("Serial"); +char const* const _PREHASH_AbuseRegionName = LLMessageStringTable::getInstance()->getString("AbuseRegionName"); +char const* const _PREHASH_ModifyLand = LLMessageStringTable::getInstance()->getString("ModifyLand"); +char const* const _PREHASH_Digest = LLMessageStringTable::getInstance()->getString("Digest"); +char const* const _PREHASH_Victim = LLMessageStringTable::getInstance()->getString("Victim"); +char const* const _PREHASH_Script = LLMessageStringTable::getInstance()->getString("Script"); +char const* const _PREHASH_PickInfoReply = LLMessageStringTable::getInstance()->getString("PickInfoReply"); +char const* const _PREHASH_MoneyBalanceReply = LLMessageStringTable::getInstance()->getString("MoneyBalanceReply"); +char const* const _PREHASH_RoutedMoneyBalanceReply = LLMessageStringTable::getInstance()->getString("RoutedMoneyBalanceReply"); +char const* const _PREHASH_RoleID = LLMessageStringTable::getInstance()->getString("RoleID"); +char const* const _PREHASH_RegionInfo = LLMessageStringTable::getInstance()->getString("RegionInfo"); +char const* const _PREHASH_GodUpdateRegionInfo = LLMessageStringTable::getInstance()->getString("GodUpdateRegionInfo"); +char const* const _PREHASH_StartAnim = LLMessageStringTable::getInstance()->getString("StartAnim"); +char const* const _PREHASH_Action = LLMessageStringTable::getInstance()->getString("Action"); +char const* const _PREHASH_Location = LLMessageStringTable::getInstance()->getString("Location"); +char const* const _PREHASH_Rights = LLMessageStringTable::getInstance()->getString("Rights"); +char const* const _PREHASH_SearchDir = LLMessageStringTable::getInstance()->getString("SearchDir"); +char const* const _PREHASH_TransferRequest = LLMessageStringTable::getInstance()->getString("TransferRequest"); +char const* const _PREHASH_ScriptSensorRequest = LLMessageStringTable::getInstance()->getString("ScriptSensorRequest"); +char const* const _PREHASH_MoneyTransferRequest = LLMessageStringTable::getInstance()->getString("MoneyTransferRequest"); +char const* const _PREHASH_EjectGroupMemberRequest = LLMessageStringTable::getInstance()->getString("EjectGroupMemberRequest"); +char const* const _PREHASH_SkillsText = LLMessageStringTable::getInstance()->getString("SkillsText"); +char const* const _PREHASH_Resent = LLMessageStringTable::getInstance()->getString("Resent"); +char const* const _PREHASH_Center = LLMessageStringTable::getInstance()->getString("Center"); +char const* const _PREHASH_SharedData = LLMessageStringTable::getInstance()->getString("SharedData"); +char const* const _PREHASH_PSBlock = LLMessageStringTable::getInstance()->getString("PSBlock"); +char const* const _PREHASH_UUIDNameBlock = LLMessageStringTable::getInstance()->getString("UUIDNameBlock"); +char const* const _PREHASH_GroupTitleUpdate = LLMessageStringTable::getInstance()->getString("GroupTitleUpdate"); +char const* const _PREHASH_Method = LLMessageStringTable::getInstance()->getString("Method"); +char const* const _PREHASH_TouchName = LLMessageStringTable::getInstance()->getString("TouchName"); +char const* const _PREHASH_UpdateType = LLMessageStringTable::getInstance()->getString("UpdateType"); +char const* const _PREHASH_KickedFromEstateID = LLMessageStringTable::getInstance()->getString("KickedFromEstateID"); +char const* const _PREHASH_CandidateID = LLMessageStringTable::getInstance()->getString("CandidateID"); +char const* const _PREHASH_ParamData = LLMessageStringTable::getInstance()->getString("ParamData"); +char const* const _PREHASH_GodlikeMessage = LLMessageStringTable::getInstance()->getString("GodlikeMessage"); +char const* const _PREHASH_SystemMessage = LLMessageStringTable::getInstance()->getString("SystemMessage"); +char const* const _PREHASH_BodyRotation = LLMessageStringTable::getInstance()->getString("BodyRotation"); +char const* const _PREHASH_SearchRegions = LLMessageStringTable::getInstance()->getString("SearchRegions"); +char const* const _PREHASH_AnimationData = LLMessageStringTable::getInstance()->getString("AnimationData"); +char const* const _PREHASH_StatID = LLMessageStringTable::getInstance()->getString("StatID"); +char const* const _PREHASH_ItemID = LLMessageStringTable::getInstance()->getString("ItemID"); +char const* const _PREHASH_ScriptDialogReply = LLMessageStringTable::getInstance()->getString("ScriptDialogReply"); +char const* const _PREHASH_RegionIDAndHandleReply = LLMessageStringTable::getInstance()->getString("RegionIDAndHandleReply"); +char const* const _PREHASH_CameraAtOffset = LLMessageStringTable::getInstance()->getString("CameraAtOffset"); +char const* const _PREHASH_VoteID = LLMessageStringTable::getInstance()->getString("VoteID"); +char const* const _PREHASH_ParcelGodForceOwner = LLMessageStringTable::getInstance()->getString("ParcelGodForceOwner"); +char const* const _PREHASH_Filter = LLMessageStringTable::getInstance()->getString("Filter"); +char const* const _PREHASH_InviteData = LLMessageStringTable::getInstance()->getString("InviteData"); +char const* const _PREHASH_PCode = LLMessageStringTable::getInstance()->getString("PCode"); +char const* const _PREHASH_SearchPos = LLMessageStringTable::getInstance()->getString("SearchPos"); +char const* const _PREHASH_PreyID = LLMessageStringTable::getInstance()->getString("PreyID"); +char const* const _PREHASH_TerrainLowerLimit = LLMessageStringTable::getInstance()->getString("TerrainLowerLimit"); +char const* const _PREHASH_EventFlags = LLMessageStringTable::getInstance()->getString("EventFlags"); +char const* const _PREHASH_TallyVotes = LLMessageStringTable::getInstance()->getString("TallyVotes"); +char const* const _PREHASH_Result = LLMessageStringTable::getInstance()->getString("Result"); +char const* const _PREHASH_LookAt = LLMessageStringTable::getInstance()->getString("LookAt"); +char const* const _PREHASH_SearchOrder = LLMessageStringTable::getInstance()->getString("SearchOrder"); +char const* const _PREHASH_PayButton = LLMessageStringTable::getInstance()->getString("PayButton"); +char const* const _PREHASH_SelfCount = LLMessageStringTable::getInstance()->getString("SelfCount"); +char const* const _PREHASH_PacketCount = LLMessageStringTable::getInstance()->getString("PacketCount"); +char const* const _PREHASH_ParcelBuyPass = LLMessageStringTable::getInstance()->getString("ParcelBuyPass"); +char const* const _PREHASH_OldItemID = LLMessageStringTable::getInstance()->getString("OldItemID"); +char const* const _PREHASH_RegionPort = LLMessageStringTable::getInstance()->getString("RegionPort"); +char const* const _PREHASH_PriceEnergyUnit = LLMessageStringTable::getInstance()->getString("PriceEnergyUnit"); +char const* const _PREHASH_Bitmap = LLMessageStringTable::getInstance()->getString("Bitmap"); +char const* const _PREHASH_CacheMissType = LLMessageStringTable::getInstance()->getString("CacheMissType"); +char const* const _PREHASH_VFileID = LLMessageStringTable::getInstance()->getString("VFileID"); +char const* const _PREHASH_GroupInsigniaID = LLMessageStringTable::getInstance()->getString("GroupInsigniaID"); +char const* const _PREHASH_Online = LLMessageStringTable::getInstance()->getString("Online"); +char const* const _PREHASH_KickFlags = LLMessageStringTable::getInstance()->getString("KickFlags"); +char const* const _PREHASH_CovenantID = LLMessageStringTable::getInstance()->getString("CovenantID"); +char const* const _PREHASH_SysCPU = LLMessageStringTable::getInstance()->getString("SysCPU"); +char const* const _PREHASH_EMail = LLMessageStringTable::getInstance()->getString("EMail"); +char const* const _PREHASH_AggregatePermTextures = LLMessageStringTable::getInstance()->getString("AggregatePermTextures"); +char const* const _PREHASH_ChatChannel = LLMessageStringTable::getInstance()->getString("ChatChannel"); +char const* const _PREHASH_ReturnID = LLMessageStringTable::getInstance()->getString("ReturnID"); +char const* const _PREHASH_ObjectAttach = LLMessageStringTable::getInstance()->getString("ObjectAttach"); +char const* const _PREHASH_TargetPort = LLMessageStringTable::getInstance()->getString("TargetPort"); +char const* const _PREHASH_ObjectSpinStop = LLMessageStringTable::getInstance()->getString("ObjectSpinStop"); +char const* const _PREHASH_FullID = LLMessageStringTable::getInstance()->getString("FullID"); +char const* const _PREHASH_ActivateGroup = LLMessageStringTable::getInstance()->getString("ActivateGroup"); +char const* const _PREHASH_SysGPU = LLMessageStringTable::getInstance()->getString("SysGPU"); +char const* const _PREHASH_AvatarInterestsReply = LLMessageStringTable::getInstance()->getString("AvatarInterestsReply"); +char const* const _PREHASH_StartLure = LLMessageStringTable::getInstance()->getString("StartLure"); +char const* const _PREHASH_SysRAM = LLMessageStringTable::getInstance()->getString("SysRAM"); +char const* const _PREHASH_ObjectPosition = LLMessageStringTable::getInstance()->getString("ObjectPosition"); +char const* const _PREHASH_SitPosition = LLMessageStringTable::getInstance()->getString("SitPosition"); +char const* const _PREHASH_StartTime = LLMessageStringTable::getInstance()->getString("StartTime"); +char const* const _PREHASH_BornOn = LLMessageStringTable::getInstance()->getString("BornOn"); +char const* const _PREHASH_CameraCollidePlane = LLMessageStringTable::getInstance()->getString("CameraCollidePlane"); +char const* const _PREHASH_EconomyDataRequest = LLMessageStringTable::getInstance()->getString("EconomyDataRequest"); +char const* const _PREHASH_TeleportLureRequest = LLMessageStringTable::getInstance()->getString("TeleportLureRequest"); +char const* const _PREHASH_FolderID = LLMessageStringTable::getInstance()->getString("FolderID"); +char const* const _PREHASH_RegionHandleRequest = LLMessageStringTable::getInstance()->getString("RegionHandleRequest"); +char const* const _PREHASH_ScriptDataRequest = LLMessageStringTable::getInstance()->getString("ScriptDataRequest"); +char const* const _PREHASH_GroupRoleDataRequest = LLMessageStringTable::getInstance()->getString("GroupRoleDataRequest"); +char const* const _PREHASH_GroupTitlesRequest = LLMessageStringTable::getInstance()->getString("GroupTitlesRequest"); +char const* const _PREHASH_AgentWearablesRequest = LLMessageStringTable::getInstance()->getString("AgentWearablesRequest"); +char const* const _PREHASH_MapBlockRequest = LLMessageStringTable::getInstance()->getString("MapBlockRequest"); +char const* const _PREHASH_LureID = LLMessageStringTable::getInstance()->getString("LureID"); +char const* const _PREHASH_CopyCenters = LLMessageStringTable::getInstance()->getString("CopyCenters"); +char const* const _PREHASH_ParamList = LLMessageStringTable::getInstance()->getString("ParamList"); +char const* const _PREHASH_InventorySerial = LLMessageStringTable::getInstance()->getString("InventorySerial"); +char const* const _PREHASH_EdgeDataPacket = LLMessageStringTable::getInstance()->getString("EdgeDataPacket"); +char const* const _PREHASH_AvatarPickerReply = LLMessageStringTable::getInstance()->getString("AvatarPickerReply"); +char const* const _PREHASH_ParcelDwellReply = LLMessageStringTable::getInstance()->getString("ParcelDwellReply"); +char const* const _PREHASH_IsForSale = LLMessageStringTable::getInstance()->getString("IsForSale"); +char const* const _PREHASH_MuteID = LLMessageStringTable::getInstance()->getString("MuteID"); +char const* const _PREHASH_MeanCollisionAlert = LLMessageStringTable::getInstance()->getString("MeanCollisionAlert"); +char const* const _PREHASH_CanAcceptTasks = LLMessageStringTable::getInstance()->getString("CanAcceptTasks"); +char const* const _PREHASH_ItemData = LLMessageStringTable::getInstance()->getString("ItemData"); +char const* const _PREHASH_AnimationList = LLMessageStringTable::getInstance()->getString("AnimationList"); +char const* const _PREHASH_Reputation = LLMessageStringTable::getInstance()->getString("Reputation"); +char const* const _PREHASH_IntValue = LLMessageStringTable::getInstance()->getString("IntValue"); +char const* const _PREHASH_TargetType = LLMessageStringTable::getInstance()->getString("TargetType"); +char const* const _PREHASH_Amount = LLMessageStringTable::getInstance()->getString("Amount"); +char const* const _PREHASH_HasAttachment = LLMessageStringTable::getInstance()->getString("HasAttachment"); +char const* const _PREHASH_UpdateAttachment = LLMessageStringTable::getInstance()->getString("UpdateAttachment"); +char const* const _PREHASH_RemoveAttachment = LLMessageStringTable::getInstance()->getString("RemoveAttachment"); +char const* const _PREHASH_HeightWidthBlock = LLMessageStringTable::getInstance()->getString("HeightWidthBlock"); +char const* const _PREHASH_RequestObjectPropertiesFamily = LLMessageStringTable::getInstance()->getString("RequestObjectPropertiesFamily"); +char const* const _PREHASH_ObjectPropertiesFamily = LLMessageStringTable::getInstance()->getString("ObjectPropertiesFamily"); +char const* const _PREHASH_UserData = LLMessageStringTable::getInstance()->getString("UserData"); +char const* const _PREHASH_IsReadable = LLMessageStringTable::getInstance()->getString("IsReadable"); +char const* const _PREHASH_PathCurve = LLMessageStringTable::getInstance()->getString("PathCurve"); +char const* const _PREHASH_Status = LLMessageStringTable::getInstance()->getString("Status"); +char const* const _PREHASH_FromGroup = LLMessageStringTable::getInstance()->getString("FromGroup"); +char const* const _PREHASH_AlreadyVoted = LLMessageStringTable::getInstance()->getString("AlreadyVoted"); +char const* const _PREHASH_PlacesReply = LLMessageStringTable::getInstance()->getString("PlacesReply"); +char const* const _PREHASH_DirPlacesReply = LLMessageStringTable::getInstance()->getString("DirPlacesReply"); +char const* const _PREHASH_ParcelBuy = LLMessageStringTable::getInstance()->getString("ParcelBuy"); +char const* const _PREHASH_DirFindQueryBackend = LLMessageStringTable::getInstance()->getString("DirFindQueryBackend"); +char const* const _PREHASH_DirPlacesQueryBackend = LLMessageStringTable::getInstance()->getString("DirPlacesQueryBackend"); +char const* const _PREHASH_DirClassifiedQueryBackend = LLMessageStringTable::getInstance()->getString("DirClassifiedQueryBackend"); +char const* const _PREHASH_DirLandQueryBackend = LLMessageStringTable::getInstance()->getString("DirLandQueryBackend"); +char const* const _PREHASH_DirPopularQueryBackend = LLMessageStringTable::getInstance()->getString("DirPopularQueryBackend"); +char const* const _PREHASH_HistoryData = LLMessageStringTable::getInstance()->getString("HistoryData"); +char const* const _PREHASH_SnapshotID = LLMessageStringTable::getInstance()->getString("SnapshotID"); +char const* const _PREHASH_Aspect = LLMessageStringTable::getInstance()->getString("Aspect"); +char const* const _PREHASH_ParamSize = LLMessageStringTable::getInstance()->getString("ParamSize"); +char const* const _PREHASH_VoteCast = LLMessageStringTable::getInstance()->getString("VoteCast"); +char const* const _PREHASH_CastsShadows = LLMessageStringTable::getInstance()->getString("CastsShadows"); +char const* const _PREHASH_EveryoneMask = LLMessageStringTable::getInstance()->getString("EveryoneMask"); +char const* const _PREHASH_ObjectSpinUpdate = LLMessageStringTable::getInstance()->getString("ObjectSpinUpdate"); +char const* const _PREHASH_MaturePublish = LLMessageStringTable::getInstance()->getString("MaturePublish"); +char const* const _PREHASH_UseExistingAsset = LLMessageStringTable::getInstance()->getString("UseExistingAsset"); +char const* const _PREHASH_Powers = LLMessageStringTable::getInstance()->getString("Powers"); +char const* const _PREHASH_ParcelLocalID = LLMessageStringTable::getInstance()->getString("ParcelLocalID"); +char const* const _PREHASH_TeleportCancel = LLMessageStringTable::getInstance()->getString("TeleportCancel"); +char const* const _PREHASH_UnixTime = LLMessageStringTable::getInstance()->getString("UnixTime"); +char const* const _PREHASH_QueryFlags = LLMessageStringTable::getInstance()->getString("QueryFlags"); +char const* const _PREHASH_AlwaysRun = LLMessageStringTable::getInstance()->getString("AlwaysRun"); +char const* const _PREHASH_Bottom = LLMessageStringTable::getInstance()->getString("Bottom"); +char const* const _PREHASH_ButtonData = LLMessageStringTable::getInstance()->getString("ButtonData"); +char const* const _PREHASH_SoundData = LLMessageStringTable::getInstance()->getString("SoundData"); +char const* const _PREHASH_ViewerStats = LLMessageStringTable::getInstance()->getString("ViewerStats"); +char const* const _PREHASH_RegionHandshake = LLMessageStringTable::getInstance()->getString("RegionHandshake"); +char const* const _PREHASH_ObjectDescription = LLMessageStringTable::getInstance()->getString("ObjectDescription"); +char const* const _PREHASH_Description = LLMessageStringTable::getInstance()->getString("Description"); +char const* const _PREHASH_ParamType = LLMessageStringTable::getInstance()->getString("ParamType"); +char const* const _PREHASH_UUIDNameReply = LLMessageStringTable::getInstance()->getString("UUIDNameReply"); +char const* const _PREHASH_UUIDGroupNameReply = LLMessageStringTable::getInstance()->getString("UUIDGroupNameReply"); +char const* const _PREHASH_SaveAssetIntoInventory = LLMessageStringTable::getInstance()->getString("SaveAssetIntoInventory"); +char const* const _PREHASH_UserInfo = LLMessageStringTable::getInstance()->getString("UserInfo"); +char const* const _PREHASH_AnimSequenceID = LLMessageStringTable::getInstance()->getString("AnimSequenceID"); +char const* const _PREHASH_NVPairs = LLMessageStringTable::getInstance()->getString("NVPairs"); +char const* const _PREHASH_GroupNoticesListRequest = LLMessageStringTable::getInstance()->getString("GroupNoticesListRequest"); +char const* const _PREHASH_ParcelAccessListRequest = LLMessageStringTable::getInstance()->getString("ParcelAccessListRequest"); +char const* const _PREHASH_MuteListRequest = LLMessageStringTable::getInstance()->getString("MuteListRequest"); +char const* const _PREHASH_RpcChannelRequest = LLMessageStringTable::getInstance()->getString("RpcChannelRequest"); +char const* const _PREHASH_LandStatRequest = LLMessageStringTable::getInstance()->getString("LandStatRequest"); +char const* const _PREHASH_PlacesQuery = LLMessageStringTable::getInstance()->getString("PlacesQuery"); +char const* const _PREHASH_DirPlacesQuery = LLMessageStringTable::getInstance()->getString("DirPlacesQuery"); +char const* const _PREHASH_SortOrder = LLMessageStringTable::getInstance()->getString("SortOrder"); +char const* const _PREHASH_Hunter = LLMessageStringTable::getInstance()->getString("Hunter"); +char const* const _PREHASH_SunAngVelocity = LLMessageStringTable::getInstance()->getString("SunAngVelocity"); +char const* const _PREHASH_BinaryBucket = LLMessageStringTable::getInstance()->getString("BinaryBucket"); +char const* const _PREHASH_ImagePacket = LLMessageStringTable::getInstance()->getString("ImagePacket"); +char const* const _PREHASH_StartGroupProposal = LLMessageStringTable::getInstance()->getString("StartGroupProposal"); +char const* const _PREHASH_EnergyLevel = LLMessageStringTable::getInstance()->getString("EnergyLevel"); +char const* const _PREHASH_PriceForListing = LLMessageStringTable::getInstance()->getString("PriceForListing"); +char const* const _PREHASH_Scale = LLMessageStringTable::getInstance()->getString("Scale"); +char const* const _PREHASH_EstateCovenantReply = LLMessageStringTable::getInstance()->getString("EstateCovenantReply"); +char const* const _PREHASH_ParentEstateID = LLMessageStringTable::getInstance()->getString("ParentEstateID"); +char const* const _PREHASH_Extra2 = LLMessageStringTable::getInstance()->getString("Extra2"); +char const* const _PREHASH_Throttle = LLMessageStringTable::getInstance()->getString("Throttle"); +char const* const _PREHASH_SimIP = LLMessageStringTable::getInstance()->getString("SimIP"); +char const* const _PREHASH_GodID = LLMessageStringTable::getInstance()->getString("GodID"); +char const* const _PREHASH_TeleportMinPrice = LLMessageStringTable::getInstance()->getString("TeleportMinPrice"); +char const* const _PREHASH_VoteItem = LLMessageStringTable::getInstance()->getString("VoteItem"); +char const* const _PREHASH_ObjectRotation = LLMessageStringTable::getInstance()->getString("ObjectRotation"); +char const* const _PREHASH_SitRotation = LLMessageStringTable::getInstance()->getString("SitRotation"); +char const* const _PREHASH_SnapSelection = LLMessageStringTable::getInstance()->getString("SnapSelection"); +char const* const _PREHASH_SoundTrigger = LLMessageStringTable::getInstance()->getString("SoundTrigger"); +char const* const _PREHASH_TerrainRaiseLimit = LLMessageStringTable::getInstance()->getString("TerrainRaiseLimit"); +char const* const _PREHASH_Quorum = LLMessageStringTable::getInstance()->getString("Quorum"); +char const* const _PREHASH_AgentBlock = LLMessageStringTable::getInstance()->getString("AgentBlock"); +char const* const _PREHASH_CommandBlock = LLMessageStringTable::getInstance()->getString("CommandBlock"); +char const* const _PREHASH_PricePublicObjectDecay = LLMessageStringTable::getInstance()->getString("PricePublicObjectDecay"); +char const* const _PREHASH_SpawnPointPos = LLMessageStringTable::getInstance()->getString("SpawnPointPos"); +char const* const _PREHASH_VolumeDetail = LLMessageStringTable::getInstance()->getString("VolumeDetail"); +char const* const _PREHASH_FromAgentName = LLMessageStringTable::getInstance()->getString("FromAgentName"); +char const* const _PREHASH_Range = LLMessageStringTable::getInstance()->getString("Range"); +char const* const _PREHASH_DirectoryVisibility = LLMessageStringTable::getInstance()->getString("DirectoryVisibility"); +char const* const _PREHASH_PublicIP = LLMessageStringTable::getInstance()->getString("PublicIP"); +char const* const _PREHASH_TeleportFailed = LLMessageStringTable::getInstance()->getString("TeleportFailed"); +char const* const _PREHASH_PreloadSound = LLMessageStringTable::getInstance()->getString("PreloadSound"); +char const* const _PREHASH_ScreenshotID = LLMessageStringTable::getInstance()->getString("ScreenshotID"); +char const* const _PREHASH_CovenantTimestamp = LLMessageStringTable::getInstance()->getString("CovenantTimestamp"); +char const* const _PREHASH_OldestUnacked = LLMessageStringTable::getInstance()->getString("OldestUnacked"); +char const* const _PREHASH_SimulatorIP = LLMessageStringTable::getInstance()->getString("SimulatorIP"); +char const* const _PREHASH_Value = LLMessageStringTable::getInstance()->getString("Value"); +char const* const _PREHASH_JointAxisOrAnchor = LLMessageStringTable::getInstance()->getString("JointAxisOrAnchor"); +char const* const _PREHASH_Test0 = LLMessageStringTable::getInstance()->getString("Test0"); +char const* const _PREHASH_Test1 = LLMessageStringTable::getInstance()->getString("Test1"); +char const* const _PREHASH_Test2 = LLMessageStringTable::getInstance()->getString("Test2"); +char const* const _PREHASH_SunPhase = LLMessageStringTable::getInstance()->getString("SunPhase"); +char const* const _PREHASH_ParcelDivide = LLMessageStringTable::getInstance()->getString("ParcelDivide"); +char const* const _PREHASH_PriceObjectClaim = LLMessageStringTable::getInstance()->getString("PriceObjectClaim"); +char const* const _PREHASH_Field = LLMessageStringTable::getInstance()->getString("Field"); +char const* const _PREHASH_Ratio = LLMessageStringTable::getInstance()->getString("Ratio"); +char const* const _PREHASH_JoinGroupReply = LLMessageStringTable::getInstance()->getString("JoinGroupReply"); +char const* const _PREHASH_LiveHelpGroupReply = LLMessageStringTable::getInstance()->getString("LiveHelpGroupReply"); +char const* const _PREHASH_Score = LLMessageStringTable::getInstance()->getString("Score"); +char const* const _PREHASH_Image = LLMessageStringTable::getInstance()->getString("Image"); +char const* const _PREHASH_ObjectClickAction = LLMessageStringTable::getInstance()->getString("ObjectClickAction"); +char const* const _PREHASH_Parameter = LLMessageStringTable::getInstance()->getString("Parameter"); +char const* const _PREHASH_Flags = LLMessageStringTable::getInstance()->getString("Flags"); +char const* const _PREHASH_Plane = LLMessageStringTable::getInstance()->getString("Plane"); +char const* const _PREHASH_Width = LLMessageStringTable::getInstance()->getString("Width"); +char const* const _PREHASH_Right = LLMessageStringTable::getInstance()->getString("Right"); +char const* const _PREHASH_DirFindQuery = LLMessageStringTable::getInstance()->getString("DirFindQuery"); +char const* const _PREHASH_Textures = LLMessageStringTable::getInstance()->getString("Textures"); +char const* const _PREHASH_EventData = LLMessageStringTable::getInstance()->getString("EventData"); +char const* const _PREHASH_Final = LLMessageStringTable::getInstance()->getString("Final"); +char const* const _PREHASH_System = LLMessageStringTable::getInstance()->getString("System"); +char const* const _PREHASH_TelehubPos = LLMessageStringTable::getInstance()->getString("TelehubPos"); +char const* const _PREHASH_ReportAutosaveCrash = LLMessageStringTable::getInstance()->getString("ReportAutosaveCrash"); +char const* const _PREHASH_CreateTrustedCircuit = LLMessageStringTable::getInstance()->getString("CreateTrustedCircuit"); +char const* const _PREHASH_DenyTrustedCircuit = LLMessageStringTable::getInstance()->getString("DenyTrustedCircuit"); +char const* const _PREHASH_RequestTrustedCircuit = LLMessageStringTable::getInstance()->getString("RequestTrustedCircuit"); +char const* const _PREHASH_Codec = LLMessageStringTable::getInstance()->getString("Codec"); +char const* const _PREHASH_Modal = LLMessageStringTable::getInstance()->getString("Modal"); +char const* const _PREHASH_ChildAgentUnknown = LLMessageStringTable::getInstance()->getString("ChildAgentUnknown"); +char const* const _PREHASH_LandingType = LLMessageStringTable::getInstance()->getString("LandingType"); +char const* const _PREHASH_ScriptRunningReply = LLMessageStringTable::getInstance()->getString("ScriptRunningReply"); +char const* const _PREHASH_Reply = LLMessageStringTable::getInstance()->getString("Reply"); +char const* const _PREHASH_GroupAccountDetailsReply = LLMessageStringTable::getInstance()->getString("GroupAccountDetailsReply"); +char const* const _PREHASH_TelehubRot = LLMessageStringTable::getInstance()->getString("TelehubRot"); +char const* const _PREHASH_AcceptFriendship = LLMessageStringTable::getInstance()->getString("AcceptFriendship"); +char const* const _PREHASH_ItemType = LLMessageStringTable::getInstance()->getString("ItemType"); +char const* const _PREHASH_DwellInfo = LLMessageStringTable::getInstance()->getString("DwellInfo"); +char const* const _PREHASH_AgentResume = LLMessageStringTable::getInstance()->getString("AgentResume"); +char const* const _PREHASH_MailFilter = LLMessageStringTable::getInstance()->getString("MailFilter"); +char const* const _PREHASH_Disconnect = LLMessageStringTable::getInstance()->getString("Disconnect"); +char const* const _PREHASH_SimPosition = LLMessageStringTable::getInstance()->getString("SimPosition"); +char const* const _PREHASH_SimWideTotalPrims = LLMessageStringTable::getInstance()->getString("SimWideTotalPrims"); +char const* const _PREHASH_Index = LLMessageStringTable::getInstance()->getString("Index"); +char const* const _PREHASH_SimFilename = LLMessageStringTable::getInstance()->getString("SimFilename"); +char const* const _PREHASH_LastOwnerID = LLMessageStringTable::getInstance()->getString("LastOwnerID"); +char const* const _PREHASH_GroupNoticeRequest = LLMessageStringTable::getInstance()->getString("GroupNoticeRequest"); +char const* const _PREHASH_EmailMessageRequest = LLMessageStringTable::getInstance()->getString("EmailMessageRequest"); +char const* const _PREHASH_MapItemRequest = LLMessageStringTable::getInstance()->getString("MapItemRequest"); +char const* const _PREHASH_AgentCount = LLMessageStringTable::getInstance()->getString("AgentCount"); +char const* const _PREHASH_MessageBlock = LLMessageStringTable::getInstance()->getString("MessageBlock"); +char const* const _PREHASH_FuseBlock = LLMessageStringTable::getInstance()->getString("FuseBlock"); +char const* const _PREHASH_AgentGroupData = LLMessageStringTable::getInstance()->getString("AgentGroupData"); +char const* const _PREHASH_ClassifiedInfoUpdate = LLMessageStringTable::getInstance()->getString("ClassifiedInfoUpdate"); +char const* const _PREHASH_RegionPos = LLMessageStringTable::getInstance()->getString("RegionPos"); +char const* const _PREHASH_ParcelMediaUpdate = LLMessageStringTable::getInstance()->getString("ParcelMediaUpdate"); +char const* const _PREHASH_NoticeID = LLMessageStringTable::getInstance()->getString("NoticeID"); +char const* const _PREHASH_GridX = LLMessageStringTable::getInstance()->getString("GridX"); +char const* const _PREHASH_GridY = LLMessageStringTable::getInstance()->getString("GridY"); +char const* const _PREHASH_Title = LLMessageStringTable::getInstance()->getString("Title"); +char const* const _PREHASH_AuctionID = LLMessageStringTable::getInstance()->getString("AuctionID"); +char const* const _PREHASH_VoteType = LLMessageStringTable::getInstance()->getString("VoteType"); +char const* const _PREHASH_CategoryID = LLMessageStringTable::getInstance()->getString("CategoryID"); +char const* const _PREHASH_Token = LLMessageStringTable::getInstance()->getString("Token"); +char const* const _PREHASH_AggregatePerms = LLMessageStringTable::getInstance()->getString("AggregatePerms"); +char const* const _PREHASH_ObjectSelect = LLMessageStringTable::getInstance()->getString("ObjectSelect"); +char const* const _PREHASH_ForceObjectSelect = LLMessageStringTable::getInstance()->getString("ForceObjectSelect"); +char const* const _PREHASH_Price = LLMessageStringTable::getInstance()->getString("Price"); +char const* const _PREHASH_SunDirection = LLMessageStringTable::getInstance()->getString("SunDirection"); +char const* const _PREHASH_FromName = LLMessageStringTable::getInstance()->getString("FromName"); +char const* const _PREHASH_ChangeInventoryItemFlags = LLMessageStringTable::getInstance()->getString("ChangLLInventoryItemFlags"); +char const* const _PREHASH_Force = LLMessageStringTable::getInstance()->getString("Force"); +char const* const _PREHASH_TransactionBlock = LLMessageStringTable::getInstance()->getString("TransactionBlock"); +char const* const _PREHASH_PowersMask = LLMessageStringTable::getInstance()->getString("PowersMask"); +char const* const _PREHASH_Stamp = LLMessageStringTable::getInstance()->getString("Stamp"); +char const* const _PREHASH_TotalCredits = LLMessageStringTable::getInstance()->getString("TotalCredits"); +char const* const _PREHASH_State = LLMessageStringTable::getInstance()->getString("State"); +char const* const _PREHASH_TextureIndex = LLMessageStringTable::getInstance()->getString("TextureIndex"); +char const* const _PREHASH_InviteeID = LLMessageStringTable::getInstance()->getString("InviteeID"); +char const* const _PREHASH_ParcelReclaim = LLMessageStringTable::getInstance()->getString("ParcelReclaim"); +char const* const _PREHASH_Money = LLMessageStringTable::getInstance()->getString("Money"); +char const* const _PREHASH_PathTwist = LLMessageStringTable::getInstance()->getString("PathTwist"); +char const* const _PREHASH_AuthBuyerID = LLMessageStringTable::getInstance()->getString("AuthBuyerID"); +char const* const _PREHASH_Color = LLMessageStringTable::getInstance()->getString("Color"); +char const* const _PREHASH_SourceType = LLMessageStringTable::getInstance()->getString("SourceType"); +char const* const _PREHASH_World = LLMessageStringTable::getInstance()->getString("World"); +char const* const _PREHASH_QueryData = LLMessageStringTable::getInstance()->getString("QueryData"); +char const* const _PREHASH_Users = LLMessageStringTable::getInstance()->getString("Users"); +char const* const _PREHASH_SysOS = LLMessageStringTable::getInstance()->getString("SysOS"); +char const* const _PREHASH_Notes = LLMessageStringTable::getInstance()->getString("Notes"); +char const* const _PREHASH_AvatarID = LLMessageStringTable::getInstance()->getString("AvatarID"); +char const* const _PREHASH_FounderID = LLMessageStringTable::getInstance()->getString("FounderID"); +char const* const _PREHASH_EndPointID = LLMessageStringTable::getInstance()->getString("EndPointID"); +char const* const _PREHASH_LocationLookAt = LLMessageStringTable::getInstance()->getString("LocationLookAt"); +char const* const _PREHASH_Sound = LLMessageStringTable::getInstance()->getString("Sound"); +char const* const _PREHASH_Cover = LLMessageStringTable::getInstance()->getString("Cover"); +char const* const _PREHASH_TotalObjectCount = LLMessageStringTable::getInstance()->getString("TotalObjectCount"); +char const* const _PREHASH_TextureEntry = LLMessageStringTable::getInstance()->getString("TextureEntry"); +char const* const _PREHASH_SquareMetersCommitted = LLMessageStringTable::getInstance()->getString("SquareMetersCommitted"); +char const* const _PREHASH_ChannelID = LLMessageStringTable::getInstance()->getString("ChannelID"); +char const* const _PREHASH_Dwell = LLMessageStringTable::getInstance()->getString("Dwell"); +char const* const _PREHASH_North = LLMessageStringTable::getInstance()->getString("North"); +char const* const _PREHASH_AgentUpdate = LLMessageStringTable::getInstance()->getString("AgentUpdate"); +char const* const _PREHASH_PickGodDelete = LLMessageStringTable::getInstance()->getString("PickGodDelete"); +char const* const _PREHASH_HostName = LLMessageStringTable::getInstance()->getString("HostName"); +char const* const _PREHASH_PriceParcelClaim = LLMessageStringTable::getInstance()->getString("PriceParcelClaim"); +char const* const _PREHASH_ParcelClaim = LLMessageStringTable::getInstance()->getString("ParcelClaim"); +char const* const _PREHASH_AgentPowers = LLMessageStringTable::getInstance()->getString("AgentPowers"); +char const* const _PREHASH_ProfileHollow = LLMessageStringTable::getInstance()->getString("ProfileHollow"); +char const* const _PREHASH_GroupRoleChanges = LLMessageStringTable::getInstance()->getString("GroupRoleChanges"); +char const* const _PREHASH_Count = LLMessageStringTable::getInstance()->getString("Count"); +char const* const _PREHASH_South = LLMessageStringTable::getInstance()->getString("South"); +char const* const _PREHASH_ObjectUpdateCompressed = LLMessageStringTable::getInstance()->getString("ObjectUpdateCompressed"); +char const* const _PREHASH_MuteFlags = LLMessageStringTable::getInstance()->getString("MuteFlags"); +char const* const _PREHASH_Group = LLMessageStringTable::getInstance()->getString("Group"); +char const* const _PREHASH_AgentPause = LLMessageStringTable::getInstance()->getString("AgentPause"); +char const* const _PREHASH_LanguagesText = LLMessageStringTable::getInstance()->getString("LanguagesText"); +char const* const _PREHASH_Error = LLMessageStringTable::getInstance()->getString("Error"); +char const* const _PREHASH_InternalScriptMail = LLMessageStringTable::getInstance()->getString("InternalScriptMail"); +char const* const _PREHASH_FindAgent = LLMessageStringTable::getInstance()->getString("FindAgent"); +char const* const _PREHASH_AgentData = LLMessageStringTable::getInstance()->getString("AgentData"); +char const* const _PREHASH_FolderData = LLMessageStringTable::getInstance()->getString("FolderData"); +char const* const _PREHASH_AssetBlock = LLMessageStringTable::getInstance()->getString("AssetBlock"); +char const* const _PREHASH_AcceptNotices = LLMessageStringTable::getInstance()->getString("AcceptNotices"); +char const* const _PREHASH_SetGroupAcceptNotices = LLMessageStringTable::getInstance()->getString("SetGroupAcceptNotices"); +char const* const _PREHASH_CloseCircuit = LLMessageStringTable::getInstance()->getString("CloseCircuit"); +char const* const _PREHASH_TeleportFinish = LLMessageStringTable::getInstance()->getString("TeleportFinish"); +char const* const _PREHASH_PathRevolutions = LLMessageStringTable::getInstance()->getString("PathRevolutions"); +char const* const _PREHASH_ClassifiedInfoReply = LLMessageStringTable::getInstance()->getString("ClassifiedInfoReply"); +char const* const _PREHASH_ParcelInfoReply = LLMessageStringTable::getInstance()->getString("ParcelInfoReply"); +char const* const _PREHASH_AutosaveData = LLMessageStringTable::getInstance()->getString("AutosaveData"); +char const* const _PREHASH_SetStartLocation = LLMessageStringTable::getInstance()->getString("SetStartLocation"); +char const* const _PREHASH_PassHours = LLMessageStringTable::getInstance()->getString("PassHours"); +char const* const _PREHASH_AttachmentPt = LLMessageStringTable::getInstance()->getString("AttachmentPt"); +char const* const _PREHASH_ParcelFlags = LLMessageStringTable::getInstance()->getString("ParcelFlags"); +char const* const _PREHASH_NumVotes = LLMessageStringTable::getInstance()->getString("NumVotes"); +char const* const _PREHASH_AvatarPickerRequest = LLMessageStringTable::getInstance()->getString("AvatarPickerRequest"); +char const* const _PREHASH_TeleportLocationRequest = LLMessageStringTable::getInstance()->getString("TeleportLocationRequest"); +char const* const _PREHASH_DataHomeLocationRequest = LLMessageStringTable::getInstance()->getString("DataHomeLocationRequest"); +char const* const _PREHASH_EventNotificationAddRequest = LLMessageStringTable::getInstance()->getString("EventNotificationAddRequest"); +char const* const _PREHASH_ParcelDwellRequest = LLMessageStringTable::getInstance()->getString("ParcelDwellRequest"); +char const* const _PREHASH_EventLocationRequest = LLMessageStringTable::getInstance()->getString("EventLocationRequest"); +char const* const _PREHASH_SetStartLocationRequest = LLMessageStringTable::getInstance()->getString("SetStartLocationRequest"); +char const* const _PREHASH_QueryStart = LLMessageStringTable::getInstance()->getString("QueryStart"); +char const* const _PREHASH_EjectData = LLMessageStringTable::getInstance()->getString("EjectData"); +char const* const _PREHASH_AvatarTextureUpdate = LLMessageStringTable::getInstance()->getString("AvatarTextureUpdate"); +char const* const _PREHASH_RPCServerPort = LLMessageStringTable::getInstance()->getString("RPCServerPort"); +char const* const _PREHASH_Bytes = LLMessageStringTable::getInstance()->getString("Bytes"); +char const* const _PREHASH_Extra = LLMessageStringTable::getInstance()->getString("Extra"); +char const* const _PREHASH_ForceScriptControlRelease = LLMessageStringTable::getInstance()->getString("ForceScriptControlRelease"); +char const* const _PREHASH_ParcelRelease = LLMessageStringTable::getInstance()->getString("ParcelRelease"); +char const* const _PREHASH_VFileType = LLMessageStringTable::getInstance()->getString("VFileType"); +char const* const _PREHASH_EjectGroupMemberReply = LLMessageStringTable::getInstance()->getString("EjectGroupMemberReply"); +char const* const _PREHASH_ImageData = LLMessageStringTable::getInstance()->getString("ImageData"); +char const* const _PREHASH_SimulatorViewerTimeMessage = LLMessageStringTable::getInstance()->getString("SimulatorViewerTimeMessage"); +char const* const _PREHASH_Rotation = LLMessageStringTable::getInstance()->getString("Rotation"); +char const* const _PREHASH_Selection = LLMessageStringTable::getInstance()->getString("Selection"); +char const* const _PREHASH_TransactionData = LLMessageStringTable::getInstance()->getString("TransactionData"); +char const* const _PREHASH_OperationData = LLMessageStringTable::getInstance()->getString("OperationData"); +char const* const _PREHASH_ExpirationDate = LLMessageStringTable::getInstance()->getString("ExpirationDate"); +char const* const _PREHASH_ParcelDeedToGroup = LLMessageStringTable::getInstance()->getString("ParcelDeedToGroup"); +char const* const _PREHASH_AvatarPicksReply = LLMessageStringTable::getInstance()->getString("AvatarPicksReply"); +char const* const _PREHASH_GroupTitlesReply = LLMessageStringTable::getInstance()->getString("GroupTitlesReply"); +char const* const _PREHASH_AgentInfo = LLMessageStringTable::getInstance()->getString("AgentInfo"); +char const* const _PREHASH_MoneyTransferBackend = LLMessageStringTable::getInstance()->getString("MoneyTransferBackend"); +char const* const _PREHASH_NextOwnerMask = LLMessageStringTable::getInstance()->getString("NextOwnerMask"); +char const* const _PREHASH_MuteData = LLMessageStringTable::getInstance()->getString("MuteData"); +char const* const _PREHASH_PassPrice = LLMessageStringTable::getInstance()->getString("PassPrice"); +char const* const _PREHASH_SourceID = LLMessageStringTable::getInstance()->getString("SourceID"); +char const* const _PREHASH_ChangeUserRights = LLMessageStringTable::getInstance()->getString("ChangeUserRights"); +char const* const _PREHASH_TeleportFlags = LLMessageStringTable::getInstance()->getString("TeleportFlags"); +char const* const _PREHASH_SlaveParcelData = LLMessageStringTable::getInstance()->getString("SlaveParcelData"); +char const* const _PREHASH_AssetData = LLMessageStringTable::getInstance()->getString("AssetData"); +char const* const _PREHASH_MultipleObjectUpdate = LLMessageStringTable::getInstance()->getString("MultipleObjectUpdate"); +char const* const _PREHASH_ObjectUpdate = LLMessageStringTable::getInstance()->getString("ObjectUpdate"); +char const* const _PREHASH_ImprovedTerseObjectUpdate = LLMessageStringTable::getInstance()->getString("ImprovedTerseObjectUpdate"); +char const* const _PREHASH_ConfirmXferPacket = LLMessageStringTable::getInstance()->getString("ConfirmXferPacket"); +char const* const _PREHASH_StartPingCheck = LLMessageStringTable::getInstance()->getString("StartPingCheck"); +char const* const _PREHASH_SimWideDeletes = LLMessageStringTable::getInstance()->getString("SimWideDeletes"); +char const* const _PREHASH_LandStatReply = LLMessageStringTable::getInstance()->getString("LandStatReply"); +char const* const _PREHASH_IsPhantom = LLMessageStringTable::getInstance()->getString("IsPhantom"); +char const* const _PREHASH_AgentList = LLMessageStringTable::getInstance()->getString("AgentList"); +char const* const _PREHASH_SimApproved = LLMessageStringTable::getInstance()->getString("SimApproved"); +char const* const _PREHASH_RezObject = LLMessageStringTable::getInstance()->getString("RezObject"); +char const* const _PREHASH_TaskLocalID = LLMessageStringTable::getInstance()->getString("TaskLocalID"); +char const* const _PREHASH_ClaimDate = LLMessageStringTable::getInstance()->getString("ClaimDate"); +char const* const _PREHASH_MergeParcel = LLMessageStringTable::getInstance()->getString("MergeParcel"); +char const* const _PREHASH_Priority = LLMessageStringTable::getInstance()->getString("Priority"); +char const* const _PREHASH_QueryText = LLMessageStringTable::getInstance()->getString("QueryText"); +char const* const _PREHASH_GroupNoticeAdd = LLMessageStringTable::getInstance()->getString("GroupNoticeAdd"); +char const* const _PREHASH_ReturnType = LLMessageStringTable::getInstance()->getString("ReturnType"); +char const* const _PREHASH_FetchFolders = LLMessageStringTable::getInstance()->getString("FetchFolders"); +char const* const _PREHASH_SimulatorPublicHostBlock = LLMessageStringTable::getInstance()->getString("SimulatorPublicHostBlock"); +char const* const _PREHASH_HeaderData = LLMessageStringTable::getInstance()->getString("HeaderData"); +char const* const _PREHASH_RequestMultipleObjects = LLMessageStringTable::getInstance()->getString("RequestMultipleObjects"); +char const* const _PREHASH_RetrieveInstantMessages = LLMessageStringTable::getInstance()->getString("RetrieveInstantMessages"); +char const* const _PREHASH_OpenCircuit = LLMessageStringTable::getInstance()->getString("OpenCircuit"); +char const* const _PREHASH_CrossedRegion = LLMessageStringTable::getInstance()->getString("CrossedRegion"); +char const* const _PREHASH_DirGroupsReply = LLMessageStringTable::getInstance()->getString("DirGroupsReply"); +char const* const _PREHASH_AvatarGroupsReply = LLMessageStringTable::getInstance()->getString("AvatarGroupsReply"); +char const* const _PREHASH_EmailMessageReply = LLMessageStringTable::getInstance()->getString("EmailMessageReply"); +char const* const _PREHASH_GroupVoteHistoryItemReply = LLMessageStringTable::getInstance()->getString("GroupVoteHistoryItemReply"); +char const* const _PREHASH_ViewerPosition = LLMessageStringTable::getInstance()->getString("ViewerPosition"); +char const* const _PREHASH_Position = LLMessageStringTable::getInstance()->getString("Position"); +char const* const _PREHASH_ParentEstate = LLMessageStringTable::getInstance()->getString("ParentEstate"); +char const* const _PREHASH_EstateName = LLMessageStringTable::getInstance()->getString("EstateName"); +char const* const _PREHASH_MuteName = LLMessageStringTable::getInstance()->getString("MuteName"); +char const* const _PREHASH_ParcelRename = LLMessageStringTable::getInstance()->getString("ParcelRename"); +char const* const _PREHASH_ViewerFilename = LLMessageStringTable::getInstance()->getString("ViewerFilename"); +char const* const _PREHASH_UserReportInternal = LLMessageStringTable::getInstance()->getString("UserReportInternal"); +char const* const _PREHASH_AvatarPropertiesRequest = LLMessageStringTable::getInstance()->getString("AvatarPropertiesRequest"); +char const* const _PREHASH_ParcelPropertiesRequest = LLMessageStringTable::getInstance()->getString("ParcelPropertiesRequest"); +char const* const _PREHASH_GroupProfileRequest = LLMessageStringTable::getInstance()->getString("GroupProfileRequest"); +char const* const _PREHASH_AgentDataUpdateRequest = LLMessageStringTable::getInstance()->getString("AgentDataUpdateRequest"); +char const* const _PREHASH_PriceObjectScaleFactor = LLMessageStringTable::getInstance()->getString("PriceObjectScaleFactor"); +char const* const _PREHASH_OpenEnrollment = LLMessageStringTable::getInstance()->getString("OpenEnrollment"); +char const* const _PREHASH_GroupData = LLMessageStringTable::getInstance()->getString("GroupData"); +char const* const _PREHASH_RequestGodlikePowers = LLMessageStringTable::getInstance()->getString("RequestGodlikePowers"); +char const* const _PREHASH_GrantGodlikePowers = LLMessageStringTable::getInstance()->getString("GrantGodlikePowers"); +char const* const _PREHASH_TransactionID = LLMessageStringTable::getInstance()->getString("TransactionID"); +char const* const _PREHASH_DestinationID = LLMessageStringTable::getInstance()->getString("DestinationID"); +char const* const _PREHASH_Controls = LLMessageStringTable::getInstance()->getString("Controls"); +char const* const _PREHASH_FirstDetachAll = LLMessageStringTable::getInstance()->getString("FirstDetachAll"); +char const* const _PREHASH_EstateID = LLMessageStringTable::getInstance()->getString("EstateID"); +char const* const _PREHASH_ImprovedInstantMessage = LLMessageStringTable::getInstance()->getString("ImprovedInstantMessage"); +char const* const _PREHASH_CheckParcelSales = LLMessageStringTable::getInstance()->getString("CheckParcelSales"); +char const* const _PREHASH_ParcelSales = LLMessageStringTable::getInstance()->getString("ParcelSales"); +char const* const _PREHASH_CurrentInterval = LLMessageStringTable::getInstance()->getString("CurrentInterval"); +char const* const _PREHASH_PriceRentLight = LLMessageStringTable::getInstance()->getString("PriceRentLight"); +char const* const _PREHASH_MediaAutoScale = LLMessageStringTable::getInstance()->getString("MediaAutoScale"); +char const* const _PREHASH_NeighborBlock = LLMessageStringTable::getInstance()->getString("NeighborBlock"); +char const* const _PREHASH_LayerData = LLMessageStringTable::getInstance()->getString("LayerData"); +char const* const _PREHASH_NVPairData = LLMessageStringTable::getInstance()->getString("NVPairData"); +char const* const _PREHASH_TeleportLocal = LLMessageStringTable::getInstance()->getString("TeleportLocal"); +char const* const _PREHASH_EjecteeID = LLMessageStringTable::getInstance()->getString("EjecteeID"); +char const* const _PREHASH_VoteInitiator = LLMessageStringTable::getInstance()->getString("VoteInitiator"); +char const* const _PREHASH_TypeData = LLMessageStringTable::getInstance()->getString("TypeData"); +char const* const _PREHASH_OwnerIDs = LLMessageStringTable::getInstance()->getString("OwnerIDs"); +char const* const _PREHASH_SystemKickUser = LLMessageStringTable::getInstance()->getString("SystemKickUser"); +char const* const _PREHASH_TransactionTime = LLMessageStringTable::getInstance()->getString("TransactionTime"); +char const* const _PREHASH_TimeToLive = LLMessageStringTable::getInstance()->getString("TimeToLive"); +char const* const _PREHASH_OldAgentID = LLMessageStringTable::getInstance()->getString("OldAgentID"); +char const* const _PREHASH_MusicURL = LLMessageStringTable::getInstance()->getString("MusicURL"); +char const* const _PREHASH_ParcelPrimBonus = LLMessageStringTable::getInstance()->getString("ParcelPrimBonus"); +char const* const _PREHASH_EjectUser = LLMessageStringTable::getInstance()->getString("EjectUser"); +char const* const _PREHASH_CoarseLocationUpdate = LLMessageStringTable::getInstance()->getString("CoarseLocationUpdate"); +char const* const _PREHASH_ChildAgentPositionUpdate = LLMessageStringTable::getInstance()->getString("ChildAgentPositionUpdate"); +char const* const _PREHASH_StoreLocal = LLMessageStringTable::getInstance()->getString("StoreLocal"); +char const* const _PREHASH_GroupName = LLMessageStringTable::getInstance()->getString("GroupName"); +char const* const _PREHASH_PriceParcelRent = LLMessageStringTable::getInstance()->getString("PriceParcelRent"); +char const* const _PREHASH_SimStatus = LLMessageStringTable::getInstance()->getString("SimStatus"); +char const* const _PREHASH_TransactionSuccess = LLMessageStringTable::getInstance()->getString("TransactionSuccess"); +char const* const _PREHASH_LureType = LLMessageStringTable::getInstance()->getString("LureType"); +char const* const _PREHASH_GroupMask = LLMessageStringTable::getInstance()->getString("GroupMask"); +char const* const _PREHASH_SitObject = LLMessageStringTable::getInstance()->getString("SitObject"); +char const* const _PREHASH_Override = LLMessageStringTable::getInstance()->getString("Override"); +char const* const _PREHASH_LocomotionState = LLMessageStringTable::getInstance()->getString("LocomotionState"); +char const* const _PREHASH_PriceUpload = LLMessageStringTable::getInstance()->getString("PriceUpload"); +char const* const _PREHASH_RemoveParcel = LLMessageStringTable::getInstance()->getString("RemoveParcel"); +char const* const _PREHASH_ConfirmAuctionStart = LLMessageStringTable::getInstance()->getString("ConfirmAuctionStart"); +char const* const _PREHASH_RpcScriptRequestInbound = LLMessageStringTable::getInstance()->getString("RpcScriptRequestInbound"); +char const* const _PREHASH_ActiveGroupID = LLMessageStringTable::getInstance()->getString("ActiveGroupID"); +char const* const _PREHASH_ParcelReturnObjects = LLMessageStringTable::getInstance()->getString("ParcelReturnObjects"); +char const* const _PREHASH_TotalObjects = LLMessageStringTable::getInstance()->getString("TotalObjects"); +char const* const _PREHASH_ObjectExtraParams = LLMessageStringTable::getInstance()->getString("ObjectExtraParams"); +char const* const _PREHASH_Questions = LLMessageStringTable::getInstance()->getString("Questions"); +char const* const _PREHASH_TransferAbort = LLMessageStringTable::getInstance()->getString("TransferAbort"); +char const* const _PREHASH_TransferInventory = LLMessageStringTable::getInstance()->getString("TransferInventory"); +char const* const _PREHASH_RayTargetID = LLMessageStringTable::getInstance()->getString("RayTargetID"); +char const* const _PREHASH_ClaimPrice = LLMessageStringTable::getInstance()->getString("ClaimPrice"); +char const* const _PREHASH_ObjectProperties = LLMessageStringTable::getInstance()->getString("ObjectProperties"); +char const* const _PREHASH_ParcelProperties = LLMessageStringTable::getInstance()->getString("ParcelProperties"); +char const* const _PREHASH_EstateOwnerID = LLMessageStringTable::getInstance()->getString("EstateOwnerID"); +char const* const _PREHASH_LogoutRequest = LLMessageStringTable::getInstance()->getString("LogoutRequest"); +char const* const _PREHASH_AssetUploadRequest = LLMessageStringTable::getInstance()->getString("AssetUploadRequest"); +char const* const _PREHASH_TransactionType = LLMessageStringTable::getInstance()->getString("TransactionType"); +char const* const _PREHASH_AvatarPropertiesUpdate = LLMessageStringTable::getInstance()->getString("AvatarPropertiesUpdate"); +char const* const _PREHASH_ParcelPropertiesUpdate = LLMessageStringTable::getInstance()->getString("ParcelPropertiesUpdate"); +char const* const _PREHASH_FetchItems = LLMessageStringTable::getInstance()->getString("FetchItems"); +char const* const _PREHASH_AbortXfer = LLMessageStringTable::getInstance()->getString("AbortXfer"); +char const* const _PREHASH_DeRezAck = LLMessageStringTable::getInstance()->getString("DeRezAck"); +char const* const _PREHASH_TakeControls = LLMessageStringTable::getInstance()->getString("TakeControls"); +char const* const _PREHASH_DirLandReply = LLMessageStringTable::getInstance()->getString("DirLandReply"); +char const* const _PREHASH_MuteType = LLMessageStringTable::getInstance()->getString("MuteType"); +char const* const _PREHASH_IMViaEMail = LLMessageStringTable::getInstance()->getString("IMViaEMail"); +char const* const _PREHASH_RentPrice = LLMessageStringTable::getInstance()->getString("RentPrice"); +char const* const _PREHASH_GenericMessage = LLMessageStringTable::getInstance()->getString("GenericMessage"); +char const* const _PREHASH_ChildAgentAlive = LLMessageStringTable::getInstance()->getString("ChildAgentAlive"); +char const* const _PREHASH_AssetType = LLMessageStringTable::getInstance()->getString("AssetType"); +char const* const _PREHASH_SpawnPointBlock = LLMessageStringTable::getInstance()->getString("SpawnPointBlock"); +char const* const _PREHASH_AttachmentBlock = LLMessageStringTable::getInstance()->getString("AttachmentBlock"); +char const* const _PREHASH_ObjectMaterial = LLMessageStringTable::getInstance()->getString("ObjectMaterial"); +char const* const _PREHASH_OwnerName = LLMessageStringTable::getInstance()->getString("OwnerName"); +char const* const _PREHASH_AvatarNotesReply = LLMessageStringTable::getInstance()->getString("AvatarNotesReply"); +char const* const _PREHASH_CacheID = LLMessageStringTable::getInstance()->getString("CacheID"); +char const* const _PREHASH_OwnerMask = LLMessageStringTable::getInstance()->getString("OwnerMask"); +char const* const _PREHASH_TransferInventoryAck = LLMessageStringTable::getInstance()->getString("TransferInventoryAck"); +char const* const _PREHASH_RegionDenyAgeUnverified = LLMessageStringTable::getInstance()->getString("RegionDenyAgeUnverified"); +char const* const _PREHASH_AgeVerificationBlock = LLMessageStringTable::getInstance()->getString("AgeVerificationBlock"); +char const* const _PREHASH_UCoord = LLMessageStringTable::getInstance()->getString("UCoord"); +char const* const _PREHASH_VCoord = LLMessageStringTable::getInstance()->getString("VCoord"); +char const* const _PREHASH_FaceIndex = LLMessageStringTable::getInstance()->getString("FaceIndex"); +char const* const _PREHASH_StatusData = LLMessageStringTable::getInstance()->getString("StatusData"); +char const* const _PREHASH_ProductSKU = LLMessageStringTable::getInstance()->getString("ProductSKU"); diff --git a/indra/llmessage/message_prehash.h b/indra/llmessage/message_prehash.h index 08c74d22da..8dc86601e6 100644 --- a/indra/llmessage/message_prehash.h +++ b/indra/llmessage/message_prehash.h @@ -32,1347 +32,1347 @@ */ -extern F32 gPrehashVersionNumber; +extern F32 const gPrehashVersionNumber; -extern char * _PREHASH_X; -extern char * _PREHASH_Y; -extern char * _PREHASH_Z; -extern char * _PREHASH_AddFlags; -extern char * _PREHASH_FailureInfo; -extern char * _PREHASH_MapData; -extern char * _PREHASH_AddItem; -extern char * _PREHASH_MeanCollision; -extern char * _PREHASH_RezScript; -extern char * _PREHASH_AvatarSitResponse; -extern char * _PREHASH_InventoryAssetResponse; -extern char * _PREHASH_KillObject; -extern char * _PREHASH_ProposalID; -extern char * _PREHASH_SerialNum; -extern char * _PREHASH_Duration; -extern char * _PREHASH_ScriptQuestion; -extern char * _PREHASH_AddCircuitCode; -extern char * _PREHASH_UseCircuitCode; -extern char * _PREHASH_ViewerCircuitCode; -extern char * _PREHASH_ScriptAnswerYes; -extern char * _PREHASH_PartnerID; -extern char * _PREHASH_DirLandQuery; -extern char * _PREHASH_TeleportStart; -extern char * _PREHASH_AboutText; -extern char * _PREHASH_VisualParam; -extern char * _PREHASH_GroupPrims; -extern char * _PREHASH_SelectedPrims; -extern char * _PREHASH_ID; -extern char * _PREHASH_UUIDNameRequest; -extern char * _PREHASH_UUIDGroupNameRequest; -extern char * _PREHASH_GroupAccountTransactionsRequest; -extern char * _PREHASH_MapNameRequest; -extern char * _PREHASH_UpdateSimulator; -extern char * _PREHASH_BillableFactor; -extern char * _PREHASH_ObjectBonusFactor; -extern char * _PREHASH_EnableSimulator; -extern char * _PREHASH_DisableSimulator; -extern char * _PREHASH_ConfirmEnableSimulator; -extern char * _PREHASH_LayerType; -extern char * _PREHASH_OwnerRole; -extern char * _PREHASH_ParcelOverlay; -extern char * _PREHASH_GroupOwned; -extern char * _PREHASH_IP; -extern char * _PREHASH_ChatFromViewer; -extern char * _PREHASH_AvgAgentsInView; -extern char * _PREHASH_AgentsInView; -extern char * _PREHASH_GroupTitle; -extern char * _PREHASH_MapLayerReply; -extern char * _PREHASH_CompoundMsgID; -extern char * _PREHASH_CameraConstraint; -extern char * _PREHASH_DownloadTotals; -extern char * _PREHASH_GenCounter; -extern char * _PREHASH_FrozenData; -extern char * _PREHASH_ChildAgentDying; -extern char * _PREHASH_To; -extern char * _PREHASH_CopyInventoryFromNotecard; -extern char * _PREHASH_RezObjectFromNotecard; -extern char * _PREHASH_ParcelDirFeeCurrent; -extern char * _PREHASH_SeedCapability; -extern char * _PREHASH_ObjectDuplicate; -extern char * _PREHASH_InventoryData; -extern char * _PREHASH_ReplyData; -extern char * _PREHASH_ResetList; -extern char * _PREHASH_MediaID; -extern char * _PREHASH_RelatedRights; -extern char * _PREHASH_RedirectGridX; -extern char * _PREHASH_RedirectGridY; -extern char * _PREHASH_TransferID; -extern char * _PREHASH_TexturesChanged; -extern char * _PREHASH_UserLookAt; -extern char * _PREHASH_TestBlock1; -extern char * _PREHASH_SensedData; -extern char * _PREHASH_UpdateBlock; -extern char * _PREHASH_ClassifiedGodDelete; -extern char * _PREHASH_ObjectGrabUpdate; -extern char * _PREHASH_LocationPos; -extern char * _PREHASH_TaxDate; -extern char * _PREHASH_StartDateTime; -extern char * _PREHASH_ObjectUpdateCached; -extern char * _PREHASH_Packets; -extern char * _PREHASH_FailureType; -extern char * _PREHASH_UpdateGroupInfo; -extern char * _PREHASH_ObjectPermissions; -extern char * _PREHASH_RevokePermissions; -extern char * _PREHASH_UpdateFlags; -extern char * _PREHASH_ObjectExportSelected; -extern char * _PREHASH_RezSelected; -extern char * _PREHASH_AutoPilot; -extern char * _PREHASH_UpdateMuteListEntry; -extern char * _PREHASH_RemoveMuteListEntry; -extern char * _PREHASH_SetSimStatusInDatabase; -extern char * _PREHASH_SetSimPresenceInDatabase; -extern char * _PREHASH_CameraProperty; -extern char * _PREHASH_BrushSize; -extern char * _PREHASH_SimulatorSetMap; -extern char * _PREHASH_RegionPresenceRequestByRegionID; -extern char * _PREHASH_ParcelObjectOwnersReply; -extern char * _PREHASH_GroupMembersReply; -extern char * _PREHASH_GroupRoleMembersReply; -extern char * _PREHASH_RequestRegionInfo; -extern char * _PREHASH_AABBMax; -extern char * _PREHASH_RequestPayPrice; -extern char * _PREHASH_SimulatorPresentAtLocation; -extern char * _PREHASH_AgentRequestSit; -extern char * _PREHASH_AABBMin; -extern char * _PREHASH_ClassifiedFlags; -extern char * _PREHASH_ControlFlags; -extern char * _PREHASH_TeleportRequest; -extern char * _PREHASH_ScriptTeleportRequest; -extern char * _PREHASH_EstateCovenantRequest; -extern char * _PREHASH_DateUTC; -extern char * _PREHASH_TaskIDs; -extern char * _PREHASH_RequestResult; -extern char * _PREHASH_CanAcceptAgents; -extern char * _PREHASH_ObjectSaleInfo; -extern char * _PREHASH_KillChildAgents; -extern char * _PREHASH_Balance; -extern char * _PREHASH_DerezContainer; -extern char * _PREHASH_ObjectData; -extern char * _PREHASH_CameraAtAxis; -extern char * _PREHASH_InfoBlock; -extern char * _PREHASH_OwnershipCost; -extern char * _PREHASH_AvatarNotesUpdate; -extern char * _PREHASH_PID; -extern char * _PREHASH_DirPopularReply; -extern char * _PREHASH_TerrainHeightRange00; -extern char * _PREHASH_SimData; -extern char * _PREHASH_TerrainHeightRange01; -extern char * _PREHASH_TerrainHeightRange10; -extern char * _PREHASH_TerrainHeightRange11; -extern char * _PREHASH_UpdateInventoryItem; -extern char * _PREHASH_UpdateCreateInventoryItem; -extern char * _PREHASH_MoveInventoryItem; -extern char * _PREHASH_CopyInventoryItem; -extern char * _PREHASH_LinkInventoryItem; -extern char * _PREHASH_RemoveInventoryItem; -extern char * _PREHASH_CreateInventoryItem; -extern char * _PREHASH_PathTwistBegin; -extern char * _PREHASH_CRC; -extern char * _PREHASH_AttachmentPoint; -extern char * _PREHASH_TelehubBlock; -extern char * _PREHASH_FOVBlock; -extern char * _PREHASH_StartLocationData; -extern char * _PREHASH_PositionData; -extern char * _PREHASH_TimeSinceLast; -extern char * _PREHASH_MapImage; -extern char * _PREHASH_Objects; -extern char * _PREHASH_URL; -extern char * _PREHASH_CreationDate; -extern char * _PREHASH_JointPivot; -extern char * _PREHASH_FPS; -extern char * _PREHASH_HasTelehub; -extern char * _PREHASH_PathEnd; -extern char * _PREHASH_ScriptDataReply; -extern char * _PREHASH_MapBlockReply; -extern char * _PREHASH_PropertiesData; -extern char * _PREHASH_ViewerEffect; -extern char * _PREHASH_FreezeUser; -extern char * _PREHASH_OwnerPrims; -extern char * _PREHASH_ObjectGrab; -extern char * _PREHASH_ToAgentID; -extern char * _PREHASH_SimulatorMapUpdate; -extern char * _PREHASH_TransferPacket; -extern char * _PREHASH_ObjectName; -extern char * _PREHASH_GroupPowers; -extern char * _PREHASH_OriginalName; -extern char * _PREHASH_CompletePingCheck; -extern char * _PREHASH_OnlineStatus; -extern char * _PREHASH_ObjectDrop; -extern char * _PREHASH_UseBigPackets; -extern char * _PREHASH_GroupNoticesListReply; -extern char * _PREHASH_ParcelAccessListReply; -extern char * _PREHASH_RpcChannelReply; -extern char * _PREHASH_RegionPresenceResponse; -extern char * _PREHASH_CharterMember; -extern char * _PREHASH_EdgeData; -extern char * _PREHASH_NameData; -extern char * _PREHASH_RegionPushOverride; -extern char * _PREHASH_SimName; -extern char * _PREHASH_UserReport; -extern char * _PREHASH_DownloadPriority; -extern char * _PREHASH_ToAgentId; -extern char * _PREHASH_DirPopularQuery; -extern char * _PREHASH_Mag; -extern char * _PREHASH_ParcelPropertiesRequestByID; -extern char * _PREHASH_ObjectLink; -extern char * _PREHASH_RpcScriptReplyInbound; -extern char * _PREHASH_RezData; -extern char * _PREHASH_RemoveInventoryObjects; -extern char * _PREHASH_GroupProposalBallot; -extern char * _PREHASH_RPCServerIP; -extern char * _PREHASH_Far; -extern char * _PREHASH_GodSessionID; -extern char * _PREHASH_FLAboutText; -extern char * _PREHASH_RegionHandshakeReply; -extern char * _PREHASH_GroupActiveProposalItemReply; -extern char * _PREHASH_MapItemReply; -extern char * _PREHASH_Seconds; -extern char * _PREHASH_UpdateUserInfo; -extern char * _PREHASH_AggregatePermTexturesOwner; -extern char * _PREHASH_Set; -extern char * _PREHASH_NewName; -extern char * _PREHASH_Key; -extern char * _PREHASH_AgentID; -extern char * _PREHASH_EventNotificationRemoveRequest; -extern char * _PREHASH_NewFolderID; -extern char * _PREHASH_Arc; -extern char * _PREHASH_RegionX; -extern char * _PREHASH_RegionY; -extern char * _PREHASH_RequestData; -extern char * _PREHASH_Msg; -extern char * _PREHASH_Top; -extern char * _PREHASH_MiscStats; -extern char * _PREHASH_ImageID; -extern char * _PREHASH_DataPacket; -extern char * _PREHASH_You; -extern char * _PREHASH_ScriptControlChange; -extern char * _PREHASH_LoadURL; -extern char * _PREHASH_SetCPURatio; -extern char * _PREHASH_NameValueData; -extern char * _PREHASH_AtomicPassObject; -extern char * _PREHASH_ErrorMessage; -extern char * _PREHASH_ViewerFrozenMessage; -extern char * _PREHASH_HealthMessage; -extern char * _PREHASH_LogTextMessage; -extern char * _PREHASH_TimeDilation; -extern char * _PREHASH_RemoveContribution; -extern char * _PREHASH_Contribution; -extern char * _PREHASH_SetGroupContribution; -extern char * _PREHASH_Offline; -extern char * _PREHASH_AgentIsNowWearing; -extern char * _PREHASH_Members; -extern char * _PREHASH_FailedResends; -extern char * _PREHASH_SecPerDay; -extern char * _PREHASH_CameraCenter; -extern char * _PREHASH_CameraLeftAxis; -extern char * _PREHASH_ExBlock; -extern char * _PREHASH_Channel; -extern char * _PREHASH_NetTest; -extern char * _PREHASH_DiscardLevel; -extern char * _PREHASH_LayerID; -extern char * _PREHASH_GrabOffset; -extern char * _PREHASH_SimPort; -extern char * _PREHASH_PricePerMeter; -extern char * _PREHASH_RegionFlags; -extern char * _PREHASH_VoteResult; -extern char * _PREHASH_ParcelDirFeeEstimate; -extern char * _PREHASH_ModifyBlock; -extern char * _PREHASH_InventoryBlock; -extern char * _PREHASH_ReplyBlock; -extern char * _PREHASH_ValidUntil; -extern char * _PREHASH_VelocityInterpolateOn; -extern char * _PREHASH_ClassifiedDelete; -extern char * _PREHASH_RegionDenyAnonymous; -extern char * _PREHASH_FLImageID; -extern char * _PREHASH_AllowPublish; -extern char * _PREHASH_SitName; -extern char * _PREHASH_RegionsVisited; -extern char * _PREHASH_DirClassifiedReply; -extern char * _PREHASH_AvatarClassifiedReply; -extern char * _PREHASH_MediaURL; -extern char * _PREHASH_CompleteAgentMovement; -extern char * _PREHASH_ClassifiedID; -extern char * _PREHASH_LocalID; -extern char * _PREHASH_SpaceIP; -extern char * _PREHASH_RemoveItem; -extern char * _PREHASH_LogFailedMoneyTransaction; -extern char * _PREHASH_ViewerStartAuction; -extern char * _PREHASH_StartAuction; -extern char * _PREHASH_DuplicateFlags; -extern char * _PREHASH_RegionInfo2; -extern char * _PREHASH_TextColor; -extern char * _PREHASH_SlaveID; -extern char * _PREHASH_Charter; -extern char * _PREHASH_AlertData; -extern char * _PREHASH_AlertInfo; -extern char * _PREHASH_TargetBlock; -extern char * _PREHASH_CheckParcelAuctions; -extern char * _PREHASH_ParcelAuctions; -extern char * _PREHASH_OwnerIsGroup; -extern char * _PREHASH_NameValuePair; -extern char * _PREHASH_RemoveNameValuePair; -extern char * _PREHASH_BulkUpdateInventory; -extern char * _PREHASH_UpdateTaskInventory; -extern char * _PREHASH_RemoveTaskInventory; -extern char * _PREHASH_MoveTaskInventory; -extern char * _PREHASH_RequestTaskInventory; -extern char * _PREHASH_ReplyTaskInventory; -extern char * _PREHASH_AggregatePermInventory; -extern char * _PREHASH_GroupAccountTransactionsReply; -extern char * _PREHASH_SimulatorInfo; -extern char * _PREHASH_WearableData; -extern char * _PREHASH_Enabled; -extern char * _PREHASH_Savings; -extern char * _PREHASH_SimulatorLoad; -extern char * _PREHASH_InternalRegionIP; -extern char * _PREHASH_ExternalRegionIP; -extern char * _PREHASH_TotalPairs; -extern char * _PREHASH_CreateGroupRequest; -extern char * _PREHASH_JoinGroupRequest; -extern char * _PREHASH_LeaveGroupRequest; -extern char * _PREHASH_InviteGroupRequest; -extern char * _PREHASH_LiveHelpGroupRequest; -extern char * _PREHASH_PriceParcelClaimFactor; -extern char * _PREHASH_BillableArea; -extern char * _PREHASH_ObjectID; -extern char * _PREHASH_ObjectFlagUpdate; -extern char * _PREHASH_GroupRoleUpdate; -extern char * _PREHASH_RequestInventoryAsset; -extern char * _PREHASH_ChangedGrid; -extern char * _PREHASH_AgentDropGroup; -extern char * _PREHASH_Details; -extern char * _PREHASH_LocationX; -extern char * _PREHASH_SaleType; -extern char * _PREHASH_LocationY; -extern char * _PREHASH_LocationZ; -extern char * _PREHASH_EconomyData; -extern char * _PREHASH_HeadRotation; -extern char * _PREHASH_DeleteOnCompletion; -extern char * _PREHASH_PublicPort; -extern char * _PREHASH_DirClassifiedQuery; -extern char * _PREHASH_CallbackID; -extern char * _PREHASH_RequestParcelTransfer; -extern char * _PREHASH_RoleCount; -extern char * _PREHASH_ObjectCapacity; -extern char * _PREHASH_RequestID; -extern char * _PREHASH_RequestXfer; -extern char * _PREHASH_ObjectTaxCurrent; -extern char * _PREHASH_LightTaxCurrent; -extern char * _PREHASH_LandTaxCurrent; -extern char * _PREHASH_GroupTaxCurrent; -extern char * _PREHASH_FetchInventoryDescendents; -extern char * _PREHASH_InventoryDescendents; -extern char * _PREHASH_Descendents; -extern char * _PREHASH_PurgeInventoryDescendents; -extern char * _PREHASH_ShowDir; -extern char * _PREHASH_IsOwner; -extern char * _PREHASH_Timestamp; -extern char * _PREHASH_GlobalPos; -extern char * _PREHASH_GrabOffsetInitial; -extern char * _PREHASH_IsTrial; -extern char * _PREHASH_ObjectDuplicateOnRay; -extern char * _PREHASH_GroupMembershipCount; -extern char * _PREHASH_MethodData; -extern char * _PREHASH_ActivateGestures; -extern char * _PREHASH_DeactivateGestures; -extern char * _PREHASH_ProposalData; -extern char * _PREHASH_PosGlobal; -extern char * _PREHASH_SearchID; -extern char * _PREHASH_RezMultipleAttachmentsFromInv; -extern char * _PREHASH_SearchName; -extern char * _PREHASH_VersionString; -extern char * _PREHASH_CreateGroupReply; -extern char * _PREHASH_LeaveGroupReply; -extern char * _PREHASH_ActualArea; -extern char * _PREHASH_Message; -extern char * _PREHASH_ClickAction; -extern char * _PREHASH_AssetUploadComplete; -extern char * _PREHASH_RequestType; -extern char * _PREHASH_UUID; -extern char * _PREHASH_BaseMask; -extern char * _PREHASH_NetBlock; -extern char * _PREHASH_GlobalX; -extern char * _PREHASH_GlobalY; -extern char * _PREHASH_CopyRotates; -extern char * _PREHASH_KickUserAck; -extern char * _PREHASH_TopPick; -extern char * _PREHASH_SessionID; -extern char * _PREHASH_GlobalZ; -extern char * _PREHASH_DeclineFriendship; -extern char * _PREHASH_FormFriendship; -extern char * _PREHASH_TerminateFriendship; -extern char * _PREHASH_TaskData; -extern char * _PREHASH_SimWideMaxPrims; -extern char * _PREHASH_TotalPrims; -extern char * _PREHASH_ProfileBegin; -extern char * _PREHASH_Request; -extern char * _PREHASH_GroupAccountDetailsRequest; -extern char * _PREHASH_GroupActiveProposalsRequest; -extern char * _PREHASH_StringValue; -extern char * _PREHASH_Version; -extern char * _PREHASH_OtherCount; -extern char * _PREHASH_MemberCount; -extern char * _PREHASH_ChatData; -extern char * _PREHASH_IsGroupOwned; -extern char * _PREHASH_EnergyEfficiency; -extern char * _PREHASH_PickInfoUpdate; -extern char * _PREHASH_PickDelete; -extern char * _PREHASH_ScriptReset; -extern char * _PREHASH_Requester; -extern char * _PREHASH_ForSale; -extern char * _PREHASH_NearestLandingRegionReply; -extern char * _PREHASH_ParcelID; -extern char * _PREHASH_Godlike; -extern char * _PREHASH_TotalDebits; -extern char * _PREHASH_Direction; -extern char * _PREHASH_HealthData; -extern char * _PREHASH_LeftAxis; -extern char * _PREHASH_LocationBlock; -extern char * _PREHASH_ObjectImage; -extern char * _PREHASH_TerrainStartHeight00; -extern char * _PREHASH_TerrainStartHeight01; -extern char * _PREHASH_TerrainStartHeight10; -extern char * _PREHASH_TerrainStartHeight11; -extern char * _PREHASH_WaterHeight; -extern char * _PREHASH_FetchInventoryReply; -extern char * _PREHASH_GroupAccountSummaryReply; -extern char * _PREHASH_AttachedSound; -extern char * _PREHASH_ParamInUse; -extern char * _PREHASH_GodKickUser; -extern char * _PREHASH_PickName; -extern char * _PREHASH_TaskName; -extern char * _PREHASH_ObjectCount; -extern char * _PREHASH_RegionPresenceRequestByHandle; -extern char * _PREHASH_RezSingleAttachmentFromInv; -extern char * _PREHASH_ChildAgentUpdate; -extern char * _PREHASH_IsOwnerGroup; -extern char * _PREHASH_AgentHeightWidth; -extern char * _PREHASH_VerticalAngle; -extern char * _PREHASH_WearableType; -extern char * _PREHASH_AggregatePermNextOwner; -extern char * _PREHASH_ShowInList; -extern char * _PREHASH_UpdateParcel; -extern char * _PREHASH_SetAlwaysRun; -extern char * _PREHASH_NVPair; -extern char * _PREHASH_SearchType; -extern char * _PREHASH_ObjectSpinStart; -extern char * _PREHASH_UseEstateSun; -extern char * _PREHASH_RegionID; -extern char * _PREHASH_AbuseRegionID; -extern char * _PREHASH_Creator; -extern char * _PREHASH_ProposalText; -extern char * _PREHASH_DirEventsReply; -extern char * _PREHASH_EventInfoReply; -extern char * _PREHASH_UserInfoReply; -extern char * _PREHASH_PathRadiusOffset; -extern char * _PREHASH_TextureData; -extern char * _PREHASH_ChatPass; -extern char * _PREHASH_TargetID; -extern char * _PREHASH_DefaultPayPrice; -extern char * _PREHASH_UserLocation; -extern char * _PREHASH_MaxPrims; -extern char * _PREHASH_LandmarkID; -extern char * _PREHASH_InitiateDownload; -extern char * _PREHASH_Name; -extern char * _PREHASH_OtherCleanTime; -extern char * _PREHASH_ParcelSetOtherCleanTime; -extern char * _PREHASH_TeleportPriceExponent; -extern char * _PREHASH_Gain; -extern char * _PREHASH_PacketAck; -extern char * _PREHASH_PathSkew; -extern char * _PREHASH_SimulatorShutdownRequest; -extern char * _PREHASH_NearestLandingRegionRequest; -extern char * _PREHASH_OtherID; -extern char * _PREHASH_MemberID; -extern char * _PREHASH_MapLayerRequest; -extern char * _PREHASH_ObjectScale; -extern char * _PREHASH_TargetIP; -extern char * _PREHASH_Redo; -extern char * _PREHASH_MoneyBalance; -extern char * _PREHASH_TrackAgent; -extern char * _PREHASH_MaxX; -extern char * _PREHASH_Data; -extern char * _PREHASH_MaxY; -extern char * _PREHASH_TextureAnim; -extern char * _PREHASH_ReturnIDs; -extern char * _PREHASH_Date; -extern char * _PREHASH_AgentWearablesUpdate; -extern char * _PREHASH_AgentDataUpdate; -extern char * _PREHASH_GroupDataUpdate; -extern char * _PREHASH_Hash; -extern char * _PREHASH_AgentGroupDataUpdate; -extern char * _PREHASH_Left; -extern char * _PREHASH_Mask; -extern char * _PREHASH_ForceMouselook; -extern char * _PREHASH_Success; -extern char * _PREHASH_ObjectGroup; -extern char * _PREHASH_SunHour; -extern char * _PREHASH_MinX; -extern char * _PREHASH_ScriptSensorReply; -extern char * _PREHASH_MinY; -extern char * _PREHASH_Command; -extern char * _PREHASH_Desc; -extern char * _PREHASH_AttachmentNeedsSave; -extern char * _PREHASH_HistoryItemData; -extern char * _PREHASH_AgentCachedTexture; -extern char * _PREHASH_Subject; -extern char * _PREHASH_East; -extern char * _PREHASH_QueryReplies; -extern char * _PREHASH_ObjectCategory; -extern char * _PREHASH_Time; -extern char * _PREHASH_CreateLandmarkForEvent; -extern char * _PREHASH_ParentID; -extern char * _PREHASH_Ping; -extern char * _PREHASH_Perp; -extern char * _PREHASH_Code; -extern char * _PREHASH_InvType; -extern char * _PREHASH_AgentFOV; -extern char * _PREHASH_Audible; -extern char * _PREHASH_AuctionData; -extern char * _PREHASH_IDBlock; -extern char * _PREHASH_West; -extern char * _PREHASH_Undo; -extern char * _PREHASH_TotalNumItems; -extern char * _PREHASH_Info; -extern char * _PREHASH_Area; -extern char * _PREHASH_SimCrashed; -extern char * _PREHASH_Text; -extern char * _PREHASH_PriceGroupCreate; -extern char * _PREHASH_ObjectShape; -extern char * _PREHASH_GroupRoleDataReply; -extern char * _PREHASH_MuteCRC; -extern char * _PREHASH_Size; -extern char * _PREHASH_FromAddress; -extern char * _PREHASH_Body; -extern char * _PREHASH_FileData; -extern char * _PREHASH_List; -extern char * _PREHASH_KickUser; -extern char * _PREHASH_OtherPrims; -extern char * _PREHASH_RunTime; -extern char * _PREHASH_GrantUserRights; -extern char * _PREHASH_RpcScriptRequestInboundForward; -extern char * _PREHASH_More; -extern char * _PREHASH_Majority; -extern char * _PREHASH_MetersTraveled; -extern char * _PREHASH_Stat; -extern char * _PREHASH_SoundID; -extern char * _PREHASH_Item; -extern char * _PREHASH_User; -extern char * _PREHASH_Prey; -extern char * _PREHASH_RayStart; -extern char * _PREHASH_UsecSinceStart; -extern char * _PREHASH_ParcelData; -extern char * _PREHASH_CameraUpAxis; -extern char * _PREHASH_ScriptDialog; -extern char * _PREHASH_MasterParcelData; -extern char * _PREHASH_Invalid; -extern char * _PREHASH_ProfileCurve; -extern char * _PREHASH_ParcelAccessListUpdate; -extern char * _PREHASH_MuteListUpdate; -extern char * _PREHASH_SendPacket; -extern char * _PREHASH_SendXferPacket; -extern char * _PREHASH_RegionDenyIdentified; -extern char * _PREHASH_NotecardItemID; -extern char * _PREHASH_LastName; -extern char * _PREHASH_From; -extern char * _PREHASH_RoleChange; -extern char * _PREHASH_Port; -extern char * _PREHASH_MemberTitle; -extern char * _PREHASH_LogParcelChanges; -extern char * _PREHASH_AgentCachedTextureResponse; -extern char * _PREHASH_DeRezObject; -extern char * _PREHASH_IsTemporary; -extern char * _PREHASH_InsigniaID; -extern char * _PREHASH_CheckFlags; -extern char * _PREHASH_EventID; -extern char * _PREHASH_Selected; -extern char * _PREHASH_FromAgentId; -extern char * _PREHASH_Type; -extern char * _PREHASH_ChatType; -extern char * _PREHASH_ReportData; -extern char * _PREHASH_RequestBlock; -extern char * _PREHASH_GrantData; -extern char * _PREHASH_DetachAttachmentIntoInv; -extern char * _PREHASH_ParcelDisableObjects; -extern char * _PREHASH_Sections; -extern char * _PREHASH_GodLevel; -extern char * _PREHASH_PayPriceReply; -extern char * _PREHASH_QueryID; -extern char * _PREHASH_CameraEyeOffset; -extern char * _PREHASH_AgentPosition; -extern char * _PREHASH_GrabPosition; -extern char * _PREHASH_OnlineNotification; -extern char * _PREHASH_OfflineNotification; -extern char * _PREHASH_SendPostcard; -extern char * _PREHASH_RequestFlags; -extern char * _PREHASH_GroupAccountSummaryRequest; -extern char * _PREHASH_GroupVoteHistoryRequest; -extern char * _PREHASH_ParamValue; -extern char * _PREHASH_MaxAgents; -extern char * _PREHASH_CreateNewOutfitAttachments; -extern char * _PREHASH_RegionHandle; -extern char * _PREHASH_TeleportProgress; -extern char * _PREHASH_AgentQuitCopy; -extern char * _PREHASH_AvatarInterestsUpdate; -extern char * _PREHASH_GroupNoticeID; -extern char * _PREHASH_ParcelName; -extern char * _PREHASH_PriceObjectRent; -extern char * _PREHASH_OfferCallingCard; -extern char * _PREHASH_AcceptCallingCard; -extern char * _PREHASH_DeclineCallingCard; -extern char * _PREHASH_AgentAccess; -extern char * _PREHASH_AgentLegacyAccess; -extern char * _PREHASH_AgentMaxAccess; -extern char * _PREHASH_DataHomeLocationReply; -extern char * _PREHASH_EventLocationReply; -extern char * _PREHASH_TerseDateID; -extern char * _PREHASH_ObjectOwner; -extern char * _PREHASH_AssetID; -extern char * _PREHASH_AlertMessage; -extern char * _PREHASH_AgentAlertMessage; -extern char * _PREHASH_EstateOwnerMessage; -extern char * _PREHASH_ParcelMediaCommandMessage; -extern char * _PREHASH_Auction; -extern char * _PREHASH_Category; -extern char * _PREHASH_FilePath; -extern char * _PREHASH_ItemFlags; -extern char * _PREHASH_Invoice; -extern char * _PREHASH_IntervalDays; -extern char * _PREHASH_PathScaleX; -extern char * _PREHASH_FromTaskID; -extern char * _PREHASH_PathScaleY; -extern char * _PREHASH_TimeInfo; -extern char * _PREHASH_PublicCount; -extern char * _PREHASH_ParcelJoin; -extern char * _PREHASH_GroupRolesCount; -extern char * _PREHASH_SimulatorBlock; -extern char * _PREHASH_GroupID; -extern char * _PREHASH_AgentVel; -extern char * _PREHASH_RequestImage; -extern char * _PREHASH_NetStats; -extern char * _PREHASH_AgentPos; -extern char * _PREHASH_AgentSit; -extern char * _PREHASH_Material; -extern char * _PREHASH_ObjectDeGrab; -extern char * _PREHASH_VelocityInterpolateOff; -extern char * _PREHASH_AuthorizedBuyerID; -extern char * _PREHASH_AvatarPropertiesReply; -extern char * _PREHASH_GroupProfileReply; -extern char * _PREHASH_SimOwner; -extern char * _PREHASH_SalePrice; -extern char * _PREHASH_Animation; -extern char * _PREHASH_OwnerID; -extern char * _PREHASH_NearestLandingRegionUpdated; -extern char * _PREHASH_PassToAgent; -extern char * _PREHASH_PreyAgent; -extern char * _PREHASH_SimStats; -extern char * _PREHASH_LogoutReply; -extern char * _PREHASH_FeatureDisabled; -extern char * _PREHASH_PhysicalAvatarEventList; -extern char * _PREHASH_ObjectLocalID; -extern char * _PREHASH_Dropped; -extern char * _PREHASH_WebProfilesDisabled; -extern char * _PREHASH_Destination; -extern char * _PREHASH_MasterID; -extern char * _PREHASH_TransferData; -extern char * _PREHASH_WantToMask; -extern char * _PREHASH_ParcelSelectObjects; -extern char * _PREHASH_ExtraParams; -extern char * _PREHASH_CreatorID; -extern char * _PREHASH_Summary; -extern char * _PREHASH_BuyObjectInventory; -extern char * _PREHASH_FetchInventory; -extern char * _PREHASH_InventoryID; -extern char * _PREHASH_PacketNumber; -extern char * _PREHASH_SetFollowCamProperties; -extern char * _PREHASH_ClearFollowCamProperties; -extern char * _PREHASH_SequenceID; -extern char * _PREHASH_DataServerLogout; -extern char * _PREHASH_NameValue; -extern char * _PREHASH_PathShearX; -extern char * _PREHASH_PathShearY; -extern char * _PREHASH_Velocity; -extern char * _PREHASH_SecPerYear; -extern char * _PREHASH_FirstName; -extern char * _PREHASH_AttachedSoundGainChange; -extern char * _PREHASH_LocationID; -extern char * _PREHASH_Running; -extern char * _PREHASH_AgentThrottle; -extern char * _PREHASH_NeighborList; -extern char * _PREHASH_PathTaperX; -extern char * _PREHASH_PathTaperY; -extern char * _PREHASH_AgentRelated; -extern char * _PREHASH_GranterBlock; -extern char * _PREHASH_UseCachedMuteList; -extern char * _PREHASH_FailStats; -extern char * _PREHASH_Tempfile; -extern char * _PREHASH_BuyerID; -extern char * _PREHASH_DirPeopleReply; -extern char * _PREHASH_TransferInfo; -extern char * _PREHASH_AvatarPickerRequestBackend; -extern char * _PREHASH_AvatarPropertiesRequestBackend; -extern char * _PREHASH_UpdateData; -extern char * _PREHASH_SimFPS; -extern char * _PREHASH_ReporterID; -extern char * _PREHASH_ButtonLabel; -extern char * _PREHASH_GranterID; -extern char * _PREHASH_WantToText; -extern char * _PREHASH_ReportType; -extern char * _PREHASH_SimulatorReady; -extern char * _PREHASH_DataBlock; -extern char * _PREHASH_AnimationSourceList; -extern char * _PREHASH_SubscribeLoad; -extern char * _PREHASH_UnsubscribeLoad; -extern char * _PREHASH_Packet; -extern char * _PREHASH_UndoLand; -extern char * _PREHASH_SimAccess; -extern char * _PREHASH_AbuserID; -extern char * _PREHASH_MembershipFee; -extern char * _PREHASH_InviteGroupResponse; -extern char * _PREHASH_CreateInventoryFolder; -extern char * _PREHASH_UpdateInventoryFolder; -extern char * _PREHASH_MoveInventoryFolder; -extern char * _PREHASH_RemoveInventoryFolder; -extern char * _PREHASH_MoneyData; -extern char * _PREHASH_ObjectDeselect; -extern char * _PREHASH_NewAssetID; -extern char * _PREHASH_ObjectAdd; -extern char * _PREHASH_RayEndIsIntersection; -extern char * _PREHASH_CompleteAuction; -extern char * _PREHASH_CircuitCode; -extern char * _PREHASH_AgentMovementComplete; -extern char * _PREHASH_ViewerIP; -extern char * _PREHASH_Header; -extern char * _PREHASH_GestureFlags; -extern char * _PREHASH_XferID; -extern char * _PREHASH_StatValue; -extern char * _PREHASH_TaskID; -extern char * _PREHASH_PickID; -extern char * _PREHASH_RayEnd; -extern char * _PREHASH_Throttles; -extern char * _PREHASH_RebakeAvatarTextures; -extern char * _PREHASH_UpAxis; -extern char * _PREHASH_AgentTextures; -extern char * _PREHASH_NotecardData; -extern char * _PREHASH_Radius; -extern char * _PREHASH_OffCircuit; -extern char * _PREHASH_Access; -extern char * _PREHASH_TitleRoleID; -extern char * _PREHASH_SquareMetersCredit; -extern char * _PREHASH_Filename; -extern char * _PREHASH_ClassifiedInfoRequest; -extern char * _PREHASH_ParcelInfoRequest; -extern char * _PREHASH_ParcelObjectOwnersRequest; -extern char * _PREHASH_TeleportLandmarkRequest; -extern char * _PREHASH_EventInfoRequest; -extern char * _PREHASH_MoneyBalanceRequest; -extern char * _PREHASH_GroupMembersRequest; -extern char * _PREHASH_GroupRoleMembersRequest; -extern char * _PREHASH_ChatFromSimulator; -extern char * _PREHASH_OldFolderID; -extern char * _PREHASH_UserInfoRequest; -extern char * _PREHASH_TextureID; -extern char * _PREHASH_ProfileURL; -extern char * _PREHASH_Handle; -extern char * _PREHASH_ButtonIndex; -extern char * _PREHASH_GetScriptRunning; -extern char * _PREHASH_SetScriptRunning; -extern char * _PREHASH_Health; -extern char * _PREHASH_CircuitInfo; -extern char * _PREHASH_ObjectBuy; -extern char * _PREHASH_ProfileEnd; -extern char * _PREHASH_Effect; -extern char * _PREHASH_TestMessage; -extern char * _PREHASH_ScriptMailRegistration; -extern char * _PREHASH_AgentSetAppearance; -extern char * _PREHASH_AvatarAppearance; -extern char * _PREHASH_RegionData; -extern char * _PREHASH_RequestingRegionData; -extern char * _PREHASH_LandingRegionData; -extern char * _PREHASH_SitTransform; -extern char * _PREHASH_TerrainBase0; -extern char * _PREHASH_SkillsMask; -extern char * _PREHASH_AtAxis; -extern char * _PREHASH_TerrainBase1; -extern char * _PREHASH_Reason; -extern char * _PREHASH_TerrainBase2; -extern char * _PREHASH_TerrainBase3; -extern char * _PREHASH_Params; -extern char * _PREHASH_PingID; -extern char * _PREHASH_Change; -extern char * _PREHASH_Height; -extern char * _PREHASH_Region; -extern char * _PREHASH_TelehubInfo; -extern char * _PREHASH_StateSave; -extern char * _PREHASH_RoleData; -extern char * _PREHASH_AgentAnimation; -extern char * _PREHASH_AvatarAnimation; -extern char * _PREHASH_LogDwellTime; -extern char * _PREHASH_ParcelGodMarkAsContent; -extern char * _PREHASH_UsePhysics; -extern char * _PREHASH_RegionDenyTransacted; -extern char * _PREHASH_JointType; -extern char * _PREHASH_ObjectTaxEstimate; -extern char * _PREHASH_LightTaxEstimate; -extern char * _PREHASH_LandTaxEstimate; -extern char * _PREHASH_TeleportLandingStatusChanged; -extern char * _PREHASH_GroupTaxEstimate; -extern char * _PREHASH_AvgViewerFPS; -extern char * _PREHASH_Buttons; -extern char * _PREHASH_Sender; -extern char * _PREHASH_Dialog; -extern char * _PREHASH_TargetData; -extern char * _PREHASH_DestID; -extern char * _PREHASH_PricePublicObjectDelete; -extern char * _PREHASH_ObjectDelete; -extern char * _PREHASH_Delete; -extern char * _PREHASH_EventGodDelete; -extern char * _PREHASH_LastTaxDate; -extern char * _PREHASH_MapImageID; -extern char * _PREHASH_EndDateTime; -extern char * _PREHASH_TerrainDetail0; -extern char * _PREHASH_TerrainDetail1; -extern char * _PREHASH_TerrainDetail2; -extern char * _PREHASH_TerrainDetail3; -extern char * _PREHASH_Offset; -extern char * _PREHASH_ObjectDelink; -extern char * _PREHASH_TargetObject; -extern char * _PREHASH_IsEstateManager; -extern char * _PREHASH_CancelAuction; -extern char * _PREHASH_ObjectDetach; -extern char * _PREHASH_Compressed; -extern char * _PREHASH_PathBegin; -extern char * _PREHASH_BypassRaycast; -extern char * _PREHASH_WinnerID; -extern char * _PREHASH_ChannelType; -extern char * _PREHASH_NonExemptMembers; -extern char * _PREHASH_Agents; -extern char * _PREHASH_MemberData; -extern char * _PREHASH_ToGroupID; -extern char * _PREHASH_ImageNotInDatabase; -extern char * _PREHASH_StartDate; -extern char * _PREHASH_AnimID; -extern char * _PREHASH_Serial; -extern char * _PREHASH_AbuseRegionName; -extern char * _PREHASH_ModifyLand; -extern char * _PREHASH_Digest; -extern char * _PREHASH_Victim; -extern char * _PREHASH_Script; -extern char * _PREHASH_PickInfoReply; -extern char * _PREHASH_MoneyBalanceReply; -extern char * _PREHASH_RoutedMoneyBalanceReply; -extern char * _PREHASH_RoleID; -extern char * _PREHASH_RegionInfo; -extern char * _PREHASH_GodUpdateRegionInfo; -extern char * _PREHASH_StartAnim; -extern char * _PREHASH_Action; -extern char * _PREHASH_Location; -extern char * _PREHASH_Rights; -extern char * _PREHASH_SearchDir; -extern char * _PREHASH_TransferRequest; -extern char * _PREHASH_ScriptSensorRequest; -extern char * _PREHASH_MoneyTransferRequest; -extern char * _PREHASH_EjectGroupMemberRequest; -extern char * _PREHASH_SkillsText; -extern char * _PREHASH_Resent; -extern char * _PREHASH_Center; -extern char * _PREHASH_SharedData; -extern char * _PREHASH_PSBlock; -extern char * _PREHASH_UUIDNameBlock; -extern char * _PREHASH_GroupTitleUpdate; -extern char * _PREHASH_Method; -extern char * _PREHASH_TouchName; -extern char * _PREHASH_UpdateType; -extern char * _PREHASH_KickedFromEstateID; -extern char * _PREHASH_CandidateID; -extern char * _PREHASH_ParamData; -extern char * _PREHASH_GodlikeMessage; -extern char * _PREHASH_SystemMessage; -extern char * _PREHASH_BodyRotation; -extern char * _PREHASH_SearchRegions; -extern char * _PREHASH_AnimationData; -extern char * _PREHASH_StatID; -extern char * _PREHASH_ItemID; -extern char * _PREHASH_ScriptDialogReply; -extern char * _PREHASH_RegionIDAndHandleReply; -extern char * _PREHASH_CameraAtOffset; -extern char * _PREHASH_VoteID; -extern char * _PREHASH_ParcelGodForceOwner; -extern char * _PREHASH_Filter; -extern char * _PREHASH_InviteData; -extern char * _PREHASH_PCode; -extern char * _PREHASH_SearchPos; -extern char * _PREHASH_PreyID; -extern char * _PREHASH_TerrainLowerLimit; -extern char * _PREHASH_EventFlags; -extern char * _PREHASH_TallyVotes; -extern char * _PREHASH_Result; -extern char * _PREHASH_LookAt; -extern char * _PREHASH_SearchOrder; -extern char * _PREHASH_PayButton; -extern char * _PREHASH_SelfCount; -extern char * _PREHASH_PacketCount; -extern char * _PREHASH_ParcelBuyPass; -extern char * _PREHASH_OldItemID; -extern char * _PREHASH_RegionPort; -extern char * _PREHASH_PriceEnergyUnit; -extern char * _PREHASH_Bitmap; -extern char * _PREHASH_CacheMissType; -extern char * _PREHASH_VFileID; -extern char * _PREHASH_GroupInsigniaID; -extern char * _PREHASH_Online; -extern char * _PREHASH_KickFlags; -extern char * _PREHASH_CovenantID; -extern char * _PREHASH_SysCPU; -extern char * _PREHASH_EMail; -extern char * _PREHASH_AggregatePermTextures; -extern char * _PREHASH_ChatChannel; -extern char * _PREHASH_ReturnID; -extern char * _PREHASH_ObjectAttach; -extern char * _PREHASH_TargetPort; -extern char * _PREHASH_ObjectSpinStop; -extern char * _PREHASH_FullID; -extern char * _PREHASH_ActivateGroup; -extern char * _PREHASH_SysGPU; -extern char * _PREHASH_AvatarInterestsReply; -extern char * _PREHASH_StartLure; -extern char * _PREHASH_SysRAM; -extern char * _PREHASH_ObjectPosition; -extern char * _PREHASH_SitPosition; -extern char * _PREHASH_StartTime; -extern char * _PREHASH_BornOn; -extern char * _PREHASH_CameraCollidePlane; -extern char * _PREHASH_EconomyDataRequest; -extern char * _PREHASH_TeleportLureRequest; -extern char * _PREHASH_FolderID; -extern char * _PREHASH_RegionHandleRequest; -extern char * _PREHASH_ScriptDataRequest; -extern char * _PREHASH_GroupRoleDataRequest; -extern char * _PREHASH_GroupTitlesRequest; -extern char * _PREHASH_AgentWearablesRequest; -extern char * _PREHASH_MapBlockRequest; -extern char * _PREHASH_LureID; -extern char * _PREHASH_CopyCenters; -extern char * _PREHASH_ParamList; -extern char * _PREHASH_InventorySerial; -extern char * _PREHASH_EdgeDataPacket; -extern char * _PREHASH_AvatarPickerReply; -extern char * _PREHASH_ParcelDwellReply; -extern char * _PREHASH_IsForSale; -extern char * _PREHASH_MuteID; -extern char * _PREHASH_MeanCollisionAlert; -extern char * _PREHASH_CanAcceptTasks; -extern char * _PREHASH_ItemData; -extern char * _PREHASH_AnimationList; -extern char * _PREHASH_Reputation; -extern char * _PREHASH_IntValue; -extern char * _PREHASH_TargetType; -extern char * _PREHASH_Amount; -extern char * _PREHASH_HasAttachment; -extern char * _PREHASH_UpdateAttachment; -extern char * _PREHASH_RemoveAttachment; -extern char * _PREHASH_HeightWidthBlock; -extern char * _PREHASH_RequestObjectPropertiesFamily; -extern char * _PREHASH_ObjectPropertiesFamily; -extern char * _PREHASH_UserData; -extern char * _PREHASH_IsReadable; -extern char * _PREHASH_PathCurve; -extern char * _PREHASH_Status; -extern char * _PREHASH_FromGroup; -extern char * _PREHASH_AlreadyVoted; -extern char * _PREHASH_PlacesReply; -extern char * _PREHASH_DirPlacesReply; -extern char * _PREHASH_ParcelBuy; -extern char * _PREHASH_DirFindQueryBackend; -extern char * _PREHASH_DirPlacesQueryBackend; -extern char * _PREHASH_DirClassifiedQueryBackend; -extern char * _PREHASH_DirLandQueryBackend; -extern char * _PREHASH_DirPopularQueryBackend; -extern char * _PREHASH_HistoryData; -extern char * _PREHASH_SnapshotID; -extern char * _PREHASH_Aspect; -extern char * _PREHASH_ParamSize; -extern char * _PREHASH_VoteCast; -extern char * _PREHASH_CastsShadows; -extern char * _PREHASH_EveryoneMask; -extern char * _PREHASH_ObjectSpinUpdate; -extern char * _PREHASH_MaturePublish; -extern char * _PREHASH_UseExistingAsset; -extern char * _PREHASH_Powers; -extern char * _PREHASH_ParcelLocalID; -extern char * _PREHASH_TeleportCancel; -extern char * _PREHASH_UnixTime; -extern char * _PREHASH_QueryFlags; -extern char * _PREHASH_AlwaysRun; -extern char * _PREHASH_Bottom; -extern char * _PREHASH_ButtonData; -extern char * _PREHASH_SoundData; -extern char * _PREHASH_ViewerStats; -extern char * _PREHASH_RegionHandshake; -extern char * _PREHASH_ObjectDescription; -extern char * _PREHASH_Description; -extern char * _PREHASH_ParamType; -extern char * _PREHASH_UUIDNameReply; -extern char * _PREHASH_UUIDGroupNameReply; -extern char * _PREHASH_SaveAssetIntoInventory; -extern char * _PREHASH_UserInfo; -extern char * _PREHASH_AnimSequenceID; -extern char * _PREHASH_NVPairs; -extern char * _PREHASH_GroupNoticesListRequest; -extern char * _PREHASH_ParcelAccessListRequest; -extern char * _PREHASH_MuteListRequest; -extern char * _PREHASH_RpcChannelRequest; -extern char * _PREHASH_LandStatRequest; -extern char * _PREHASH_PlacesQuery; -extern char * _PREHASH_DirPlacesQuery; -extern char * _PREHASH_SortOrder; -extern char * _PREHASH_Hunter; -extern char * _PREHASH_SunAngVelocity; -extern char * _PREHASH_BinaryBucket; -extern char * _PREHASH_ImagePacket; -extern char * _PREHASH_StartGroupProposal; -extern char * _PREHASH_EnergyLevel; -extern char * _PREHASH_PriceForListing; -extern char * _PREHASH_Scale; -extern char * _PREHASH_EstateCovenantReply; -extern char * _PREHASH_ParentEstateID; -extern char * _PREHASH_Extra2; -extern char * _PREHASH_Throttle; -extern char * _PREHASH_SimIP; -extern char * _PREHASH_GodID; -extern char * _PREHASH_TeleportMinPrice; -extern char * _PREHASH_VoteItem; -extern char * _PREHASH_ObjectRotation; -extern char * _PREHASH_SitRotation; -extern char * _PREHASH_SnapSelection; -extern char * _PREHASH_SoundTrigger; -extern char * _PREHASH_TerrainRaiseLimit; -extern char * _PREHASH_Quorum; -extern char * _PREHASH_AgentBlock; -extern char * _PREHASH_CommandBlock; -extern char * _PREHASH_PricePublicObjectDecay; -extern char * _PREHASH_SpawnPointPos; -extern char * _PREHASH_VolumeDetail; -extern char * _PREHASH_FromAgentName; -extern char * _PREHASH_Range; -extern char * _PREHASH_DirectoryVisibility; -extern char * _PREHASH_PublicIP; -extern char * _PREHASH_TeleportFailed; -extern char * _PREHASH_PreloadSound; -extern char * _PREHASH_ScreenshotID; -extern char * _PREHASH_CovenantTimestamp; -extern char * _PREHASH_OldestUnacked; -extern char * _PREHASH_SimulatorIP; -extern char * _PREHASH_Value; -extern char * _PREHASH_JointAxisOrAnchor; -extern char * _PREHASH_Test0; -extern char * _PREHASH_Test1; -extern char * _PREHASH_Test2; -extern char * _PREHASH_SunPhase; -extern char * _PREHASH_ParcelDivide; -extern char * _PREHASH_PriceObjectClaim; -extern char * _PREHASH_Field; -extern char * _PREHASH_Ratio; -extern char * _PREHASH_JoinGroupReply; -extern char * _PREHASH_LiveHelpGroupReply; -extern char * _PREHASH_Score; -extern char * _PREHASH_Image; -extern char * _PREHASH_ObjectClickAction; -extern char * _PREHASH_Parameter; -extern char * _PREHASH_Flags; -extern char * _PREHASH_Plane; -extern char * _PREHASH_Width; -extern char * _PREHASH_Right; -extern char * _PREHASH_DirFindQuery; -extern char * _PREHASH_Textures; -extern char * _PREHASH_EventData; -extern char * _PREHASH_Final; -extern char * _PREHASH_System; -extern char * _PREHASH_TelehubPos; -extern char * _PREHASH_ReportAutosaveCrash; -extern char * _PREHASH_CreateTrustedCircuit; -extern char * _PREHASH_DenyTrustedCircuit; -extern char * _PREHASH_RequestTrustedCircuit; -extern char * _PREHASH_Codec; -extern char * _PREHASH_Modal; -extern char * _PREHASH_ChildAgentUnknown; -extern char * _PREHASH_LandingType; -extern char * _PREHASH_ScriptRunningReply; -extern char * _PREHASH_Reply; -extern char * _PREHASH_GroupAccountDetailsReply; -extern char * _PREHASH_TelehubRot; -extern char * _PREHASH_AcceptFriendship; -extern char * _PREHASH_ItemType; -extern char * _PREHASH_DwellInfo; -extern char * _PREHASH_AgentResume; -extern char * _PREHASH_MailFilter; -extern char * _PREHASH_Disconnect; -extern char * _PREHASH_SimPosition; -extern char * _PREHASH_SimWideTotalPrims; -extern char * _PREHASH_Index; -extern char * _PREHASH_SimFilename; -extern char * _PREHASH_LastOwnerID; -extern char * _PREHASH_GroupNoticeRequest; -extern char * _PREHASH_EmailMessageRequest; -extern char * _PREHASH_MapItemRequest; -extern char * _PREHASH_AgentCount; -extern char * _PREHASH_MessageBlock; -extern char * _PREHASH_FuseBlock; -extern char * _PREHASH_AgentGroupData; -extern char * _PREHASH_ClassifiedInfoUpdate; -extern char * _PREHASH_RegionPos; -extern char * _PREHASH_ParcelMediaUpdate; -extern char * _PREHASH_NoticeID; -extern char * _PREHASH_GridX; -extern char * _PREHASH_GridY; -extern char * _PREHASH_Title; -extern char * _PREHASH_AuctionID; -extern char * _PREHASH_VoteType; -extern char * _PREHASH_CategoryID; -extern char * _PREHASH_Token; -extern char * _PREHASH_AggregatePerms; -extern char * _PREHASH_ObjectSelect; -extern char * _PREHASH_ForceObjectSelect; -extern char * _PREHASH_Price; -extern char * _PREHASH_SunDirection; -extern char * _PREHASH_FromName; -extern char * _PREHASH_ChangeInventoryItemFlags; -extern char * _PREHASH_Force; -extern char * _PREHASH_TransactionBlock; -extern char * _PREHASH_PowersMask; -extern char * _PREHASH_Stamp; -extern char * _PREHASH_TotalCredits; -extern char * _PREHASH_State; -extern char * _PREHASH_TextureIndex; -extern char * _PREHASH_InviteeID; -extern char * _PREHASH_ParcelReclaim; -extern char * _PREHASH_Money; -extern char * _PREHASH_PathTwist; -extern char * _PREHASH_AuthBuyerID; -extern char * _PREHASH_Color; -extern char * _PREHASH_SourceType; -extern char * _PREHASH_World; -extern char * _PREHASH_QueryData; -extern char * _PREHASH_Users; -extern char * _PREHASH_SysOS; -extern char * _PREHASH_Notes; -extern char * _PREHASH_AvatarID; -extern char * _PREHASH_FounderID; -extern char * _PREHASH_EndPointID; -extern char * _PREHASH_LocationLookAt; -extern char * _PREHASH_Sound; -extern char * _PREHASH_Cover; -extern char * _PREHASH_TotalObjectCount; -extern char * _PREHASH_TextureEntry; -extern char * _PREHASH_SquareMetersCommitted; -extern char * _PREHASH_ChannelID; -extern char * _PREHASH_Dwell; -extern char * _PREHASH_North; -extern char * _PREHASH_AgentUpdate; -extern char * _PREHASH_PickGodDelete; -extern char * _PREHASH_HostName; -extern char * _PREHASH_PriceParcelClaim; -extern char * _PREHASH_ParcelClaim; -extern char * _PREHASH_AgentPowers; -extern char * _PREHASH_ProfileHollow; -extern char * _PREHASH_GroupRoleChanges; -extern char * _PREHASH_Count; -extern char * _PREHASH_South; -extern char * _PREHASH_ObjectUpdateCompressed; -extern char * _PREHASH_MuteFlags; -extern char * _PREHASH_Group; -extern char * _PREHASH_AgentPause; -extern char * _PREHASH_LanguagesText; -extern char * _PREHASH_Error; -extern char * _PREHASH_InternalScriptMail; -extern char * _PREHASH_FindAgent; -extern char * _PREHASH_AgentData; -extern char * _PREHASH_FolderData; -extern char * _PREHASH_AssetBlock; -extern char * _PREHASH_AcceptNotices; -extern char * _PREHASH_SetGroupAcceptNotices; -extern char * _PREHASH_CloseCircuit; -extern char * _PREHASH_TeleportFinish; -extern char * _PREHASH_PathRevolutions; -extern char * _PREHASH_ClassifiedInfoReply; -extern char * _PREHASH_ParcelInfoReply; -extern char * _PREHASH_AutosaveData; -extern char * _PREHASH_SetStartLocation; -extern char * _PREHASH_PassHours; -extern char * _PREHASH_AttachmentPt; -extern char * _PREHASH_ParcelFlags; -extern char * _PREHASH_NumVotes; -extern char * _PREHASH_AvatarPickerRequest; -extern char * _PREHASH_TeleportLocationRequest; -extern char * _PREHASH_DataHomeLocationRequest; -extern char * _PREHASH_EventNotificationAddRequest; -extern char * _PREHASH_ParcelDwellRequest; -extern char * _PREHASH_EventLocationRequest; -extern char * _PREHASH_SetStartLocationRequest; -extern char * _PREHASH_QueryStart; -extern char * _PREHASH_EjectData; -extern char * _PREHASH_AvatarTextureUpdate; -extern char * _PREHASH_RPCServerPort; -extern char * _PREHASH_Bytes; -extern char * _PREHASH_Extra; -extern char * _PREHASH_ForceScriptControlRelease; -extern char * _PREHASH_ParcelRelease; -extern char * _PREHASH_VFileType; -extern char * _PREHASH_EjectGroupMemberReply; -extern char * _PREHASH_ImageData; -extern char * _PREHASH_SimulatorViewerTimeMessage; -extern char * _PREHASH_Rotation; -extern char * _PREHASH_Selection; -extern char * _PREHASH_TransactionData; -extern char * _PREHASH_OperationData; -extern char * _PREHASH_ExpirationDate; -extern char * _PREHASH_ParcelDeedToGroup; -extern char * _PREHASH_AvatarPicksReply; -extern char * _PREHASH_GroupTitlesReply; -extern char * _PREHASH_AgentInfo; -extern char * _PREHASH_MoneyTransferBackend; -extern char * _PREHASH_NextOwnerMask; -extern char * _PREHASH_MuteData; -extern char * _PREHASH_PassPrice; -extern char * _PREHASH_SourceID; -extern char * _PREHASH_ChangeUserRights; -extern char * _PREHASH_TeleportFlags; -extern char * _PREHASH_SlaveParcelData; -extern char * _PREHASH_AssetData; -extern char * _PREHASH_MultipleObjectUpdate; -extern char * _PREHASH_ObjectUpdate; -extern char * _PREHASH_ImprovedTerseObjectUpdate; -extern char * _PREHASH_ConfirmXferPacket; -extern char * _PREHASH_StartPingCheck; -extern char * _PREHASH_SimWideDeletes; -extern char * _PREHASH_LandStatReply; -extern char * _PREHASH_IsPhantom; -extern char * _PREHASH_AgentList; -extern char * _PREHASH_SimApproved; -extern char * _PREHASH_RezObject; -extern char * _PREHASH_TaskLocalID; -extern char * _PREHASH_ClaimDate; -extern char * _PREHASH_MergeParcel; -extern char * _PREHASH_Priority; -extern char * _PREHASH_QueryText; -extern char * _PREHASH_GroupNoticeAdd; -extern char * _PREHASH_ReturnType; -extern char * _PREHASH_FetchFolders; -extern char * _PREHASH_SimulatorPublicHostBlock; -extern char * _PREHASH_HeaderData; -extern char * _PREHASH_RequestMultipleObjects; -extern char * _PREHASH_RetrieveInstantMessages; -extern char * _PREHASH_OpenCircuit; -extern char * _PREHASH_CrossedRegion; -extern char * _PREHASH_DirGroupsReply; -extern char * _PREHASH_AvatarGroupsReply; -extern char * _PREHASH_EmailMessageReply; -extern char * _PREHASH_GroupVoteHistoryItemReply; -extern char * _PREHASH_ViewerPosition; -extern char * _PREHASH_Position; -extern char * _PREHASH_ParentEstate; -extern char * _PREHASH_EstateName; -extern char * _PREHASH_MuteName; -extern char * _PREHASH_ParcelRename; -extern char * _PREHASH_ViewerFilename; -extern char * _PREHASH_UserReportInternal; -extern char * _PREHASH_AvatarPropertiesRequest; -extern char * _PREHASH_ParcelPropertiesRequest; -extern char * _PREHASH_GroupProfileRequest; -extern char * _PREHASH_AgentDataUpdateRequest; -extern char * _PREHASH_PriceObjectScaleFactor; -extern char * _PREHASH_OpenEnrollment; -extern char * _PREHASH_GroupData; -extern char * _PREHASH_RequestGodlikePowers; -extern char * _PREHASH_GrantGodlikePowers; -extern char * _PREHASH_TransactionID; -extern char * _PREHASH_DestinationID; -extern char * _PREHASH_Controls; -extern char * _PREHASH_FirstDetachAll; -extern char * _PREHASH_EstateID; -extern char * _PREHASH_ImprovedInstantMessage; -extern char * _PREHASH_CheckParcelSales; -extern char * _PREHASH_ParcelSales; -extern char * _PREHASH_CurrentInterval; -extern char * _PREHASH_PriceRentLight; -extern char * _PREHASH_MediaAutoScale; -extern char * _PREHASH_NeighborBlock; -extern char * _PREHASH_LayerData; -extern char * _PREHASH_NVPairData; -extern char * _PREHASH_TeleportLocal; -extern char * _PREHASH_EjecteeID; -extern char * _PREHASH_VoteInitiator; -extern char * _PREHASH_TypeData; -extern char * _PREHASH_OwnerIDs; -extern char * _PREHASH_SystemKickUser; -extern char * _PREHASH_TransactionTime; -extern char * _PREHASH_TimeToLive; -extern char * _PREHASH_OldAgentID; -extern char * _PREHASH_MusicURL; -extern char * _PREHASH_ParcelPrimBonus; -extern char * _PREHASH_EjectUser; -extern char * _PREHASH_CoarseLocationUpdate; -extern char * _PREHASH_ChildAgentPositionUpdate; -extern char * _PREHASH_StoreLocal; -extern char * _PREHASH_GroupName; -extern char * _PREHASH_PriceParcelRent; -extern char * _PREHASH_SimStatus; -extern char * _PREHASH_TransactionSuccess; -extern char * _PREHASH_LureType; -extern char * _PREHASH_GroupMask; -extern char * _PREHASH_SitObject; -extern char * _PREHASH_Override; -extern char * _PREHASH_LocomotionState; -extern char * _PREHASH_PriceUpload; -extern char * _PREHASH_RemoveParcel; -extern char * _PREHASH_ConfirmAuctionStart; -extern char * _PREHASH_RpcScriptRequestInbound; -extern char * _PREHASH_ActiveGroupID; -extern char * _PREHASH_ParcelReturnObjects; -extern char * _PREHASH_TotalObjects; -extern char * _PREHASH_ObjectExtraParams; -extern char * _PREHASH_Questions; -extern char * _PREHASH_TransferAbort; -extern char * _PREHASH_TransferInventory; -extern char * _PREHASH_RayTargetID; -extern char * _PREHASH_ClaimPrice; -extern char * _PREHASH_ObjectProperties; -extern char * _PREHASH_ParcelProperties; -extern char * _PREHASH_EstateOwnerID; -extern char * _PREHASH_LogoutRequest; -extern char * _PREHASH_AssetUploadRequest; -extern char * _PREHASH_TransactionType; -extern char * _PREHASH_AvatarPropertiesUpdate; -extern char * _PREHASH_ParcelPropertiesUpdate; -extern char * _PREHASH_FetchItems; -extern char * _PREHASH_AbortXfer; -extern char * _PREHASH_DeRezAck; -extern char * _PREHASH_TakeControls; -extern char * _PREHASH_DirLandReply; -extern char * _PREHASH_MuteType; -extern char * _PREHASH_IMViaEMail; -extern char * _PREHASH_RentPrice; -extern char * _PREHASH_GenericMessage; -extern char * _PREHASH_ChildAgentAlive; -extern char * _PREHASH_AssetType; -extern char * _PREHASH_SpawnPointBlock; -extern char * _PREHASH_AttachmentBlock; -extern char * _PREHASH_ObjectMaterial; -extern char * _PREHASH_OwnerName; -extern char * _PREHASH_AvatarNotesReply; -extern char * _PREHASH_CacheID; -extern char * _PREHASH_OwnerMask; -extern char * _PREHASH_TransferInventoryAck; -extern char * _PREHASH_RegionDenyAgeUnverified; -extern char * _PREHASH_AgeVerificationBlock; -extern char * _PREHASH_UCoord; -extern char * _PREHASH_VCoord; -extern char * _PREHASH_FaceIndex; -extern char * _PREHASH_StatusData; -extern char * _PREHASH_ProductSKU; +extern char const* const _PREHASH_X; +extern char const* const _PREHASH_Y; +extern char const* const _PREHASH_Z; +extern char const* const _PREHASH_AddFlags; +extern char const* const _PREHASH_FailureInfo; +extern char const* const _PREHASH_MapData; +extern char const* const _PREHASH_AddItem; +extern char const* const _PREHASH_MeanCollision; +extern char const* const _PREHASH_RezScript; +extern char const* const _PREHASH_AvatarSitResponse; +extern char const* const _PREHASH_InventoryAssetResponse; +extern char const* const _PREHASH_KillObject; +extern char const* const _PREHASH_ProposalID; +extern char const* const _PREHASH_SerialNum; +extern char const* const _PREHASH_Duration; +extern char const* const _PREHASH_ScriptQuestion; +extern char const* const _PREHASH_AddCircuitCode; +extern char const* const _PREHASH_UseCircuitCode; +extern char const* const _PREHASH_ViewerCircuitCode; +extern char const* const _PREHASH_ScriptAnswerYes; +extern char const* const _PREHASH_PartnerID; +extern char const* const _PREHASH_DirLandQuery; +extern char const* const _PREHASH_TeleportStart; +extern char const* const _PREHASH_AboutText; +extern char const* const _PREHASH_VisualParam; +extern char const* const _PREHASH_GroupPrims; +extern char const* const _PREHASH_SelectedPrims; +extern char const* const _PREHASH_ID; +extern char const* const _PREHASH_UUIDNameRequest; +extern char const* const _PREHASH_UUIDGroupNameRequest; +extern char const* const _PREHASH_GroupAccountTransactionsRequest; +extern char const* const _PREHASH_MapNameRequest; +extern char const* const _PREHASH_UpdateSimulator; +extern char const* const _PREHASH_BillableFactor; +extern char const* const _PREHASH_ObjectBonusFactor; +extern char const* const _PREHASH_EnableSimulator; +extern char const* const _PREHASH_DisableSimulator; +extern char const* const _PREHASH_ConfirmEnableSimulator; +extern char const* const _PREHASH_LayerType; +extern char const* const _PREHASH_OwnerRole; +extern char const* const _PREHASH_ParcelOverlay; +extern char const* const _PREHASH_GroupOwned; +extern char const* const _PREHASH_IP; +extern char const* const _PREHASH_ChatFromViewer; +extern char const* const _PREHASH_AvgAgentsInView; +extern char const* const _PREHASH_AgentsInView; +extern char const* const _PREHASH_GroupTitle; +extern char const* const _PREHASH_MapLayerReply; +extern char const* const _PREHASH_CompoundMsgID; +extern char const* const _PREHASH_CameraConstraint; +extern char const* const _PREHASH_DownloadTotals; +extern char const* const _PREHASH_GenCounter; +extern char const* const _PREHASH_FrozenData; +extern char const* const _PREHASH_ChildAgentDying; +extern char const* const _PREHASH_To; +extern char const* const _PREHASH_CopyInventoryFromNotecard; +extern char const* const _PREHASH_RezObjectFromNotecard; +extern char const* const _PREHASH_ParcelDirFeeCurrent; +extern char const* const _PREHASH_SeedCapability; +extern char const* const _PREHASH_ObjectDuplicate; +extern char const* const _PREHASH_InventoryData; +extern char const* const _PREHASH_ReplyData; +extern char const* const _PREHASH_ResetList; +extern char const* const _PREHASH_MediaID; +extern char const* const _PREHASH_RelatedRights; +extern char const* const _PREHASH_RedirectGridX; +extern char const* const _PREHASH_RedirectGridY; +extern char const* const _PREHASH_TransferID; +extern char const* const _PREHASH_TexturesChanged; +extern char const* const _PREHASH_UserLookAt; +extern char const* const _PREHASH_TestBlock1; +extern char const* const _PREHASH_SensedData; +extern char const* const _PREHASH_UpdateBlock; +extern char const* const _PREHASH_ClassifiedGodDelete; +extern char const* const _PREHASH_ObjectGrabUpdate; +extern char const* const _PREHASH_LocationPos; +extern char const* const _PREHASH_TaxDate; +extern char const* const _PREHASH_StartDateTime; +extern char const* const _PREHASH_ObjectUpdateCached; +extern char const* const _PREHASH_Packets; +extern char const* const _PREHASH_FailureType; +extern char const* const _PREHASH_UpdateGroupInfo; +extern char const* const _PREHASH_ObjectPermissions; +extern char const* const _PREHASH_RevokePermissions; +extern char const* const _PREHASH_UpdateFlags; +extern char const* const _PREHASH_ObjectExportSelected; +extern char const* const _PREHASH_RezSelected; +extern char const* const _PREHASH_AutoPilot; +extern char const* const _PREHASH_UpdateMuteListEntry; +extern char const* const _PREHASH_RemoveMuteListEntry; +extern char const* const _PREHASH_SetSimStatusInDatabase; +extern char const* const _PREHASH_SetSimPresenceInDatabase; +extern char const* const _PREHASH_CameraProperty; +extern char const* const _PREHASH_BrushSize; +extern char const* const _PREHASH_SimulatorSetMap; +extern char const* const _PREHASH_RegionPresenceRequestByRegionID; +extern char const* const _PREHASH_ParcelObjectOwnersReply; +extern char const* const _PREHASH_GroupMembersReply; +extern char const* const _PREHASH_GroupRoleMembersReply; +extern char const* const _PREHASH_RequestRegionInfo; +extern char const* const _PREHASH_AABBMax; +extern char const* const _PREHASH_RequestPayPrice; +extern char const* const _PREHASH_SimulatorPresentAtLocation; +extern char const* const _PREHASH_AgentRequestSit; +extern char const* const _PREHASH_AABBMin; +extern char const* const _PREHASH_ClassifiedFlags; +extern char const* const _PREHASH_ControlFlags; +extern char const* const _PREHASH_TeleportRequest; +extern char const* const _PREHASH_ScriptTeleportRequest; +extern char const* const _PREHASH_EstateCovenantRequest; +extern char const* const _PREHASH_DateUTC; +extern char const* const _PREHASH_TaskIDs; +extern char const* const _PREHASH_RequestResult; +extern char const* const _PREHASH_CanAcceptAgents; +extern char const* const _PREHASH_ObjectSaleInfo; +extern char const* const _PREHASH_KillChildAgents; +extern char const* const _PREHASH_Balance; +extern char const* const _PREHASH_DerezContainer; +extern char const* const _PREHASH_ObjectData; +extern char const* const _PREHASH_CameraAtAxis; +extern char const* const _PREHASH_InfoBlock; +extern char const* const _PREHASH_OwnershipCost; +extern char const* const _PREHASH_AvatarNotesUpdate; +extern char const* const _PREHASH_PID; +extern char const* const _PREHASH_DirPopularReply; +extern char const* const _PREHASH_TerrainHeightRange00; +extern char const* const _PREHASH_SimData; +extern char const* const _PREHASH_TerrainHeightRange01; +extern char const* const _PREHASH_TerrainHeightRange10; +extern char const* const _PREHASH_TerrainHeightRange11; +extern char const* const _PREHASH_UpdateInventoryItem; +extern char const* const _PREHASH_UpdateCreateInventoryItem; +extern char const* const _PREHASH_MoveInventoryItem; +extern char const* const _PREHASH_CopyInventoryItem; +extern char const* const _PREHASH_LinkInventoryItem; +extern char const* const _PREHASH_RemoveInventoryItem; +extern char const* const _PREHASH_CreateInventoryItem; +extern char const* const _PREHASH_PathTwistBegin; +extern char const* const _PREHASH_CRC; +extern char const* const _PREHASH_AttachmentPoint; +extern char const* const _PREHASH_TelehubBlock; +extern char const* const _PREHASH_FOVBlock; +extern char const* const _PREHASH_StartLocationData; +extern char const* const _PREHASH_PositionData; +extern char const* const _PREHASH_TimeSinceLast; +extern char const* const _PREHASH_MapImage; +extern char const* const _PREHASH_Objects; +extern char const* const _PREHASH_URL; +extern char const* const _PREHASH_CreationDate; +extern char const* const _PREHASH_JointPivot; +extern char const* const _PREHASH_FPS; +extern char const* const _PREHASH_HasTelehub; +extern char const* const _PREHASH_PathEnd; +extern char const* const _PREHASH_ScriptDataReply; +extern char const* const _PREHASH_MapBlockReply; +extern char const* const _PREHASH_PropertiesData; +extern char const* const _PREHASH_ViewerEffect; +extern char const* const _PREHASH_FreezeUser; +extern char const* const _PREHASH_OwnerPrims; +extern char const* const _PREHASH_ObjectGrab; +extern char const* const _PREHASH_ToAgentID; +extern char const* const _PREHASH_SimulatorMapUpdate; +extern char const* const _PREHASH_TransferPacket; +extern char const* const _PREHASH_ObjectName; +extern char const* const _PREHASH_GroupPowers; +extern char const* const _PREHASH_OriginalName; +extern char const* const _PREHASH_CompletePingCheck; +extern char const* const _PREHASH_OnlineStatus; +extern char const* const _PREHASH_ObjectDrop; +extern char const* const _PREHASH_UseBigPackets; +extern char const* const _PREHASH_GroupNoticesListReply; +extern char const* const _PREHASH_ParcelAccessListReply; +extern char const* const _PREHASH_RpcChannelReply; +extern char const* const _PREHASH_RegionPresenceResponse; +extern char const* const _PREHASH_CharterMember; +extern char const* const _PREHASH_EdgeData; +extern char const* const _PREHASH_NameData; +extern char const* const _PREHASH_RegionPushOverride; +extern char const* const _PREHASH_SimName; +extern char const* const _PREHASH_UserReport; +extern char const* const _PREHASH_DownloadPriority; +extern char const* const _PREHASH_ToAgentId; +extern char const* const _PREHASH_DirPopularQuery; +extern char const* const _PREHASH_Mag; +extern char const* const _PREHASH_ParcelPropertiesRequestByID; +extern char const* const _PREHASH_ObjectLink; +extern char const* const _PREHASH_RpcScriptReplyInbound; +extern char const* const _PREHASH_RezData; +extern char const* const _PREHASH_RemoveInventoryObjects; +extern char const* const _PREHASH_GroupProposalBallot; +extern char const* const _PREHASH_RPCServerIP; +extern char const* const _PREHASH_Far; +extern char const* const _PREHASH_GodSessionID; +extern char const* const _PREHASH_FLAboutText; +extern char const* const _PREHASH_RegionHandshakeReply; +extern char const* const _PREHASH_GroupActiveProposalItemReply; +extern char const* const _PREHASH_MapItemReply; +extern char const* const _PREHASH_Seconds; +extern char const* const _PREHASH_UpdateUserInfo; +extern char const* const _PREHASH_AggregatePermTexturesOwner; +extern char const* const _PREHASH_Set; +extern char const* const _PREHASH_NewName; +extern char const* const _PREHASH_Key; +extern char const* const _PREHASH_AgentID; +extern char const* const _PREHASH_EventNotificationRemoveRequest; +extern char const* const _PREHASH_NewFolderID; +extern char const* const _PREHASH_Arc; +extern char const* const _PREHASH_RegionX; +extern char const* const _PREHASH_RegionY; +extern char const* const _PREHASH_RequestData; +extern char const* const _PREHASH_Msg; +extern char const* const _PREHASH_Top; +extern char const* const _PREHASH_MiscStats; +extern char const* const _PREHASH_ImageID; +extern char const* const _PREHASH_DataPacket; +extern char const* const _PREHASH_You; +extern char const* const _PREHASH_ScriptControlChange; +extern char const* const _PREHASH_LoadURL; +extern char const* const _PREHASH_SetCPURatio; +extern char const* const _PREHASH_NameValueData; +extern char const* const _PREHASH_AtomicPassObject; +extern char const* const _PREHASH_ErrorMessage; +extern char const* const _PREHASH_ViewerFrozenMessage; +extern char const* const _PREHASH_HealthMessage; +extern char const* const _PREHASH_LogTextMessage; +extern char const* const _PREHASH_TimeDilation; +extern char const* const _PREHASH_RemoveContribution; +extern char const* const _PREHASH_Contribution; +extern char const* const _PREHASH_SetGroupContribution; +extern char const* const _PREHASH_Offline; +extern char const* const _PREHASH_AgentIsNowWearing; +extern char const* const _PREHASH_Members; +extern char const* const _PREHASH_FailedResends; +extern char const* const _PREHASH_SecPerDay; +extern char const* const _PREHASH_CameraCenter; +extern char const* const _PREHASH_CameraLeftAxis; +extern char const* const _PREHASH_ExBlock; +extern char const* const _PREHASH_Channel; +extern char const* const _PREHASH_NetTest; +extern char const* const _PREHASH_DiscardLevel; +extern char const* const _PREHASH_LayerID; +extern char const* const _PREHASH_GrabOffset; +extern char const* const _PREHASH_SimPort; +extern char const* const _PREHASH_PricePerMeter; +extern char const* const _PREHASH_RegionFlags; +extern char const* const _PREHASH_VoteResult; +extern char const* const _PREHASH_ParcelDirFeeEstimate; +extern char const* const _PREHASH_ModifyBlock; +extern char const* const _PREHASH_InventoryBlock; +extern char const* const _PREHASH_ReplyBlock; +extern char const* const _PREHASH_ValidUntil; +extern char const* const _PREHASH_VelocityInterpolateOn; +extern char const* const _PREHASH_ClassifiedDelete; +extern char const* const _PREHASH_RegionDenyAnonymous; +extern char const* const _PREHASH_FLImageID; +extern char const* const _PREHASH_AllowPublish; +extern char const* const _PREHASH_SitName; +extern char const* const _PREHASH_RegionsVisited; +extern char const* const _PREHASH_DirClassifiedReply; +extern char const* const _PREHASH_AvatarClassifiedReply; +extern char const* const _PREHASH_MediaURL; +extern char const* const _PREHASH_CompleteAgentMovement; +extern char const* const _PREHASH_ClassifiedID; +extern char const* const _PREHASH_LocalID; +extern char const* const _PREHASH_SpaceIP; +extern char const* const _PREHASH_RemoveItem; +extern char const* const _PREHASH_LogFailedMoneyTransaction; +extern char const* const _PREHASH_ViewerStartAuction; +extern char const* const _PREHASH_StartAuction; +extern char const* const _PREHASH_DuplicateFlags; +extern char const* const _PREHASH_RegionInfo2; +extern char const* const _PREHASH_TextColor; +extern char const* const _PREHASH_SlaveID; +extern char const* const _PREHASH_Charter; +extern char const* const _PREHASH_AlertData; +extern char const* const _PREHASH_AlertInfo; +extern char const* const _PREHASH_TargetBlock; +extern char const* const _PREHASH_CheckParcelAuctions; +extern char const* const _PREHASH_ParcelAuctions; +extern char const* const _PREHASH_OwnerIsGroup; +extern char const* const _PREHASH_NameValuePair; +extern char const* const _PREHASH_RemoveNameValuePair; +extern char const* const _PREHASH_BulkUpdateInventory; +extern char const* const _PREHASH_UpdateTaskInventory; +extern char const* const _PREHASH_RemoveTaskInventory; +extern char const* const _PREHASH_MoveTaskInventory; +extern char const* const _PREHASH_RequestTaskInventory; +extern char const* const _PREHASH_ReplyTaskInventory; +extern char const* const _PREHASH_AggregatePermInventory; +extern char const* const _PREHASH_GroupAccountTransactionsReply; +extern char const* const _PREHASH_SimulatorInfo; +extern char const* const _PREHASH_WearableData; +extern char const* const _PREHASH_Enabled; +extern char const* const _PREHASH_Savings; +extern char const* const _PREHASH_SimulatorLoad; +extern char const* const _PREHASH_InternalRegionIP; +extern char const* const _PREHASH_ExternalRegionIP; +extern char const* const _PREHASH_TotalPairs; +extern char const* const _PREHASH_CreateGroupRequest; +extern char const* const _PREHASH_JoinGroupRequest; +extern char const* const _PREHASH_LeaveGroupRequest; +extern char const* const _PREHASH_InviteGroupRequest; +extern char const* const _PREHASH_LiveHelpGroupRequest; +extern char const* const _PREHASH_PriceParcelClaimFactor; +extern char const* const _PREHASH_BillableArea; +extern char const* const _PREHASH_ObjectID; +extern char const* const _PREHASH_ObjectFlagUpdate; +extern char const* const _PREHASH_GroupRoleUpdate; +extern char const* const _PREHASH_RequestInventoryAsset; +extern char const* const _PREHASH_ChangedGrid; +extern char const* const _PREHASH_AgentDropGroup; +extern char const* const _PREHASH_Details; +extern char const* const _PREHASH_LocationX; +extern char const* const _PREHASH_SaleType; +extern char const* const _PREHASH_LocationY; +extern char const* const _PREHASH_LocationZ; +extern char const* const _PREHASH_EconomyData; +extern char const* const _PREHASH_HeadRotation; +extern char const* const _PREHASH_DeleteOnCompletion; +extern char const* const _PREHASH_PublicPort; +extern char const* const _PREHASH_DirClassifiedQuery; +extern char const* const _PREHASH_CallbackID; +extern char const* const _PREHASH_RequestParcelTransfer; +extern char const* const _PREHASH_RoleCount; +extern char const* const _PREHASH_ObjectCapacity; +extern char const* const _PREHASH_RequestID; +extern char const* const _PREHASH_RequestXfer; +extern char const* const _PREHASH_ObjectTaxCurrent; +extern char const* const _PREHASH_LightTaxCurrent; +extern char const* const _PREHASH_LandTaxCurrent; +extern char const* const _PREHASH_GroupTaxCurrent; +extern char const* const _PREHASH_FetchInventoryDescendents; +extern char const* const _PREHASH_InventoryDescendents; +extern char const* const _PREHASH_Descendents; +extern char const* const _PREHASH_PurgeInventoryDescendents; +extern char const* const _PREHASH_ShowDir; +extern char const* const _PREHASH_IsOwner; +extern char const* const _PREHASH_Timestamp; +extern char const* const _PREHASH_GlobalPos; +extern char const* const _PREHASH_GrabOffsetInitial; +extern char const* const _PREHASH_IsTrial; +extern char const* const _PREHASH_ObjectDuplicateOnRay; +extern char const* const _PREHASH_GroupMembershipCount; +extern char const* const _PREHASH_MethodData; +extern char const* const _PREHASH_ActivateGestures; +extern char const* const _PREHASH_DeactivateGestures; +extern char const* const _PREHASH_ProposalData; +extern char const* const _PREHASH_PosGlobal; +extern char const* const _PREHASH_SearchID; +extern char const* const _PREHASH_RezMultipleAttachmentsFromInv; +extern char const* const _PREHASH_SearchName; +extern char const* const _PREHASH_VersionString; +extern char const* const _PREHASH_CreateGroupReply; +extern char const* const _PREHASH_LeaveGroupReply; +extern char const* const _PREHASH_ActualArea; +extern char const* const _PREHASH_Message; +extern char const* const _PREHASH_ClickAction; +extern char const* const _PREHASH_AssetUploadComplete; +extern char const* const _PREHASH_RequestType; +extern char const* const _PREHASH_UUID; +extern char const* const _PREHASH_BaseMask; +extern char const* const _PREHASH_NetBlock; +extern char const* const _PREHASH_GlobalX; +extern char const* const _PREHASH_GlobalY; +extern char const* const _PREHASH_CopyRotates; +extern char const* const _PREHASH_KickUserAck; +extern char const* const _PREHASH_TopPick; +extern char const* const _PREHASH_SessionID; +extern char const* const _PREHASH_GlobalZ; +extern char const* const _PREHASH_DeclineFriendship; +extern char const* const _PREHASH_FormFriendship; +extern char const* const _PREHASH_TerminateFriendship; +extern char const* const _PREHASH_TaskData; +extern char const* const _PREHASH_SimWideMaxPrims; +extern char const* const _PREHASH_TotalPrims; +extern char const* const _PREHASH_ProfileBegin; +extern char const* const _PREHASH_Request; +extern char const* const _PREHASH_GroupAccountDetailsRequest; +extern char const* const _PREHASH_GroupActiveProposalsRequest; +extern char const* const _PREHASH_StringValue; +extern char const* const _PREHASH_Version; +extern char const* const _PREHASH_OtherCount; +extern char const* const _PREHASH_MemberCount; +extern char const* const _PREHASH_ChatData; +extern char const* const _PREHASH_IsGroupOwned; +extern char const* const _PREHASH_EnergyEfficiency; +extern char const* const _PREHASH_PickInfoUpdate; +extern char const* const _PREHASH_PickDelete; +extern char const* const _PREHASH_ScriptReset; +extern char const* const _PREHASH_Requester; +extern char const* const _PREHASH_ForSale; +extern char const* const _PREHASH_NearestLandingRegionReply; +extern char const* const _PREHASH_ParcelID; +extern char const* const _PREHASH_Godlike; +extern char const* const _PREHASH_TotalDebits; +extern char const* const _PREHASH_Direction; +extern char const* const _PREHASH_HealthData; +extern char const* const _PREHASH_LeftAxis; +extern char const* const _PREHASH_LocationBlock; +extern char const* const _PREHASH_ObjectImage; +extern char const* const _PREHASH_TerrainStartHeight00; +extern char const* const _PREHASH_TerrainStartHeight01; +extern char const* const _PREHASH_TerrainStartHeight10; +extern char const* const _PREHASH_TerrainStartHeight11; +extern char const* const _PREHASH_WaterHeight; +extern char const* const _PREHASH_FetchInventoryReply; +extern char const* const _PREHASH_GroupAccountSummaryReply; +extern char const* const _PREHASH_AttachedSound; +extern char const* const _PREHASH_ParamInUse; +extern char const* const _PREHASH_GodKickUser; +extern char const* const _PREHASH_PickName; +extern char const* const _PREHASH_TaskName; +extern char const* const _PREHASH_ObjectCount; +extern char const* const _PREHASH_RegionPresenceRequestByHandle; +extern char const* const _PREHASH_RezSingleAttachmentFromInv; +extern char const* const _PREHASH_ChildAgentUpdate; +extern char const* const _PREHASH_IsOwnerGroup; +extern char const* const _PREHASH_AgentHeightWidth; +extern char const* const _PREHASH_VerticalAngle; +extern char const* const _PREHASH_WearableType; +extern char const* const _PREHASH_AggregatePermNextOwner; +extern char const* const _PREHASH_ShowInList; +extern char const* const _PREHASH_UpdateParcel; +extern char const* const _PREHASH_SetAlwaysRun; +extern char const* const _PREHASH_NVPair; +extern char const* const _PREHASH_SearchType; +extern char const* const _PREHASH_ObjectSpinStart; +extern char const* const _PREHASH_UseEstateSun; +extern char const* const _PREHASH_RegionID; +extern char const* const _PREHASH_AbuseRegionID; +extern char const* const _PREHASH_Creator; +extern char const* const _PREHASH_ProposalText; +extern char const* const _PREHASH_DirEventsReply; +extern char const* const _PREHASH_EventInfoReply; +extern char const* const _PREHASH_UserInfoReply; +extern char const* const _PREHASH_PathRadiusOffset; +extern char const* const _PREHASH_TextureData; +extern char const* const _PREHASH_ChatPass; +extern char const* const _PREHASH_TargetID; +extern char const* const _PREHASH_DefaultPayPrice; +extern char const* const _PREHASH_UserLocation; +extern char const* const _PREHASH_MaxPrims; +extern char const* const _PREHASH_LandmarkID; +extern char const* const _PREHASH_InitiateDownload; +extern char const* const _PREHASH_Name; +extern char const* const _PREHASH_OtherCleanTime; +extern char const* const _PREHASH_ParcelSetOtherCleanTime; +extern char const* const _PREHASH_TeleportPriceExponent; +extern char const* const _PREHASH_Gain; +extern char const* const _PREHASH_PacketAck; +extern char const* const _PREHASH_PathSkew; +extern char const* const _PREHASH_SimulatorShutdownRequest; +extern char const* const _PREHASH_NearestLandingRegionRequest; +extern char const* const _PREHASH_OtherID; +extern char const* const _PREHASH_MemberID; +extern char const* const _PREHASH_MapLayerRequest; +extern char const* const _PREHASH_ObjectScale; +extern char const* const _PREHASH_TargetIP; +extern char const* const _PREHASH_Redo; +extern char const* const _PREHASH_MoneyBalance; +extern char const* const _PREHASH_TrackAgent; +extern char const* const _PREHASH_MaxX; +extern char const* const _PREHASH_Data; +extern char const* const _PREHASH_MaxY; +extern char const* const _PREHASH_TextureAnim; +extern char const* const _PREHASH_ReturnIDs; +extern char const* const _PREHASH_Date; +extern char const* const _PREHASH_AgentWearablesUpdate; +extern char const* const _PREHASH_AgentDataUpdate; +extern char const* const _PREHASH_GroupDataUpdate; +extern char const* const _PREHASH_Hash; +extern char const* const _PREHASH_AgentGroupDataUpdate; +extern char const* const _PREHASH_Left; +extern char const* const _PREHASH_Mask; +extern char const* const _PREHASH_ForceMouselook; +extern char const* const _PREHASH_Success; +extern char const* const _PREHASH_ObjectGroup; +extern char const* const _PREHASH_SunHour; +extern char const* const _PREHASH_MinX; +extern char const* const _PREHASH_ScriptSensorReply; +extern char const* const _PREHASH_MinY; +extern char const* const _PREHASH_Command; +extern char const* const _PREHASH_Desc; +extern char const* const _PREHASH_AttachmentNeedsSave; +extern char const* const _PREHASH_HistoryItemData; +extern char const* const _PREHASH_AgentCachedTexture; +extern char const* const _PREHASH_Subject; +extern char const* const _PREHASH_East; +extern char const* const _PREHASH_QueryReplies; +extern char const* const _PREHASH_ObjectCategory; +extern char const* const _PREHASH_Time; +extern char const* const _PREHASH_CreateLandmarkForEvent; +extern char const* const _PREHASH_ParentID; +extern char const* const _PREHASH_Ping; +extern char const* const _PREHASH_Perp; +extern char const* const _PREHASH_Code; +extern char const* const _PREHASH_InvType; +extern char const* const _PREHASH_AgentFOV; +extern char const* const _PREHASH_Audible; +extern char const* const _PREHASH_AuctionData; +extern char const* const _PREHASH_IDBlock; +extern char const* const _PREHASH_West; +extern char const* const _PREHASH_Undo; +extern char const* const _PREHASH_TotalNumItems; +extern char const* const _PREHASH_Info; +extern char const* const _PREHASH_Area; +extern char const* const _PREHASH_SimCrashed; +extern char const* const _PREHASH_Text; +extern char const* const _PREHASH_PriceGroupCreate; +extern char const* const _PREHASH_ObjectShape; +extern char const* const _PREHASH_GroupRoleDataReply; +extern char const* const _PREHASH_MuteCRC; +extern char const* const _PREHASH_Size; +extern char const* const _PREHASH_FromAddress; +extern char const* const _PREHASH_Body; +extern char const* const _PREHASH_FileData; +extern char const* const _PREHASH_List; +extern char const* const _PREHASH_KickUser; +extern char const* const _PREHASH_OtherPrims; +extern char const* const _PREHASH_RunTime; +extern char const* const _PREHASH_GrantUserRights; +extern char const* const _PREHASH_RpcScriptRequestInboundForward; +extern char const* const _PREHASH_More; +extern char const* const _PREHASH_Majority; +extern char const* const _PREHASH_MetersTraveled; +extern char const* const _PREHASH_Stat; +extern char const* const _PREHASH_SoundID; +extern char const* const _PREHASH_Item; +extern char const* const _PREHASH_User; +extern char const* const _PREHASH_Prey; +extern char const* const _PREHASH_RayStart; +extern char const* const _PREHASH_UsecSinceStart; +extern char const* const _PREHASH_ParcelData; +extern char const* const _PREHASH_CameraUpAxis; +extern char const* const _PREHASH_ScriptDialog; +extern char const* const _PREHASH_MasterParcelData; +extern char const* const _PREHASH_Invalid; +extern char const* const _PREHASH_ProfileCurve; +extern char const* const _PREHASH_ParcelAccessListUpdate; +extern char const* const _PREHASH_MuteListUpdate; +extern char const* const _PREHASH_SendPacket; +extern char const* const _PREHASH_SendXferPacket; +extern char const* const _PREHASH_RegionDenyIdentified; +extern char const* const _PREHASH_NotecardItemID; +extern char const* const _PREHASH_LastName; +extern char const* const _PREHASH_From; +extern char const* const _PREHASH_RoleChange; +extern char const* const _PREHASH_Port; +extern char const* const _PREHASH_MemberTitle; +extern char const* const _PREHASH_LogParcelChanges; +extern char const* const _PREHASH_AgentCachedTextureResponse; +extern char const* const _PREHASH_DeRezObject; +extern char const* const _PREHASH_IsTemporary; +extern char const* const _PREHASH_InsigniaID; +extern char const* const _PREHASH_CheckFlags; +extern char const* const _PREHASH_EventID; +extern char const* const _PREHASH_Selected; +extern char const* const _PREHASH_FromAgentId; +extern char const* const _PREHASH_Type; +extern char const* const _PREHASH_ChatType; +extern char const* const _PREHASH_ReportData; +extern char const* const _PREHASH_RequestBlock; +extern char const* const _PREHASH_GrantData; +extern char const* const _PREHASH_DetachAttachmentIntoInv; +extern char const* const _PREHASH_ParcelDisableObjects; +extern char const* const _PREHASH_Sections; +extern char const* const _PREHASH_GodLevel; +extern char const* const _PREHASH_PayPriceReply; +extern char const* const _PREHASH_QueryID; +extern char const* const _PREHASH_CameraEyeOffset; +extern char const* const _PREHASH_AgentPosition; +extern char const* const _PREHASH_GrabPosition; +extern char const* const _PREHASH_OnlineNotification; +extern char const* const _PREHASH_OfflineNotification; +extern char const* const _PREHASH_SendPostcard; +extern char const* const _PREHASH_RequestFlags; +extern char const* const _PREHASH_GroupAccountSummaryRequest; +extern char const* const _PREHASH_GroupVoteHistoryRequest; +extern char const* const _PREHASH_ParamValue; +extern char const* const _PREHASH_MaxAgents; +extern char const* const _PREHASH_CreateNewOutfitAttachments; +extern char const* const _PREHASH_RegionHandle; +extern char const* const _PREHASH_TeleportProgress; +extern char const* const _PREHASH_AgentQuitCopy; +extern char const* const _PREHASH_AvatarInterestsUpdate; +extern char const* const _PREHASH_GroupNoticeID; +extern char const* const _PREHASH_ParcelName; +extern char const* const _PREHASH_PriceObjectRent; +extern char const* const _PREHASH_OfferCallingCard; +extern char const* const _PREHASH_AcceptCallingCard; +extern char const* const _PREHASH_DeclineCallingCard; +extern char const* const _PREHASH_AgentAccess; +extern char const* const _PREHASH_AgentLegacyAccess; +extern char const* const _PREHASH_AgentMaxAccess; +extern char const* const _PREHASH_DataHomeLocationReply; +extern char const* const _PREHASH_EventLocationReply; +extern char const* const _PREHASH_TerseDateID; +extern char const* const _PREHASH_ObjectOwner; +extern char const* const _PREHASH_AssetID; +extern char const* const _PREHASH_AlertMessage; +extern char const* const _PREHASH_AgentAlertMessage; +extern char const* const _PREHASH_EstateOwnerMessage; +extern char const* const _PREHASH_ParcelMediaCommandMessage; +extern char const* const _PREHASH_Auction; +extern char const* const _PREHASH_Category; +extern char const* const _PREHASH_FilePath; +extern char const* const _PREHASH_ItemFlags; +extern char const* const _PREHASH_Invoice; +extern char const* const _PREHASH_IntervalDays; +extern char const* const _PREHASH_PathScaleX; +extern char const* const _PREHASH_FromTaskID; +extern char const* const _PREHASH_PathScaleY; +extern char const* const _PREHASH_TimeInfo; +extern char const* const _PREHASH_PublicCount; +extern char const* const _PREHASH_ParcelJoin; +extern char const* const _PREHASH_GroupRolesCount; +extern char const* const _PREHASH_SimulatorBlock; +extern char const* const _PREHASH_GroupID; +extern char const* const _PREHASH_AgentVel; +extern char const* const _PREHASH_RequestImage; +extern char const* const _PREHASH_NetStats; +extern char const* const _PREHASH_AgentPos; +extern char const* const _PREHASH_AgentSit; +extern char const* const _PREHASH_Material; +extern char const* const _PREHASH_ObjectDeGrab; +extern char const* const _PREHASH_VelocityInterpolateOff; +extern char const* const _PREHASH_AuthorizedBuyerID; +extern char const* const _PREHASH_AvatarPropertiesReply; +extern char const* const _PREHASH_GroupProfileReply; +extern char const* const _PREHASH_SimOwner; +extern char const* const _PREHASH_SalePrice; +extern char const* const _PREHASH_Animation; +extern char const* const _PREHASH_OwnerID; +extern char const* const _PREHASH_NearestLandingRegionUpdated; +extern char const* const _PREHASH_PassToAgent; +extern char const* const _PREHASH_PreyAgent; +extern char const* const _PREHASH_SimStats; +extern char const* const _PREHASH_LogoutReply; +extern char const* const _PREHASH_FeatureDisabled; +extern char const* const _PREHASH_PhysicalAvatarEventList; +extern char const* const _PREHASH_ObjectLocalID; +extern char const* const _PREHASH_Dropped; +extern char const* const _PREHASH_WebProfilesDisabled; +extern char const* const _PREHASH_Destination; +extern char const* const _PREHASH_MasterID; +extern char const* const _PREHASH_TransferData; +extern char const* const _PREHASH_WantToMask; +extern char const* const _PREHASH_ParcelSelectObjects; +extern char const* const _PREHASH_ExtraParams; +extern char const* const _PREHASH_CreatorID; +extern char const* const _PREHASH_Summary; +extern char const* const _PREHASH_BuyObjectInventory; +extern char const* const _PREHASH_FetchInventory; +extern char const* const _PREHASH_InventoryID; +extern char const* const _PREHASH_PacketNumber; +extern char const* const _PREHASH_SetFollowCamProperties; +extern char const* const _PREHASH_ClearFollowCamProperties; +extern char const* const _PREHASH_SequenceID; +extern char const* const _PREHASH_DataServerLogout; +extern char const* const _PREHASH_NameValue; +extern char const* const _PREHASH_PathShearX; +extern char const* const _PREHASH_PathShearY; +extern char const* const _PREHASH_Velocity; +extern char const* const _PREHASH_SecPerYear; +extern char const* const _PREHASH_FirstName; +extern char const* const _PREHASH_AttachedSoundGainChange; +extern char const* const _PREHASH_LocationID; +extern char const* const _PREHASH_Running; +extern char const* const _PREHASH_AgentThrottle; +extern char const* const _PREHASH_NeighborList; +extern char const* const _PREHASH_PathTaperX; +extern char const* const _PREHASH_PathTaperY; +extern char const* const _PREHASH_AgentRelated; +extern char const* const _PREHASH_GranterBlock; +extern char const* const _PREHASH_UseCachedMuteList; +extern char const* const _PREHASH_FailStats; +extern char const* const _PREHASH_Tempfile; +extern char const* const _PREHASH_BuyerID; +extern char const* const _PREHASH_DirPeopleReply; +extern char const* const _PREHASH_TransferInfo; +extern char const* const _PREHASH_AvatarPickerRequestBackend; +extern char const* const _PREHASH_AvatarPropertiesRequestBackend; +extern char const* const _PREHASH_UpdateData; +extern char const* const _PREHASH_SimFPS; +extern char const* const _PREHASH_ReporterID; +extern char const* const _PREHASH_ButtonLabel; +extern char const* const _PREHASH_GranterID; +extern char const* const _PREHASH_WantToText; +extern char const* const _PREHASH_ReportType; +extern char const* const _PREHASH_SimulatorReady; +extern char const* const _PREHASH_DataBlock; +extern char const* const _PREHASH_AnimationSourceList; +extern char const* const _PREHASH_SubscribeLoad; +extern char const* const _PREHASH_UnsubscribeLoad; +extern char const* const _PREHASH_Packet; +extern char const* const _PREHASH_UndoLand; +extern char const* const _PREHASH_SimAccess; +extern char const* const _PREHASH_AbuserID; +extern char const* const _PREHASH_MembershipFee; +extern char const* const _PREHASH_InviteGroupResponse; +extern char const* const _PREHASH_CreateInventoryFolder; +extern char const* const _PREHASH_UpdateInventoryFolder; +extern char const* const _PREHASH_MoveInventoryFolder; +extern char const* const _PREHASH_RemoveInventoryFolder; +extern char const* const _PREHASH_MoneyData; +extern char const* const _PREHASH_ObjectDeselect; +extern char const* const _PREHASH_NewAssetID; +extern char const* const _PREHASH_ObjectAdd; +extern char const* const _PREHASH_RayEndIsIntersection; +extern char const* const _PREHASH_CompleteAuction; +extern char const* const _PREHASH_CircuitCode; +extern char const* const _PREHASH_AgentMovementComplete; +extern char const* const _PREHASH_ViewerIP; +extern char const* const _PREHASH_Header; +extern char const* const _PREHASH_GestureFlags; +extern char const* const _PREHASH_XferID; +extern char const* const _PREHASH_StatValue; +extern char const* const _PREHASH_TaskID; +extern char const* const _PREHASH_PickID; +extern char const* const _PREHASH_RayEnd; +extern char const* const _PREHASH_Throttles; +extern char const* const _PREHASH_RebakeAvatarTextures; +extern char const* const _PREHASH_UpAxis; +extern char const* const _PREHASH_AgentTextures; +extern char const* const _PREHASH_NotecardData; +extern char const* const _PREHASH_Radius; +extern char const* const _PREHASH_OffCircuit; +extern char const* const _PREHASH_Access; +extern char const* const _PREHASH_TitleRoleID; +extern char const* const _PREHASH_SquareMetersCredit; +extern char const* const _PREHASH_Filename; +extern char const* const _PREHASH_ClassifiedInfoRequest; +extern char const* const _PREHASH_ParcelInfoRequest; +extern char const* const _PREHASH_ParcelObjectOwnersRequest; +extern char const* const _PREHASH_TeleportLandmarkRequest; +extern char const* const _PREHASH_EventInfoRequest; +extern char const* const _PREHASH_MoneyBalanceRequest; +extern char const* const _PREHASH_GroupMembersRequest; +extern char const* const _PREHASH_GroupRoleMembersRequest; +extern char const* const _PREHASH_ChatFromSimulator; +extern char const* const _PREHASH_OldFolderID; +extern char const* const _PREHASH_UserInfoRequest; +extern char const* const _PREHASH_TextureID; +extern char const* const _PREHASH_ProfileURL; +extern char const* const _PREHASH_Handle; +extern char const* const _PREHASH_ButtonIndex; +extern char const* const _PREHASH_GetScriptRunning; +extern char const* const _PREHASH_SetScriptRunning; +extern char const* const _PREHASH_Health; +extern char const* const _PREHASH_CircuitInfo; +extern char const* const _PREHASH_ObjectBuy; +extern char const* const _PREHASH_ProfileEnd; +extern char const* const _PREHASH_Effect; +extern char const* const _PREHASH_TestMessage; +extern char const* const _PREHASH_ScriptMailRegistration; +extern char const* const _PREHASH_AgentSetAppearance; +extern char const* const _PREHASH_AvatarAppearance; +extern char const* const _PREHASH_RegionData; +extern char const* const _PREHASH_RequestingRegionData; +extern char const* const _PREHASH_LandingRegionData; +extern char const* const _PREHASH_SitTransform; +extern char const* const _PREHASH_TerrainBase0; +extern char const* const _PREHASH_SkillsMask; +extern char const* const _PREHASH_AtAxis; +extern char const* const _PREHASH_TerrainBase1; +extern char const* const _PREHASH_Reason; +extern char const* const _PREHASH_TerrainBase2; +extern char const* const _PREHASH_TerrainBase3; +extern char const* const _PREHASH_Params; +extern char const* const _PREHASH_PingID; +extern char const* const _PREHASH_Change; +extern char const* const _PREHASH_Height; +extern char const* const _PREHASH_Region; +extern char const* const _PREHASH_TelehubInfo; +extern char const* const _PREHASH_StateSave; +extern char const* const _PREHASH_RoleData; +extern char const* const _PREHASH_AgentAnimation; +extern char const* const _PREHASH_AvatarAnimation; +extern char const* const _PREHASH_LogDwellTime; +extern char const* const _PREHASH_ParcelGodMarkAsContent; +extern char const* const _PREHASH_UsePhysics; +extern char const* const _PREHASH_RegionDenyTransacted; +extern char const* const _PREHASH_JointType; +extern char const* const _PREHASH_ObjectTaxEstimate; +extern char const* const _PREHASH_LightTaxEstimate; +extern char const* const _PREHASH_LandTaxEstimate; +extern char const* const _PREHASH_TeleportLandingStatusChanged; +extern char const* const _PREHASH_GroupTaxEstimate; +extern char const* const _PREHASH_AvgViewerFPS; +extern char const* const _PREHASH_Buttons; +extern char const* const _PREHASH_Sender; +extern char const* const _PREHASH_Dialog; +extern char const* const _PREHASH_TargetData; +extern char const* const _PREHASH_DestID; +extern char const* const _PREHASH_PricePublicObjectDelete; +extern char const* const _PREHASH_ObjectDelete; +extern char const* const _PREHASH_Delete; +extern char const* const _PREHASH_EventGodDelete; +extern char const* const _PREHASH_LastTaxDate; +extern char const* const _PREHASH_MapImageID; +extern char const* const _PREHASH_EndDateTime; +extern char const* const _PREHASH_TerrainDetail0; +extern char const* const _PREHASH_TerrainDetail1; +extern char const* const _PREHASH_TerrainDetail2; +extern char const* const _PREHASH_TerrainDetail3; +extern char const* const _PREHASH_Offset; +extern char const* const _PREHASH_ObjectDelink; +extern char const* const _PREHASH_TargetObject; +extern char const* const _PREHASH_IsEstateManager; +extern char const* const _PREHASH_CancelAuction; +extern char const* const _PREHASH_ObjectDetach; +extern char const* const _PREHASH_Compressed; +extern char const* const _PREHASH_PathBegin; +extern char const* const _PREHASH_BypassRaycast; +extern char const* const _PREHASH_WinnerID; +extern char const* const _PREHASH_ChannelType; +extern char const* const _PREHASH_NonExemptMembers; +extern char const* const _PREHASH_Agents; +extern char const* const _PREHASH_MemberData; +extern char const* const _PREHASH_ToGroupID; +extern char const* const _PREHASH_ImageNotInDatabase; +extern char const* const _PREHASH_StartDate; +extern char const* const _PREHASH_AnimID; +extern char const* const _PREHASH_Serial; +extern char const* const _PREHASH_AbuseRegionName; +extern char const* const _PREHASH_ModifyLand; +extern char const* const _PREHASH_Digest; +extern char const* const _PREHASH_Victim; +extern char const* const _PREHASH_Script; +extern char const* const _PREHASH_PickInfoReply; +extern char const* const _PREHASH_MoneyBalanceReply; +extern char const* const _PREHASH_RoutedMoneyBalanceReply; +extern char const* const _PREHASH_RoleID; +extern char const* const _PREHASH_RegionInfo; +extern char const* const _PREHASH_GodUpdateRegionInfo; +extern char const* const _PREHASH_StartAnim; +extern char const* const _PREHASH_Action; +extern char const* const _PREHASH_Location; +extern char const* const _PREHASH_Rights; +extern char const* const _PREHASH_SearchDir; +extern char const* const _PREHASH_TransferRequest; +extern char const* const _PREHASH_ScriptSensorRequest; +extern char const* const _PREHASH_MoneyTransferRequest; +extern char const* const _PREHASH_EjectGroupMemberRequest; +extern char const* const _PREHASH_SkillsText; +extern char const* const _PREHASH_Resent; +extern char const* const _PREHASH_Center; +extern char const* const _PREHASH_SharedData; +extern char const* const _PREHASH_PSBlock; +extern char const* const _PREHASH_UUIDNameBlock; +extern char const* const _PREHASH_GroupTitleUpdate; +extern char const* const _PREHASH_Method; +extern char const* const _PREHASH_TouchName; +extern char const* const _PREHASH_UpdateType; +extern char const* const _PREHASH_KickedFromEstateID; +extern char const* const _PREHASH_CandidateID; +extern char const* const _PREHASH_ParamData; +extern char const* const _PREHASH_GodlikeMessage; +extern char const* const _PREHASH_SystemMessage; +extern char const* const _PREHASH_BodyRotation; +extern char const* const _PREHASH_SearchRegions; +extern char const* const _PREHASH_AnimationData; +extern char const* const _PREHASH_StatID; +extern char const* const _PREHASH_ItemID; +extern char const* const _PREHASH_ScriptDialogReply; +extern char const* const _PREHASH_RegionIDAndHandleReply; +extern char const* const _PREHASH_CameraAtOffset; +extern char const* const _PREHASH_VoteID; +extern char const* const _PREHASH_ParcelGodForceOwner; +extern char const* const _PREHASH_Filter; +extern char const* const _PREHASH_InviteData; +extern char const* const _PREHASH_PCode; +extern char const* const _PREHASH_SearchPos; +extern char const* const _PREHASH_PreyID; +extern char const* const _PREHASH_TerrainLowerLimit; +extern char const* const _PREHASH_EventFlags; +extern char const* const _PREHASH_TallyVotes; +extern char const* const _PREHASH_Result; +extern char const* const _PREHASH_LookAt; +extern char const* const _PREHASH_SearchOrder; +extern char const* const _PREHASH_PayButton; +extern char const* const _PREHASH_SelfCount; +extern char const* const _PREHASH_PacketCount; +extern char const* const _PREHASH_ParcelBuyPass; +extern char const* const _PREHASH_OldItemID; +extern char const* const _PREHASH_RegionPort; +extern char const* const _PREHASH_PriceEnergyUnit; +extern char const* const _PREHASH_Bitmap; +extern char const* const _PREHASH_CacheMissType; +extern char const* const _PREHASH_VFileID; +extern char const* const _PREHASH_GroupInsigniaID; +extern char const* const _PREHASH_Online; +extern char const* const _PREHASH_KickFlags; +extern char const* const _PREHASH_CovenantID; +extern char const* const _PREHASH_SysCPU; +extern char const* const _PREHASH_EMail; +extern char const* const _PREHASH_AggregatePermTextures; +extern char const* const _PREHASH_ChatChannel; +extern char const* const _PREHASH_ReturnID; +extern char const* const _PREHASH_ObjectAttach; +extern char const* const _PREHASH_TargetPort; +extern char const* const _PREHASH_ObjectSpinStop; +extern char const* const _PREHASH_FullID; +extern char const* const _PREHASH_ActivateGroup; +extern char const* const _PREHASH_SysGPU; +extern char const* const _PREHASH_AvatarInterestsReply; +extern char const* const _PREHASH_StartLure; +extern char const* const _PREHASH_SysRAM; +extern char const* const _PREHASH_ObjectPosition; +extern char const* const _PREHASH_SitPosition; +extern char const* const _PREHASH_StartTime; +extern char const* const _PREHASH_BornOn; +extern char const* const _PREHASH_CameraCollidePlane; +extern char const* const _PREHASH_EconomyDataRequest; +extern char const* const _PREHASH_TeleportLureRequest; +extern char const* const _PREHASH_FolderID; +extern char const* const _PREHASH_RegionHandleRequest; +extern char const* const _PREHASH_ScriptDataRequest; +extern char const* const _PREHASH_GroupRoleDataRequest; +extern char const* const _PREHASH_GroupTitlesRequest; +extern char const* const _PREHASH_AgentWearablesRequest; +extern char const* const _PREHASH_MapBlockRequest; +extern char const* const _PREHASH_LureID; +extern char const* const _PREHASH_CopyCenters; +extern char const* const _PREHASH_ParamList; +extern char const* const _PREHASH_InventorySerial; +extern char const* const _PREHASH_EdgeDataPacket; +extern char const* const _PREHASH_AvatarPickerReply; +extern char const* const _PREHASH_ParcelDwellReply; +extern char const* const _PREHASH_IsForSale; +extern char const* const _PREHASH_MuteID; +extern char const* const _PREHASH_MeanCollisionAlert; +extern char const* const _PREHASH_CanAcceptTasks; +extern char const* const _PREHASH_ItemData; +extern char const* const _PREHASH_AnimationList; +extern char const* const _PREHASH_Reputation; +extern char const* const _PREHASH_IntValue; +extern char const* const _PREHASH_TargetType; +extern char const* const _PREHASH_Amount; +extern char const* const _PREHASH_HasAttachment; +extern char const* const _PREHASH_UpdateAttachment; +extern char const* const _PREHASH_RemoveAttachment; +extern char const* const _PREHASH_HeightWidthBlock; +extern char const* const _PREHASH_RequestObjectPropertiesFamily; +extern char const* const _PREHASH_ObjectPropertiesFamily; +extern char const* const _PREHASH_UserData; +extern char const* const _PREHASH_IsReadable; +extern char const* const _PREHASH_PathCurve; +extern char const* const _PREHASH_Status; +extern char const* const _PREHASH_FromGroup; +extern char const* const _PREHASH_AlreadyVoted; +extern char const* const _PREHASH_PlacesReply; +extern char const* const _PREHASH_DirPlacesReply; +extern char const* const _PREHASH_ParcelBuy; +extern char const* const _PREHASH_DirFindQueryBackend; +extern char const* const _PREHASH_DirPlacesQueryBackend; +extern char const* const _PREHASH_DirClassifiedQueryBackend; +extern char const* const _PREHASH_DirLandQueryBackend; +extern char const* const _PREHASH_DirPopularQueryBackend; +extern char const* const _PREHASH_HistoryData; +extern char const* const _PREHASH_SnapshotID; +extern char const* const _PREHASH_Aspect; +extern char const* const _PREHASH_ParamSize; +extern char const* const _PREHASH_VoteCast; +extern char const* const _PREHASH_CastsShadows; +extern char const* const _PREHASH_EveryoneMask; +extern char const* const _PREHASH_ObjectSpinUpdate; +extern char const* const _PREHASH_MaturePublish; +extern char const* const _PREHASH_UseExistingAsset; +extern char const* const _PREHASH_Powers; +extern char const* const _PREHASH_ParcelLocalID; +extern char const* const _PREHASH_TeleportCancel; +extern char const* const _PREHASH_UnixTime; +extern char const* const _PREHASH_QueryFlags; +extern char const* const _PREHASH_AlwaysRun; +extern char const* const _PREHASH_Bottom; +extern char const* const _PREHASH_ButtonData; +extern char const* const _PREHASH_SoundData; +extern char const* const _PREHASH_ViewerStats; +extern char const* const _PREHASH_RegionHandshake; +extern char const* const _PREHASH_ObjectDescription; +extern char const* const _PREHASH_Description; +extern char const* const _PREHASH_ParamType; +extern char const* const _PREHASH_UUIDNameReply; +extern char const* const _PREHASH_UUIDGroupNameReply; +extern char const* const _PREHASH_SaveAssetIntoInventory; +extern char const* const _PREHASH_UserInfo; +extern char const* const _PREHASH_AnimSequenceID; +extern char const* const _PREHASH_NVPairs; +extern char const* const _PREHASH_GroupNoticesListRequest; +extern char const* const _PREHASH_ParcelAccessListRequest; +extern char const* const _PREHASH_MuteListRequest; +extern char const* const _PREHASH_RpcChannelRequest; +extern char const* const _PREHASH_LandStatRequest; +extern char const* const _PREHASH_PlacesQuery; +extern char const* const _PREHASH_DirPlacesQuery; +extern char const* const _PREHASH_SortOrder; +extern char const* const _PREHASH_Hunter; +extern char const* const _PREHASH_SunAngVelocity; +extern char const* const _PREHASH_BinaryBucket; +extern char const* const _PREHASH_ImagePacket; +extern char const* const _PREHASH_StartGroupProposal; +extern char const* const _PREHASH_EnergyLevel; +extern char const* const _PREHASH_PriceForListing; +extern char const* const _PREHASH_Scale; +extern char const* const _PREHASH_EstateCovenantReply; +extern char const* const _PREHASH_ParentEstateID; +extern char const* const _PREHASH_Extra2; +extern char const* const _PREHASH_Throttle; +extern char const* const _PREHASH_SimIP; +extern char const* const _PREHASH_GodID; +extern char const* const _PREHASH_TeleportMinPrice; +extern char const* const _PREHASH_VoteItem; +extern char const* const _PREHASH_ObjectRotation; +extern char const* const _PREHASH_SitRotation; +extern char const* const _PREHASH_SnapSelection; +extern char const* const _PREHASH_SoundTrigger; +extern char const* const _PREHASH_TerrainRaiseLimit; +extern char const* const _PREHASH_Quorum; +extern char const* const _PREHASH_AgentBlock; +extern char const* const _PREHASH_CommandBlock; +extern char const* const _PREHASH_PricePublicObjectDecay; +extern char const* const _PREHASH_SpawnPointPos; +extern char const* const _PREHASH_VolumeDetail; +extern char const* const _PREHASH_FromAgentName; +extern char const* const _PREHASH_Range; +extern char const* const _PREHASH_DirectoryVisibility; +extern char const* const _PREHASH_PublicIP; +extern char const* const _PREHASH_TeleportFailed; +extern char const* const _PREHASH_PreloadSound; +extern char const* const _PREHASH_ScreenshotID; +extern char const* const _PREHASH_CovenantTimestamp; +extern char const* const _PREHASH_OldestUnacked; +extern char const* const _PREHASH_SimulatorIP; +extern char const* const _PREHASH_Value; +extern char const* const _PREHASH_JointAxisOrAnchor; +extern char const* const _PREHASH_Test0; +extern char const* const _PREHASH_Test1; +extern char const* const _PREHASH_Test2; +extern char const* const _PREHASH_SunPhase; +extern char const* const _PREHASH_ParcelDivide; +extern char const* const _PREHASH_PriceObjectClaim; +extern char const* const _PREHASH_Field; +extern char const* const _PREHASH_Ratio; +extern char const* const _PREHASH_JoinGroupReply; +extern char const* const _PREHASH_LiveHelpGroupReply; +extern char const* const _PREHASH_Score; +extern char const* const _PREHASH_Image; +extern char const* const _PREHASH_ObjectClickAction; +extern char const* const _PREHASH_Parameter; +extern char const* const _PREHASH_Flags; +extern char const* const _PREHASH_Plane; +extern char const* const _PREHASH_Width; +extern char const* const _PREHASH_Right; +extern char const* const _PREHASH_DirFindQuery; +extern char const* const _PREHASH_Textures; +extern char const* const _PREHASH_EventData; +extern char const* const _PREHASH_Final; +extern char const* const _PREHASH_System; +extern char const* const _PREHASH_TelehubPos; +extern char const* const _PREHASH_ReportAutosaveCrash; +extern char const* const _PREHASH_CreateTrustedCircuit; +extern char const* const _PREHASH_DenyTrustedCircuit; +extern char const* const _PREHASH_RequestTrustedCircuit; +extern char const* const _PREHASH_Codec; +extern char const* const _PREHASH_Modal; +extern char const* const _PREHASH_ChildAgentUnknown; +extern char const* const _PREHASH_LandingType; +extern char const* const _PREHASH_ScriptRunningReply; +extern char const* const _PREHASH_Reply; +extern char const* const _PREHASH_GroupAccountDetailsReply; +extern char const* const _PREHASH_TelehubRot; +extern char const* const _PREHASH_AcceptFriendship; +extern char const* const _PREHASH_ItemType; +extern char const* const _PREHASH_DwellInfo; +extern char const* const _PREHASH_AgentResume; +extern char const* const _PREHASH_MailFilter; +extern char const* const _PREHASH_Disconnect; +extern char const* const _PREHASH_SimPosition; +extern char const* const _PREHASH_SimWideTotalPrims; +extern char const* const _PREHASH_Index; +extern char const* const _PREHASH_SimFilename; +extern char const* const _PREHASH_LastOwnerID; +extern char const* const _PREHASH_GroupNoticeRequest; +extern char const* const _PREHASH_EmailMessageRequest; +extern char const* const _PREHASH_MapItemRequest; +extern char const* const _PREHASH_AgentCount; +extern char const* const _PREHASH_MessageBlock; +extern char const* const _PREHASH_FuseBlock; +extern char const* const _PREHASH_AgentGroupData; +extern char const* const _PREHASH_ClassifiedInfoUpdate; +extern char const* const _PREHASH_RegionPos; +extern char const* const _PREHASH_ParcelMediaUpdate; +extern char const* const _PREHASH_NoticeID; +extern char const* const _PREHASH_GridX; +extern char const* const _PREHASH_GridY; +extern char const* const _PREHASH_Title; +extern char const* const _PREHASH_AuctionID; +extern char const* const _PREHASH_VoteType; +extern char const* const _PREHASH_CategoryID; +extern char const* const _PREHASH_Token; +extern char const* const _PREHASH_AggregatePerms; +extern char const* const _PREHASH_ObjectSelect; +extern char const* const _PREHASH_ForceObjectSelect; +extern char const* const _PREHASH_Price; +extern char const* const _PREHASH_SunDirection; +extern char const* const _PREHASH_FromName; +extern char const* const _PREHASH_ChangeInventoryItemFlags; +extern char const* const _PREHASH_Force; +extern char const* const _PREHASH_TransactionBlock; +extern char const* const _PREHASH_PowersMask; +extern char const* const _PREHASH_Stamp; +extern char const* const _PREHASH_TotalCredits; +extern char const* const _PREHASH_State; +extern char const* const _PREHASH_TextureIndex; +extern char const* const _PREHASH_InviteeID; +extern char const* const _PREHASH_ParcelReclaim; +extern char const* const _PREHASH_Money; +extern char const* const _PREHASH_PathTwist; +extern char const* const _PREHASH_AuthBuyerID; +extern char const* const _PREHASH_Color; +extern char const* const _PREHASH_SourceType; +extern char const* const _PREHASH_World; +extern char const* const _PREHASH_QueryData; +extern char const* const _PREHASH_Users; +extern char const* const _PREHASH_SysOS; +extern char const* const _PREHASH_Notes; +extern char const* const _PREHASH_AvatarID; +extern char const* const _PREHASH_FounderID; +extern char const* const _PREHASH_EndPointID; +extern char const* const _PREHASH_LocationLookAt; +extern char const* const _PREHASH_Sound; +extern char const* const _PREHASH_Cover; +extern char const* const _PREHASH_TotalObjectCount; +extern char const* const _PREHASH_TextureEntry; +extern char const* const _PREHASH_SquareMetersCommitted; +extern char const* const _PREHASH_ChannelID; +extern char const* const _PREHASH_Dwell; +extern char const* const _PREHASH_North; +extern char const* const _PREHASH_AgentUpdate; +extern char const* const _PREHASH_PickGodDelete; +extern char const* const _PREHASH_HostName; +extern char const* const _PREHASH_PriceParcelClaim; +extern char const* const _PREHASH_ParcelClaim; +extern char const* const _PREHASH_AgentPowers; +extern char const* const _PREHASH_ProfileHollow; +extern char const* const _PREHASH_GroupRoleChanges; +extern char const* const _PREHASH_Count; +extern char const* const _PREHASH_South; +extern char const* const _PREHASH_ObjectUpdateCompressed; +extern char const* const _PREHASH_MuteFlags; +extern char const* const _PREHASH_Group; +extern char const* const _PREHASH_AgentPause; +extern char const* const _PREHASH_LanguagesText; +extern char const* const _PREHASH_Error; +extern char const* const _PREHASH_InternalScriptMail; +extern char const* const _PREHASH_FindAgent; +extern char const* const _PREHASH_AgentData; +extern char const* const _PREHASH_FolderData; +extern char const* const _PREHASH_AssetBlock; +extern char const* const _PREHASH_AcceptNotices; +extern char const* const _PREHASH_SetGroupAcceptNotices; +extern char const* const _PREHASH_CloseCircuit; +extern char const* const _PREHASH_TeleportFinish; +extern char const* const _PREHASH_PathRevolutions; +extern char const* const _PREHASH_ClassifiedInfoReply; +extern char const* const _PREHASH_ParcelInfoReply; +extern char const* const _PREHASH_AutosaveData; +extern char const* const _PREHASH_SetStartLocation; +extern char const* const _PREHASH_PassHours; +extern char const* const _PREHASH_AttachmentPt; +extern char const* const _PREHASH_ParcelFlags; +extern char const* const _PREHASH_NumVotes; +extern char const* const _PREHASH_AvatarPickerRequest; +extern char const* const _PREHASH_TeleportLocationRequest; +extern char const* const _PREHASH_DataHomeLocationRequest; +extern char const* const _PREHASH_EventNotificationAddRequest; +extern char const* const _PREHASH_ParcelDwellRequest; +extern char const* const _PREHASH_EventLocationRequest; +extern char const* const _PREHASH_SetStartLocationRequest; +extern char const* const _PREHASH_QueryStart; +extern char const* const _PREHASH_EjectData; +extern char const* const _PREHASH_AvatarTextureUpdate; +extern char const* const _PREHASH_RPCServerPort; +extern char const* const _PREHASH_Bytes; +extern char const* const _PREHASH_Extra; +extern char const* const _PREHASH_ForceScriptControlRelease; +extern char const* const _PREHASH_ParcelRelease; +extern char const* const _PREHASH_VFileType; +extern char const* const _PREHASH_EjectGroupMemberReply; +extern char const* const _PREHASH_ImageData; +extern char const* const _PREHASH_SimulatorViewerTimeMessage; +extern char const* const _PREHASH_Rotation; +extern char const* const _PREHASH_Selection; +extern char const* const _PREHASH_TransactionData; +extern char const* const _PREHASH_OperationData; +extern char const* const _PREHASH_ExpirationDate; +extern char const* const _PREHASH_ParcelDeedToGroup; +extern char const* const _PREHASH_AvatarPicksReply; +extern char const* const _PREHASH_GroupTitlesReply; +extern char const* const _PREHASH_AgentInfo; +extern char const* const _PREHASH_MoneyTransferBackend; +extern char const* const _PREHASH_NextOwnerMask; +extern char const* const _PREHASH_MuteData; +extern char const* const _PREHASH_PassPrice; +extern char const* const _PREHASH_SourceID; +extern char const* const _PREHASH_ChangeUserRights; +extern char const* const _PREHASH_TeleportFlags; +extern char const* const _PREHASH_SlaveParcelData; +extern char const* const _PREHASH_AssetData; +extern char const* const _PREHASH_MultipleObjectUpdate; +extern char const* const _PREHASH_ObjectUpdate; +extern char const* const _PREHASH_ImprovedTerseObjectUpdate; +extern char const* const _PREHASH_ConfirmXferPacket; +extern char const* const _PREHASH_StartPingCheck; +extern char const* const _PREHASH_SimWideDeletes; +extern char const* const _PREHASH_LandStatReply; +extern char const* const _PREHASH_IsPhantom; +extern char const* const _PREHASH_AgentList; +extern char const* const _PREHASH_SimApproved; +extern char const* const _PREHASH_RezObject; +extern char const* const _PREHASH_TaskLocalID; +extern char const* const _PREHASH_ClaimDate; +extern char const* const _PREHASH_MergeParcel; +extern char const* const _PREHASH_Priority; +extern char const* const _PREHASH_QueryText; +extern char const* const _PREHASH_GroupNoticeAdd; +extern char const* const _PREHASH_ReturnType; +extern char const* const _PREHASH_FetchFolders; +extern char const* const _PREHASH_SimulatorPublicHostBlock; +extern char const* const _PREHASH_HeaderData; +extern char const* const _PREHASH_RequestMultipleObjects; +extern char const* const _PREHASH_RetrieveInstantMessages; +extern char const* const _PREHASH_OpenCircuit; +extern char const* const _PREHASH_CrossedRegion; +extern char const* const _PREHASH_DirGroupsReply; +extern char const* const _PREHASH_AvatarGroupsReply; +extern char const* const _PREHASH_EmailMessageReply; +extern char const* const _PREHASH_GroupVoteHistoryItemReply; +extern char const* const _PREHASH_ViewerPosition; +extern char const* const _PREHASH_Position; +extern char const* const _PREHASH_ParentEstate; +extern char const* const _PREHASH_EstateName; +extern char const* const _PREHASH_MuteName; +extern char const* const _PREHASH_ParcelRename; +extern char const* const _PREHASH_ViewerFilename; +extern char const* const _PREHASH_UserReportInternal; +extern char const* const _PREHASH_AvatarPropertiesRequest; +extern char const* const _PREHASH_ParcelPropertiesRequest; +extern char const* const _PREHASH_GroupProfileRequest; +extern char const* const _PREHASH_AgentDataUpdateRequest; +extern char const* const _PREHASH_PriceObjectScaleFactor; +extern char const* const _PREHASH_OpenEnrollment; +extern char const* const _PREHASH_GroupData; +extern char const* const _PREHASH_RequestGodlikePowers; +extern char const* const _PREHASH_GrantGodlikePowers; +extern char const* const _PREHASH_TransactionID; +extern char const* const _PREHASH_DestinationID; +extern char const* const _PREHASH_Controls; +extern char const* const _PREHASH_FirstDetachAll; +extern char const* const _PREHASH_EstateID; +extern char const* const _PREHASH_ImprovedInstantMessage; +extern char const* const _PREHASH_CheckParcelSales; +extern char const* const _PREHASH_ParcelSales; +extern char const* const _PREHASH_CurrentInterval; +extern char const* const _PREHASH_PriceRentLight; +extern char const* const _PREHASH_MediaAutoScale; +extern char const* const _PREHASH_NeighborBlock; +extern char const* const _PREHASH_LayerData; +extern char const* const _PREHASH_NVPairData; +extern char const* const _PREHASH_TeleportLocal; +extern char const* const _PREHASH_EjecteeID; +extern char const* const _PREHASH_VoteInitiator; +extern char const* const _PREHASH_TypeData; +extern char const* const _PREHASH_OwnerIDs; +extern char const* const _PREHASH_SystemKickUser; +extern char const* const _PREHASH_TransactionTime; +extern char const* const _PREHASH_TimeToLive; +extern char const* const _PREHASH_OldAgentID; +extern char const* const _PREHASH_MusicURL; +extern char const* const _PREHASH_ParcelPrimBonus; +extern char const* const _PREHASH_EjectUser; +extern char const* const _PREHASH_CoarseLocationUpdate; +extern char const* const _PREHASH_ChildAgentPositionUpdate; +extern char const* const _PREHASH_StoreLocal; +extern char const* const _PREHASH_GroupName; +extern char const* const _PREHASH_PriceParcelRent; +extern char const* const _PREHASH_SimStatus; +extern char const* const _PREHASH_TransactionSuccess; +extern char const* const _PREHASH_LureType; +extern char const* const _PREHASH_GroupMask; +extern char const* const _PREHASH_SitObject; +extern char const* const _PREHASH_Override; +extern char const* const _PREHASH_LocomotionState; +extern char const* const _PREHASH_PriceUpload; +extern char const* const _PREHASH_RemoveParcel; +extern char const* const _PREHASH_ConfirmAuctionStart; +extern char const* const _PREHASH_RpcScriptRequestInbound; +extern char const* const _PREHASH_ActiveGroupID; +extern char const* const _PREHASH_ParcelReturnObjects; +extern char const* const _PREHASH_TotalObjects; +extern char const* const _PREHASH_ObjectExtraParams; +extern char const* const _PREHASH_Questions; +extern char const* const _PREHASH_TransferAbort; +extern char const* const _PREHASH_TransferInventory; +extern char const* const _PREHASH_RayTargetID; +extern char const* const _PREHASH_ClaimPrice; +extern char const* const _PREHASH_ObjectProperties; +extern char const* const _PREHASH_ParcelProperties; +extern char const* const _PREHASH_EstateOwnerID; +extern char const* const _PREHASH_LogoutRequest; +extern char const* const _PREHASH_AssetUploadRequest; +extern char const* const _PREHASH_TransactionType; +extern char const* const _PREHASH_AvatarPropertiesUpdate; +extern char const* const _PREHASH_ParcelPropertiesUpdate; +extern char const* const _PREHASH_FetchItems; +extern char const* const _PREHASH_AbortXfer; +extern char const* const _PREHASH_DeRezAck; +extern char const* const _PREHASH_TakeControls; +extern char const* const _PREHASH_DirLandReply; +extern char const* const _PREHASH_MuteType; +extern char const* const _PREHASH_IMViaEMail; +extern char const* const _PREHASH_RentPrice; +extern char const* const _PREHASH_GenericMessage; +extern char const* const _PREHASH_ChildAgentAlive; +extern char const* const _PREHASH_AssetType; +extern char const* const _PREHASH_SpawnPointBlock; +extern char const* const _PREHASH_AttachmentBlock; +extern char const* const _PREHASH_ObjectMaterial; +extern char const* const _PREHASH_OwnerName; +extern char const* const _PREHASH_AvatarNotesReply; +extern char const* const _PREHASH_CacheID; +extern char const* const _PREHASH_OwnerMask; +extern char const* const _PREHASH_TransferInventoryAck; +extern char const* const _PREHASH_RegionDenyAgeUnverified; +extern char const* const _PREHASH_AgeVerificationBlock; +extern char const* const _PREHASH_UCoord; +extern char const* const _PREHASH_VCoord; +extern char const* const _PREHASH_FaceIndex; +extern char const* const _PREHASH_StatusData; +extern char const* const _PREHASH_ProductSKU; #endif diff --git a/indra/llprimitive/llprimitive.cpp b/indra/llprimitive/llprimitive.cpp index 258c0c3c15..f9ef897aa3 100644 --- a/indra/llprimitive/llprimitive.cpp +++ b/indra/llprimitive/llprimitive.cpp @@ -1216,12 +1216,12 @@ BOOL LLPrimitive::packTEMessage(LLDataPacker &dp) const return FALSE; } -S32 LLPrimitive::unpackTEMessage(LLMessageSystem *mesgsys, char *block_name) +S32 LLPrimitive::unpackTEMessage(LLMessageSystem* mesgsys, char const* block_name) { return(unpackTEMessage(mesgsys,block_name,-1)); } -S32 LLPrimitive::unpackTEMessage(LLMessageSystem *mesgsys, char *block_name, const S32 block_num) +S32 LLPrimitive::unpackTEMessage(LLMessageSystem* mesgsys, char const* block_name, const S32 block_num) { // use a negative block_num to indicate a single-block read (a non-variable block) S32 retval = 0; diff --git a/indra/llprimitive/llprimitive.h b/indra/llprimitive/llprimitive.h index f535fb1672..d981b248fa 100644 --- a/indra/llprimitive/llprimitive.h +++ b/indra/llprimitive/llprimitive.h @@ -358,8 +358,8 @@ public: S32 unpackTEField(U8 *cur_ptr, U8 *buffer_end, U8 *data_ptr, U8 data_size, U8 face_count, EMsgVariableType type); BOOL packTEMessage(LLMessageSystem *mesgsys) const; BOOL packTEMessage(LLDataPacker &dp) const; - S32 unpackTEMessage(LLMessageSystem *mesgsys, char *block_name); - S32 unpackTEMessage(LLMessageSystem *mesgsys, char *block_name, const S32 block_num); // Variable num of blocks + S32 unpackTEMessage(LLMessageSystem* mesgsys, char const* block_name); + S32 unpackTEMessage(LLMessageSystem* mesgsys, char const* block_name, const S32 block_num); // Variable num of blocks BOOL unpackTEMessage(LLDataPacker &dp); #ifdef CHECK_FOR_FINITE diff --git a/indra/llprimitive/llvolumemessage.cpp b/indra/llprimitive/llvolumemessage.cpp index b6cae5c4df..58b23bebd2 100644 --- a/indra/llprimitive/llvolumemessage.cpp +++ b/indra/llprimitive/llvolumemessage.cpp @@ -94,7 +94,7 @@ bool LLVolumeMessage::packProfileParams( bool LLVolumeMessage::unpackProfileParams( LLProfileParams* params, LLMessageSystem* mesgsys, - char* block_name, + char const* block_name, S32 block_num) { bool ok = true; @@ -322,7 +322,7 @@ bool LLVolumeMessage::packPathParams( bool LLVolumeMessage::unpackPathParams( LLPathParams* params, LLMessageSystem* mesgsys, - char* block_name, + char const* block_name, S32 block_num) { U8 curve; @@ -522,7 +522,7 @@ bool LLVolumeMessage::packVolumeParams(const LLVolumeParams* params, LLDataPacke bool LLVolumeMessage::unpackVolumeParams( LLVolumeParams* params, LLMessageSystem* mesgsys, - char* block_name, + char const* block_name, S32 block_num) { bool ok = true; diff --git a/indra/llprimitive/llvolumemessage.h b/indra/llprimitive/llvolumemessage.h index 33562323c3..f59ee79c60 100644 --- a/indra/llprimitive/llvolumemessage.h +++ b/indra/llprimitive/llvolumemessage.h @@ -49,7 +49,7 @@ protected: static bool unpackProfileParams( LLProfileParams* params, LLMessageSystem* mesgsys, - char* block_name, + char const* block_name, S32 block_num = 0); static bool unpackProfileParams(LLProfileParams* params, LLDataPacker& dp); @@ -60,7 +60,7 @@ protected: static bool unpackPathParams( LLPathParams* params, LLMessageSystem* mesgsys, - char* block_name, + char const* block_name, S32 block_num = 0); static bool unpackPathParams(LLPathParams* params, LLDataPacker& dp); @@ -83,7 +83,7 @@ public: static bool unpackVolumeParams( LLVolumeParams* params, LLMessageSystem* mesgsys, - char* block_name, + char const* block_name, S32 block_num = 0); static bool unpackVolumeParams(LLVolumeParams* params, LLDataPacker &dp); }; diff --git a/indra/llui/tests/llurlentry_stub.cpp b/indra/llui/tests/llurlentry_stub.cpp index 96ebe83826..095447ec66 100644 --- a/indra/llui/tests/llurlentry_stub.cpp +++ b/indra/llui/tests/llurlentry_stub.cpp @@ -193,8 +193,8 @@ LLFontGL* LLFontGL::getFontDefault() return NULL; } -char* _PREHASH_AgentData = "AgentData"; -char* _PREHASH_AgentID = "AgentID"; +char const* const _PREHASH_AgentData = 0; // never dereferenced during this test +char const* const _PREHASH_AgentID = 0; // never dereferenced during this test LLHost LLHost::invalid(INVALID_PORT,INVALID_HOST_IP_ADDRESS); diff --git a/indra/newview/tests/llremoteparcelrequest_test.cpp b/indra/newview/tests/llremoteparcelrequest_test.cpp index 7862cce3a1..9a6e08ee84 100644 --- a/indra/newview/tests/llremoteparcelrequest_test.cpp +++ b/indra/newview/tests/llremoteparcelrequest_test.cpp @@ -61,8 +61,8 @@ void LLMessageSystem::addUUIDFast(char const *,LLUUID const &) { } void LLMessageSystem::nextBlockFast(char const *) { } void LLMessageSystem::newMessage(char const *) { } LLMessageSystem * gMessageSystem; -char * _PREHASH_AgentID; -char * _PREHASH_AgentData; +char const* const _PREHASH_AgentID = 0; // never dereferenced during this test +char const* const _PREHASH_AgentData = 0; // never dereferenced during this test LLAgent gAgent; LLAgent::LLAgent() : mAgentAccess(s_saved_settings) { } LLAgent::~LLAgent() { } -- cgit v1.2.3 From a03f6997d8c3519e2c89930a1ed03a787af6f7ae Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Fri, 1 Apr 2011 12:08:03 -0400 Subject: update message template hash to correct value --- scripts/messages/message_template.msg.sha1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/messages/message_template.msg.sha1 b/scripts/messages/message_template.msg.sha1 index 4b1ba7e2d3..41e70011af 100644 --- a/scripts/messages/message_template.msg.sha1 +++ b/scripts/messages/message_template.msg.sha1 @@ -1 +1 @@ -ee062c94248e9af06df5284f7186893a135084c9 \ No newline at end of file +ce3be58f4ea395c272fcfa3e6b6dad027c188e0d \ No newline at end of file -- cgit v1.2.3 From 6bee9532207cfabd1c6315ea00fa7703bc401d2c Mon Sep 17 00:00:00 2001 From: Joshua Bell <josh@lindenlab.com> Date: Fri, 1 Apr 2011 09:24:41 -0700 Subject: STORM-1130: Top Scripts: Date/time sorting is broken (sorts lexically) Use LLScrollListCtrl's intrinsic support for date-typed columns. --- indra/newview/llfloatertopobjects.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/indra/newview/llfloatertopobjects.cpp b/indra/newview/llfloatertopobjects.cpp index 19f6038b56..87d048c15b 100644 --- a/indra/newview/llfloatertopobjects.cpp +++ b/indra/newview/llfloatertopobjects.cpp @@ -223,7 +223,8 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data) columns[3]["value"] = llformat("<%0.1f,%0.1f,%0.1f>", location_x, location_y, location_z); columns[3]["font"] = "SANSSERIF"; columns[4]["column"] = "time"; - columns[4]["value"] = formatted_time((time_t)time_stamp); + columns[4]["type"] = "date"; + columns[4]["value"] = LLDate((time_t)time_stamp); columns[4]["font"] = "SANSSERIF"; if (mCurrentMode == STAT_REPORT_TOP_SCRIPTS -- cgit v1.2.3 From 8ceff5afd679d4432bc22532dc1d98f563c0b8e4 Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Fri, 1 Apr 2011 13:31:08 -0400 Subject: correct merge error in prehash change --- indra/llui/tests/llurlentry_stub.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/llui/tests/llurlentry_stub.cpp b/indra/llui/tests/llurlentry_stub.cpp index 966bea329c..ac2412c928 100644 --- a/indra/llui/tests/llurlentry_stub.cpp +++ b/indra/llui/tests/llurlentry_stub.cpp @@ -193,8 +193,8 @@ LLFontGL* LLFontGL::getFontDefault() return NULL; } -char* _PREHASH_AgentData = (char *)"AgentData"; -char* _PREHASH_AgentID = (char *)"AgentID"; +char const* const _PREHASH_AgentData = (char *)"AgentData"; +char const* const _PREHASH_AgentID = (char *)"AgentID"; LLHost LLHost::invalid(INVALID_PORT,INVALID_HOST_IP_ADDRESS); -- cgit v1.2.3 From 09786fb4f85300d382e2cf346de2e5a0bea98b9a Mon Sep 17 00:00:00 2001 From: Eli Linden <eli@lindenlab.com> Date: Fri, 1 Apr 2011 12:28:34 -0700 Subject: synched up with viewer-development latest --- .../skins/default/xui/de/floater_about_land.xml | 4 +- indra/newview/skins/default/xui/de/floater_map.xml | 27 +- .../newview/skins/default/xui/de/floater_tools.xml | 2 + .../skins/default/xui/de/menu_attachment_self.xml | 2 +- .../skins/default/xui/de/menu_avatar_self.xml | 2 +- .../skins/default/xui/de/menu_bottomtray.xml | 2 +- .../default/xui/de/menu_inspect_avatar_gear.xml | 6 +- .../default/xui/de/menu_inspect_self_gear.xml | 39 ++- .../default/xui/de/menu_inventory_gear_default.xml | 1 + indra/newview/skins/default/xui/de/menu_object.xml | 4 +- .../default/xui/de/menu_places_gear_folder.xml | 5 +- .../default/xui/de/menu_places_gear_landmark.xml | 5 +- indra/newview/skins/default/xui/de/menu_viewer.xml | 6 +- .../newview/skins/default/xui/de/notifications.xml | 52 ++- indra/newview/skins/default/xui/de/panel_login.xml | 7 + .../skins/default/xui/de/panel_nearby_media.xml | 2 +- .../newview/skins/default/xui/de/panel_people.xml | 2 + .../newview/skins/default/xui/de/panel_profile.xml | 8 +- .../skins/default/xui/de/panel_script_ed.xml | 3 + indra/newview/skins/default/xui/de/strings.xml | 359 ++++++++++++++++++++- .../skins/default/xui/en/floater_beacons.xml | 14 +- .../skins/default/xui/en/menu_bottomtray.xml | 3 +- .../newview/skins/default/xui/en/notifications.xml | 12 + .../skins/default/xui/es/floater_about_land.xml | 6 +- indra/newview/skins/default/xui/es/floater_map.xml | 3 + .../newview/skins/default/xui/es/floater_tools.xml | 2 + .../skins/default/xui/es/menu_attachment_self.xml | 2 +- .../skins/default/xui/es/menu_avatar_self.xml | 2 +- .../skins/default/xui/es/menu_bottomtray.xml | 2 +- .../default/xui/es/menu_inspect_avatar_gear.xml | 6 +- .../default/xui/es/menu_inspect_self_gear.xml | 39 ++- .../default/xui/es/menu_inventory_gear_default.xml | 1 + indra/newview/skins/default/xui/es/menu_object.xml | 4 +- .../default/xui/es/menu_places_gear_folder.xml | 5 +- .../default/xui/es/menu_places_gear_landmark.xml | 5 +- indra/newview/skins/default/xui/es/menu_viewer.xml | 8 +- .../newview/skins/default/xui/es/notifications.xml | 44 ++- indra/newview/skins/default/xui/es/panel_login.xml | 7 + .../skins/default/xui/es/panel_nearby_media.xml | 2 +- .../newview/skins/default/xui/es/panel_people.xml | 2 + .../default/xui/es/panel_preferences_chat.xml | 6 +- .../default/xui/es/panel_preferences_general.xml | 2 +- .../default/xui/es/panel_preferences_privacy.xml | 2 +- .../default/xui/es/panel_preferences_setup.xml | 2 +- .../default/xui/es/panel_preferences_sound.xml | 2 +- .../newview/skins/default/xui/es/panel_profile.xml | 8 +- .../skins/default/xui/es/panel_script_ed.xml | 3 + indra/newview/skins/default/xui/es/strings.xml | 357 +++++++++++++++++++- .../skins/default/xui/fr/floater_about_land.xml | 8 +- indra/newview/skins/default/xui/fr/floater_map.xml | 27 +- .../newview/skins/default/xui/fr/floater_tools.xml | 2 + .../skins/default/xui/fr/menu_attachment_self.xml | 2 +- .../skins/default/xui/fr/menu_avatar_self.xml | 2 +- .../skins/default/xui/fr/menu_bottomtray.xml | 2 +- .../default/xui/fr/menu_inspect_avatar_gear.xml | 6 +- .../default/xui/fr/menu_inspect_self_gear.xml | 39 ++- .../default/xui/fr/menu_inventory_gear_default.xml | 1 + indra/newview/skins/default/xui/fr/menu_object.xml | 4 +- .../default/xui/fr/menu_places_gear_folder.xml | 5 +- .../default/xui/fr/menu_places_gear_landmark.xml | 5 +- indra/newview/skins/default/xui/fr/menu_viewer.xml | 6 +- .../newview/skins/default/xui/fr/notifications.xml | 44 ++- indra/newview/skins/default/xui/fr/panel_login.xml | 7 + .../skins/default/xui/fr/panel_nearby_media.xml | 2 +- .../newview/skins/default/xui/fr/panel_people.xml | 2 + .../newview/skins/default/xui/fr/panel_profile.xml | 8 +- .../skins/default/xui/fr/panel_script_ed.xml | 3 + indra/newview/skins/default/xui/fr/strings.xml | 359 ++++++++++++++++++++- 68 files changed, 1426 insertions(+), 197 deletions(-) diff --git a/indra/newview/skins/default/xui/de/floater_about_land.xml b/indra/newview/skins/default/xui/de/floater_about_land.xml index 8783b52013..2d8459479a 100644 --- a/indra/newview/skins/default/xui/de/floater_about_land.xml +++ b/indra/newview/skins/default/xui/de/floater_about_land.xml @@ -348,6 +348,7 @@ Nur große Parzellen können in der Suche aufgeführt werden. <combo_box.item label="Parks und Natur" name="item9"/> <combo_box.item label="Wohngebiet" name="item10"/> <combo_box.item label="Shopping" name="item11"/> + <combo_box.item label="Vermietung" name="item13"/> <combo_box.item label="Sonstige" name="item12"/> </combo_box> <combo_box name="land category"> @@ -362,6 +363,7 @@ Nur große Parzellen können in der Suche aufgeführt werden. <combo_box.item label="Parks und Natur" name="item9"/> <combo_box.item label="Wohngebiet" name="item10"/> <combo_box.item label="Shopping" name="item11"/> + <combo_box.item label="Vermietung" name="item13"/> <combo_box.item label="Sonstige" name="item12"/> </combo_box> <check_box label="Moderater Inhalt" name="MatureCheck" tool_tip=""/> @@ -437,7 +439,7 @@ Nur große Parzellen können in der Suche aufgeführt werden. (Durch Grundbesitz festgelegt) </panel.string> <panel.string name="allow_public_access"> - Öffentlichen Zugang erlauben ([MATURITY]) + Öffentlichen Zugang erlauben ([MATURITY]) (Hinweis: Bei Deaktivierung dieser Option werden Bannlinien generiert) </panel.string> <panel.string name="estate_override"> Eine oder mehrere dieser Optionen gelten auf Grundbesitzebene diff --git a/indra/newview/skins/default/xui/de/floater_map.xml b/indra/newview/skins/default/xui/de/floater_map.xml index 217a641dec..f6d9db8d53 100644 --- a/indra/newview/skins/default/xui/de/floater_map.xml +++ b/indra/newview/skins/default/xui/de/floater_map.xml @@ -1,32 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Map" title=""> - <floater.string name="mini_map_north"> - N - </floater.string> - <floater.string name="mini_map_east"> - O - </floater.string> - <floater.string name="mini_map_west"> - W - </floater.string> - <floater.string name="mini_map_south"> - S - </floater.string> - <floater.string name="mini_map_southeast"> - SO - </floater.string> - <floater.string name="mini_map_northeast"> - NO - </floater.string> - <floater.string name="mini_map_southwest"> - SW - </floater.string> - <floater.string name="mini_map_northwest"> - NW - </floater.string> <floater.string name="ToolTipMsg"> [REGION](Doppelklicken, um Karte zu öffnen; Umschalt-Taste gedrückt halten und ziehen, um zu schwenken) </floater.string> + <floater.string name="AltToolTipMsg"> + [REGION](Doppelklicken, um zu teleportieren; Umschalttaste gedrückt halten und ziehen, um zu schwenken) + </floater.string> <floater.string name="mini_map_caption"> MINI-KARTE </floater.string> diff --git a/indra/newview/skins/default/xui/de/floater_tools.xml b/indra/newview/skins/default/xui/de/floater_tools.xml index d201fc327c..d95d674df2 100644 --- a/indra/newview/skins/default/xui/de/floater_tools.xml +++ b/indra/newview/skins/default/xui/de/floater_tools.xml @@ -64,6 +64,8 @@ <radio_item label="Fläche auswählen" name="radio select face"/> </radio_group> <check_box label="Verknüpfte Teile bearbeiten" name="checkbox edit linked parts"/> + <button label="Link" name="link_btn"/> + <button label="Verknüpfung auflösen" name="unlink_btn"/> <text name="RenderingCost" tool_tip="Zeigt die errechneten Wiedergabekosten für dieses Objekt"> þ: [COUNT] </text> diff --git a/indra/newview/skins/default/xui/de/menu_attachment_self.xml b/indra/newview/skins/default/xui/de/menu_attachment_self.xml index 644fc68ba4..325d52a22e 100644 --- a/indra/newview/skins/default/xui/de/menu_attachment_self.xml +++ b/indra/newview/skins/default/xui/de/menu_attachment_self.xml @@ -5,7 +5,7 @@ <menu_item_call label="Abnehmen" name="Detach"/> <menu_item_call label="Hinsetzen" name="Sit Down Here"/> <menu_item_call label="Aufstehen" name="Stand Up"/> - <menu_item_call label="Outfit ändern" name="Change Outfit"/> + <menu_item_call label="Mein Aussehen" name="Change Outfit"/> <menu_item_call label="Mein Outfit bearbeiten" name="Edit Outfit"/> <menu_item_call label="Meine Form bearbeiten" name="Edit My Shape"/> <menu_item_call label="Meine Freunde" name="Friends..."/> diff --git a/indra/newview/skins/default/xui/de/menu_avatar_self.xml b/indra/newview/skins/default/xui/de/menu_avatar_self.xml index 582c76ac94..40557b7ad8 100644 --- a/indra/newview/skins/default/xui/de/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/de/menu_avatar_self.xml @@ -21,7 +21,7 @@ <context_menu label="Abnehmen" name="Object Detach"/> <menu_item_call label="Alles abnehmen" name="Detach All"/> </context_menu> - <menu_item_call label="Outfit ändern" name="Chenge Outfit"/> + <menu_item_call label="Mein Aussehen" name="Chenge Outfit"/> <menu_item_call label="Mein Outfit bearbeiten" name="Edit Outfit"/> <menu_item_call label="Meine Form bearbeiten" name="Edit My Shape"/> <menu_item_call label="Meine Freunde" name="Friends..."/> diff --git a/indra/newview/skins/default/xui/de/menu_bottomtray.xml b/indra/newview/skins/default/xui/de/menu_bottomtray.xml index 6c4308286a..660cd2eaf3 100644 --- a/indra/newview/skins/default/xui/de/menu_bottomtray.xml +++ b/indra/newview/skins/default/xui/de/menu_bottomtray.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="hide_camera_move_controls_menu"> + <menu_item_check label="Voice aktiviert" name="EnableVoiceChat"/> <menu_item_check label="Schaltfläche Gesten" name="ShowGestureButton"/> <menu_item_check label="Schaltfläche Bewegungssteuerung" name="ShowMoveButton"/> <menu_item_check label="Schaltfläche Ansicht" name="ShowCameraButton"/> <menu_item_check label="Schaltfläche Foto" name="ShowSnapshotButton"/> - <menu_item_check label="Schaltfläche „Seitenleiste“" name="ShowSidebarButton"/> <menu_item_check label="Schaltfläche „Bauen“" name="ShowBuildButton"/> <menu_item_check label="Schaltfläche „Suchen“" name="ShowSearchButton"/> <menu_item_check label="Schaltfläche „Karte“" name="ShowWorldMapButton"/> diff --git a/indra/newview/skins/default/xui/de/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/de/menu_inspect_avatar_gear.xml index edad34a1d5..641a0ceebe 100644 --- a/indra/newview/skins/default/xui/de/menu_inspect_avatar_gear.xml +++ b/indra/newview/skins/default/xui/de/menu_inspect_avatar_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> -<menu name="Gear Menu"> +<toggleable_menu name="Gear Menu"> <menu_item_call label="Profil anzeigen" name="view_profile"/> <menu_item_call label="Freund hinzufügen" name="add_friend"/> <menu_item_call label="IM" name="im"/> @@ -11,9 +11,11 @@ <menu_item_call label="Melden" name="report"/> <menu_item_call label="Einfrieren" name="freeze"/> <menu_item_call label="Hinauswerfen" name="eject"/> + <menu_item_call label="Hinauswerfen" name="kick"/> + <menu_item_call label="CSR" name="csr"/> <menu_item_call label="Fehler in Texturen beseitigen" name="debug"/> <menu_item_call label="Auf Karte anzeigen" name="find_on_map"/> <menu_item_call label="Hineinzoomen" name="zoom_in"/> <menu_item_call label="Bezahlen" name="pay"/> <menu_item_call label="Teilen" name="share"/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/de/menu_inspect_self_gear.xml index 851a96cc09..5979194bfb 100644 --- a/indra/newview/skins/default/xui/de/menu_inspect_self_gear.xml +++ b/indra/newview/skins/default/xui/de/menu_inspect_self_gear.xml @@ -1,10 +1,31 @@ -<?xml version="1.0" encoding="utf-8"?> -<menu name="Gear Menu"> - <menu_item_call label="Hinsetzen" name="sit_down_here"/> - <menu_item_call label="Aufstehen" name="stand_up"/> - <menu_item_call label="Outfit ändern" name="change_outfit"/> - <menu_item_call label="Mein Profil" name="my_profile"/> - <menu_item_call label="Meine Freunde" name="my_friends"/> - <menu_item_call label="Meine Gruppen" name="my_groups"/> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Gear Menu"> + <menu_item_call label="Hinsetzen" name="Sit Down Here"/> + <menu_item_call label="Aufstehen" name="Stand Up"/> + <context_menu label="Ausziehen" name="Take Off >"> + <context_menu label="Kleidung" name="Clothes >"> + <menu_item_call label="Hemd" name="Shirt"/> + <menu_item_call label="Hose" name="Pants"/> + <menu_item_call label="Rock" name="Skirt"/> + <menu_item_call label="Schuhe" name="Shoes"/> + <menu_item_call label="Strümpfe" name="Socks"/> + <menu_item_call label="Jacke" name="Jacket"/> + <menu_item_call label="Handschuhe" name="Gloves"/> + <menu_item_call label="Unterhemd" name="Self Undershirt"/> + <menu_item_call label="Unterhose" name="Self Underpants"/> + <menu_item_call label="Tätowierung" name="Self Tattoo"/> + <menu_item_call label="Alpha" name="Self Alpha"/> + <menu_item_call label="Alle Kleider" name="All Clothes"/> + </context_menu> + <context_menu label="HUD" name="Object Detach HUD"/> + <context_menu label="Abnehmen" name="Object Detach"/> + <menu_item_call label="Alles abnehmen" name="Detach All"/> + </context_menu> + <menu_item_call label="Outfit ändern" name="Chenge Outfit"/> + <menu_item_call label="Mein Outfit bearbeiten" name="Edit Outfit"/> + <menu_item_call label="Meine Form bearbeiten" name="Edit My Shape"/> + <menu_item_call label="Meine Freunde" name="Friends..."/> + <menu_item_call label="Meine Gruppen" name="Groups..."/> + <menu_item_call label="Mein Profil" name="Profile..."/> <menu_item_call label="Fehler in Texturen beseitigen" name="Debug..."/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/de/menu_inventory_gear_default.xml index df86a5cf71..48dec3e856 100644 --- a/indra/newview/skins/default/xui/de/menu_inventory_gear_default.xml +++ b/indra/newview/skins/default/xui/de/menu_inventory_gear_default.xml @@ -3,6 +3,7 @@ <menu_item_call label="Neues Inventar-Fenster" name="new_window"/> <menu_item_check label="Nach Name sortieren" name="sort_by_name"/> <menu_item_check label="Nach aktuellesten Objekten sortieren" name="sort_by_recent"/> + <menu_item_check label="Ordner immer nach Namen sortieren" name="sort_folders_by_name"/> <menu_item_check label="Systemordner nach oben" name="sort_system_folders_to_top"/> <menu_item_call label="Filter anzeigen" name="show_filters"/> <menu_item_call label="Filter zurücksetzen" name="reset_filters"/> diff --git a/indra/newview/skins/default/xui/de/menu_object.xml b/indra/newview/skins/default/xui/de/menu_object.xml index 19057d4228..412bd3ac04 100644 --- a/indra/newview/skins/default/xui/de/menu_object.xml +++ b/indra/newview/skins/default/xui/de/menu_object.xml @@ -16,14 +16,14 @@ <context_menu label="Anhängen" name="Object Attach"/> <context_menu label="HUD anhängen" name="Object Attach HUD"/> </context_menu> - <context_menu label="Entfernen" name="Remove"> + <context_menu label="Verwalten" name="Remove"> <menu_item_call label="Missbrauch melden" name="Report Abuse..."/> <menu_item_call label="Ignorieren" name="Object Mute"/> <menu_item_call label="Zurückgeben" name="Return..."/> - <menu_item_call label="Löschen" name="Delete"/> </context_menu> <menu_item_call label="Nehmen" name="Pie Object Take"/> <menu_item_call label="Kopie nehmen" name="Take Copy"/> <menu_item_call label="Bezahlen" name="Pay..."/> <menu_item_call label="Kaufen" name="Buy..."/> + <menu_item_call label="Löschen" name="Delete"/> </context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/de/menu_places_gear_folder.xml index 132d3f6466..892f075d3c 100644 --- a/indra/newview/skins/default/xui/de/menu_places_gear_folder.xml +++ b/indra/newview/skins/default/xui/de/menu_places_gear_folder.xml @@ -1,7 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="menu_folder_gear"> +<toggleable_menu name="menu_folder_gear"> <menu_item_call label="Landmarke hinzufügen" name="add_landmark"/> <menu_item_call label="Ordner hinzufügen" name="add_folder"/> + <menu_item_call label="Objekt wiederherstellen" name="restore_item"/> <menu_item_call label="Ausschneiden" name="cut"/> <menu_item_call label="Kopieren" name="copy_folder"/> <menu_item_call label="Einfügen" name="paste"/> @@ -12,4 +13,4 @@ <menu_item_call label="Alle Ordner aufklappen" name="expand_all"/> <menu_item_call label="Alle Ordner schließen" name="collapse_all"/> <menu_item_check label="Nach Datum sortieren" name="sort_by_date"/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/de/menu_places_gear_landmark.xml index 6af4d644af..8955f797a2 100644 --- a/indra/newview/skins/default/xui/de/menu_places_gear_landmark.xml +++ b/indra/newview/skins/default/xui/de/menu_places_gear_landmark.xml @@ -1,10 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="menu_ladmark_gear"> +<toggleable_menu name="menu_ladmark_gear"> <menu_item_call label="Teleportieren" name="teleport"/> <menu_item_call label="Weitere Informationen" name="more_info"/> <menu_item_call label="Auf Karte zeigen" name="show_on_map"/> <menu_item_call label="Landmarke hinzufügen" name="add_landmark"/> <menu_item_call label="Ordner hinzufügen" name="add_folder"/> + <menu_item_call label="Objekt wiederherstellen" name="restore_item"/> <menu_item_call label="Ausschneiden" name="cut"/> <menu_item_call label="Landmarke kopieren" name="copy_landmark"/> <menu_item_call label="SLurl kopieren" name="copy_slurl"/> @@ -15,4 +16,4 @@ <menu_item_call label="Alle Ordner schließen" name="collapse_all"/> <menu_item_check label="Nach Datum sortieren" name="sort_by_date"/> <menu_item_call label="Auswahl erstellen" name="create_pick"/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml index 4a043e1233..17bcb013cc 100644 --- a/indra/newview/skins/default/xui/de/menu_viewer.xml +++ b/indra/newview/skins/default/xui/de/menu_viewer.xml @@ -7,7 +7,7 @@ </menu_item_call> <menu_item_call label="L$ kaufen" name="Buy and Sell L$"/> <menu_item_call label="Mein Profil" name="Profile"/> - <menu_item_call label="Outfit ändern" name="ChangeOutfit"/> + <menu_item_call label="Mein Aussehen" name="ChangeOutfit"/> <menu_item_check label="Mein Inventar" name="Inventory"/> <menu_item_check label="Mein Inventar" name="ShowSidetrayInventory"/> <menu_item_check label="Meine Gesten" name="Gestures"/> @@ -35,6 +35,7 @@ <menu label="Welt" name="World"> <menu_item_check label="Minikarte" name="Mini-Map"/> <menu_item_check label="Karte" name="World Map"/> + <menu_item_check label="Suchen" name="Search"/> <menu_item_call label="Foto" name="Take Snapshot"/> <menu_item_call label="Landmarke für diesen Ort setzen" name="Create Landmark Here"/> <menu label="Ortsprofil" name="Land"> @@ -228,8 +229,10 @@ <menu label="Info anzeigen" name="Display Info"> <menu_item_check label="Zeit anzeigen" name="Show Time"/> <menu_item_check label="Render-Info anzeigen" name="Show Render Info"/> + <menu_item_check label="Texturinfos anzeigen" name="Show Texture Info"/> <menu_item_check label="Matrizen anzeigen" name="Show Matrices"/> <menu_item_check label="Farbe unter Cursor anzeigen" name="Show Color Under Cursor"/> + <menu_item_check label="Speicher anzeigen" name="Show Memory"/> <menu_item_check label="Akutalisierungen an Objekten anzeigen" name="Show Updates"/> </menu> <menu label="Fehler erzwingen" name="Force Errors"> @@ -254,6 +257,7 @@ <menu_item_check label="Shadow Frusta" name="Shadow Frusta"/> <menu_item_check label="Okklusion" name="Occlusion"/> <menu_item_check label="Bündel rendern" name="Render Batches"/> + <menu_item_check label="Typ aktualisieren" name="Update Type"/> <menu_item_check label="Texture-Anim" name="Texture Anim"/> <menu_item_check label="Textur-Priorität" name="Texture Priority"/> <menu_item_check label="Texturbereich" name="Texture Area"/> diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml index b0ad989a59..3c63c093d2 100644 --- a/indra/newview/skins/default/xui/de/notifications.xml +++ b/indra/newview/skins/default/xui/de/notifications.xml @@ -72,9 +72,9 @@ Fehlerdetails: The notification called '[_NAME]' was not found in noti <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="LoginFailedNoNetwork"> - Eine Verbindung zum [SECOND_LIFE_GRID] konnte nicht hergestellt werden. -'[DIAGNOSTIC]' -Bitte vergewissern Sie sich, dass Ihre Internetverbindung funktioniert. + Verbindung nicht möglich zum [SECOND_LIFE_GRID]. + '[DIAGNOSTIC]' +Stellen Sie sicher, dass Ihre Internetverbindung funktioniert. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="MessageTemplateNotFound"> @@ -340,13 +340,6 @@ Sie benötigen ein Konto, um [SECOND_LIFE] betreten zu können. Möchten Sie jet <notification name="InvalidCredentialFormat"> Sie müssen entweder den Benutzernamen oder den Vor- und Nachnamen Ihres Avatars in das Feld „Benutzername“ eingeben und die Anmeldung dann erneut versuchen. </notification> - <notification name="AddClassified"> - Anzeigen werden im Suchverzeichnis im Abschnitt „Anzeigen" und auf [http://secondlife.com/community/classifieds secondlife.com] für eine Woche angezeigt. -Füllen Sie Ihre Anzeige aus und klicken Sie auf 'Veröffentlichen...', um sie zum Verzeichnis hinzuzufügen. -Sie werden gebeten für die Anzeige zu bezahlen, wenn Sie auf 'Veröffentlichen' klicken. -Wenn Sie mehr bezahlen, erscheint Ihre Anzeige weiter oben in der Liste, ebenso wenn ein Benutzer nach Ihren Suchbegriffen sucht. - <usetemplate ignoretext="So wird eine neue Anzeige erstellt" name="okcancelignore" notext="Abbrechen" yestext="OK"/> - </notification> <notification name="DeleteClassified"> Anzeige „[NAME]“ löschen? Gebühren werden nicht rückerstattet. @@ -2768,11 +2761,11 @@ Die Schaltfläche wird angezeigt, wenn genügend Platz vorhanden ist. Wählen Sie Einwohner aus, für die Sie das Objekt freigeben möchten. </notification> <notification name="ShareItemsConfirmation"> - Möchten Sie diese Objekte wirklich für andere freigeben: + Möchten Sie wirklich die folgenden Objekte: <nolink>[ITEMS]</nolink> -Für folgende Einwohner: +für folgende Einwohner freigeben: [RESIDENTS] <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> @@ -2863,9 +2856,6 @@ Alle stummschalten? <notification label="Welt erkunden" name="HintDestinationGuide"> Im Reiseführer finden Sie Tausende von interessanten Orten. Wählen Sie einfach einen Ort aus und klicken Sie auf „Teleportieren“. </notification> - <notification label="Aussehen ändern" name="HintAvatarPicker"> - Möchten Sie einen neuen Look ausprobieren? Klicken Sie auf die Schaltfläche unten, um mehr Avatare zu sehen. - </notification> <notification label="Seitenleiste" name="HintSidePanel"> In der Seitenleiste können Sie schnell auf Ihr Inventar, Ihre Outfits, Ihre Profile u. ä. zugreifen. </notification> @@ -2903,6 +2893,38 @@ Alle stummschalten? <button name="cancel" text="Abbrechen"/> </form> </notification> + <notification label="" name="ModeChange"> + Zum Wechsel des Modus müssen Sie das Programm beenden und neu starten. + <usetemplate name="okcancelbuttons" notext="Nicht beenden" yestext="Beenden"/> + </notification> + <notification label="" name="NoClassifieds"> + Die Erstellung und Bearbeitung von Anzeigen ist nur im Modus „Erweitert“ möglich. Möchten Sie das Programm beenden und den Modus wechseln? Die Modusauswahl ist auf dem Anmeldebildschirm zu finden. + <usetemplate name="okcancelbuttons" notext="Nicht beenden" yestext="Beenden"/> + </notification> + <notification label="" name="NoGroupInfo"> + Die Erstellung und Bearbeitung von Gruppen ist nur im Modus „Erweitert“ möglich. Möchten Sie das Programm beenden und den Modus wechseln? Die Modusauswahl ist auf dem Anmeldebildschirm zu finden. + <usetemplate name="okcancelbuttons" notext="Nicht beenden" yestext="Beenden"/> + </notification> + <notification label="" name="NoPicks"> + Die Erstellung und Bearbeitung von Auswahlen ist nur im Modus „Erweitert“ möglich. Möchten Sie das Programm beenden und den Modus wechseln? Die Modusauswahl ist auf dem Anmeldebildschirm zu finden. + <usetemplate name="okcancelbuttons" notext="Nicht beenden" yestext="Beenden"/> + </notification> + <notification label="" name="NoWorldMap"> + Die Anzeige der Weltkarte ist nur im Modus „Erweitert“ möglich. Möchten Sie das Programm beenden und den Modus wechseln? Die Modusauswahl ist auf dem Anmeldebildschirm zu finden. + <usetemplate name="okcancelbuttons" notext="Nicht beenden" yestext="Beenden"/> + </notification> + <notification label="" name="NoVoiceCall"> + Voice-Anrufe sind nur im Modus „Erweitert“ möglich. Möchten Sie sich abmelden und den Modus wechseln? + <usetemplate name="okcancelbuttons" notext="Nicht beenden" yestext="Beenden"/> + </notification> + <notification label="" name="NoAvatarShare"> + Die Freigabe ist nur im Modus „Erweitert“ möglich. Möchten Sie sich abmelden und den Modus wechseln? + <usetemplate name="okcancelbuttons" notext="Nicht beenden" yestext="Beenden"/> + </notification> + <notification label="" name="NoAvatarPay"> + Die Bezahlung anderer Einwohner ist nur im Modus „Erweitert“ möglich. Möchten Sie sich abmelden und den Modus wechseln? + <usetemplate name="okcancelbuttons" notext="Nicht beenden" yestext="Beenden"/> + </notification> <global name="UnsupportedCPU"> - Ihre CPU-Geschwindigkeit entspricht nicht den Mindestanforderungen. </global> diff --git a/indra/newview/skins/default/xui/de/panel_login.xml b/indra/newview/skins/default/xui/de/panel_login.xml index 1bee6b1ead..553bd3e2ff 100644 --- a/indra/newview/skins/default/xui/de/panel_login.xml +++ b/indra/newview/skins/default/xui/de/panel_login.xml @@ -17,6 +17,13 @@ </text> <check_box label="Kennwort merken" name="remember_check"/> <button label="Anmelden" name="connect_btn"/> + <text name="mode_selection_text"> + Modus: + </text> + <combo_box name="mode_combo" tool_tip="Wählen Sie den gewünschten Modus aus. Basis: Second Life schnell und einfach erkunden und chatten. Erweitert: Zugriff auf zusätzliche Funktionen."> + <combo_box.item label="Basis" name="Basic"/> + <combo_box.item label="Erweitert" name="Advanced"/> + </combo_box> <text name="start_location_text"> Hier anfangen: </text> diff --git a/indra/newview/skins/default/xui/de/panel_nearby_media.xml b/indra/newview/skins/default/xui/de/panel_nearby_media.xml index ef66148902..90885c7192 100644 --- a/indra/newview/skins/default/xui/de/panel_nearby_media.xml +++ b/indra/newview/skins/default/xui/de/panel_nearby_media.xml @@ -19,7 +19,7 @@ <button label="Stoppen" name="all_nearby_media_disable_btn" tool_tip="Alle Medien in der Nähe ausschalten"/> <button label="Starten" name="all_nearby_media_enable_btn" tool_tip="Alle Medien in der Nähe einschalten"/> <button name="open_prefs_btn" tool_tip="Medien-Einstellungen öffnen"/> - <button label="Mehr >>" label_selected="Weniger <<" name="more_btn" tool_tip="Erweiterte Steuerung"/> + <button label="Mehr >>" label_selected="<< Weniger" name="more_btn" tool_tip="Erweiterte Steuerung"/> <button label="Mehr >>" label_selected="Weniger <<" name="less_btn" tool_tip="Erweiterte Steuerung"/> </panel> <panel name="nearby_media_panel"> diff --git a/indra/newview/skins/default/xui/de/panel_people.xml b/indra/newview/skins/default/xui/de/panel_people.xml index 99e0b933b8..004792bbf5 100644 --- a/indra/newview/skins/default/xui/de/panel_people.xml +++ b/indra/newview/skins/default/xui/de/panel_people.xml @@ -18,6 +18,8 @@ Sie suchen nach Leuten? Verwenden Sie die [secondlife:///app/worldmap Karte]. <string name="groups_filter_label" value="Nach Gruppen filtern"/> <string name="no_filtered_groups_msg" value="Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/groups/[SEARCH_TERM] Suche]."/> <string name="no_groups_msg" value="Suchen Sie nach Gruppen? Versuchen Sie es mit der [secondlife:///app/search/groups Suche]."/> + <string name="MiniMapToolTipMsg" value="[REGION](Doppelklicken, um Karte zu öffnen; Umschalttaste gedrückt halten und ziehen, um zu schwenken)"/> + <string name="AltMiniMapToolTipMsg" value="[REGION](Doppelklicken, um zu teleportieren; Umschalttaste gedrückt halten und ziehen, um zu schwenken)"/> <filter_editor label="Filter" name="filter_input"/> <tab_container name="tabs"> <panel label="IN DER NÄHE" name="nearby_panel"> diff --git a/indra/newview/skins/default/xui/de/panel_profile.xml b/indra/newview/skins/default/xui/de/panel_profile.xml index 938631f65d..b4c6e67108 100644 --- a/indra/newview/skins/default/xui/de/panel_profile.xml +++ b/indra/newview/skins/default/xui/de/panel_profile.xml @@ -16,6 +16,12 @@ <string name="RegisterDateFormat"> [REG_DATE] ([AGE]) </string> + <string name="name_text_args"> + [NAME] + </string> + <string name="display_name_text_args"> + [DISPLAY_NAME] + </string> <layout_stack name="layout"> <layout_panel name="profile_stack"> <scroll_container name="profile_scroll"> @@ -34,7 +40,7 @@ </text_editor> <text name="title_partner_text" value="Partner:"/> <panel name="partner_data_panel"> - <name_box initial_value="(wird in Datenbank gesucht)" name="partner_text"/> + <text initial_value="(wird in Datenbank gesucht)" name="partner_text"/> </panel> <text name="title_groups_text" value="Gruppen:"/> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_script_ed.xml b/indra/newview/skins/default/xui/de/panel_script_ed.xml index 73789f06d8..adfe2a342b 100644 --- a/indra/newview/skins/default/xui/de/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/de/panel_script_ed.xml @@ -15,6 +15,9 @@ <panel.string name="Title"> Skript: [NAME] </panel.string> + <panel.string name="external_editor_not_set"> + Wählen Sie über die Umgebungsvariable „LL_SCRIPT_EDITOR“ oder die Einstellung „ExternalEditor“ einen Editor aus. + </panel.string> <menu_bar name="script_menu"> <menu label="Datei" name="File"> <menu_item_call label="Speichern" name="Save"/> diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml index 7284e40be2..0c621db6b0 100644 --- a/indra/newview/skins/default/xui/de/strings.xml +++ b/indra/newview/skins/default/xui/de/strings.xml @@ -1067,7 +1067,7 @@ <string name="PermNo"> Nein </string> - <string name="Chat" value=" Chat:"/> + <string name="Chat Message" value="Chat:"/> <string name="Sound" value=" Sound:"/> <string name="Wait" value=" --- Warten:"/> <string name="AnimFlagStop" value=" Animation stoppen:"/> @@ -1864,12 +1864,6 @@ Gültige Formate: .wav, .tga, .bmp, .jpg, .jpeg oder .bvh <string name="accel-win-shift"> Umschalt+ </string> - <string name="Esc"> - Esc - </string> - <string name="Home"> - Zuhause - </string> <string name="FileSaved"> Datei wurde gespeichert </string> @@ -1898,7 +1892,7 @@ Gültige Formate: .wav, .tga, .bmp, .jpg, .jpeg oder .bvh Rechts </string> <string name="Direction_Back"> - Hinten + Zurück </string> <string name="Direction_North"> Norden @@ -1987,6 +1981,9 @@ Gültige Formate: .wav, .tga, .bmp, .jpg, .jpeg oder .bvh <string name="Other"> Sonstige </string> + <string name="Rental"> + Vermietung + </string> <string name="Any"> Alle </string> @@ -3966,7 +3963,7 @@ Missbrauchsbericht <string name="Notices"> Mitteilungen </string> - <string name="Chat"> + <string name="Chat" value=" Chat:"> Chat </string> <string name="DeleteItems"> @@ -3978,4 +3975,348 @@ Missbrauchsbericht <string name="EmptyOutfitText"> Keine Objekte in diesem Outfit </string> + <string name="ExternalEditorNotSet"> + Wählen Sie über die Einstellung „ExternalEditor“ einen Editor aus + </string> + <string name="ExternalEditorNotFound"> + Angegebener externer Editor nicht gefunden. +Setzen Sie den Editorpfad in Anführungszeichen +(z. B. "/pfad/editor" "%s"). + </string> + <string name="ExternalEditorCommandParseError"> + Fehler beim Parsen des externen Editorbefehls. + </string> + <string name="ExternalEditorFailedToRun"> + Externer Editor konnte nicht ausgeführt werden. + </string> + <string name="Esc"> + Esc + </string> + <string name="Space"> + Space + </string> + <string name="Enter"> + Enter + </string> + <string name="Tab"> + Tab + </string> + <string name="Ins"> + Ins + </string> + <string name="Del"> + Del + </string> + <string name="Backsp"> + Backsp + </string> + <string name="Shift"> + Shift + </string> + <string name="Ctrl"> + Ctrl + </string> + <string name="Alt"> + Alt + </string> + <string name="CapsLock"> + CapsLock + </string> + <string name="Home"> + Zuhause + </string> + <string name="End"> + End + </string> + <string name="PgUp"> + PgUp + </string> + <string name="PgDn"> + PgDn + </string> + <string name="F1"> + F1 + </string> + <string name="F2"> + F2 + </string> + <string name="F3"> + F3 + </string> + <string name="F4"> + F4 + </string> + <string name="F5"> + F5 + </string> + <string name="F6"> + F6 + </string> + <string name="F7"> + F7 + </string> + <string name="F8"> + F8 + </string> + <string name="F9"> + F9 + </string> + <string name="F10"> + F10 + </string> + <string name="F11"> + F11 + </string> + <string name="F12"> + F12 + </string> + <string name="Add"> + Addieren + </string> + <string name="Subtract"> + Subtrahieren + </string> + <string name="Multiply"> + Multiplizieren + </string> + <string name="Divide"> + Dividieren + </string> + <string name="PAD_DIVIDE"> + PAD_DIVIDE + </string> + <string name="PAD_LEFT"> + PAD_LEFT + </string> + <string name="PAD_RIGHT"> + PAD_RIGHT + </string> + <string name="PAD_DOWN"> + PAD_DOWN + </string> + <string name="PAD_UP"> + PAD_UP + </string> + <string name="PAD_HOME"> + PAD_HOME + </string> + <string name="PAD_END"> + PAD_END + </string> + <string name="PAD_PGUP"> + PAD_PGUP + </string> + <string name="PAD_PGDN"> + PAD_PGDN + </string> + <string name="PAD_CENTER"> + PAD_CENTER + </string> + <string name="PAD_INS"> + PAD_INS + </string> + <string name="PAD_DEL"> + PAD_DEL + </string> + <string name="PAD_Enter"> + PAD_Enter + </string> + <string name="PAD_BUTTON0"> + PAD_BUTTON0 + </string> + <string name="PAD_BUTTON1"> + PAD_BUTTON1 + </string> + <string name="PAD_BUTTON2"> + PAD_BUTTON2 + </string> + <string name="PAD_BUTTON3"> + PAD_BUTTON3 + </string> + <string name="PAD_BUTTON4"> + PAD_BUTTON4 + </string> + <string name="PAD_BUTTON5"> + PAD_BUTTON5 + </string> + <string name="PAD_BUTTON6"> + PAD_BUTTON6 + </string> + <string name="PAD_BUTTON7"> + PAD_BUTTON7 + </string> + <string name="PAD_BUTTON8"> + PAD_BUTTON8 + </string> + <string name="PAD_BUTTON9"> + PAD_BUTTON9 + </string> + <string name="PAD_BUTTON10"> + PAD_BUTTON10 + </string> + <string name="PAD_BUTTON11"> + PAD_BUTTON11 + </string> + <string name="PAD_BUTTON12"> + PAD_BUTTON12 + </string> + <string name="PAD_BUTTON13"> + PAD_BUTTON13 + </string> + <string name="PAD_BUTTON14"> + PAD_BUTTON14 + </string> + <string name="PAD_BUTTON15"> + PAD_BUTTON15 + </string> + <string name="-"> + - + </string> + <string name="="> + = + </string> + <string name="`"> + ` + </string> + <string name=";"> + ; + </string> + <string name="["> + [ + </string> + <string name="]"> + ] + </string> + <string name="\"> + \ + </string> + <string name="0"> + 0 + </string> + <string name="1"> + 1 + </string> + <string name="2"> + 2 + </string> + <string name="3"> + 3 + </string> + <string name="4"> + 4 + </string> + <string name="5"> + 5 + </string> + <string name="6"> + 6 + </string> + <string name="7"> + 7 + </string> + <string name="8"> + 8 + </string> + <string name="9"> + 9 + </string> + <string name="A"> + A + </string> + <string name="B"> + B + </string> + <string name="C"> + C + </string> + <string name="D"> + D + </string> + <string name="E"> + E + </string> + <string name="F"> + F + </string> + <string name="G"> + G + </string> + <string name="H"> + H + </string> + <string name="I"> + I + </string> + <string name="J"> + J + </string> + <string name="K"> + K + </string> + <string name="L"> + L + </string> + <string name="M"> + M + </string> + <string name="N"> + N + </string> + <string name="O"> + O + </string> + <string name="P"> + P + </string> + <string name="Q"> + Q + </string> + <string name="R"> + R + </string> + <string name="S"> + S + </string> + <string name="T"> + T + </string> + <string name="U"> + U + </string> + <string name="V"> + V + </string> + <string name="W"> + W + </string> + <string name="X"> + X + </string> + <string name="Y"> + Y + </string> + <string name="Z"> + Z + </string> + <string name="BeaconParticle"> + Partikel-Beacons werden angezeigt (blau) + </string> + <string name="BeaconPhysical"> + Beacons für physische Objekte werden angezeigt (grün) + </string> + <string name="BeaconScripted"> + Beacons für Skriptobjekte werden angezeigt (rot) + </string> + <string name="BeaconScriptedTouch"> + Beacons für Skriptobjekte mit Berührungsfunktion werden angezeigt (rot) + </string> + <string name="BeaconSound"> + Sound-Beacons werden angezeigt (gelb) + </string> + <string name="BeaconMedia"> + Medien-Beacons werden angezeigt (weiß) + </string> + <string name="ParticleHiding"> + Partikel werden ausgeblendet + </string> </strings> diff --git a/indra/newview/skins/default/xui/en/floater_beacons.xml b/indra/newview/skins/default/xui/en/floater_beacons.xml index 4fc2b698d8..3d29356b22 100644 --- a/indra/newview/skins/default/xui/en/floater_beacons.xml +++ b/indra/newview/skins/default/xui/en/floater_beacons.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <floater legacy_header_height="18" - height="225" + height="245" layout="topleft" name="beacons" help_topic="beacons" @@ -12,7 +12,7 @@ width="240"> <panel follows="left|top|right|bottom" - height="200" + height="240" layout="topleft" left="10" name="beacons_panel" @@ -133,6 +133,16 @@ <check_box.commit_callback function="Beacons.UICheck" /> </check_box> + <check_box + control_name="moapbeacon" + height="16" + left="0" + label="Media sources" + layout="topleft" + name="moapbeacon" > + <check_box.commit_callback + function="Beacons.UICheck" /> + </check_box> </panel> </floater> diff --git a/indra/newview/skins/default/xui/en/menu_bottomtray.xml b/indra/newview/skins/default/xui/en/menu_bottomtray.xml index 1b55fa4fd3..07dabe1909 100644 --- a/indra/newview/skins/default/xui/en/menu_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/menu_bottomtray.xml @@ -9,7 +9,7 @@ visible="false" width="128"> <menu_item_check - label="Voice Enabled" + label="Speak Button" layout="topleft" name="EnableVoiceChat"> <menu_item_check.on_click @@ -19,7 +19,6 @@ function="CheckControl" parameter="EnableVoiceChat" /> </menu_item_check> - <menu_item_separator/> <menu_item_check label="Gesture button" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index ba13479860..433f623273 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -6985,6 +6985,18 @@ Mute everyone? To stand up and exit the sitting position, click the Stand button. </notification> + <notification + name="HintSpeak" + label="Speak" + type="hint" + unique="true"> +Click the Speak button to turn your microphone on and off. + +Click on the up arrow to see the voice control panel. + +Hiding the Speak button will disable the voice feature. + </notification> + <notification name="HintDestinationGuide" label="Explore the World" diff --git a/indra/newview/skins/default/xui/es/floater_about_land.xml b/indra/newview/skins/default/xui/es/floater_about_land.xml index 3f50437c13..3df0f92842 100644 --- a/indra/newview/skins/default/xui/es/floater_about_land.xml +++ b/indra/newview/skins/default/xui/es/floater_about_land.xml @@ -215,7 +215,7 @@ Vaya al menú Mundo > Acerca del terreno o seleccione otra parcela para ver s <text name="Simulator primitive usage:"> Uso de primitivas: </text> - <text name="objects_available"> + <text name="objects_available"> [COUNT] de un máx. de [MAX] ([AVAILABLE] disponibles) </text> <text name="Primitives parcel supports:"> @@ -347,6 +347,7 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda. <combo_box.item label="Parques y Naturaleza" name="item9"/> <combo_box.item label="Residencial" name="item10"/> <combo_box.item label="Compras" name="item11"/> + <combo_box.item label="Terreno en alquiler" name="item13"/> <combo_box.item label="Otra" name="item12"/> </combo_box> <combo_box name="land category"> @@ -361,6 +362,7 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda. <combo_box.item label="Parques y Naturaleza" name="item9"/> <combo_box.item label="Residencial" name="item10"/> <combo_box.item label="Compras" name="item11"/> + <combo_box.item label="Terreno en alquiler" name="item13"/> <combo_box.item label="Otra" name="item12"/> </combo_box> <check_box label="Contenido 'Mature'" name="MatureCheck" tool_tip=""/> @@ -439,7 +441,7 @@ los media: (Definido por el Estado) </panel.string> <panel.string name="allow_public_access"> - Permitir el acceso público ([MATURITY]) + Permitir el acceso público ([MATURITY]) (Nota: Si no seleccionas esta opción, se crearán líneas de prohibición) </panel.string> <panel.string name="estate_override"> Una o más de esta opciones está configurada a nivel del estado diff --git a/indra/newview/skins/default/xui/es/floater_map.xml b/indra/newview/skins/default/xui/es/floater_map.xml index fa01a4a635..370b7f5053 100644 --- a/indra/newview/skins/default/xui/es/floater_map.xml +++ b/indra/newview/skins/default/xui/es/floater_map.xml @@ -3,6 +3,9 @@ <floater.string name="ToolTipMsg"> [REGIÓN](Haz doble clic para abrir el mapa y pulsa la tecla Mayús y arrastra para obtener una vista panorámica) </floater.string> + <floater.string name="AltToolTipMsg"> + [REGION](Pulsa dos veces para teleportarte, pulsa mayús y arrastra para obtener una panorámica) + </floater.string> <floater.string name="mini_map_caption"> MINIMAPA </floater.string> diff --git a/indra/newview/skins/default/xui/es/floater_tools.xml b/indra/newview/skins/default/xui/es/floater_tools.xml index e2ff4a25ce..fba969f267 100644 --- a/indra/newview/skins/default/xui/es/floater_tools.xml +++ b/indra/newview/skins/default/xui/es/floater_tools.xml @@ -64,6 +64,8 @@ <radio_item label="Elegir la cara" name="radio select face"/> </radio_group> <check_box label="Editar las partes enlazadas" name="checkbox edit linked parts"/> + <button label="Enlazar" name="link_btn"/> + <button label="Desenlazar" name="unlink_btn"/> <text name="RenderingCost" tool_tip="Muestra cuánto se calcula que cuesta renderizar este objeto"> þ: [COUNT] </text> diff --git a/indra/newview/skins/default/xui/es/menu_attachment_self.xml b/indra/newview/skins/default/xui/es/menu_attachment_self.xml index ab76c92d65..0ba39378bb 100644 --- a/indra/newview/skins/default/xui/es/menu_attachment_self.xml +++ b/indra/newview/skins/default/xui/es/menu_attachment_self.xml @@ -5,7 +5,7 @@ <menu_item_call label="Quitar" name="Detach"/> <menu_item_call label="Sentarte" name="Sit Down Here"/> <menu_item_call label="Levantarme" name="Stand Up"/> - <menu_item_call label="Cambiar vestuario" name="Change Outfit"/> + <menu_item_call label="Mi apariencia" name="Change Outfit"/> <menu_item_call label="Editar mi vestuario" name="Edit Outfit"/> <menu_item_call label="Editar mi anatomía" name="Edit My Shape"/> <menu_item_call label="Mis amigos" name="Friends..."/> diff --git a/indra/newview/skins/default/xui/es/menu_avatar_self.xml b/indra/newview/skins/default/xui/es/menu_avatar_self.xml index 50f8384b0f..a2d86d78c1 100644 --- a/indra/newview/skins/default/xui/es/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/es/menu_avatar_self.xml @@ -21,7 +21,7 @@ <context_menu label="Quitar" name="Object Detach"/> <menu_item_call label="Quitarse todo" name="Detach All"/> </context_menu> - <menu_item_call label="Cambiar vestuario" name="Chenge Outfit"/> + <menu_item_call label="Mi apariencia" name="Chenge Outfit"/> <menu_item_call label="Editar mi vestuario" name="Edit Outfit"/> <menu_item_call label="Editar mi anatomía" name="Edit My Shape"/> <menu_item_call label="Mis amigos" name="Friends..."/> diff --git a/indra/newview/skins/default/xui/es/menu_bottomtray.xml b/indra/newview/skins/default/xui/es/menu_bottomtray.xml index 62683f3076..a16da5ae9e 100644 --- a/indra/newview/skins/default/xui/es/menu_bottomtray.xml +++ b/indra/newview/skins/default/xui/es/menu_bottomtray.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="hide_camera_move_controls_menu"> + <menu_item_check label="Voz activada" name="EnableVoiceChat"/> <menu_item_check label="Botón Gestos" name="ShowGestureButton"/> <menu_item_check label="Botón Moverse" name="ShowMoveButton"/> <menu_item_check label="Botón Vista" name="ShowCameraButton"/> <menu_item_check label="Botón Foto" name="ShowSnapshotButton"/> - <menu_item_check label="Botón Barra lateral" name="ShowSidebarButton"/> <menu_item_check label="Botón Construir" name="ShowBuildButton"/> <menu_item_check label="Botón Buscar" name="ShowSearchButton"/> <menu_item_check label="Botón Mapa" name="ShowWorldMapButton"/> diff --git a/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml index 236289f82a..bee4c61da2 100644 --- a/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml +++ b/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> -<menu name="Gear Menu"> +<toggleable_menu name="Gear Menu"> <menu_item_call label="Ver el perfil" name="view_profile"/> <menu_item_call label="Añadir como amigo" name="add_friend"/> <menu_item_call label="MI" name="im"/> @@ -11,9 +11,11 @@ <menu_item_call label="Denunciar" name="report"/> <menu_item_call label="Congelar" name="freeze"/> <menu_item_call label="Expulsar" name="eject"/> + <menu_item_call label="Expulsar" name="kick"/> + <menu_item_call label="CSR" name="csr"/> <menu_item_call label="Depurar las texturas" name="debug"/> <menu_item_call label="Encontrar en el mapa" name="find_on_map"/> <menu_item_call label="Acercar el zoom" name="zoom_in"/> <menu_item_call label="Pagar" name="pay"/> <menu_item_call label="Compartir" name="share"/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/es/menu_inspect_self_gear.xml index c8a1e9d9da..29ad718fdd 100644 --- a/indra/newview/skins/default/xui/es/menu_inspect_self_gear.xml +++ b/indra/newview/skins/default/xui/es/menu_inspect_self_gear.xml @@ -1,10 +1,31 @@ -<?xml version="1.0" encoding="utf-8"?> -<menu name="Gear Menu"> - <menu_item_call label="Sentarte" name="sit_down_here"/> - <menu_item_call label="Levantarme" name="stand_up"/> - <menu_item_call label="Cambiar vestuario" name="change_outfit"/> - <menu_item_call label="Mi perfil" name="my_profile"/> - <menu_item_call label="Mis amigos" name="my_friends"/> - <menu_item_call label="Mis grupos" name="my_groups"/> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Gear Menu"> + <menu_item_call label="Sentarme" name="Sit Down Here"/> + <menu_item_call label="Levantarme" name="Stand Up"/> + <context_menu label="Quitarme" name="Take Off >"> + <context_menu label="Ropas" name="Clothes >"> + <menu_item_call label="Camisa" name="Shirt"/> + <menu_item_call label="Pantalones" name="Pants"/> + <menu_item_call label="Falda" name="Skirt"/> + <menu_item_call label="Zapatos" name="Shoes"/> + <menu_item_call label="Calcetines" name="Socks"/> + <menu_item_call label="Chaqueta" name="Jacket"/> + <menu_item_call label="Guantes" name="Gloves"/> + <menu_item_call label="Camiseta" name="Self Undershirt"/> + <menu_item_call label="Ropa interior" name="Self Underpants"/> + <menu_item_call label="Tatuaje" name="Self Tattoo"/> + <menu_item_call label="Alfa" name="Self Alpha"/> + <menu_item_call label="Toda la ropa" name="All Clothes"/> + </context_menu> + <context_menu label="HUD" name="Object Detach HUD"/> + <context_menu label="Quitar" name="Object Detach"/> + <menu_item_call label="Quitarse todo" name="Detach All"/> + </context_menu> + <menu_item_call label="Cambiar vestuario" name="Chenge Outfit"/> + <menu_item_call label="Editar mi vestuario" name="Edit Outfit"/> + <menu_item_call label="Editar mi anatomía" name="Edit My Shape"/> + <menu_item_call label="Mis amigos" name="Friends..."/> + <menu_item_call label="Mis grupos" name="Groups..."/> + <menu_item_call label="Mi perfil" name="Profile..."/> <menu_item_call label="Depurar las texturas" name="Debug..."/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/es/menu_inventory_gear_default.xml index 8e498fefba..0e9644629e 100644 --- a/indra/newview/skins/default/xui/es/menu_inventory_gear_default.xml +++ b/indra/newview/skins/default/xui/es/menu_inventory_gear_default.xml @@ -3,6 +3,7 @@ <menu_item_call label="Nueva ventana del inventario" name="new_window"/> <menu_item_check label="Ordenar alfabéticamente" name="sort_by_name"/> <menu_item_check label="Ordenar por los más recientes" name="sort_by_recent"/> + <menu_item_check label="Ordenar las carpetas siempre alfabéticamente" name="sort_folders_by_name"/> <menu_item_check label="Las carpetas del sistema, arriba" name="sort_system_folders_to_top"/> <menu_item_call label="Ver los filtros" name="show_filters"/> <menu_item_call label="Restablecer los filtros" name="reset_filters"/> diff --git a/indra/newview/skins/default/xui/es/menu_object.xml b/indra/newview/skins/default/xui/es/menu_object.xml index 06121e0c09..d8c75eaf47 100644 --- a/indra/newview/skins/default/xui/es/menu_object.xml +++ b/indra/newview/skins/default/xui/es/menu_object.xml @@ -16,14 +16,14 @@ <context_menu label="Anexar" name="Object Attach"/> <context_menu label="Anexar el HUD" name="Object Attach HUD"/> </context_menu> - <context_menu label="Quitar" name="Remove"> + <context_menu label="Gestionar" name="Remove"> <menu_item_call label="Denunciar una infracción" name="Report Abuse..."/> <menu_item_call label="Ignorar" name="Object Mute"/> <menu_item_call label="Devolver" name="Return..."/> - <menu_item_call label="Eliminar" name="Delete"/> </context_menu> <menu_item_call label="Tomar" name="Pie Object Take"/> <menu_item_call label="Coger una copia" name="Take Copy"/> <menu_item_call label="Pagar" name="Pay..."/> <menu_item_call label="Comprar" name="Buy..."/> + <menu_item_call label="Borrar" name="Delete"/> </context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/es/menu_places_gear_folder.xml index bf46eb58e3..4051ff4075 100644 --- a/indra/newview/skins/default/xui/es/menu_places_gear_folder.xml +++ b/indra/newview/skins/default/xui/es/menu_places_gear_folder.xml @@ -1,7 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="menu_folder_gear"> +<toggleable_menu name="menu_folder_gear"> <menu_item_call label="Añadir este hito" name="add_landmark"/> <menu_item_call label="Añadir una carpeta" name="add_folder"/> + <menu_item_call label="Restaurar ítem" name="restore_item"/> <menu_item_call label="Cortar" name="cut"/> <menu_item_call label="Copiar" name="copy_folder"/> <menu_item_call label="Pegar" name="paste"/> @@ -12,4 +13,4 @@ <menu_item_call label="Abrir todas las carpetas" name="expand_all"/> <menu_item_call label="Cerrar todas las carpetas" name="collapse_all"/> <menu_item_check label="Ordenar por fecha" name="sort_by_date"/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/es/menu_places_gear_landmark.xml index eac85de846..c92bd19787 100644 --- a/indra/newview/skins/default/xui/es/menu_places_gear_landmark.xml +++ b/indra/newview/skins/default/xui/es/menu_places_gear_landmark.xml @@ -1,10 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="menu_ladmark_gear"> +<toggleable_menu name="menu_ladmark_gear"> <menu_item_call label="Teleportar" name="teleport"/> <menu_item_call label="Más información" name="more_info"/> <menu_item_call label="Mostrar en el mapa" name="show_on_map"/> <menu_item_call label="Añadir un hito" name="add_landmark"/> <menu_item_call label="Añadir una carpeta" name="add_folder"/> + <menu_item_call label="Restaurar ítem" name="restore_item"/> <menu_item_call label="Cortar" name="cut"/> <menu_item_call label="Copiar el hito" name="copy_landmark"/> <menu_item_call label="Copiar la SLurl" name="copy_slurl"/> @@ -15,4 +16,4 @@ <menu_item_call label="Cerrar todas las carpetas" name="collapse_all"/> <menu_item_check label="Ordenar por fecha" name="sort_by_date"/> <menu_item_call label="Crear un Destacado" name="create_pick"/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_viewer.xml b/indra/newview/skins/default/xui/es/menu_viewer.xml index 2fe7db1041..c48203f95c 100644 --- a/indra/newview/skins/default/xui/es/menu_viewer.xml +++ b/indra/newview/skins/default/xui/es/menu_viewer.xml @@ -7,7 +7,7 @@ </menu_item_call> <menu_item_call label="Comprar L$" name="Buy and Sell L$"/> <menu_item_call label="Mi perfil" name="Profile"/> - <menu_item_call label="Cambiar vestuario" name="ChangeOutfit"/> + <menu_item_call label="Mi apariencia" name="ChangeOutfit"/> <menu_item_check label="Mi Inventario" name="Inventory"/> <menu_item_check label="Mi Inventario" name="ShowSidetrayInventory"/> <menu_item_check label="Mis gestos" name="Gestures"/> @@ -35,6 +35,7 @@ <menu label="Mundo" name="World"> <menu_item_check label="Minimapa" name="Mini-Map"/> <menu_item_check label="Mapa del mundo" name="World Map"/> + <menu_item_check label="Buscar" name="Search"/> <menu_item_call label="Foto" name="Take Snapshot"/> <menu_item_call label="Crear un hito de este sitio" name="Create Landmark Here"/> <menu label="Perfil del lugar" name="Land"> @@ -224,7 +225,9 @@ <menu label="Show Info" name="Display Info"> <menu_item_check label="Show Time" name="Show Time"/> <menu_item_check label="Show Render Info" name="Show Render Info"/> + <menu_item_check label="Mostrar información de textura" name="Show Texture Info"/> <menu_item_check label="Show Color Under Cursor" name="Show Color Under Cursor"/> + <menu_item_check label="Mostrar la memoria" name="Show Memory"/> <menu_item_check label="Show Updates to Objects" name="Show Updates"/> </menu> <menu label="Force an Error" name="Force Errors"> @@ -242,6 +245,9 @@ <menu_item_check label="Randomize Framerate" name="Randomize Framerate"/> <menu_item_check label="Frame Test" name="Frame Test"/> </menu> + <menu label="Render Metadata" name="Render Metadata"> + <menu_item_check label="Actualizar el tipo" name="Update Type"/> + </menu> <menu label="Rendering" name="Rendering"> <menu_item_check label="Axes" name="Axes"/> <menu_item_check label="Wireframe" name="Wireframe"/> diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml index 2bf36bb763..1379f710c3 100644 --- a/indra/newview/skins/default/xui/es/notifications.xml +++ b/indra/newview/skins/default/xui/es/notifications.xml @@ -73,7 +73,7 @@ Detalles del error: la notificación de nombre '[_NAME]' no se ha enco </notification> <notification name="LoginFailedNoNetwork"> No se puede conectar con [SECOND_LIFE_GRID]. -'[DIAGNOSTIC]' + '[DIAGNOSTIC]' Asegúrate de que tu conexión a Internet está funcionando adecuadamente. <usetemplate name="okbutton" yestext="OK"/> </notification> @@ -330,13 +330,6 @@ Necesitas una cuenta para acceder a [SECOND_LIFE]. ¿Te gustaría crear una ahor <notification name="InvalidCredentialFormat"> Escribe el nombre de usuario o el nombre y el apellido de tu avatar en el campo Nombre de usuario e inicia sesión otra vez. </notification> - <notification name="AddClassified"> - Los anuncios clasificados aparecen durante una semana en la sección 'Clasificados' de la búsqueda y en [http://secondlife.com/community/classifieds secondlife.com]. -Rellena tu anuncio y pulsa 'Publicar...' para añadirlo al directorio. -Cuando pulses Publicar, se te preguntará por un precio a pagar. -El pagar más hará que tu anuncio aparezca más arriba en la lista, y que también aparezca más arriba en la lista cuando la gente busque por palabras clave. - <usetemplate ignoretext="Cómo crear un anuncio clasificado nuevo." name="okcancelignore" notext="Cancelar" yestext="OK"/> - </notification> <notification name="DeleteClassified"> ¿Borrar el clasificado '[NAME]'? No se reembolsan las cuotas pagadas. @@ -2851,9 +2844,6 @@ Si lo haces, todos los residentes que se unan posteriormente a la llamada tambi <notification label="Explora el mundo" name="HintDestinationGuide"> La Guía de destinos contiene miles de nuevos lugares por descubrir. Selecciona una ubicación y elige Teleportarme para iniciar la exploración. </notification> - <notification label="Cambiar de apariencia" name="HintAvatarPicker"> - ¿Te gustaría cambiar de apariencia? Haz clic en el botón que aparece a continuación para ver más avatares. - </notification> <notification label="Panel lateral" name="HintSidePanel"> Accede de manera rápida a tu inventario, así como a tu ropa, los perfiles y el resto de la información disponible en el panel lateral. </notification> @@ -2891,6 +2881,38 @@ Si lo haces, todos los residentes que se unan posteriormente a la llamada tambi <button name="cancel" text="Cancelar"/> </form> </notification> + <notification label="" name="ModeChange"> + Para cambiar de modo tienes que salir y reiniciar. + <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/> + </notification> + <notification label="" name="NoClassifieds"> + La creación y edición de clasificados sólo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión. + <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/> + </notification> + <notification label="" name="NoGroupInfo"> + La creación y edición de grupos sólo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión. + <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/> + </notification> + <notification label="" name="NoPicks"> + La creación y edición de Destacados sólo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión. + <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/> + </notification> + <notification label="" name="NoWorldMap"> + La visualización del mapa del mundo sólo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión. + <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/> + </notification> + <notification label="" name="NoVoiceCall"> + Las llamadas de voz sólo están disponibles en el modo Avanzado. ¿Quieres cerrar sesión y cambiar de modo? + <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/> + </notification> + <notification label="" name="NoAvatarShare"> + Compartir sólo está disponible en el modo Avanzado. ¿Quieres cerrar sesión y cambiar de modo? + <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/> + </notification> + <notification label="" name="NoAvatarPay"> + El pago a otros residentes sólo está disponible en el modo Avanzado. ¿Quieres cerrar sesión y cambiar de modo? + <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/> + </notification> <global name="UnsupportedCPU"> - La velocidad de tu CPU no cumple los requerimientos mínimos. </global> diff --git a/indra/newview/skins/default/xui/es/panel_login.xml b/indra/newview/skins/default/xui/es/panel_login.xml index ada964f33e..eee1844c46 100644 --- a/indra/newview/skins/default/xui/es/panel_login.xml +++ b/indra/newview/skins/default/xui/es/panel_login.xml @@ -17,6 +17,13 @@ </text> <check_box label="Recordar la contraseña" name="remember_check"/> <button label="Iniciar sesión" name="connect_btn"/> + <text name="mode_selection_text"> + Modo: + </text> + <combo_box name="mode_combo" tool_tip="Selecciona el modo. Elige Básico para una exploración rápida y fácil y para chatear. Elige Avanzado para tener acceso a más funciones."> + <combo_box.item label="Básico" name="Basic"/> + <combo_box.item label="Avanzado" name="Advanced"/> + </combo_box> <text name="start_location_text"> Empezar en: </text> diff --git a/indra/newview/skins/default/xui/es/panel_nearby_media.xml b/indra/newview/skins/default/xui/es/panel_nearby_media.xml index f65cae6e20..8d4f9eda18 100644 --- a/indra/newview/skins/default/xui/es/panel_nearby_media.xml +++ b/indra/newview/skins/default/xui/es/panel_nearby_media.xml @@ -19,7 +19,7 @@ <button label="Parar todo" name="all_nearby_media_disable_btn" tool_tip="Apagar todos los media cercanos"/> <button label="Iniciar todo" name="all_nearby_media_enable_btn" tool_tip="Encender todos los media cercanos"/> <button name="open_prefs_btn" tool_tip="Abrir las preferencias de los media"/> - <button label="Más >>" label_selected="Menos <<" name="more_btn" tool_tip="Controles avanzados"/> + <button label="Más >>" label_selected="<< Menos" name="more_btn" tool_tip="Controles avanzados"/> <button label="Más >>" label_selected="Menos <<" name="less_btn" tool_tip="Controles avanzados"/> </panel> <panel name="nearby_media_panel"> diff --git a/indra/newview/skins/default/xui/es/panel_people.xml b/indra/newview/skins/default/xui/es/panel_people.xml index d0c80ebae5..01149e412d 100644 --- a/indra/newview/skins/default/xui/es/panel_people.xml +++ b/indra/newview/skins/default/xui/es/panel_people.xml @@ -18,6 +18,8 @@ <string name="groups_filter_label" value="Filtrar a los grupos"/> <string name="no_filtered_groups_msg" value="¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/groups/[SEARCH_TERM] Buscar]."/> <string name="no_groups_msg" value="¿Buscas grupos en que participar? Prueba la [secondlife:///app/search/groups Búsqueda]."/> + <string name="MiniMapToolTipMsg" value="[REGION](Pulsa dos veces para abrir el mapa, pulsa mayús y arrastra para obtener una panorámica)"/> + <string name="AltMiniMapToolTipMsg" value="[REGION](Pulsa dos veces para teleportarte, pulsa mayús y arrastra para obtener una panorámica)"/> <filter_editor label="Filtrar" name="filter_input"/> <tab_container name="tabs"> <panel label="CERCANA" name="nearby_panel"> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml index 67f9a929f6..0b304fe287 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml @@ -27,9 +27,9 @@ </text> <check_box label="Chats de grupo" name="EnableGroupChatPopups" tool_tip="Activa esta casilla para ver una ventana emergente cada vez que recibas un mensaje de un grupo de chat"/> <check_box label="Chats de MI" name="EnableIMChatPopups" tool_tip="Activa esta casilla para ver una ventana emergente cada vez que recibas un mensaje instantáneo"/> - <spinner label="Duración de los interlocutores favoritos en los chats:" name="nearby_toasts_lifetime"/> - <spinner label="Tiempo restante de los interlocutores favoritos en los chats:" name="nearby_toasts_fadingtime"/> - <check_box label="Utiliza la herramienta de traducción automática mientras utilizas el chat (mediante Google)" name="translate_chat_checkbox"/> + <spinner label="Duración de los interlocutores favoritos:" name="nearby_toasts_lifetime"/> + <spinner label="Tiempo de los otros interlocutores:" name="nearby_toasts_fadingtime"/> + <check_box label="Usar la traducción automática (con Google) en el chat" name="translate_chat_checkbox"/> <text name="translate_language_text"> Traducir el chat al: </text> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_general.xml b/indra/newview/skins/default/xui/es/panel_preferences_general.xml index 91cf9524a3..790c7be581 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_general.xml @@ -55,7 +55,7 @@ </text> <radio_group name="inworld_typing_preference"> <radio_item label="Inicia el chat local" name="radio_start_chat" value="1"/> - <radio_item label="Se verá afectado el movimiento (por ejemplo, mediante las teclas WASD)" name="radio_move" value="0"/> + <radio_item label="Afecta al movimiento (por ejemplo, en las teclas WASD)" name="radio_move" value="0"/> </radio_group> <text name="title_afk_text"> Ausente tras: diff --git a/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml index 5eaa345c98..adc0862cf1 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml @@ -11,7 +11,7 @@ <check_box label="Sólo saben si estoy conectado mis amigos y grupos" name="online_visibility"/> <check_box label="Sólo pueden llamarme o mandarme un MI mis amigos y grupos" name="voice_call_friends_only_check"/> <check_box label="Desconectar el micrófono cuando finalicen las llamadas" name="auto_disengage_mic_check"/> - <check_box label="Mostrar mis Hitos favoritos en Inicio de sesión (mediante el menú desplegable "Empezar en")" name="favorites_on_login_check"/> + <check_box label="Mostrar mis Hitos favoritos al Inicio de sesión (menú desplegable "Empezar en")" name="favorites_on_login_check"/> <text name="Logs:"> Registros de chat: </text> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_setup.xml b/indra/newview/skins/default/xui/es/panel_preferences_setup.xml index 68484645b7..9b453fd807 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_setup.xml @@ -32,7 +32,7 @@ <check_box initial_value="true" label="Activar plugins" name="browser_plugins_enabled"/> <check_box initial_value="true" label="Aceptar las 'cookies'" name="cookies_enabled"/> <check_box initial_value="true" label="Activar Javascript" name="browser_javascript_enabled"/> - <check_box initial_value="falso" label="Permitir ventanas emergentes de navegadores de medios" name="media_popup_enabled"/> + <check_box initial_value="falso" label="Permitir las ventanas emergentes en el navegador" name="media_popup_enabled"/> <check_box initial_value="false" label="Activar web proxy" name="web_proxy_enabled"/> <text name="Proxy location"> Localización del proxy: diff --git a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml index 6c4ab0f14f..db3659abcd 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml @@ -9,7 +9,7 @@ <slider label="Ambiental" name="Wind Volume"/> <slider label="Efectos de sonido" name="SFX Volume"/> <slider label="Música en streaming" name="Music Volume"/> - <check_box label="Activada" name="enable_music"/> + <check_box label="Activados" name="enable_music"/> <slider label="Multimedia" name="Media Volume"/> <check_box label="Activada" name="enable_media"/> <slider label="Chat de voz" name="Voice Volume"/> diff --git a/indra/newview/skins/default/xui/es/panel_profile.xml b/indra/newview/skins/default/xui/es/panel_profile.xml index 339a1f236b..334c0541af 100644 --- a/indra/newview/skins/default/xui/es/panel_profile.xml +++ b/indra/newview/skins/default/xui/es/panel_profile.xml @@ -16,6 +16,12 @@ <string name="RegisterDateFormat"> [REG_DATE] ([AGE]) </string> + <string name="name_text_args"> + [NAME] + </string> + <string name="display_name_text_args"> + [DISPLAY_NAME] + </string> <layout_stack name="layout"> <layout_panel name="profile_stack"> <scroll_container name="profile_scroll"> @@ -30,7 +36,7 @@ <text name="title_acc_status_text" value="Estado de la cuenta:"/> <text name="title_partner_text" value="Compañero/a:"/> <panel name="partner_data_panel"> - <name_box initial_value="(obteniendo)" name="partner_text"/> + <text initial_value="(obteniendo)" name="partner_text"/> </panel> <text name="title_groups_text" value="Grupos:"/> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_script_ed.xml b/indra/newview/skins/default/xui/es/panel_script_ed.xml index 5be25a286d..46952c6974 100644 --- a/indra/newview/skins/default/xui/es/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/es/panel_script_ed.xml @@ -15,6 +15,9 @@ <panel.string name="Title"> Script: [NAME] </panel.string> + <panel.string name="external_editor_not_set"> + Puedes seleccionar un editor configurando la variable de entorno LL_SCRIPT_EDITOR o mediante la configuración de ExternalEditor. + </panel.string> <menu_bar name="script_menu"> <menu label="Archivo" name="File"> <menu_item_call label="Guardar" name="Save"/> diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index df40a2b6b4..cd1fb767c8 100644 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -1040,7 +1040,7 @@ </string> <string name="WornOnAttachmentPoint" value="(lo llevas en: [ATTACHMENT_POINT])"/> <string name="ActiveGesture" value="[GESLABEL] (activo)"/> - <string name="Chat" value="Chat :"/> + <string name="Chat Message" value="Chat:"/> <string name="Sound" value="Sonido :"/> <string name="Wait" value="--- Espera :"/> <string name="AnimFlagStop" value="Parar la animación:"/> @@ -1822,12 +1822,6 @@ Se esperaba .wav, .tga, .bmp, .jpg, .jpeg, o .bvh <string name="accel-win-shift"> Mayús+ </string> - <string name="Esc"> - Esc - </string> - <string name="Home"> - Base - </string> <string name="FileSaved"> Archivo guardado </string> @@ -1945,6 +1939,9 @@ Se esperaba .wav, .tga, .bmp, .jpg, .jpeg, o .bvh <string name="Other"> Otra </string> + <string name="Rental"> + Terreno en alquiler + </string> <string name="Any"> Cualquiera </string> @@ -3864,7 +3861,7 @@ Denuncia de infracción <string name="Notices"> Avisos </string> - <string name="Chat"> + <string name="Chat" value="Chat :"> Chat </string> <string name="DeleteItems"> @@ -3876,4 +3873,348 @@ Denuncia de infracción <string name="EmptyOutfitText"> No hay elementos en este vestuario </string> + <string name="ExternalEditorNotSet"> + Selecciona un editor mediante la configuración de ExternalEditor. + </string> + <string name="ExternalEditorNotFound"> + No se encuentra el editor externo especificado. +Inténtalo incluyendo la ruta de acceso al editor entre comillas +(por ejemplo, "/ruta a mi/editor" "%s"). + </string> + <string name="ExternalEditorCommandParseError"> + Error al analizar el comando de editor externo. + </string> + <string name="ExternalEditorFailedToRun"> + Error al ejecutar el editor externo. + </string> + <string name="Esc"> + Esc + </string> + <string name="Space"> + Space + </string> + <string name="Enter"> + Enter + </string> + <string name="Tab"> + Tab + </string> + <string name="Ins"> + Ins + </string> + <string name="Del"> + Del + </string> + <string name="Backsp"> + Backsp + </string> + <string name="Shift"> + Shift + </string> + <string name="Ctrl"> + Ctrl + </string> + <string name="Alt"> + Alt + </string> + <string name="CapsLock"> + CapsLock + </string> + <string name="Home"> + Base + </string> + <string name="End"> + End + </string> + <string name="PgUp"> + PgUp + </string> + <string name="PgDn"> + PgDn + </string> + <string name="F1"> + F1 + </string> + <string name="F2"> + F2 + </string> + <string name="F3"> + F3 + </string> + <string name="F4"> + F4 + </string> + <string name="F5"> + F5 + </string> + <string name="F6"> + F6 + </string> + <string name="F7"> + F7 + </string> + <string name="F8"> + F8 + </string> + <string name="F9"> + F9 + </string> + <string name="F10"> + F10 + </string> + <string name="F11"> + F11 + </string> + <string name="F12"> + F12 + </string> + <string name="Add"> + Añadir + </string> + <string name="Subtract"> + Restar + </string> + <string name="Multiply"> + Multiplicar + </string> + <string name="Divide"> + Dividir + </string> + <string name="PAD_DIVIDE"> + PAD_DIVIDE + </string> + <string name="PAD_LEFT"> + PAD_LEFT + </string> + <string name="PAD_RIGHT"> + PAD_RIGHT + </string> + <string name="PAD_DOWN"> + PAD_DOWN + </string> + <string name="PAD_UP"> + PAD_UP + </string> + <string name="PAD_HOME"> + PAD_HOME + </string> + <string name="PAD_END"> + PAD_END + </string> + <string name="PAD_PGUP"> + PAD_PGUP + </string> + <string name="PAD_PGDN"> + PAD_PGDN + </string> + <string name="PAD_CENTER"> + PAD_CENTER + </string> + <string name="PAD_INS"> + PAD_INS + </string> + <string name="PAD_DEL"> + PAD_DEL + </string> + <string name="PAD_Enter"> + PAD_Enter + </string> + <string name="PAD_BUTTON0"> + PAD_BUTTON0 + </string> + <string name="PAD_BUTTON1"> + PAD_BUTTON1 + </string> + <string name="PAD_BUTTON2"> + PAD_BUTTON2 + </string> + <string name="PAD_BUTTON3"> + PAD_BUTTON3 + </string> + <string name="PAD_BUTTON4"> + PAD_BUTTON4 + </string> + <string name="PAD_BUTTON5"> + PAD_BUTTON5 + </string> + <string name="PAD_BUTTON6"> + PAD_BUTTON6 + </string> + <string name="PAD_BUTTON7"> + PAD_BUTTON7 + </string> + <string name="PAD_BUTTON8"> + PAD_BUTTON8 + </string> + <string name="PAD_BUTTON9"> + PAD_BUTTON9 + </string> + <string name="PAD_BUTTON10"> + PAD_BUTTON10 + </string> + <string name="PAD_BUTTON11"> + PAD_BUTTON11 + </string> + <string name="PAD_BUTTON12"> + PAD_BUTTON12 + </string> + <string name="PAD_BUTTON13"> + PAD_BUTTON13 + </string> + <string name="PAD_BUTTON14"> + PAD_BUTTON14 + </string> + <string name="PAD_BUTTON15"> + PAD_BUTTON15 + </string> + <string name="-"> + - + </string> + <string name="="> + = + </string> + <string name="`"> + ` + </string> + <string name=";"> + ; + </string> + <string name="["> + [ + </string> + <string name="]"> + ] + </string> + <string name="\"> + \ + </string> + <string name="0"> + 0 + </string> + <string name="1"> + 1 + </string> + <string name="2"> + 2 + </string> + <string name="3"> + 3 + </string> + <string name="4"> + 4 + </string> + <string name="5"> + 5 + </string> + <string name="6"> + 6 + </string> + <string name="7"> + 7 + </string> + <string name="8"> + 8 + </string> + <string name="9"> + 9 + </string> + <string name="A"> + A + </string> + <string name="B"> + B + </string> + <string name="C"> + C + </string> + <string name="D"> + D + </string> + <string name="E"> + E + </string> + <string name="F"> + F + </string> + <string name="G"> + G + </string> + <string name="H"> + H + </string> + <string name="I"> + I + </string> + <string name="J"> + J + </string> + <string name="K"> + K + </string> + <string name="L"> + L + </string> + <string name="M"> + M + </string> + <string name="N"> + N + </string> + <string name="O"> + O + </string> + <string name="P"> + P + </string> + <string name="Q"> + Q + </string> + <string name="R"> + R + </string> + <string name="S"> + S + </string> + <string name="T"> + T + </string> + <string name="U"> + U + </string> + <string name="V"> + V + </string> + <string name="W"> + W + </string> + <string name="X"> + X + </string> + <string name="Y"> + Y + </string> + <string name="Z"> + Z + </string> + <string name="BeaconParticle"> + Viendo balizas de partículas (azules) + </string> + <string name="BeaconPhysical"> + Viendo balizas de objetos materiales (verdes) + </string> + <string name="BeaconScripted"> + Viendo balizas de objetos con script (rojas) + </string> + <string name="BeaconScriptedTouch"> + Viendo el objeto con script con balizas de función táctil (rojas) + </string> + <string name="BeaconSound"> + Viendo balizas de sonido (amarillas) + </string> + <string name="BeaconMedia"> + Viendo balizas de medios (blancas) + </string> + <string name="ParticleHiding"> + Ocultando las partículas + </string> </strings> diff --git a/indra/newview/skins/default/xui/fr/floater_about_land.xml b/indra/newview/skins/default/xui/fr/floater_about_land.xml index 6e6409725f..a33c0344f7 100644 --- a/indra/newview/skins/default/xui/fr/floater_about_land.xml +++ b/indra/newview/skins/default/xui/fr/floater_about_land.xml @@ -248,7 +248,7 @@ ou divisé. <text name="group_objects_text"> [COUNT] </text> - <button label="Afficher" label_selected="Afficher" name="ShowGroup" /> + <button label="Afficher" label_selected="Afficher" name="ShowGroup"/> <button label="Retour" label_selected="Renvoyer..." name="ReturnGroup..." tool_tip="Renvoyer les objets à leurs propriétaires."/> <text name="Owned by others:"> Appartenant à d'autres : @@ -336,7 +336,7 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche. Options du terrain : </text> <check_box label="Sécurisé (pas de dégâts)" name="check safe" tool_tip="Si cette option est cochée, le terrain est sécurisé et il n'y pas de risques de dommages causés par des combats. Si elle est décochée, des dommages causés par les combats peuvent avoir lieu."/> - <check_box label="Pas de bousculades" name="PushRestrictCheck" tool_tip="Empêche l'utilisation de scripts causant des bousculades. Cette option est utile pour empêcher les comportements abusifs sur votre terrain."/> + <check_box label="Pas de bousculades" name="PushRestrictCheck" tool_tip="Empêche l'utilisation de scripts causant des bousculades. Cette option est utile pour empêcher les comportements abusifs sur votre terrain."/> <check_box label="Afficher le lieu dans la recherche (30 L$/semaine)" name="ShowDirectoryCheck" tool_tip="Afficher la parcelle dans les résultats de recherche"/> <combo_box name="land category with adult"> <combo_box.item label="Toutes catégories" name="item0"/> @@ -351,6 +351,7 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche. <combo_box.item label="Parcs et Nature" name="item9"/> <combo_box.item label="Résidentiel" name="item10"/> <combo_box.item label="Shopping" name="item11"/> + <combo_box.item label="Location" name="item13"/> <combo_box.item label="Autre" name="item12"/> </combo_box> <combo_box name="land category"> @@ -365,6 +366,7 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche. <combo_box.item label="Parcs et Nature" name="item9"/> <combo_box.item label="Résidentiel" name="item10"/> <combo_box.item label="Shopping" name="item11"/> + <combo_box.item label="Location" name="item13"/> <combo_box.item label="Autre" name="item12"/> </combo_box> <check_box label="Contenu Modéré" name="MatureCheck" tool_tip=""/> @@ -444,7 +446,7 @@ musique : (défini par le domaine </panel.string> <panel.string name="allow_public_access"> - Autoriser l'accès public ([MATURITY]) + Autoriser l'accès public ([MATURITY]) (Remarque : des lignes d'interdiction seront créées si cette case n'est pas cochée) </panel.string> <panel.string name="estate_override"> Au moins une de ces options est définie au niveau du domaine. diff --git a/indra/newview/skins/default/xui/fr/floater_map.xml b/indra/newview/skins/default/xui/fr/floater_map.xml index 04afe89c7b..8675fb8ef9 100644 --- a/indra/newview/skins/default/xui/fr/floater_map.xml +++ b/indra/newview/skins/default/xui/fr/floater_map.xml @@ -1,32 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Map" title=""> - <floater.string name="mini_map_north"> - N - </floater.string> - <floater.string name="mini_map_east"> - E - </floater.string> - <floater.string name="mini_map_west"> - O - </floater.string> - <floater.string name="mini_map_south"> - S - </floater.string> - <floater.string name="mini_map_southeast"> - SE - </floater.string> - <floater.string name="mini_map_northeast"> - NE - </floater.string> - <floater.string name="mini_map_southwest"> - SO - </floater.string> - <floater.string name="mini_map_northwest"> - NO - </floater.string> <floater.string name="ToolTipMsg"> [REGION](Carte : double-clic ; Panoramique : Maj + faire glisser) </floater.string> + <floater.string name="AltToolTipMsg"> + [REGION](Téléportation : double-clic ; Panoramique : Maj + faire glisser) + </floater.string> <floater.string name="mini_map_caption"> MINI-CARTE </floater.string> diff --git a/indra/newview/skins/default/xui/fr/floater_tools.xml b/indra/newview/skins/default/xui/fr/floater_tools.xml index 01274b4cbc..fd72e6ac15 100644 --- a/indra/newview/skins/default/xui/fr/floater_tools.xml +++ b/indra/newview/skins/default/xui/fr/floater_tools.xml @@ -64,6 +64,8 @@ <radio_item label="Choisir une face" name="radio select face"/> </radio_group> <check_box label="Modification liée" name="checkbox edit linked parts"/> + <button label="Lien" name="link_btn"/> + <button label="Annuler le lien" name="unlink_btn"/> <text name="RenderingCost" tool_tip="Affiche le coût du rendu calculé pour cet objet"> þ : [COUNT] </text> diff --git a/indra/newview/skins/default/xui/fr/menu_attachment_self.xml b/indra/newview/skins/default/xui/fr/menu_attachment_self.xml index 78198fb5a8..6af2064e44 100644 --- a/indra/newview/skins/default/xui/fr/menu_attachment_self.xml +++ b/indra/newview/skins/default/xui/fr/menu_attachment_self.xml @@ -5,7 +5,7 @@ <menu_item_call label="Détacher" name="Detach"/> <menu_item_call label="M'asseoir" name="Sit Down Here"/> <menu_item_call label="Me lever" name="Stand Up"/> - <menu_item_call label="Changer de tenue" name="Change Outfit"/> + <menu_item_call label="Mon apparence" name="Change Outfit"/> <menu_item_call label="Modifier ma tenue" name="Edit Outfit"/> <menu_item_call label="Modifier ma silhouette" name="Edit My Shape"/> <menu_item_call label="Mes amis" name="Friends..."/> diff --git a/indra/newview/skins/default/xui/fr/menu_avatar_self.xml b/indra/newview/skins/default/xui/fr/menu_avatar_self.xml index c7ee2e9f88..21528cd43b 100644 --- a/indra/newview/skins/default/xui/fr/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/fr/menu_avatar_self.xml @@ -21,7 +21,7 @@ <context_menu label="Détacher" name="Object Detach"/> <menu_item_call label="Tout détacher" name="Detach All"/> </context_menu> - <menu_item_call label="Changer de tenue" name="Chenge Outfit"/> + <menu_item_call label="Mon apparence" name="Chenge Outfit"/> <menu_item_call label="Modifier ma tenue" name="Edit Outfit"/> <menu_item_call label="Modifier ma silhouette" name="Edit My Shape"/> <menu_item_call label="Mes amis" name="Friends..."/> diff --git a/indra/newview/skins/default/xui/fr/menu_bottomtray.xml b/indra/newview/skins/default/xui/fr/menu_bottomtray.xml index bfdc89c5bb..ddaea517fc 100644 --- a/indra/newview/skins/default/xui/fr/menu_bottomtray.xml +++ b/indra/newview/skins/default/xui/fr/menu_bottomtray.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="hide_camera_move_controls_menu"> + <menu_item_check label="Voix activée" name="EnableVoiceChat"/> <menu_item_check label="Bouton Geste" name="ShowGestureButton"/> <menu_item_check label="Bouton Bouger" name="ShowMoveButton"/> <menu_item_check label="Bouton Affichage" name="ShowCameraButton"/> <menu_item_check label="Bouton Photo" name="ShowSnapshotButton"/> - <menu_item_check label="Bouton Panneau latéral" name="ShowSidebarButton"/> <menu_item_check label="Bouton Construire" name="ShowBuildButton"/> <menu_item_check label="Bouton Rechercher" name="ShowSearchButton"/> <menu_item_check label="Bouton Carte" name="ShowWorldMapButton"/> diff --git a/indra/newview/skins/default/xui/fr/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/fr/menu_inspect_avatar_gear.xml index 17254ff325..53f22bb44a 100644 --- a/indra/newview/skins/default/xui/fr/menu_inspect_avatar_gear.xml +++ b/indra/newview/skins/default/xui/fr/menu_inspect_avatar_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> -<menu name="Gear Menu"> +<toggleable_menu name="Gear Menu"> <menu_item_call label="Voir le profil" name="view_profile"/> <menu_item_call label="Devenir amis" name="add_friend"/> <menu_item_call label="IM" name="im"/> @@ -11,9 +11,11 @@ <menu_item_call label="Signaler" name="report"/> <menu_item_call label="Figer" name="freeze"/> <menu_item_call label="Expulser" name="eject"/> + <menu_item_call label="Éjecter" name="kick"/> + <menu_item_call label="Représentant de l'Assistance client" name="csr"/> <menu_item_call label="Déboguer les textures" name="debug"/> <menu_item_call label="Situer sur la carte" name="find_on_map"/> <menu_item_call label="Zoomer en avant" name="zoom_in"/> <menu_item_call label="Payer" name="pay"/> <menu_item_call label="Partager" name="share"/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/fr/menu_inspect_self_gear.xml index 3bc164788a..ac70df472d 100644 --- a/indra/newview/skins/default/xui/fr/menu_inspect_self_gear.xml +++ b/indra/newview/skins/default/xui/fr/menu_inspect_self_gear.xml @@ -1,10 +1,31 @@ -<?xml version="1.0" encoding="utf-8"?> -<menu name="Gear Menu"> - <menu_item_call label="M'asseoir" name="sit_down_here"/> - <menu_item_call label="Me lever" name="stand_up"/> - <menu_item_call label="Changer de tenue" name="change_outfit"/> - <menu_item_call label="Mon profil" name="my_profile"/> - <menu_item_call label="Mes amis" name="my_friends"/> - <menu_item_call label="Mes groupes" name="my_groups"/> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Gear Menu"> + <menu_item_call label="M'asseoir" name="Sit Down Here"/> + <menu_item_call label="Me lever" name="Stand Up"/> + <context_menu label="Enlever" name="Take Off >"> + <context_menu label="Habits" name="Clothes >"> + <menu_item_call label="Chemise" name="Shirt"/> + <menu_item_call label="Pantalon" name="Pants"/> + <menu_item_call label="Jupe" name="Skirt"/> + <menu_item_call label="Chaussures" name="Shoes"/> + <menu_item_call label="Chaussettes" name="Socks"/> + <menu_item_call label="Veste" name="Jacket"/> + <menu_item_call label="Gants" name="Gloves"/> + <menu_item_call label="Débardeur" name="Self Undershirt"/> + <menu_item_call label="Caleçon" name="Self Underpants"/> + <menu_item_call label="Tatouage" name="Self Tattoo"/> + <menu_item_call label="Alpha" name="Self Alpha"/> + <menu_item_call label="Tous les habits" name="All Clothes"/> + </context_menu> + <context_menu label="HUD" name="Object Detach HUD"/> + <context_menu label="Détacher" name="Object Detach"/> + <menu_item_call label="Tout détacher" name="Detach All"/> + </context_menu> + <menu_item_call label="Changer de tenue" name="Chenge Outfit"/> + <menu_item_call label="Modifier ma tenue" name="Edit Outfit"/> + <menu_item_call label="Modifier ma silhouette" name="Edit My Shape"/> + <menu_item_call label="Mes amis" name="Friends..."/> + <menu_item_call label="Mes groupes" name="Groups..."/> + <menu_item_call label="Mon profil" name="Profile..."/> <menu_item_call label="Déboguer les textures" name="Debug..."/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml index f28918ae14..364872c875 100644 --- a/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml +++ b/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml @@ -3,6 +3,7 @@ <menu_item_call label="Nouvelle fenêtre d'inventaire" name="new_window"/> <menu_item_check label="Trier par nom" name="sort_by_name"/> <menu_item_check label="Trier en commençant par le plus récent" name="sort_by_recent"/> + <menu_item_check label="Toujours trier les dossiers par nom" name="sort_folders_by_name"/> <menu_item_check label="Dossiers système en premier" name="sort_system_folders_to_top"/> <menu_item_call label="Afficher les filtres" name="show_filters"/> <menu_item_call label="Réinitialiser les filtres" name="reset_filters"/> diff --git a/indra/newview/skins/default/xui/fr/menu_object.xml b/indra/newview/skins/default/xui/fr/menu_object.xml index a50a9df4b1..c6db48a31c 100644 --- a/indra/newview/skins/default/xui/fr/menu_object.xml +++ b/indra/newview/skins/default/xui/fr/menu_object.xml @@ -16,14 +16,14 @@ <context_menu label="Attacher" name="Object Attach"/> <context_menu label="Attacher HUD" name="Object Attach HUD"/> </context_menu> - <context_menu label="Supprimer" name="Remove"> + <context_menu label="Gérer" name="Remove"> <menu_item_call label="Signaler une infraction" name="Report Abuse..."/> <menu_item_call label="Ignorer" name="Object Mute"/> <menu_item_call label="Retour" name="Return..."/> - <menu_item_call label="Supprimer" name="Delete"/> </context_menu> <menu_item_call label="Prendre" name="Pie Object Take"/> <menu_item_call label="Prendre une copie" name="Take Copy"/> <menu_item_call label="Payer" name="Pay..."/> <menu_item_call label="Acheter" name="Buy..."/> + <menu_item_call label="Supprimer" name="Delete"/> </context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/fr/menu_places_gear_folder.xml index 3570bdec7f..3fdf3bf3c4 100644 --- a/indra/newview/skins/default/xui/fr/menu_places_gear_folder.xml +++ b/indra/newview/skins/default/xui/fr/menu_places_gear_folder.xml @@ -1,7 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="menu_folder_gear"> +<toggleable_menu name="menu_folder_gear"> <menu_item_call label="Ajouter un repère" name="add_landmark"/> <menu_item_call label="Ajouter un dossier" name="add_folder"/> + <menu_item_call label="Restaurer l'article" name="restore_item"/> <menu_item_call label="Couper" name="cut"/> <menu_item_call label="Copier" name="copy_folder"/> <menu_item_call label="Coller" name="paste"/> @@ -12,4 +13,4 @@ <menu_item_call label="Développer tous les dossiers" name="expand_all"/> <menu_item_call label="Réduire tous les dossiers" name="collapse_all"/> <menu_item_check label="Trier par date" name="sort_by_date"/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/fr/menu_places_gear_landmark.xml index 5491c1b3fc..b48f6ea693 100644 --- a/indra/newview/skins/default/xui/fr/menu_places_gear_landmark.xml +++ b/indra/newview/skins/default/xui/fr/menu_places_gear_landmark.xml @@ -1,10 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="menu_ladmark_gear"> +<toggleable_menu name="menu_ladmark_gear"> <menu_item_call label="Téléporter" name="teleport"/> <menu_item_call label="Plus d'informations" name="more_info"/> <menu_item_call label="Voir sur la carte" name="show_on_map"/> <menu_item_call label="Ajouter un repère" name="add_landmark"/> <menu_item_call label="Ajouter un dossier" name="add_folder"/> + <menu_item_call label="Restaurer l'article" name="restore_item"/> <menu_item_call label="Couper" name="cut"/> <menu_item_call label="Copier le repère" name="copy_landmark"/> <menu_item_call label="Copier la SLurl" name="copy_slurl"/> @@ -15,4 +16,4 @@ <menu_item_call label="Réduire tous les dossiers" name="collapse_all"/> <menu_item_check label="Trier par date" name="sort_by_date"/> <menu_item_call label="Créer un favori" name="create_pick"/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml index 65a00c2e6c..ee1ab8c601 100644 --- a/indra/newview/skins/default/xui/fr/menu_viewer.xml +++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml @@ -7,7 +7,7 @@ </menu_item_call> <menu_item_call label="Acheter des L$" name="Buy and Sell L$"/> <menu_item_call label="Mon profil" name="Profile"/> - <menu_item_call label="Changer de tenue" name="ChangeOutfit"/> + <menu_item_call label="Mon apparence" name="ChangeOutfit"/> <menu_item_check label="Mon inventaire" name="Inventory"/> <menu_item_check label="Mon inventaire" name="ShowSidetrayInventory"/> <menu_item_check label="Mes gestes" name="Gestures"/> @@ -35,6 +35,7 @@ <menu label="Monde" name="World"> <menu_item_check label="Mini-carte" name="Mini-Map"/> <menu_item_check label="Carte du monde" name="World Map"/> + <menu_item_check label="Rechercher" name="Search"/> <menu_item_call label="Photo" name="Take Snapshot"/> <menu_item_call label="Créer un repère pour ce lieu" name="Create Landmark Here"/> <menu label="Profil du lieu" name="Land"> @@ -227,8 +228,10 @@ <menu label="Afficher les infos" name="Display Info"> <menu_item_check label="Afficher l'heure" name="Show Time"/> <menu_item_check label="Afficher les infos de rendu" name="Show Render Info"/> + <menu_item_check label="Afficher les infos de texture" name="Show Texture Info"/> <menu_item_check label="Afficher les matrices" name="Show Matrices"/> <menu_item_check label="Afficher la couleur sous le curseur" name="Show Color Under Cursor"/> + <menu_item_check label="Afficher la mémoire" name="Show Memory"/> <menu_item_check label="Afficher les mises à jour des objets" name="Show Updates"/> </menu> <menu label="Forcer une erreur" name="Force Errors"> @@ -253,6 +256,7 @@ <menu_item_check label="Shadow Frusta" name="Shadow Frusta"/> <menu_item_check label="Occlusion" name="Occlusion"/> <menu_item_check label="Lots de rendu" name="Render Batches"/> + <menu_item_check label="Type de mise à jour" name="Update Type"/> <menu_item_check label="Texture Anim" name="Texture Anim"/> <menu_item_check label="Priorité de la texture" name="Texture Priority"/> <menu_item_check label="Zone de texture" name="Texture Area"/> diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml index 603b8f0edc..e984ea66ed 100644 --- a/indra/newview/skins/default/xui/fr/notifications.xml +++ b/indra/newview/skins/default/xui/fr/notifications.xml @@ -73,7 +73,7 @@ Détails de l'erreur : La notification, appelée '[_NAME]', est i </notification> <notification name="LoginFailedNoNetwork"> Connexion à [SECOND_LIFE_GRID] impossible. -'[DIAGNOSTIC]' + '[DIAGNOSTIC]' Veuillez vérifier votre connexion Internet. <usetemplate name="okbutton" yestext="OK"/> </notification> @@ -332,13 +332,6 @@ Pour entrer dans [SECOND_LIFE], vous devez disposer d'un compte. Voulez-vou <notification name="InvalidCredentialFormat"> Saisissez soit le nom d'utilisateur soit à la fois le prénom et le nom de votre avatar dans le champ Nom d'utilisateur, puis connectez-vous. </notification> - <notification name="AddClassified"> - Les petites annonces sont publiées à l'onglet Petites annonces de la section Recherche et sur [http://secondlife.com/community/classifieds secondlife.com] pendant une semaine. -Rédigez votre annonce, puis cliquez sur Publier pour l'ajouter à la liste des annonces. -Au moment de cliquer sur Publier, vous serez invité à payer des frais. -Plus vous payez cher, plus votre annonce est visible dans la liste ainsi que dans les résultats de recherche de mots-clés. - <usetemplate ignoretext="Comment ajouter une nouvelle petite annonce" name="okcancelignore" notext="Annuler" yestext="OK"/> - </notification> <notification name="DeleteClassified"> Supprimer l'annonce [NAME] ? Une fois payés, les frais ne sont pas remboursables. @@ -2848,9 +2841,6 @@ Ignorer les autres ? <notification label="Explorer le monde" name="HintDestinationGuide"> Le Guide des destinations comprend des milliers d'endroits nouveaux à découvrir. Sélectionnez-en un, puis cliquez sur Téléporter pour commencer à l'explorer. </notification> - <notification label="Changer d'apparence" name="HintAvatarPicker"> - Vous souhaitez changer de look ? Cliquez sur le bouton ci-dessous pour voir plus d'avatars. - </notification> <notification label="Panneau latéral" name="HintSidePanel"> Obtenir un accès rapide à votre inventaire, à vos habits, à vos profils et bien plus encore dans le panneau latéral. </notification> @@ -2888,6 +2878,38 @@ Ignorer les autres ? <button name="cancel" text="Annuler"/> </form> </notification> + <notification label="" name="ModeChange"> + Vous devez quitter et redémarrer l'application afin de changer de mode. + <usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/> + </notification> + <notification label="" name="NoClassifieds"> + Pour créer et modifier des petites annonces, vous devez utiliser le mode Avancé. Voulez-vous quitter l'application afin de changer de mode ? Le sélecteur de mode se trouve sur l'écran de connexion. + <usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/> + </notification> + <notification label="" name="NoGroupInfo"> + Pour créer et modifier des groupes, vous devez utiliser le mode Avancé. Voulez-vous quitter l'application afin de changer de mode ? Le sélecteur de mode se trouve sur l'écran de connexion. + <usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/> + </notification> + <notification label="" name="NoPicks"> + Pour créer et modifier des favoris, vous devez utiliser le mode Avancé. Voulez-vous quitter l'application afin de changer de mode ? Le sélecteur de mode se trouve sur l'écran de connexion. + <usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/> + </notification> + <notification label="" name="NoWorldMap"> + Pour afficher la carte du monde, vous devez utiliser le mode Avancé. Voulez-vous quitter l'application afin de changer de mode ? Le sélecteur de mode se trouve sur l'écran de connexion. + <usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/> + </notification> + <notification label="" name="NoVoiceCall"> + Les appels vocaux sont uniquement disponibles en mode Avancé. Voulez-vous quitter l'application afin de changer de mode ? + <usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/> + </notification> + <notification label="" name="NoAvatarShare"> + Le partage est uniquement disponible en mode Avancé. Voulez-vous quitter l'application afin de changer de mode ? + <usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/> + </notification> + <notification label="" name="NoAvatarPay"> + Pour pouvoir payer d'autres résidents, vous devez utiliser le mode Avancé. Voulez-vous quitter l'application afin de changer de mode ? + <usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/> + </notification> <global name="UnsupportedCPU"> - Votre processeur ne remplit pas les conditions minimum requises. </global> diff --git a/indra/newview/skins/default/xui/fr/panel_login.xml b/indra/newview/skins/default/xui/fr/panel_login.xml index ef55ba7991..e54b36644c 100644 --- a/indra/newview/skins/default/xui/fr/panel_login.xml +++ b/indra/newview/skins/default/xui/fr/panel_login.xml @@ -17,6 +17,13 @@ </text> <check_box label="Enregistrer" name="remember_check"/> <button label="Connexion" name="connect_btn"/> + <text name="mode_selection_text"> + Mode : + </text> + <combo_box name="mode_combo" tool_tip="Sélectionnez un mode. Pour une exploration facile et rapide avec chat, choisissez Basique. Pour accéder à plus de fonctionnalités, choisissez Avancé."> + <combo_box.item label="Basique" name="Basic"/> + <combo_box.item label="Avancé" name="Advanced"/> + </combo_box> <text name="start_location_text"> Lieu de départ : </text> diff --git a/indra/newview/skins/default/xui/fr/panel_nearby_media.xml b/indra/newview/skins/default/xui/fr/panel_nearby_media.xml index 66bfd01a2a..7b7b67041a 100644 --- a/indra/newview/skins/default/xui/fr/panel_nearby_media.xml +++ b/indra/newview/skins/default/xui/fr/panel_nearby_media.xml @@ -19,7 +19,7 @@ <button label="Arrêter" name="all_nearby_media_disable_btn" tool_tip="Désactiver tous les médias près de vous"/> <button label="Lire" name="all_nearby_media_enable_btn" tool_tip="Activer tous les médias près de vous"/> <button name="open_prefs_btn" tool_tip="Ouvrir les préférences de média"/> - <button label="Plus >>" label_selected="Moins <<" name="more_btn" tool_tip="Options avancées"/> + <button label="Plus >>" label_selected="<< Moins" name="more_btn" tool_tip="Options avancées"/> <button label="Plus >>" label_selected="Moins <<" name="less_btn" tool_tip="Options avancées"/> </panel> <panel name="nearby_media_panel"> diff --git a/indra/newview/skins/default/xui/fr/panel_people.xml b/indra/newview/skins/default/xui/fr/panel_people.xml index eecbabae2b..166f04b3e4 100644 --- a/indra/newview/skins/default/xui/fr/panel_people.xml +++ b/indra/newview/skins/default/xui/fr/panel_people.xml @@ -18,6 +18,8 @@ Pour rechercher des résidents avec qui passer du temps, utilisez [secondlife:// <string name="groups_filter_label" value="Filtrer les groupes"/> <string name="no_filtered_groups_msg" value="Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/groups/[SEARCH_TERM] Rechercher]."/> <string name="no_groups_msg" value="Vous souhaitez trouver des groupes à rejoindre ? Utilisez [secondlife:///app/search/groups Rechercher]."/> + <string name="MiniMapToolTipMsg" value="[REGION](Carte : double-clic ; Panoramique : Maj + faire glisser)"/> + <string name="AltMiniMapToolTipMsg" value="[REGION](Téléportation : double-clic ; Panoramique : Maj + faire glisser)"/> <filter_editor label="Filtre" name="filter_input"/> <tab_container name="tabs"> <panel label="PRÈS DE VOUS" name="nearby_panel"> diff --git a/indra/newview/skins/default/xui/fr/panel_profile.xml b/indra/newview/skins/default/xui/fr/panel_profile.xml index 6b611923af..9aa6fe97a1 100644 --- a/indra/newview/skins/default/xui/fr/panel_profile.xml +++ b/indra/newview/skins/default/xui/fr/panel_profile.xml @@ -16,6 +16,12 @@ <string name="RegisterDateFormat"> [REG_DATE] ([AGE]) </string> + <string name="name_text_args"> + [NAME] + </string> + <string name="display_name_text_args"> + [DISPLAY_NAME] + </string> <layout_stack name="layout"> <layout_panel name="profile_stack"> <scroll_container name="profile_scroll"> @@ -34,7 +40,7 @@ </text_editor> <text name="title_partner_text" value="Partenaire :"/> <panel name="partner_data_panel"> - <name_box initial_value="(récupération en cours)" name="partner_text"/> + <text initial_value="(récupération en cours)" name="partner_text"/> </panel> <text name="title_groups_text" value="Groupes :"/> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_script_ed.xml b/indra/newview/skins/default/xui/fr/panel_script_ed.xml index 2c86dd72b6..2b08ae56c5 100644 --- a/indra/newview/skins/default/xui/fr/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/fr/panel_script_ed.xml @@ -15,6 +15,9 @@ <panel.string name="Title"> Script : [NAME] </panel.string> + <panel.string name="external_editor_not_set"> + Sélectionnez un éditeur en définissant la variable d'environnement LL_SCRIPT_EDITOR ou le paramètre ExternalEditor. + </panel.string> <menu_bar name="script_menu"> <menu label="Fichier" name="File"> <menu_item_call label="Enregistrer" name="Save"/> diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml index 74c1fd8622..a7c71dc0f0 100644 --- a/indra/newview/skins/default/xui/fr/strings.xml +++ b/indra/newview/skins/default/xui/fr/strings.xml @@ -1067,7 +1067,7 @@ <string name="PermNo"> Non </string> - <string name="Chat" value=" Chat :"/> + <string name="Chat Message" value="Chat :"/> <string name="Sound" value=" Son :"/> <string name="Wait" value=" --- Attendre :"/> <string name="AnimFlagStop" value=" Arrêter l'animation :"/> @@ -1864,12 +1864,6 @@ <string name="accel-win-shift"> Maj+ </string> - <string name="Esc"> - Échap - </string> - <string name="Home"> - Début - </string> <string name="FileSaved"> Fichier enregistré </string> @@ -1889,7 +1883,7 @@ PDT </string> <string name="Direction_Forward"> - Vers l'avant + Avant </string> <string name="Direction_Left"> Gauche @@ -1987,6 +1981,9 @@ <string name="Other"> Autre </string> + <string name="Rental"> + Location + </string> <string name="Any"> Aucun </string> @@ -3966,7 +3963,7 @@ de l'infraction signalée <string name="Notices"> Notices </string> - <string name="Chat"> + <string name="Chat" value=" Chat :"> Chat </string> <string name="DeleteItems"> @@ -3978,4 +3975,348 @@ de l'infraction signalée <string name="EmptyOutfitText"> Cette tenue ne contient aucun article. </string> + <string name="ExternalEditorNotSet"> + Sélectionnez un éditeur à l'aide du paramètre ExternalEditor. + </string> + <string name="ExternalEditorNotFound"> + Éditeur externe spécifié introuvable. +Essayez avec le chemin d'accès à l'éditeur entre guillemets doubles +(par ex. : "/chemin_accès/editor" "%s"). + </string> + <string name="ExternalEditorCommandParseError"> + Erreur lors de l'analyse de la commande d'éditeur externe. + </string> + <string name="ExternalEditorFailedToRun"> + Échec d'exécution de l'éditeur externe. + </string> + <string name="Esc"> + Échap + </string> + <string name="Space"> + Space + </string> + <string name="Enter"> + Enter + </string> + <string name="Tab"> + Tab + </string> + <string name="Ins"> + Ins + </string> + <string name="Del"> + Del + </string> + <string name="Backsp"> + Backsp + </string> + <string name="Shift"> + Shift + </string> + <string name="Ctrl"> + Ctrl + </string> + <string name="Alt"> + Alt + </string> + <string name="CapsLock"> + CapsLock + </string> + <string name="Home"> + Début + </string> + <string name="End"> + End + </string> + <string name="PgUp"> + PgUp + </string> + <string name="PgDn"> + PgDn + </string> + <string name="F1"> + F1 + </string> + <string name="F2"> + F2 + </string> + <string name="F3"> + F3 + </string> + <string name="F4"> + F4 + </string> + <string name="F5"> + F5 + </string> + <string name="F6"> + F6 + </string> + <string name="F7"> + F7 + </string> + <string name="F8"> + F8 + </string> + <string name="F9"> + F9 + </string> + <string name="F10"> + F10 + </string> + <string name="F11"> + F11 + </string> + <string name="F12"> + F12 + </string> + <string name="Add"> + Ajouter + </string> + <string name="Subtract"> + Soustraire + </string> + <string name="Multiply"> + Multiplier + </string> + <string name="Divide"> + Diviser + </string> + <string name="PAD_DIVIDE"> + PAD_DIVIDE + </string> + <string name="PAD_LEFT"> + PAD_LEFT + </string> + <string name="PAD_RIGHT"> + PAD_RIGHT + </string> + <string name="PAD_DOWN"> + PAD_DOWN + </string> + <string name="PAD_UP"> + PAD_UP + </string> + <string name="PAD_HOME"> + PAD_HOME + </string> + <string name="PAD_END"> + PAD_END + </string> + <string name="PAD_PGUP"> + PAD_PGUP + </string> + <string name="PAD_PGDN"> + PAD_PGDN + </string> + <string name="PAD_CENTER"> + PAD_CENTER + </string> + <string name="PAD_INS"> + PAD_INS + </string> + <string name="PAD_DEL"> + PAD_DEL + </string> + <string name="PAD_Enter"> + PAD_Enter + </string> + <string name="PAD_BUTTON0"> + PAD_BUTTON0 + </string> + <string name="PAD_BUTTON1"> + PAD_BUTTON1 + </string> + <string name="PAD_BUTTON2"> + PAD_BUTTON2 + </string> + <string name="PAD_BUTTON3"> + PAD_BUTTON3 + </string> + <string name="PAD_BUTTON4"> + PAD_BUTTON4 + </string> + <string name="PAD_BUTTON5"> + PAD_BUTTON5 + </string> + <string name="PAD_BUTTON6"> + PAD_BUTTON6 + </string> + <string name="PAD_BUTTON7"> + PAD_BUTTON7 + </string> + <string name="PAD_BUTTON8"> + PAD_BUTTON8 + </string> + <string name="PAD_BUTTON9"> + PAD_BUTTON9 + </string> + <string name="PAD_BUTTON10"> + PAD_BUTTON10 + </string> + <string name="PAD_BUTTON11"> + PAD_BUTTON11 + </string> + <string name="PAD_BUTTON12"> + PAD_BUTTON12 + </string> + <string name="PAD_BUTTON13"> + PAD_BUTTON13 + </string> + <string name="PAD_BUTTON14"> + PAD_BUTTON14 + </string> + <string name="PAD_BUTTON15"> + PAD_BUTTON15 + </string> + <string name="-"> + - + </string> + <string name="="> + = + </string> + <string name="`"> + ` + </string> + <string name=";"> + ; + </string> + <string name="["> + [ + </string> + <string name="]"> + ] + </string> + <string name="\"> + \ + </string> + <string name="0"> + 0 + </string> + <string name="1"> + 1 + </string> + <string name="2"> + 2 + </string> + <string name="3"> + 3 + </string> + <string name="4"> + 4 + </string> + <string name="5"> + 5 + </string> + <string name="6"> + 6 + </string> + <string name="7"> + 7 + </string> + <string name="8"> + 8 + </string> + <string name="9"> + 9 + </string> + <string name="A"> + A + </string> + <string name="B"> + B + </string> + <string name="C"> + C + </string> + <string name="D"> + D + </string> + <string name="E"> + E + </string> + <string name="F"> + F + </string> + <string name="G"> + G + </string> + <string name="H"> + H + </string> + <string name="I"> + I + </string> + <string name="J"> + J + </string> + <string name="K"> + K + </string> + <string name="L"> + L + </string> + <string name="M"> + M + </string> + <string name="N"> + N + </string> + <string name="O"> + O + </string> + <string name="P"> + P + </string> + <string name="Q"> + Q + </string> + <string name="R"> + R + </string> + <string name="S"> + S + </string> + <string name="T"> + T + </string> + <string name="U"> + U + </string> + <string name="V"> + V + </string> + <string name="W"> + W + </string> + <string name="X"> + X + </string> + <string name="Y"> + Y + </string> + <string name="Z"> + Z + </string> + <string name="BeaconParticle"> + Affichage des balises de particule (bleu) + </string> + <string name="BeaconPhysical"> + Affichage des balises d'objet physique (vert) + </string> + <string name="BeaconScripted"> + Affichage des balises d'objet scripté (rouge) + </string> + <string name="BeaconScriptedTouch"> + Affichage des balises d'objet scripté avec fonction de toucher (rouge) + </string> + <string name="BeaconSound"> + Affichage des balises de son (jaune) + </string> + <string name="BeaconMedia"> + Affichage des balises de média (blanc) + </string> + <string name="ParticleHiding"> + Masquage des particules + </string> </strings> -- cgit v1.2.3 From f9af1f4fca028709b0262c0e8c40eefc2ab13d00 Mon Sep 17 00:00:00 2001 From: Eli Linden <eli@lindenlab.com> Date: Fri, 1 Apr 2011 12:38:18 -0700 Subject: INTL-34 WIP Set22 translations PT --- .../skins/default/xui/pt/floater_about_land.xml | 4 +- indra/newview/skins/default/xui/pt/floater_map.xml | 3 + .../newview/skins/default/xui/pt/floater_tools.xml | 2 + .../skins/default/xui/pt/menu_attachment_self.xml | 2 +- .../skins/default/xui/pt/menu_avatar_self.xml | 2 +- .../skins/default/xui/pt/menu_bottomtray.xml | 2 +- .../default/xui/pt/menu_inspect_avatar_gear.xml | 6 +- .../default/xui/pt/menu_inspect_self_gear.xml | 39 ++- .../default/xui/pt/menu_inventory_gear_default.xml | 1 + indra/newview/skins/default/xui/pt/menu_object.xml | 4 +- .../default/xui/pt/menu_places_gear_folder.xml | 5 +- .../default/xui/pt/menu_places_gear_landmark.xml | 5 +- indra/newview/skins/default/xui/pt/menu_viewer.xml | 8 +- .../newview/skins/default/xui/pt/notifications.xml | 44 ++- indra/newview/skins/default/xui/pt/panel_login.xml | 7 + .../skins/default/xui/pt/panel_nearby_media.xml | 2 +- .../newview/skins/default/xui/pt/panel_people.xml | 2 + .../newview/skins/default/xui/pt/panel_profile.xml | 8 +- .../skins/default/xui/pt/panel_script_ed.xml | 3 + indra/newview/skins/default/xui/pt/strings.xml | 363 ++++++++++++++++++++- 20 files changed, 466 insertions(+), 46 deletions(-) diff --git a/indra/newview/skins/default/xui/pt/floater_about_land.xml b/indra/newview/skins/default/xui/pt/floater_about_land.xml index ffd1cce76c..7761c79864 100644 --- a/indra/newview/skins/default/xui/pt/floater_about_land.xml +++ b/indra/newview/skins/default/xui/pt/floater_about_land.xml @@ -347,6 +347,7 @@ Apenas lotes maiores podem ser listados na busca. <combo_box.item label="Parques & Natureza" name="item9"/> <combo_box.item label="Residencial" name="item10"/> <combo_box.item label="Compras" name="item11"/> + <combo_box.item label="Aluguel" name="item13"/> <combo_box.item label="Outros" name="item12"/> </combo_box> <combo_box name="land category"> @@ -361,6 +362,7 @@ Apenas lotes maiores podem ser listados na busca. <combo_box.item label="Parques e Natureza" name="item9"/> <combo_box.item label="Residencial" name="item10"/> <combo_box.item label="Compras" name="item11"/> + <combo_box.item label="Aluguel" name="item13"/> <combo_box.item label="Outros" name="item12"/> </combo_box> <check_box label="Conteúdo adulto" name="MatureCheck" tool_tip=""/> @@ -439,7 +441,7 @@ Mídia: (Definições do terreno) </panel.string> <panel.string name="allow_public_access"> - Acesso para público: [MATURITY] + Acesso para público: [MATURITY]) (Desmarcar esse item cria limites) </panel.string> <panel.string name="estate_override"> Uma ou mais destas opções está definida no nível de propriedade. diff --git a/indra/newview/skins/default/xui/pt/floater_map.xml b/indra/newview/skins/default/xui/pt/floater_map.xml index 38c2647199..faf9c7c170 100644 --- a/indra/newview/skins/default/xui/pt/floater_map.xml +++ b/indra/newview/skins/default/xui/pt/floater_map.xml @@ -3,6 +3,9 @@ <floater.string name="ToolTipMsg"> [REGION](Clique duas vezes para abrir o mapa, shift+arraste para a visão pan) </floater.string> + <floater.string name="AltToolTipMsg"> + [REGION](Clique duas vezes para teletransportar, shift+arraste para a visão pan) + </floater.string> <floater.string name="mini_map_caption"> MINIMAPA </floater.string> diff --git a/indra/newview/skins/default/xui/pt/floater_tools.xml b/indra/newview/skins/default/xui/pt/floater_tools.xml index f90097bf22..7289b592fd 100644 --- a/indra/newview/skins/default/xui/pt/floater_tools.xml +++ b/indra/newview/skins/default/xui/pt/floater_tools.xml @@ -64,6 +64,8 @@ <radio_item label="Selecionar face" name="radio select face"/> </radio_group> <check_box label="Editar partes linkadas" name="checkbox edit linked parts"/> + <button label="Link" name="link_btn"/> + <button label="Desconectar links" name="unlink_btn"/> <text name="RenderingCost" tool_tip="Mostra o cálculo do custo de renderização do objeto"> þ: [COUNT] </text> diff --git a/indra/newview/skins/default/xui/pt/menu_attachment_self.xml b/indra/newview/skins/default/xui/pt/menu_attachment_self.xml index 09060cf3ae..5b32784c32 100644 --- a/indra/newview/skins/default/xui/pt/menu_attachment_self.xml +++ b/indra/newview/skins/default/xui/pt/menu_attachment_self.xml @@ -5,7 +5,7 @@ <menu_item_call label="Tirar" name="Detach"/> <menu_item_call label="Sentar" name="Sit Down Here"/> <menu_item_call label="Ficar de pé" name="Stand Up"/> - <menu_item_call label="Trocar de look" name="Change Outfit"/> + <menu_item_call label="Minha aparência" name="Change Outfit"/> <menu_item_call label="Editar meu look" name="Edit Outfit"/> <menu_item_call label="Editar meu corpo" name="Edit My Shape"/> <menu_item_call label="Meus amigos" name="Friends..."/> diff --git a/indra/newview/skins/default/xui/pt/menu_avatar_self.xml b/indra/newview/skins/default/xui/pt/menu_avatar_self.xml index 6e203d5a25..e2fd61745f 100644 --- a/indra/newview/skins/default/xui/pt/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/pt/menu_avatar_self.xml @@ -21,7 +21,7 @@ <context_menu label="Tirar" name="Object Detach"/> <menu_item_call label="Tirar tudo" name="Detach All"/> </context_menu> - <menu_item_call label="Trocar de look" name="Chenge Outfit"/> + <menu_item_call label="Minha aparência" name="Chenge Outfit"/> <menu_item_call label="Editar meu look" name="Edit Outfit"/> <menu_item_call label="Editar meu corpo" name="Edit My Shape"/> <menu_item_call label="Meus amigos" name="Friends..."/> diff --git a/indra/newview/skins/default/xui/pt/menu_bottomtray.xml b/indra/newview/skins/default/xui/pt/menu_bottomtray.xml index 479d02512f..bd628c94d3 100644 --- a/indra/newview/skins/default/xui/pt/menu_bottomtray.xml +++ b/indra/newview/skins/default/xui/pt/menu_bottomtray.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="hide_camera_move_controls_menu"> + <menu_item_check label="Voz ativada" name="EnableVoiceChat"/> <menu_item_check label="Botão de gestos" name="ShowGestureButton"/> <menu_item_check label="Botão de movimento" name="ShowMoveButton"/> <menu_item_check label="Botão de ver" name="ShowCameraButton"/> <menu_item_check label="Botão de fotos" name="ShowSnapshotButton"/> - <menu_item_check label="Botão da Barra lateral" name="ShowSidebarButton"/> <menu_item_check label="Botão Construir" name="ShowBuildButton"/> <menu_item_check label="Botão Buscar" name="ShowSearchButton"/> <menu_item_check label="Botão Mapa" name="ShowWorldMapButton"/> diff --git a/indra/newview/skins/default/xui/pt/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/pt/menu_inspect_avatar_gear.xml index 6a511e6ab7..2b5aa7508b 100644 --- a/indra/newview/skins/default/xui/pt/menu_inspect_avatar_gear.xml +++ b/indra/newview/skins/default/xui/pt/menu_inspect_avatar_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> -<menu name="Gear Menu"> +<toggleable_menu name="Gear Menu"> <menu_item_call label="Ver perfil" name="view_profile"/> <menu_item_call label="Adicionar amigo..." name="add_friend"/> <menu_item_call label="MI" name="im"/> @@ -11,9 +11,11 @@ <menu_item_call label="Denunciar" name="report"/> <menu_item_call label="Congelar" name="freeze"/> <menu_item_call label="Ejetar" name="eject"/> + <menu_item_call label="Chutar" name="kick"/> + <menu_item_call label="CSR" name="csr"/> <menu_item_call label="Depurar texturas" name="debug"/> <menu_item_call label="Localizar no mapa" name="find_on_map"/> <menu_item_call label="Mais zoom" name="zoom_in"/> <menu_item_call label="Pagar" name="pay"/> <menu_item_call label="Compartilhar" name="share"/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/pt/menu_inspect_self_gear.xml index 7e67f4cfd4..e8fafa58a9 100644 --- a/indra/newview/skins/default/xui/pt/menu_inspect_self_gear.xml +++ b/indra/newview/skins/default/xui/pt/menu_inspect_self_gear.xml @@ -1,10 +1,31 @@ -<?xml version="1.0" encoding="utf-8"?> -<menu name="Gear Menu"> - <menu_item_call label="Sentar" name="sit_down_here"/> - <menu_item_call label="Ficar de pé" name="stand_up"/> - <menu_item_call label="Trocar de look" name="change_outfit"/> - <menu_item_call label="Meu perfil" name="my_profile"/> - <menu_item_call label="Meus amigos" name="my_friends"/> - <menu_item_call label="Meus grupos" name="my_groups"/> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Gear Menu"> + <menu_item_call label="Sentar" name="Sit Down Here"/> + <menu_item_call label="Ficar de pé" name="Stand Up"/> + <context_menu label="Tirar" name="Take Off >"> + <context_menu label="Roupa" name="Clothes >"> + <menu_item_call label="Camisa" name="Shirt"/> + <menu_item_call label="Calças" name="Pants"/> + <menu_item_call label="Saia" name="Skirt"/> + <menu_item_call label="Sapatos" name="Shoes"/> + <menu_item_call label="Meias" name="Socks"/> + <menu_item_call label="Jaqueta" name="Jacket"/> + <menu_item_call label="Luvas" name="Gloves"/> + <menu_item_call label="Camiseta" name="Self Undershirt"/> + <menu_item_call label="Roupa de baixo" name="Self Underpants"/> + <menu_item_call label="Tatuagem" name="Self Tattoo"/> + <menu_item_call label="Alpha" name="Self Alpha"/> + <menu_item_call label="Todas as roupas" name="All Clothes"/> + </context_menu> + <context_menu label="HUD" name="Object Detach HUD"/> + <context_menu label="Separar" name="Object Detach"/> + <menu_item_call label="Separar tudo" name="Detach All"/> + </context_menu> + <menu_item_call label="Trocar de look" name="Chenge Outfit"/> + <menu_item_call label="Editar meu look" name="Edit Outfit"/> + <menu_item_call label="Editar meu corpo" name="Edit My Shape"/> + <menu_item_call label="Meus amigos" name="Friends..."/> + <menu_item_call label="Meus grupos" name="Groups..."/> + <menu_item_call label="Meu perfil" name="Profile..."/> <menu_item_call label="Depurar texturas" name="Debug..."/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/pt/menu_inventory_gear_default.xml index 3400578d9a..6faea517fe 100644 --- a/indra/newview/skins/default/xui/pt/menu_inventory_gear_default.xml +++ b/indra/newview/skins/default/xui/pt/menu_inventory_gear_default.xml @@ -3,6 +3,7 @@ <menu_item_call label="Nova janela de inventário" name="new_window"/> <menu_item_check label="Ordenar por nome" name="sort_by_name"/> <menu_item_check label="Ordenar por mais recente" name="sort_by_recent"/> + <menu_item_check label="Sempre ordenar pastas por nome" name="sort_folders_by_name"/> <menu_item_check label="Pastas do sistema no topo" name="sort_system_folders_to_top"/> <menu_item_call label="Mostrar filtros" name="show_filters"/> <menu_item_call label="Restabelecer filtros" name="reset_filters"/> diff --git a/indra/newview/skins/default/xui/pt/menu_object.xml b/indra/newview/skins/default/xui/pt/menu_object.xml index bf94859699..f4919e0c1f 100644 --- a/indra/newview/skins/default/xui/pt/menu_object.xml +++ b/indra/newview/skins/default/xui/pt/menu_object.xml @@ -16,14 +16,14 @@ <context_menu label="Anexar" name="Object Attach"/> <context_menu label="Anexar o HUD" name="Object Attach HUD"/> </context_menu> - <context_menu label="Tirar" name="Remove"> + <context_menu label="Gerenciar" name="Remove"> <menu_item_call label="Denunciar abuso" name="Report Abuse..."/> <menu_item_call label="Bloquear" name="Object Mute"/> <menu_item_call label="Devolver" name="Return..."/> - <menu_item_call label="Excluir" name="Delete"/> </context_menu> <menu_item_call label="Pegar" name="Pie Object Take"/> <menu_item_call label="Pegar uma cópia" name="Take Copy"/> <menu_item_call label="Pagar" name="Pay..."/> <menu_item_call label="Comprar" name="Buy..."/> + <menu_item_call label="Excluir" name="Delete"/> </context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/pt/menu_places_gear_folder.xml index 2059a9ed2d..7cba70a110 100644 --- a/indra/newview/skins/default/xui/pt/menu_places_gear_folder.xml +++ b/indra/newview/skins/default/xui/pt/menu_places_gear_folder.xml @@ -1,7 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="menu_folder_gear"> +<toggleable_menu name="menu_folder_gear"> <menu_item_call label="Adicionar marco" name="add_landmark"/> <menu_item_call label="Adicionar pasta" name="add_folder"/> + <menu_item_call label="Restaurar item" name="restore_item"/> <menu_item_call label="Cortar" name="cut"/> <menu_item_call label="Copiar" name="copy_folder"/> <menu_item_call label="Colar" name="paste"/> @@ -12,4 +13,4 @@ <menu_item_call label="Expandir todas as pastas" name="expand_all"/> <menu_item_call label="Recolher todas as pastas" name="collapse_all"/> <menu_item_check label="Ordenar por data" name="sort_by_date"/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/pt/menu_places_gear_landmark.xml index 52a9d13735..fec0911fcf 100644 --- a/indra/newview/skins/default/xui/pt/menu_places_gear_landmark.xml +++ b/indra/newview/skins/default/xui/pt/menu_places_gear_landmark.xml @@ -1,10 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="menu_ladmark_gear"> +<toggleable_menu name="menu_ladmark_gear"> <menu_item_call label="Teletransportar" name="teleport"/> <menu_item_call label="Mais informações" name="more_info"/> <menu_item_call label="Mostrar no mapa" name="show_on_map"/> <menu_item_call label="Adicionar marco" name="add_landmark"/> <menu_item_call label="Adicionar pasta" name="add_folder"/> + <menu_item_call label="Restaurar item" name="restore_item"/> <menu_item_call label="Cortar" name="cut"/> <menu_item_call label="Copiar marco" name="copy_landmark"/> <menu_item_call label="Copiar SLurl" name="copy_slurl"/> @@ -15,4 +16,4 @@ <menu_item_call label="Recolher todas as pastas" name="collapse_all"/> <menu_item_check label="Ordenar por data" name="sort_by_date"/> <menu_item_call label="Criar destaque" name="create_pick"/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_viewer.xml b/indra/newview/skins/default/xui/pt/menu_viewer.xml index 3bbf2b66f2..538b20e01f 100644 --- a/indra/newview/skins/default/xui/pt/menu_viewer.xml +++ b/indra/newview/skins/default/xui/pt/menu_viewer.xml @@ -7,7 +7,7 @@ </menu_item_call> <menu_item_call label="Comprar L$" name="Buy and Sell L$"/> <menu_item_call label="Meu perfil" name="Profile"/> - <menu_item_call label="Trocar de look" name="ChangeOutfit"/> + <menu_item_call label="Minha aparência" name="ChangeOutfit"/> <menu_item_check label="Meu inventário" name="Inventory"/> <menu_item_check label="Meu inventário" name="ShowSidetrayInventory"/> <menu_item_check label="Meus gestos" name="Gestures"/> @@ -35,6 +35,7 @@ <menu label="Mundo" name="World"> <menu_item_check label="Mini Mapa" name="Mini-Map"/> <menu_item_check label="Mapa-múndi" name="World Map"/> + <menu_item_check label="Busca" name="Search"/> <menu_item_call label="Foto" name="Take Snapshot"/> <menu_item_call label="Criar marco deste lugar" name="Create Landmark Here"/> <menu label="Perfil da região" name="Land"> @@ -224,7 +225,9 @@ <menu label="Show Info" name="Display Info"> <menu_item_check label="Mostrar hora" name="Show Time"/> <menu_item_check label="Dados de renderização" name="Show Render Info"/> + <menu_item_check label="Mostrar info da textura" name="Show Texture Info"/> <menu_item_check label="Mostrar cor sob o cursor" name="Show Color Under Cursor"/> + <menu_item_check label="Mostrar memória" name="Show Memory"/> <menu_item_check label="Mostrar mudanças a objetos" name="Show Updates"/> </menu> <menu label="Force an Error" name="Force Errors"> @@ -242,6 +245,9 @@ <menu_item_check label="Taxa de quadros aleatória" name="Randomize Framerate"/> <menu_item_check label="Frame Test" name="Frame Test"/> </menu> + <menu label="Render Metadata" name="Render Metadata"> + <menu_item_check label="Tipo de atualização" name="Update Type"/> + </menu> <menu label="Rendering" name="Rendering"> <menu_item_check label="Axes" name="Axes"/> <menu_item_check label="Wireframe" name="Wireframe"/> diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml index 4b2e4bc5e0..31e29fb6c1 100644 --- a/indra/newview/skins/default/xui/pt/notifications.xml +++ b/indra/newview/skins/default/xui/pt/notifications.xml @@ -72,7 +72,7 @@ Detalhes do erro: O aviso '[_NAME]' não foi localizado no arquivo not </notification> <notification name="LoginFailedNoNetwork"> Falha de conexão com o [SECOND_LIFE_GRID]. -'[DIAGNOSTIC]' + '[DIAGNOSTIC]' Verifique se a conexão à internet está funcionando. <usetemplate name="okbutton" yestext="OK"/> </notification> @@ -330,13 +330,6 @@ Digite o nome de usuário de seu avatar. <notification name="InvalidCredentialFormat"> Digite o nome de usuário ou o nome e sobrenome do seu avatar no campo Nome de usuário, depois entre em sua conta novamente. </notification> - <notification name="AddClassified"> - Os anúncios serão publicados na seção 'Classificados' das buscas e em [http://secondlife.com/community/classifieds secondlife.com] durante uma semana. -Escreva seu anúncio e clique em 'Publicar...' -Depois, decida quanto deseja pagar pelo anúncio. -Quanto mais você pagar, mais alto será o posicionamento do seu anúncio nos classficados e nos resultados de busca das suas palavras-chave. - <usetemplate ignoretext="Como colocar um anúncio" name="okcancelignore" notext="Cancelar" yestext="OK"/> - </notification> <notification name="DeleteClassified"> Apagar classificado'[NAME]'? Não há reembolso por taxas já pagas. @@ -2832,9 +2825,6 @@ Silenciar todos? <notification label="Explore o mundo" name="HintDestinationGuide"> O Guia de Destinos traz milhares de lugares novos para você explorar e conhecer. Selecione um lugar, clique em Teletransportar e comece suas descobertas. </notification> - <notification label="Troque o visual" name="HintAvatarPicker"> - Que tal mudar o visual? Clique o botão abaixo para ver Avatares diferentes. - </notification> <notification label="Painel lateral" name="HintSidePanel"> Acesse rapidamente seu inventário, roupas, looks, perfis e mais no painel lateral. </notification> @@ -2872,6 +2862,38 @@ Silenciar todos? <button name="cancel" text="Cancelar"/> </form> </notification> + <notification label="" name="ModeChange"> + Para alterar o modo, é preciso fechar e reiniciar. + <usetemplate name="okcancelbuttons" notext="Não sair" yestext="Sair"/> + </notification> + <notification label="" name="NoClassifieds"> + É preciso usar o modo Avançado para criar e editar anúncios classificados. Desejar sair para mudar o modo? Selecione o modo na tela de login. + <usetemplate name="okcancelbuttons" notext="Não sair" yestext="Sair"/> + </notification> + <notification label="" name="NoGroupInfo"> + É preciso usar o modo Avançado para criar e editar grupos. Desejar sair para mudar o modo? Selecione o modo na tela de login. + <usetemplate name="okcancelbuttons" notext="Não sair" yestext="Sair"/> + </notification> + <notification label="" name="NoPicks"> + É preciso usar o modo Avançado para criar e editar Destaques. Desejar sair para mudar o modo? Selecione o modo na tela de login. + <usetemplate name="okcancelbuttons" notext="Não sair" yestext="Sair"/> + </notification> + <notification label="" name="NoWorldMap"> + É preciso usar o modo Avançado para ver o mapa-múndi. Desejar sair para mudar o modo? Selecione o modo na tela de login. + <usetemplate name="okcancelbuttons" notext="Não sair" yestext="Sair"/> + </notification> + <notification label="" name="NoVoiceCall"> + Ligações de voz devem ser feitas no modo Avançado. Desejar sair para mudar o modo? + <usetemplate name="okcancelbuttons" notext="Não sair" yestext="Sair"/> + </notification> + <notification label="" name="NoAvatarShare"> + É preciso estar no modo Avançado para compartilhar. Desejar sair para mudar o modo? + <usetemplate name="okcancelbuttons" notext="Não sair" yestext="Sair"/> + </notification> + <notification label="" name="NoAvatarPay"> + É preciso usar o modo Avançado para fazer pagamentos a outros residentes. Desejar sair para mudar o modo? + <usetemplate name="okcancelbuttons" notext="Não sair" yestext="Sair"/> + </notification> <global name="UnsupportedCPU"> - A velocidade da sua CPU não suporta os requisitos mínimos exigidos. </global> diff --git a/indra/newview/skins/default/xui/pt/panel_login.xml b/indra/newview/skins/default/xui/pt/panel_login.xml index 42df93fd86..f4af6a7108 100644 --- a/indra/newview/skins/default/xui/pt/panel_login.xml +++ b/indra/newview/skins/default/xui/pt/panel_login.xml @@ -17,6 +17,13 @@ </text> <check_box label="Lembrar senha" name="remember_check"/> <button label="conectar" name="connect_btn"/> + <text name="mode_selection_text"> + Modo: + </text> + <combo_box name="mode_combo" tool_tip="Selecione o modo. O modo Básico é mais rápido e ideal para explorar e conversar. Use o modo Avançado para acessar mais recursos."> + <combo_box.item label="Básico" name="Basic"/> + <combo_box.item label="Avançado" name="Advanced"/> + </combo_box> <text name="start_location_text"> Começar em: </text> diff --git a/indra/newview/skins/default/xui/pt/panel_nearby_media.xml b/indra/newview/skins/default/xui/pt/panel_nearby_media.xml index 7d1b48ad76..43bf8f9661 100644 --- a/indra/newview/skins/default/xui/pt/panel_nearby_media.xml +++ b/indra/newview/skins/default/xui/pt/panel_nearby_media.xml @@ -19,7 +19,7 @@ <button label="Parar tudo" name="all_nearby_media_disable_btn" tool_tip="Desligar mídias por perto"/> <button label="Executar tudo" name="all_nearby_media_enable_btn" tool_tip="Ligar mídias por perto"/> <button name="open_prefs_btn" tool_tip="Preferências de mídia"/> - <button label="Mais >>" label_selected="Menos <<" name="more_btn" tool_tip="Controles avançados"/> + <button label="Mais >>" label_selected="<< Menos" name="more_btn" tool_tip="Controles avançados"/> <button label="Mais >>" label_selected="Menos <<" name="less_btn" tool_tip="Controles avançados"/> </panel> <panel name="nearby_media_panel"> diff --git a/indra/newview/skins/default/xui/pt/panel_people.xml b/indra/newview/skins/default/xui/pt/panel_people.xml index f1632729a9..aece30738b 100644 --- a/indra/newview/skins/default/xui/pt/panel_people.xml +++ b/indra/newview/skins/default/xui/pt/panel_people.xml @@ -18,6 +18,8 @@ Em busca de alguém para conversar? Procure no [secondlife:///app/worldmap Mapa- <string name="groups_filter_label" value="Filtro de grupos"/> <string name="no_filtered_groups_msg" value="Não encontrou o que procura? Tente buscar no [secondlife:///app/search/groups/[SEARCH_TERM] Search]."/> <string name="no_groups_msg" value="À procura de grupos interessantes? Tente fazer uma [secondlife:///app/search/groups Busca]."/> + <string name="MiniMapToolTipMsg" value="[REGION](Clique duas vezes para abrir o mapa, shift+arraste para a visão pan)"/> + <string name="AltMiniMapToolTipMsg" value="[REGION](Clique duas vezes para teletransportar, shift+arraste para a visão pan)"/> <filter_editor label="Filtro" name="filter_input"/> <tab_container name="tabs"> <panel label="PROXIMIDADE" name="nearby_panel"> diff --git a/indra/newview/skins/default/xui/pt/panel_profile.xml b/indra/newview/skins/default/xui/pt/panel_profile.xml index f984ed6a7b..075ef55dee 100644 --- a/indra/newview/skins/default/xui/pt/panel_profile.xml +++ b/indra/newview/skins/default/xui/pt/panel_profile.xml @@ -16,6 +16,12 @@ <string name="RegisterDateFormat"> [REG_DATE] ([AGE]) </string> + <string name="name_text_args"> + [NAME] + </string> + <string name="display_name_text_args"> + [DISPLAY_NAME] + </string> <layout_stack name="layout"> <layout_panel name="profile_stack"> <scroll_container name="profile_scroll"> @@ -30,7 +36,7 @@ <text name="title_acc_status_text" value="Conta:"/> <text name="title_partner_text" value="Parceiro(a):"/> <panel name="partner_data_panel"> - <name_box initial_value="(pesquisando)" name="partner_text"/> + <text initial_value="(pesquisando)" name="partner_text"/> </panel> <text name="title_groups_text" value="Grupos:"/> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_script_ed.xml b/indra/newview/skins/default/xui/pt/panel_script_ed.xml index 563f4fe054..a1acb18cb4 100644 --- a/indra/newview/skins/default/xui/pt/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/pt/panel_script_ed.xml @@ -15,6 +15,9 @@ <panel.string name="Title"> Script: [NOME] </panel.string> + <panel.string name="external_editor_not_set"> + Selecione um editor configurando a variável de ambiente LL_SCRIPT_EDITOR ou o ExternalEditor. + </panel.string> <menu_bar name="script_menu"> <menu label="Arquivo" name="File"> <menu_item_call label="Salvar" name="Save"/> diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml index 06123e0118..47813604ff 100644 --- a/indra/newview/skins/default/xui/pt/strings.xml +++ b/indra/newview/skins/default/xui/pt/strings.xml @@ -1040,7 +1040,7 @@ </string> <string name="WornOnAttachmentPoint" value="(vestido em [ATTACHMENT_POINT])"/> <string name="ActiveGesture" value="[GESLABEL] (ativado)"/> - <string name="Chat" value="Bate papo"/> + <string name="Chat Message" value="Bate-papo:"/> <string name="Sound" value="Som"/> <string name="Wait" value="--- Aguarde"/> <string name="AnimFlagStop" value="Parar animação"/> @@ -1822,12 +1822,6 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh <string name="accel-win-shift"> Shift+ </string> - <string name="Esc"> - Esc - </string> - <string name="Home"> - Início - </string> <string name="FileSaved"> Arquivo salvo </string> @@ -1847,7 +1841,7 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh PDT </string> <string name="Direction_Forward"> - Avante + Frente </string> <string name="Direction_Left"> Esquerda @@ -1871,10 +1865,10 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh Leste </string> <string name="Direction_Up"> - Acima + P/ cima </string> <string name="Direction_Down"> - Abaixo + P/ baixo </string> <string name="Any Category"> Qualquer categoria @@ -1945,6 +1939,9 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh <string name="Other"> Outros </string> + <string name="Rental"> + Aluguel + </string> <string name="Any"> Qualquer </string> @@ -3863,7 +3860,7 @@ Denunciar abuso <string name="Notices"> Avisos </string> - <string name="Chat"> + <string name="Chat" value="Bate papo"> Bate-papo </string> <string name="DeleteItems"> @@ -3875,4 +3872,348 @@ Denunciar abuso <string name="EmptyOutfitText"> Este look não possui nenhuma peça </string> + <string name="ExternalEditorNotSet"> + Selecione um editor utilizando a configuração ExternalEditor. + </string> + <string name="ExternalEditorNotFound"> + O editor externo especificado não foi localizado. +Tente colocar o caminho do editor entre aspas. +(ex. "/caminho para/editor" "%s") + </string> + <string name="ExternalEditorCommandParseError"> + Error ao analisar o comando do editor externo. + </string> + <string name="ExternalEditorFailedToRun"> + Falha de execução do editor externo. + </string> + <string name="Esc"> + Esc + </string> + <string name="Space"> + Space + </string> + <string name="Enter"> + Enter + </string> + <string name="Tab"> + Tab + </string> + <string name="Ins"> + Ins + </string> + <string name="Del"> + Del + </string> + <string name="Backsp"> + Backsp + </string> + <string name="Shift"> + Shift + </string> + <string name="Ctrl"> + Ctrl + </string> + <string name="Alt"> + Alt + </string> + <string name="CapsLock"> + CapsLock + </string> + <string name="Home"> + Início + </string> + <string name="End"> + End + </string> + <string name="PgUp"> + PgUp + </string> + <string name="PgDn"> + PgDn + </string> + <string name="F1"> + F1 + </string> + <string name="F2"> + F2 + </string> + <string name="F3"> + F3 + </string> + <string name="F4"> + F4 + </string> + <string name="F5"> + F5 + </string> + <string name="F6"> + F6 + </string> + <string name="F7"> + F7 + </string> + <string name="F8"> + F8 + </string> + <string name="F9"> + F9 + </string> + <string name="F10"> + F10 + </string> + <string name="F11"> + F11 + </string> + <string name="F12"> + F12 + </string> + <string name="Add"> + Adicionar + </string> + <string name="Subtract"> + Subtrair + </string> + <string name="Multiply"> + Multiplicar + </string> + <string name="Divide"> + Dividir + </string> + <string name="PAD_DIVIDE"> + PAD_DIVIDE + </string> + <string name="PAD_LEFT"> + PAD_LEFT + </string> + <string name="PAD_RIGHT"> + PAD_RIGHT + </string> + <string name="PAD_DOWN"> + PAD_DOWN + </string> + <string name="PAD_UP"> + PAD_UP + </string> + <string name="PAD_HOME"> + PAD_HOME + </string> + <string name="PAD_END"> + PAD_END + </string> + <string name="PAD_PGUP"> + PAD_PGUP + </string> + <string name="PAD_PGDN"> + PAD_PGDN + </string> + <string name="PAD_CENTER"> + PAD_CENTER + </string> + <string name="PAD_INS"> + PAD_INS + </string> + <string name="PAD_DEL"> + PAD_DEL + </string> + <string name="PAD_Enter"> + PAD_Enter + </string> + <string name="PAD_BUTTON0"> + PAD_BUTTON0 + </string> + <string name="PAD_BUTTON1"> + PAD_BUTTON1 + </string> + <string name="PAD_BUTTON2"> + PAD_BUTTON2 + </string> + <string name="PAD_BUTTON3"> + PAD_BUTTON3 + </string> + <string name="PAD_BUTTON4"> + PAD_BUTTON4 + </string> + <string name="PAD_BUTTON5"> + PAD_BUTTON5 + </string> + <string name="PAD_BUTTON6"> + PAD_BUTTON6 + </string> + <string name="PAD_BUTTON7"> + PAD_BUTTON7 + </string> + <string name="PAD_BUTTON8"> + PAD_BUTTON8 + </string> + <string name="PAD_BUTTON9"> + PAD_BUTTON9 + </string> + <string name="PAD_BUTTON10"> + PAD_BUTTON10 + </string> + <string name="PAD_BUTTON11"> + PAD_BUTTON11 + </string> + <string name="PAD_BUTTON12"> + PAD_BUTTON12 + </string> + <string name="PAD_BUTTON13"> + PAD_BUTTON13 + </string> + <string name="PAD_BUTTON14"> + PAD_BUTTON14 + </string> + <string name="PAD_BUTTON15"> + PAD_BUTTON15 + </string> + <string name="-"> + - + </string> + <string name="="> + = + </string> + <string name="`"> + ` + </string> + <string name=";"> + ; + </string> + <string name="["> + [ + </string> + <string name="]"> + ] + </string> + <string name="\"> + \ + </string> + <string name="0"> + 0 + </string> + <string name="1"> + 1 + </string> + <string name="2"> + 2 + </string> + <string name="3"> + 3 + </string> + <string name="4"> + 4 + </string> + <string name="5"> + 5 + </string> + <string name="6"> + 6 + </string> + <string name="7"> + 7 + </string> + <string name="8"> + 8 + </string> + <string name="9"> + 9 + </string> + <string name="A"> + A + </string> + <string name="B"> + B + </string> + <string name="C"> + C + </string> + <string name="D"> + D + </string> + <string name="E"> + E + </string> + <string name="F"> + F + </string> + <string name="G"> + G + </string> + <string name="H"> + H + </string> + <string name="I"> + I + </string> + <string name="J"> + J + </string> + <string name="K"> + K + </string> + <string name="L"> + L + </string> + <string name="M"> + M + </string> + <string name="N"> + N + </string> + <string name="O"> + O + </string> + <string name="P"> + P + </string> + <string name="Q"> + Q + </string> + <string name="R"> + R + </string> + <string name="S"> + S + </string> + <string name="T"> + T + </string> + <string name="U"> + U + </string> + <string name="V"> + V + </string> + <string name="W"> + W + </string> + <string name="X"> + X + </string> + <string name="Y"> + Y + </string> + <string name="Z"> + Z + </string> + <string name="BeaconParticle"> + Vendo balizas de partículas (azul) + </string> + <string name="BeaconPhysical"> + Vendo balizas de objetos físicos (verde) + </string> + <string name="BeaconScripted"> + Vendo balizas de objetos com script (vermelho) + </string> + <string name="BeaconScriptedTouch"> + Vendo objeto com script com balizas com funcionalidade de toque (vermelho) + </string> + <string name="BeaconSound"> + Vendo balizas de som (amarelo) + </string> + <string name="BeaconMedia"> + Vendo balizas de mídia (branco) + </string> + <string name="ParticleHiding"> + Ocultar partículas + </string> </strings> -- cgit v1.2.3 From 2deea7c9d162b9bcae29e73fca8eebd26460fbf8 Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Fri, 1 Apr 2011 17:38:13 -0400 Subject: Added tag end-of-develop.py for changeset 52b2263ab28f --- .hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/.hgtags b/.hgtags index deae8abc20..67a66dfa88 100644 --- a/.hgtags +++ b/.hgtags @@ -93,3 +93,4 @@ c5bdef3aaa2744626aef3c217ce29e1900d357b3 2.6.1-beta1 42f32494bac475d0737799346f6831558ae8bf5d 2.6.0-release d1203046bb653b763f835b04d184646949d8dd5c DRTVWR-45_2.6.2-beta1 d1203046bb653b763f835b04d184646949d8dd5c 2.6.2-beta1 +52b2263ab28f0976c689fd0b76c55a9eb027cdbf end-of-develop.py -- cgit v1.2.3 From 774b9ac9f9f87af65a7356d7f9a25e204428d4aa Mon Sep 17 00:00:00 2001 From: callum <none@none> Date: Fri, 1 Apr 2011 14:48:56 -0700 Subject: SOCIAL-859 FIX SSL issues re-emerged on OS X 10.6.7 (and possibly other OSs) --- indra/newview/app_settings/CA.pem | 7253 +++++++++++++++++-------------------- 1 file changed, 3337 insertions(+), 3916 deletions(-) diff --git a/indra/newview/app_settings/CA.pem b/indra/newview/app_settings/CA.pem index 7cebbf48b2..1e23c13d7d 100644 --- a/indra/newview/app_settings/CA.pem +++ b/indra/newview/app_settings/CA.pem @@ -1,3916 +1,3337 @@ ------BEGIN CERTIFICATE----- -MIIEuDCCA6CgAwIBAgIBBDANBgkqhkiG9w0BAQUFADCBtDELMAkGA1UEBhMCQlIx -EzARBgNVBAoTCklDUC1CcmFzaWwxPTA7BgNVBAsTNEluc3RpdHV0byBOYWNpb25h -bCBkZSBUZWNub2xvZ2lhIGRhIEluZm9ybWFjYW8gLSBJVEkxETAPBgNVBAcTCEJy -YXNpbGlhMQswCQYDVQQIEwJERjExMC8GA1UEAxMoQXV0b3JpZGFkZSBDZXJ0aWZp -Y2Fkb3JhIFJhaXogQnJhc2lsZWlyYTAeFw0wMTExMzAxMjU4MDBaFw0xMTExMzAy -MzU5MDBaMIG0MQswCQYDVQQGEwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDE9MDsG -A1UECxM0SW5zdGl0dXRvIE5hY2lvbmFsIGRlIFRlY25vbG9naWEgZGEgSW5mb3Jt -YWNhbyAtIElUSTERMA8GA1UEBxMIQnJhc2lsaWExCzAJBgNVBAgTAkRGMTEwLwYD -VQQDEyhBdXRvcmlkYWRlIENlcnRpZmljYWRvcmEgUmFpeiBCcmFzaWxlaXJhMIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwPMudwX/hvm+Uh2b/lQAcHVA -isamaLkWdkwP9/S/tOKIgRrL6Oy+ZIGlOUdd6uYtk9Ma/3pUpgcfNAj0vYm5gsyj -Qo9emsc+x6m4VWwk9iqMZSCK5EQkAq/Ut4n7KuLE1+gdftwdIgxfUsPt4CyNrY50 -QV57KM2UT8x5rrmzEjr7TICGpSUAl2gVqe6xaii+bmYR1QrmWaBSAG59LrkrjrYt -bRhFboUDe1DK+6T8s5L6k8c8okpbHpa9veMztDVC9sPJ60MWXh6anVKo1UcLcbUR -yEeNvZneVRKAAU6ouwdjDvwlsaKydFKwed0ToQ47bmUKgcm+wV3eTRk36UOnTwID -AQABo4HSMIHPME4GA1UdIARHMEUwQwYFYEwBAQAwOjA4BggrBgEFBQcCARYsaHR0 -cDovL2FjcmFpei5pY3BicmFzaWwuZ292LmJyL0RQQ2FjcmFpei5wZGYwPQYDVR0f -BDYwNDAyoDCgLoYsaHR0cDovL2FjcmFpei5pY3BicmFzaWwuZ292LmJyL0xDUmFj -cmFpei5jcmwwHQYDVR0OBBYEFIr68VeEERM1kEL6V0lUaQ2kxPA3MA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAZA5c1 -U/hgIh6OcgLAfiJgFWpvmDZWqlV30/bHFpj8iBobJSm5uDpt7TirYh1Uxe3fQaGl -YjJe+9zd+izPRbBqXPVQA34EXcwk4qpWuf1hHriWfdrx8AcqSqr6CuQFwSr75Fos -SzlwDADa70mT7wZjAmQhnZx2xJ6wfWlT9VQfS//JYeIc7Fue2JNLd00UOSMMaiK/ -t79enKNHEA2fupH3vEigf5Eh4bVAN5VohrTm6MY53x7XQZZr1ME7a55lFEnSeT0u -mlOAjR2mAbvSM5X5oSZNrmetdzyTj2flCM8CC7MLab0kkdngRIlUBGHF1/S5nmPb -K+9A46sd33oqK8n8 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGCDCCA/CgAwIBAgIBATANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290 -IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB -IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA -Y2FjZXJ0Lm9yZzAeFw0wNTEwMTQwNzM2NTVaFw0zMzAzMjgwNzM2NTVaMFQxFDAS -BgNVBAoTC0NBY2VydCBJbmMuMR4wHAYDVQQLExVodHRwOi8vd3d3LkNBY2VydC5v -cmcxHDAaBgNVBAMTE0NBY2VydCBDbGFzcyAzIFJvb3QwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCrSTURSHzSJn5TlM9Dqd0o10Iqi/OHeBlYfA+e2ol9 -4fvrcpANdKGWZKufoCSZc9riVXbHF3v1BKxGuMO+f2SNEGwk82GcwPKQ+lHm9WkB -Y8MPVuJKQs/iRIwlKKjFeQl9RrmK8+nzNCkIReQcn8uUBByBqBSzmGXEQ+xOgo0J -0b2qW42S0OzekMV/CsLj6+YxWl50PpczWejDAz1gM7/30W9HxM3uYoNSbi4ImqTZ -FRiRpoWSR7CuSOtttyHshRpocjWr//AQXcD0lKdq1TuSfkyQBX6TwSyLpI5idBVx -bgtxA+qvFTia1NIFcm+M+SvrWnIl+TlG43IbPgTDZCciECqKT1inA62+tC4T7V2q -SNfVfdQqe1z6RgRQ5MwOQluM7dvyz/yWk+DbETZUYjQ4jwxgmzuXVjit89Jbi6Bb -6k6WuHzX1aCGcEDTkSm3ojyt9Yy7zxqSiuQ0e8DYbF/pCsLDpyCaWt8sXVJcukfV -m+8kKHA4IC/VfynAskEDaJLM4JzMl0tF7zoQCqtwOpiVcK01seqFK6QcgCExqa5g -eoAmSAC4AcCTY1UikTxW56/bOiXzjzFU6iaLgVn5odFTEcV7nQP2dBHgbbEsPyyG -kZlxmqZ3izRg0RS0LKydr4wQ05/EavhvE/xzWfdmQnQeiuP43NJvmJzLR5iVQAX7 -6QIDAQABo4G/MIG8MA8GA1UdEwEB/wQFMAMBAf8wXQYIKwYBBQUHAQEEUTBPMCMG -CCsGAQUFBzABhhdodHRwOi8vb2NzcC5DQWNlcnQub3JnLzAoBggrBgEFBQcwAoYc -aHR0cDovL3d3dy5DQWNlcnQub3JnL2NhLmNydDBKBgNVHSAEQzBBMD8GCCsGAQQB -gZBKMDMwMQYIKwYBBQUHAgEWJWh0dHA6Ly93d3cuQ0FjZXJ0Lm9yZy9pbmRleC5w -aHA/aWQ9MTAwDQYJKoZIhvcNAQEEBQADggIBAH8IiKHaGlBJ2on7oQhy84r3HsQ6 -tHlbIDCxRd7CXdNlafHCXVRUPIVfuXtCkcKZ/RtRm6tGpaEQU55tiKxzbiwzpvD0 -nuB1wT6IRanhZkP+VlrRekF490DaSjrxC1uluxYG5sLnk7mFTZdPsR44Q4Dvmw2M -77inYACHV30eRBzLI++bPJmdr7UpHEV5FpZNJ23xHGzDwlVks7wU4vOkHx4y/CcV -Bc/dLq4+gmF78CEQGPZE6lM5+dzQmiDgxrvgu1pPxJnIB721vaLbLmINQjRBvP+L -ivVRIqqIMADisNS8vmW61QNXeZvo3MhN+FDtkaVSKKKs+zZYPumUK5FQhxvWXtaM -zPcPEAxSTtAWYeXlCmy/F8dyRlecmPVsYGN6b165Ti/Iubm7aoW8mA3t+T6XhDSU -rgCvoeXnkm5OvfPi2RSLXNLrAWygF6UtEOucekq9ve7O/e0iQKtwOIj1CodqwqsF -YMlIBdpTwd5Ed2qz8zw87YC8pjhKKSRf/lk7myV6VmMAZLldpGJ9VzZPrYPvH5JT -oI53V93lYRE9IwCQTDz6o2CTBKOvNfYOao9PSmCnhQVsRqGP9Md246FZV/dxssRu -FFxtbUFm3xuTsdQAw+7Lzzw9IYCpX2Nl/N3gX6T0K/CFcUHUZyX7GrGXrtaZghNB -0m6lG5kngOcLqagA ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290 -IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB -IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA -Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO -BgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEi -MCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJ -ARYSc3VwcG9ydEBjYWNlcnQub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC -CgKCAgEAziLA4kZ97DYoB1CW8qAzQIxL8TtmPzHlawI229Z89vGIj053NgVBlfkJ -8BLPRoZzYLdufujAWGSuzbCtRRcMY/pnCujW0r8+55jE8Ez64AO7NV1sId6eINm6 -zWYyN3L69wj1x81YyY7nDl7qPv4coRQKFWyGhFtkZip6qUtTefWIonvuLwphK42y -fk1WpRPs6tqSnqxEQR5YYGUFZvjARL3LlPdCfgv3ZWiYUQXw8wWRBB0bF4LsyFe7 -w2t6iPGwcswlWyCR7BYCEo8y6RcYSNDHBS4CMEK4JZwFaz+qOqfrU0j36NK2B5jc -G8Y0f3/JHIJ6BVgrCFvzOKKrF11myZjXnhCLotLddJr3cQxyYN/Nb5gznZY0dj4k -epKwDpUeb+agRThHqtdB7Uq3EvbXG4OKDy7YCbZZ16oE/9KTfWgu3YtLq1i6L43q -laegw1SJpfvbi1EinbLDvhG+LJGGi5Z4rSDTii8aP8bQUWWHIbEZAWV/RRyH9XzQ -QUxPKZgh/TMfdQwEUfoZd9vUFBzugcMd9Zi3aQaRIt0AUMyBMawSB3s42mhb5ivU -fslfrejrckzzAeVLIL+aplfKkQABi6F1ITe1Yw1nPkZPcCBnzsXWWdsC4PDSy826 -YreQQejdIOQpvGQpQsgi3Hia/0PsmBsJUUtaWsJx8cTLc6nloQsCAwEAAaOCAc4w -ggHKMB0GA1UdDgQWBBQWtTIb1Mfz4OaO873SsDrusjkY0TCBowYDVR0jBIGbMIGY -gBQWtTIb1Mfz4OaO873SsDrusjkY0aF9pHsweTEQMA4GA1UEChMHUm9vdCBDQTEe -MBwGA1UECxMVaHR0cDovL3d3dy5jYWNlcnQub3JnMSIwIAYDVQQDExlDQSBDZXJ0 -IFNpZ25pbmcgQXV0aG9yaXR5MSEwHwYJKoZIhvcNAQkBFhJzdXBwb3J0QGNhY2Vy -dC5vcmeCAQAwDwYDVR0TAQH/BAUwAwEB/zAyBgNVHR8EKzApMCegJaAjhiFodHRw -czovL3d3dy5jYWNlcnQub3JnL3Jldm9rZS5jcmwwMAYJYIZIAYb4QgEEBCMWIWh0 -dHBzOi8vd3d3LmNhY2VydC5vcmcvcmV2b2tlLmNybDA0BglghkgBhvhCAQgEJxYl -aHR0cDovL3d3dy5jYWNlcnQub3JnL2luZGV4LnBocD9pZD0xMDBWBglghkgBhvhC -AQ0ESRZHVG8gZ2V0IHlvdXIgb3duIGNlcnRpZmljYXRlIGZvciBGUkVFIGhlYWQg -b3ZlciB0byBodHRwOi8vd3d3LmNhY2VydC5vcmcwDQYJKoZIhvcNAQEEBQADggIB -ACjH7pyCArpcgBLKNQodgW+JapnM8mgPf6fhjViVPr3yBsOQWqy1YPaZQwGjiHCc -nWKdpIevZ1gNMDY75q1I08t0AoZxPuIrA2jxNGJARjtT6ij0rPtmlVOKTV39O9lg -18p5aTuxZZKmxoGCXJzN600BiqXfEVWqFcofN8CCmHBh22p8lqOOLlQ+TyGpkO/c -gr/c6EWtTZBzCDyUZbAEmXZ/4rzCahWqlwQ3JNgelE5tDlG+1sSPypZt90Pf6DBl -Jzt7u0NDY8RD97LsaMzhGY4i+5jhe1o+ATc7iwiwovOVThrLm82asduycPAtStvY -sONvRUgzEv/+PDIqVPfE94rwiCPCR/5kenHA0R6mY7AHfqQv0wGP3J8rtsYIqQ+T -SCX8Ev2fQtzzxD72V7DX3WnRBnc0CkvSyqD/HMaMyRa+xMwyN2hzXwj7UfdJUzYF -CpUCTPJ5GhD22Dp1nPMd8aINcGeGG7MW9S/lpOt5hvk9C8JzC6WZrG/8Z7jlLwum -GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk -zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW -omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIESzCCAzOgAwIBAgIJAJigUTEEXRQpMA0GCSqGSIb3DQEBBQUAMHYxCzAJBgNV -BAYTAkRFMQ8wDQYDVQQIEwZIZXNzZW4xDjAMBgNVBAcTBUZ1bGRhMRAwDgYDVQQK -EwdEZWJjb25mMRMwEQYDVQQDEwpEZWJjb25mIENBMR8wHQYJKoZIhvcNAQkBFhBq -b2VyZ0BkZWJpYW4ub3JnMB4XDTA1MTEwNTE3NTUxNFoXDTE1MTEwMzE3NTUxNFow -djELMAkGA1UEBhMCREUxDzANBgNVBAgTBkhlc3NlbjEOMAwGA1UEBxMFRnVsZGEx -EDAOBgNVBAoTB0RlYmNvbmYxEzARBgNVBAMTCkRlYmNvbmYgQ0ExHzAdBgkqhkiG -9w0BCQEWEGpvZXJnQGRlYmlhbi5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQCvbOo0SrIwI5IMlsshH8WF3dHB9r9JlSKhMPaybawa1EyvZspMQ3wa -F5qxNf3Sj+NElEmjseEqvCZiIIzqwerHu0Qw62cDYCdCd2+Wb5m0bPYB5CGHiyU1 -eNP0je42O0YeXG2BvUujN8AviocVo39X2YwNQ0ryy4OaqYgm2pRlbtT2ESbF+SfV -Y2iqQj/f8ymF+lHo/pz8tbAqxWcqaSiHFAVQJrdqtFhtoodoNiE3q76zJoUkZTXB -k60Yc3MJSnatZCpnsSBr/D7zpntl0THrUjjtdRWCjQVhqfhM1yZJV+ApbLdheFh0 -ZWlSxdnp25p0q0XYw/7G92ELyFDfBUUNAgMBAAGjgdswgdgwHQYDVR0OBBYEFMuV -dFNb4mCWUFbcP5LOtxFLrEVTMIGoBgNVHSMEgaAwgZ2AFMuVdFNb4mCWUFbcP5LO -txFLrEVToXqkeDB2MQswCQYDVQQGEwJERTEPMA0GA1UECBMGSGVzc2VuMQ4wDAYD -VQQHEwVGdWxkYTEQMA4GA1UEChMHRGViY29uZjETMBEGA1UEAxMKRGViY29uZiBD -QTEfMB0GCSqGSIb3DQEJARYQam9lcmdAZGViaWFuLm9yZ4IJAJigUTEEXRQpMAwG -A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAGZXxHg4mnkvilRIM1EQfGdY -S5b/WcyF2MYSTeTvK4aIB6VHwpZoZCnDGj2m2D3CkHT0upAD9o0zM1tdsfncLzV+ -mDT/jNmBtYo4QXx5vEPwvEIcgrWjwk7SyaEUhZjtolTkHB7ACl0oD0r71St4iEPR -qTUCEXk2E47bg1Fz58wNt/yo2+4iqiRjg1XCH4evkQuhpW+dTZnDyFNqwSYZapOE -TBA+9zBb6xD1KM2DdY7r4GiyYItN0BKLfuWbh9LXGbl1C+f4P11g+m2MPiavIeCe -1iazG5pcS3KoTLACsYlEX24TINtg4kcuS81XdllcnsV3Kdts0nIqPj6uhTTZD0k= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDtTCCAp2gAwIBAgIRANAeQJAAAEZSAAAAAQAAAAQwDQYJKoZIhvcNAQEF -BQAwgYkxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJEQzETMBEGA1UEBxMKV2Fz -aGluZ3RvbjEXMBUGA1UEChMOQUJBLkVDT00sIElOQy4xGTAXBgNVBAMTEEFC -QS5FQ09NIFJvb3QgQ0ExJDAiBgkqhkiG9w0BCQEWFWFkbWluQGRpZ3NpZ3Ry -dXN0LmNvbTAeFw05OTA3MTIxNzMzNTNaFw0wOTA3MDkxNzMzNTNaMIGJMQsw -CQYDVQQGEwJVUzELMAkGA1UECBMCREMxEzARBgNVBAcTCldhc2hpbmd0b24x -FzAVBgNVBAoTDkFCQS5FQ09NLCBJTkMuMRkwFwYDVQQDExBBQkEuRUNPTSBS -b290IENBMSQwIgYJKoZIhvcNAQkBFhVhZG1pbkBkaWdzaWd0cnVzdC5jb20w -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx0xHgeVVDBwhMywVC -AOINg0Y95JO6tgbTDVm9PsHOQ2cBiiGo77zM0KLMsFWWU4RmBQDaREmA2FQK -pSWGlO1jVv9wbKOhGdJ4vmgqRF4vz8wYXke8OrFGPR7wuSw0X4x8TAgpnUBV -6zx9g9618PeKgw6hTLQ6pbNfWiKX7BmbwQVo/ea3qZGULOR4SCQaJRk665Wc -OQqKz0Ky8BzVX/tr7WhWezkscjiw7pOp03t3POtxA6k4ShZsiSrK2jMTecJV -jO2cu/LLWxD4LmE1xilMKtAqY9FlWbT4zfn0AIS2V0KFnTKo+SpU+/94Qby9 -cSj0u5C8/5Y0BONFnqFGKECBAgMBAAGjFjAUMBIGA1UdEwEB/wQIMAYBAf8C -AQgwDQYJKoZIhvcNAQEFBQADggEBAARvJYbk5pYntNlCwNDJALF/VD6Hsm0k -qS8Kfv2kRLD4VAe9G52dyntQJHsRW0mjpr8SdNWJt7cvmGQlFLdh6X9ggGvT -ZOirvRrWUfrAtF13Gn9kCF55xgVM8XrdTX3O5kh7VNJhkoHWG9YA8A6eKHeg -TYjHInYZw8eeG6Z3ePhfm1bR8PIXrI6dWeYf/le22V7hXZ9F7GFoGUHhsiAm -/lowdiT/QHI8eZ98IkirRs3bs4Ysj78FQdPB4xTjQRcm0HyncUwZ6EoPclgx -fexgeqMiKL0ZJGA/O4dzwGvky663qyVDslUte6sGDnVdNOVdc22esnVApVnJ -TzFxiNmIf1Q= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJT -RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4 -dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5h -bCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzEL -MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1B -ZGRUcnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1 -c3QgRXh0ZXJuYWwgQ0EgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBALf3GjPm8gAELTngTlvtH7xsD821+iO2zt6bETOXpClMfZOfvUq8 -k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfwTz/oMp50 -ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504 -B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDez -eWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5 -aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0WicCAwEAAaOB -3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0PBAQD -AgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6 -xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU -cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdv -cmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJ -KoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl -j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5R -xNKWt9x+Tu5w/Rw56wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjT -K3rMUUKhemPR5ruhxSvCNr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1 -n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHx -REzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49O -hgQ= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJT -RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU -UCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3Qw -HhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJT -RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU -UCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3Qw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwze -xODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY654eyNAbFvAWlA3yCyykQruGI -gb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWroulpOj0O -M3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1Lc -sRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5 -mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG -9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0OBBYEFJWxtPCU -tr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ -MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQsw -CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk -ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAx -IENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0 -MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph -iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9 -tTEv2dB8Xfjea4MYeDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL -/bscVjby/rK25Xa71SJlpz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlV -g3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6 -tkD9xOQ14R0WHNC8K47Wcdk= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJT -RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU -UCBOZXR3b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAe -Fw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNF -MRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ -IE5ldHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+ -A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c -+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1id9NEHif2 -P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKX -C1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8R -s3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9 -BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQWBBSBPjfYkrAf -d59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zCB -jgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkG -A1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU -cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENB -IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmu -G7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL -+YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbj -PGsye/Kf8Lb93/AoGEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bY -GozH7ZxOmuASu7VqTITh4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6 -NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9HEufOX1362Kqx -My3ZdvJOOjMMK7MtkAY= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJT -RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU -UCBOZXR3b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9v -dDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYT -AlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3Qg -VFRQIE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBS -b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoek -n0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKk -IhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3KP0q6p6z -sLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1t -UvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R -+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvES -a0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0GA1UdDgQWBBQ5 -lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw -AwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkw -ZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL -ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVh -bGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2Vh -lRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG -GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx9 -5dr6h+sNNVJn0J6XdgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKF -Yqa0p9m9N5xotS1WfbC3P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVA -wRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQw -dOUeqN48Jzd/g66ed8/wMLH/S5noxqE= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJV -UzEcMBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1l -cmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4X -DTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMx -HDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJp -Y2EgT25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCa -xlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CGv2BlnEtUiMJIxUo5vxTjWVXl -GbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44zDyL9Hy7n -BzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145Lcx -VR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiE -mf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCu -JKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Zo/Z5 -9m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUA -A4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF -Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOM -IOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTI -dGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g -Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j -8uB9Gr784N/Xx6dssPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJV -UzEcMBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1l -cmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4X -DTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMx -HDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJp -Y2EgT25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssN -t79Hc9PwVU3dxgz6sWYFas14tNwC206B89enfHG8dWOgXeMHDEjsJcQDIPT/ -DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8f3SkWq7x -uhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE -18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxr -kJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMD -bi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8BPeraunzgWGcX -uVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn6KVu -Y8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9 -W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ -o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48 -ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124Hhn -AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op -aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNee -MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypL -M7PmG2tZTiLMubekJcmnxPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qf -tIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjR -Ywu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R -+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr -+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVM -nNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMADjMSW7yV5TKQqLPGbIOt -d+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh1NolNscI -WC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZ -ZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y -3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz -2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw -RY8mkaKO/qk= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMC -VVMxHTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNB -bWVyaWNhIE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIg -Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyOTA2MDAw -MFoXDTM3MTEyMDE1MDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRB -T0wgVGltZSBXYXJuZXIgSW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUg -SW5jLjE3MDUGA1UEAxMuQU9MIFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAJnej8Mlo2k06AX3dLm/WpcZuS+U0pPlLYnKhHw/EEMbjIt8hFj4JHxI -zyr9wBXZGH6EGhfT257XyuTZ16pYUYfw8ItITuLCxFlpMGK2MKKMCxGZYTVt -fu/FsRkGIBKOQuHfD5YQUqjPnF+VFNivO3ULMSAfRC+iYkGzuxgh28pxPIzs -trkNn+9R7017EvILDOGsQI93f7DKeHEMXRZxcKLXwjqFzQ6axOAAsNUl6twr -5JQtOJyJQVdkKGUZHLZEtMgxa44Be3ZZJX8VHIQIfHNlIAqhBC4aMqiaILGc -LCFZ5/vP7nAtCMpjPiybkxlqpMKX/7eGV4iFbJ4VFitNLLMCAwEAAaNjMGEw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUoTYwFsuGkABFgFOxj8jYPXy+ -XxIwHwYDVR0jBBgwFoAUoTYwFsuGkABFgFOxj8jYPXy+XxIwDgYDVR0PAQH/ -BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQCKIBilvrMvtKaEAEAwKfq0FHNM -eUWn9nDg6H5kHgqVfGphwu9OH77/yZkfB2FK4V1Mza3u0FIy2VkyvNp5ctZ7 -CegCgTXTCt8RHcl5oIBN/lrXVtbtDyqvpxh1MwzqwWEFT2qaifKNuZ8u77Bf -WgDrvq2g+EQFZ7zLBO+eZMXpyD8Fv8YvBxzDNnGGyjhmSs3WuEvGbKeXO/oT -LW4jYYehY0KswsuXn2Fozy1MBJ3XJU8KDk2QixhWqJNIV9xvrr2eZ1d3iVCz -vhGbRWeDhhmH05i9CBoWH1iCC+GWaQVLjuyDUTEH1dSf/1l7qG6Fz9NLqUmw -X7A5KGgOc90lmt4S ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIF5jCCA86gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMC -VVMxHTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNB -bWVyaWNhIE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIg -Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyOTA2MDAw -MFoXDTM3MDkyODIzNDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRB -T0wgVGltZSBXYXJuZXIgSW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUg -SW5jLjE3MDUGA1UEAxMuQU9MIFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC -ggIBALQ3WggWmRToVbEbJGv8x4vmh6mJ7ouZzU9AhqS2TcnZsdw8TQ2FTBVs -RotSeJ/4I/1n9SQ6aF3Q92RhQVSji6UI0ilbm2BPJoPRYxJWSXakFsKlnUWs -i4SVqBax7J/qJBrvuVdcmiQhLE0OcR+mrF1FdAOYxFSMFkpBd4aVdQxHAWZg -/BXxD+r1FHjHDtdugRxev17nOirYlxcwfACtCJ0zr7iZYYCLqJV+FNwSbKTQ -2O9ASQI2+W6p1h2WVgSysy0WVoaP2SBXgM1nEG2wTPDaRrbqJS5Gr42whTg0 -ixQmgiusrpkLjhTXUr2eacOGAgvqdnUxCc4zGSGFQ+aJLZ8lN2fxI2rSAG2X -+Z/nKcrdH9cG6rjJuQkhn8g/BsXS6RJGAE57COtCPStIbp1n3UsC5ETzkxml -J85per5n0/xQpCyrw2u544BMzwVhSyvcG7mm0tCq9Stz+86QNZ8MUhy/XCFh -EVsVS6kkUfykXPcXnbDS+gfpj1bkGoxoigTTfFrjnqKhynFbotSg5ymFXQNo -Kk/SBtc9+cMDLz9l+WceR0DTYw/j1Y75hauXTLPXJuuWCpTehTacyH+BCQJJ -Kg71ZDIMgtG6aoIbs0t0EfOMd9afv9w3pKdVBC/UMejTRrkDfNoSTllkt1Ex -MVCgyhwn2RAurda9EGYrw7AiShJbAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMB -Af8wHQYDVR0OBBYEFE9pbQN+nZ8HGEO8txBO1b+pxCAoMB8GA1UdIwQYMBaA -FE9pbQN+nZ8HGEO8txBO1b+pxCAoMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG -9w0BAQUFAAOCAgEAO/Ouyuguh4X7ZVnnrREUpVe8WJ8kEle7+z802u6teio0 -cnAxa8cZmIDJgt43d15Ui47y6mdPyXSEkVYJ1eV6moG2gcKtNuTxVBFT8zRF -ASbI5Rq8NEQh3q0l/HYWdyGQgJhXnU7q7C+qPBR7V8F+GBRn7iTGvboVsNIY -vbdVgaxTwOjdaRITQrcCtQVBynlQboIOcXKTRuidDV29rs4prWPVVRaAMCf/ -drr3uNZK49m1+VLQTkCpx+XCMseqdiThawVQ68W/ClTluUI8JPu3B5wwn3la -5uBAUhX0/Kr0VvlEl4ftDmVyXr4m+02kLQgH3thcoNyBM5kYJRF3p+v9WAks -mWsbivNSPxpNSGDxoPYzAlOL7SUJuA0t7Zdz7NeWH45gDtoQmy8YJPamTQr5 -O8t1wswvziRpyQoijlmn94IM19drNZxDAGrElWe6nEXLuA4399xOAU++CrYD -062KRffaJ00psUjf5BHklka9bAI+1lHIlRcBFanyqqryvy9lG2/QuRqT9Y41 -xICHPpQvZuTpqP9BnHAqTyo5GJUefvthATxRCC4oGKQWDzH9OmwjkyB24f0H -hdFbP9IcczLd+rn4jM8Ch3qaluTtT4mNU0OrDhPAARW0eTjb/G49nlG2uBOL -Z8/5fNkiHfZdxRwBL5joeiQYvITX+txyW/fBOmg= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQG -EwJJRTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0 -MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUx -MjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNV -BAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZ -QmFsdGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAKMEuyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+h -Xe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gR -QKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/CG9VwcPCP -wBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1 -pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNT -Px8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkC -AwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1BE3wMBIGA1Ud -EwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUA -A4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkT -I7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx -jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/ -oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67 -G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H -RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFajCCBFKgAwIBAgIEPLU9RjANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQK -EwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEG -A1UEAxMqYmVUUlVTVGVkIFJvb3QgQ0EtQmFsdGltb3JlIEltcGxlbWVudGF0 -aW9uMB4XDTAyMDQxMTA3Mzg1MVoXDTIyMDQxMTA3Mzg1MVowZjESMBAGA1UE -ChMJYmVUUlVTVGVkMRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAx -BgNVBAMTKmJlVFJVU1RlZCBSb290IENBLUJhbHRpbW9yZSBJbXBsZW1lbnRh -dGlvbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALx+xDmcjOPW -HIb/ymKt4H8wRXqOGrO4x/nRNv8i805qX4QQ+2aBw5R5MdKR4XeOGCrDFN5R -9U+jK7wYFuK13XneIviCfsuBH/0nLI/6l2Qijvj/YaOcGx6Sj8CoCd8JEey3 -fTGaGuqDIQY8n7pc/5TqarjDa1U0Tz0yH92BFODEPM2dMPgwqZfT7syj0B9f -HBOB1BirlNFjw55/NZKeX0Tq7PQiXLfoPX2k+YmpkbIq2eszh+6l/ePazIjm -iSZuxyuC0F6dWdsU7JGDBcNeDsYq0ATdcT0gTlgn/FP7eHgZFLL8kFKJOGJg -B7Sg7KxrUNb9uShr71ItOrL/8QFArDcCAwEAAaOCAh4wggIaMA8GA1UdEwEB -/wQFMAMBAf8wggG1BgNVHSAEggGsMIIBqDCCAaQGDysGAQQBsT4AAAEJKIOR -MTCCAY8wggFIBggrBgEFBQcCAjCCAToaggE2UmVsaWFuY2Ugb24gb3IgdXNl -IG9mIHRoaXMgQ2VydGlmaWNhdGUgY3JlYXRlcyBhbiBhY2tub3dsZWRnbWVu -dCBhbmQgYWNjZXB0YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5k -YXJkIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwgdGhlIENlcnRpZmlj -YXRpb24gUHJhY3RpY2UgU3RhdGVtZW50IGFuZCB0aGUgUmVseWluZyBQYXJ0 -eSBBZ3JlZW1lbnQsIHdoaWNoIGNhbiBiZSBmb3VuZCBhdCB0aGUgYmVUUlVT -VGVkIHdlYiBzaXRlLCBodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20vcHJvZHVj -dHNfc2VydmljZXMvaW5kZXguaHRtbDBBBggrBgEFBQcCARY1aHR0cDovL3d3 -dy5iZXRydXN0ZWQuY29tL3Byb2R1Y3RzX3NlcnZpY2VzL2luZGV4Lmh0bWww -HQYDVR0OBBYEFEU9w6nR3D8kVpgccxiIav+DR+22MB8GA1UdIwQYMBaAFEU9 -w6nR3D8kVpgccxiIav+DR+22MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0B -AQUFAAOCAQEASZK8o+6svfoNyYt5hhwjdrCAWXf82n+0S9/DZEtqTg6t8n1Z -dwWtColzsPq8y9yNAIiPpqCy6qxSJ7+hSHyXEHu67RMdmgduyzFiEuhjA6p9 -beP4G3YheBufS0OM00mG9htc9i5gFdPp43t1P9ACg9AYgkHNZTfqjjJ+vWuZ -XTARyNtIVBw74acT02pIk/c9jH8F6M7ziCpjBLjqflh8AXtb4cV97yHgjQ5d -UX2xZ/2jvTg2xvI4hocalmhgRvsoFEdV4aeADGvi6t9NfJBIoDa9CReJf8Py -05yc493EG931t3GzUwWJBtDLSoDByFOQtTwxiBdQn8nEDovYqAJjDQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFLDCCBBSgAwIBAgIEOU99hzANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQG -EwJXVzESMBAGA1UEChMJYmVUUlVTVGVkMRswGQYDVQQDExJiZVRSVVNUZWQg -Um9vdCBDQXMxGjAYBgNVBAMTEWJlVFJVU1RlZCBSb290IENBMB4XDTAwMDYy -MDE0MjEwNFoXDTEwMDYyMDEzMjEwNFowWjELMAkGA1UEBhMCV1cxEjAQBgNV -BAoTCWJlVFJVU1RlZDEbMBkGA1UEAxMSYmVUUlVTVGVkIFJvb3QgQ0FzMRow -GAYDVQQDExFiZVRSVVNUZWQgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBANS0c3oTCjhVAb6JVuGUntS+WutKNHUbYSnE4a0IYCF4 -SP+00PpeQY1hRIfo7clY+vyTmt9P6j41ffgzeubx181vSUs9Ty1uDoM6GHh3 -o8/n9E1z2Jo7Gh2+lVPPIJfCzz4kUmwMjmVZxXH/YgmPqsWPzGCgc0rXOD8V -cr+il7dw6K/ifhYGTPWqZCZyByWtNfwYsSbX2P8ZDoMbjNx4RWc0PfSvHI3k -bWvtILNnmrRhyxdviTX/507AMhLn7uzf/5cwdO2NR47rtMNE5qdMf1ZD6Li8 -tr76g5fmu/vEtpO+GRg+jIG5c4gW9JZDnGdzF5DYCW5jrEq2I8QBoa2k5MUC -AwEAAaOCAfgwggH0MA8GA1UdEwEB/wQFMAMBAf8wggFZBgNVHSAEggFQMIIB -TDCCAUgGCisGAQQBsT4BAAAwggE4MIIBAQYIKwYBBQUHAgIwgfQagfFSZWxp -YW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVz -IGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0 -ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGFuZCBjZXJ0aWZpY2F0aW9u -IHByYWN0aWNlIHN0YXRlbWVudCwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IGJl -VFJVU1RlZCdzIHdlYiBzaXRlLCBodHRwczovL3d3dy5iZVRSVVNUZWQuY29t -L3ZhdWx0L3Rlcm1zMDEGCCsGAQUFBwIBFiVodHRwczovL3d3dy5iZVRSVVNU -ZWQuY29tL3ZhdWx0L3Rlcm1zMDQGA1UdHwQtMCswKaAnoCWkIzAhMRIwEAYD -VQQKEwliZVRSVVNUZWQxCzAJBgNVBAYTAldXMB0GA1UdDgQWBBQquZtpLjub -2M3eKjEENGvKBxirZzAfBgNVHSMEGDAWgBQquZtpLjub2M3eKjEENGvKBxir -ZzAOBgNVHQ8BAf8EBAMCAf4wDQYJKoZIhvcNAQEFBQADggEBAHlh26Nebhax -6nZR+csVm8tpvuaBa58oH2U+3RGFktToQb9+M70j5/Egv6S0phkBxoyNNXxl -pE8JpNbYIxUFE6dDea/bow6be3ga8wSGWsb2jCBHOElQBp1yZzrwmAOtlmdE -/D8QDYZN5AA7KXvOOzuZhmElQITcE2K3+spZ1gMe1lMBzW1MaFVA4e5rxyoA -AEiCswoBw2AqDPeCNe5IhpbkdNQ96gFxugR1QKepfzk5mlWXKWWuGVUlBXJH -0+gY3Ljpr0NzARJ0o+FcXxVdJPP55PS2Z2cS52QiivalQaYctmBjRYoQtLpG -EK5BV2VsPyMQPyEQWbfkQN0mDCP2qq4= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGUTCCBTmgAwIBAgIEPLVPQDANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQK -EwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEG -A1UEAxMqYmVUUlVTVGVkIFJvb3QgQ0EgLSBFbnRydXN0IEltcGxlbWVudGF0 -aW9uMB4XDTAyMDQxMTA4MjQyN1oXDTIyMDQxMTA4NTQyN1owZjESMBAGA1UE -ChMJYmVUUlVTVGVkMRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAx -BgNVBAMTKmJlVFJVU1RlZCBSb290IENBIC0gRW50cnVzdCBJbXBsZW1lbnRh -dGlvbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALr0RAOqEmq1 -Q+xVkrYwfTVXDNvzDSduTPdQqJtOK2/b9a0cS12zqcH+e0TrW6MFDR/FNCsw -ACnxeECypP869AGIF37m1CbTukzqMvtDd5eHI8XbQ6P1KqNRXuE70mVpflUV -m3rnafdE4Fe1FehmYA8NA/uCjqPoEXtsvsdjDheT389Lrm5zdeDzqrmkwAkb -hepxKYhBMvnwKg5sCfJ0a2ZsUhMfGLzUPvfYbiCeyv78IZTuEyhL11xeDGbu -6bsPwTSxfwh28z0mcMmLJR1iJAzqHHVOwBLkuhMdMCktVjMFu5dZfsZJT4nX -LySotohAtWSSU1Yk5KKghbNekLQSM80CAwEAAaOCAwUwggMBMIIBtwYDVR0g -BIIBrjCCAaowggGmBg8rBgEEAbE+AAACCSiDkTEwggGRMIIBSQYIKwYBBQUH -AgIwggE7GoIBN1JlbGlhbmNlIG9uIG9yIHVzZSBvZiB0aGlzIENlcnRpZmlj -YXRlIGNyZWF0ZXMgYW4gYWNrbm93bGVkZ21lbnQgYW5kIGFjY2VwdGFuY2Ug -b2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29u -ZGl0aW9ucyBvZiB1c2UsIHRoZSBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0 -YXRlbWVudCBhbmQgdGhlIFJlbHlpbmcgUGFydHkgQWdyZWVtZW50LCB3aGlj -aCBjYW4gYmUgZm91bmQgYXQgdGhlIGJlVFJVU1RlZCB3ZWIgc2l0ZSwgaHR0 -cHM6Ly93d3cuYmV0cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9pbmRl -eC5odG1sMEIGCCsGAQUFBwIBFjZodHRwczovL3d3dy5iZXRydXN0ZWQuY29t -L3Byb2R1Y3RzX3NlcnZpY2VzL2luZGV4Lmh0bWwwEQYJYIZIAYb4QgEBBAQD -AgAHMIGJBgNVHR8EgYEwfzB9oHugeaR3MHUxEjAQBgNVBAoTCWJlVFJVU1Rl -ZDEbMBkGA1UECxMSYmVUUlVTVGVkIFJvb3QgQ0FzMTMwMQYDVQQDEypiZVRS -VVNUZWQgUm9vdCBDQSAtIEVudHJ1c3QgSW1wbGVtZW50YXRpb24xDTALBgNV -BAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMjA0MTEwODI0MjdagQ8yMDIyMDQx -MTA4NTQyN1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFH1w5a44iwY/qhwa -j/nPJDCqhIQWMB0GA1UdDgQWBBR9cOWuOIsGP6ocGo/5zyQwqoSEFjAMBgNV -HRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDANBgkq -hkiG9w0BAQUFAAOCAQEAKrgXzh8QlOu4mre5X+za95IkrNySO8cgjfKZ5V04 -ocI07cUTWVwFtStPYZuR+0H8/NU8TZh2BvWBfevdkObRVlTa4y0MnxEylCIB -evZsLHRnBMylj44ss0O1lKLQfelifwa+JwGDnjr9iu6YQ0pr17WXOzq/T220 -Y/ozADQuLW2WyXvKmWO6vvT2MKAtmJbpVkQFqUSjYRDrgqFnXbxdJ3Wqiig2 -KjiS2d2kXgClzMx8KSreKJCrt+G2/30lC0DYqjSjLd4H61/OCt3Kfjp9JsFi -aDrmLzfzgYYhxKlkqu9FNtEaZnz46TfW1mG+oq1I59/mdP7TbX3SJdysYlep -9w== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFaDCCBFCgAwIBAgIQO1nHe81bV569N1KsdrSqGjANBgkqhkiG9w0BAQUF -ADBiMRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBS -b290IENBczEvMC0GA1UEAxMmYmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1w -bGVtZW50YXRpb24wHhcNMDIwNDExMTExODEzWhcNMjIwNDEyMTEwNzI1WjBi -MRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290 -IENBczEvMC0GA1UEAxMmYmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVt -ZW50YXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkujQw -CY5X0LkGLG9uJIAiv11DpvpPrILnHGhwhRujbrWqeNluB0s/6d/16uhUoWGK -Di9pdRi3DOUUjXFumLhV/AyV0Jtu4S2I1DpAa5LxmZZk3tv/ePTulh1HiXzU -vrmIdyM6CeYEnm2qXtLIvZpOGd+J6lsOfsPktPDgaTuID0GQ+NRxQyTBjyZL -O1bp/4xsN+lFrYWMU8NghpBKlsmzVLC7F/AcRdnUGxlkVgoZ98zh/4avflhe -rHqQH8koOUV7orbHnB/ahdQhhlkwk75TMzf270HPM8ercmsl9fNTGwxMLvF1 -S++gh/f+ihXQbNXL+WhTuXAVE8L1LvtDNXUtAgMBAAGjggIYMIICFDAMBgNV -HRMEBTADAQH/MIIBtQYDVR0gBIIBrDCCAagwggGkBg8rBgEEAbE+AAADCSiD -kTEwggGPMEEGCCsGAQUFBwIBFjVodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20v -cHJvZHVjdHNfc2VydmljZXMvaW5kZXguaHRtbDCCAUgGCCsGAQUFBwICMIIB -OhqCATZSZWxpYW5jZSBvbiBvciB1c2Ugb2YgdGhpcyBDZXJ0aWZpY2F0ZSBj -cmVhdGVzIGFuIGFja25vd2xlZGdtZW50IGFuZCBhY2NlcHRhbmNlIG9mIHRo -ZSB0aGVuIGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlv -bnMgb2YgdXNlLCB0aGUgQ2VydGlmaWNhdGlvbiBQcmFjdGljZSBTdGF0ZW1l -bnQgYW5kIHRoZSBSZWx5aW5nIFBhcnR5IEFncmVlbWVudCwgd2hpY2ggY2Fu -IGJlIGZvdW5kIGF0IHRoZSBiZVRSVVNUZWQgd2ViIHNpdGUsIGh0dHA6Ly93 -d3cuYmV0cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1s -MAsGA1UdDwQEAwIBBjAfBgNVHSMEGDAWgBSp7BR++dlDzFMrFK3P9/BZiUHN -GTAdBgNVHQ4EFgQUqewUfvnZQ8xTKxStz/fwWYlBzRkwDQYJKoZIhvcNAQEF -BQADggEBANuXsHXqDMTBmMpWBcCorSZIry0g6IHHtt9DwSwddUvUQo3neqh0 -3GZCWYez9Wlt2ames30cMcH1VOJZJEnl7r05pmuKmET7m9cqg5c0Lcd9NUwt -NLg+DcTsiCevnpL9UGGCqGAHFFPMZRPB9kdEadIxyKbdLrML3kqNWz2rDcI1 -UqJWN8wyiyiFQpyRQHpwKzg21eFzGh/l+n5f3NacOzDq28BbJ1zTcwfBwvNM -m2+fG8oeqqg4MwlYsq78B+g23FW6L09A/nq9BqaBwZMifIYRCgZ3SK41ty8y -mmFei74pnykkiFY5LKjSq5YDWtRIn7lAhAuYaPsBQ9Yb4gmxlxw= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYT -AlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNl -cnR1bSBDQTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJ -BgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNV -BAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AM6xwS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYV -M42sLQnFdvkrOYCJ5JdLkKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/Ox -LjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE -7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/KUz/iDsaW -VhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu -/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYD -VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESS -bLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQaTOs9qmdvLdTN -/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvgGrZg -FCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqT -E5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x -O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYV -IZQs6GAqm4VKQPNriiTsBhYscw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJH -QjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxm -b3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFB -IENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIz -MTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu -Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENB -IExpbWl0ZWQxITAfBgNVBAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL5AnfRu4ep2hxxNRUSO -vkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhGC1Pqy0wk -wLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfH -dr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf04 -9vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULi -mAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cmez6KJcfA3Z3m -NWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEKIz6W -8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB -Af8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v -QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwu -Y29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG -9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm -7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHC -v8S5dIa2LX1rzNLzRt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdV -CYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAV -GI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C12yxow+ev+to -51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJH -QjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxm -b3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2Vj -dXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4 -MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIg -TWFuY2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2Rv -IENBIExpbWl0ZWQxJDAiBgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2 -aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMBxM4KK0HDr -c4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP9nQ95IDC -+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8 -j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWC -iIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtG -Cd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz6YiO/O1R65Nx -Tq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4EFgQU -PNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB -/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv -Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNo -dHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNl -cy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm -4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiF -Gv45jN5bBAS0VPmjZ55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXG -De+X3EyrEeFryzHRbPtIgKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsF -Vy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfU -a7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6s -Cx1HRR3B7Hzs/Sk= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJH -QjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxm -b3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1 -c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0y -ODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVy -IE1hbmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9k -byBDQSBMaW1pdGVkMSUwIwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNl -cnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhT -WvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh73TkVvFVI -xO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9 -C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/ -oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW1O24zG71++IsWL1/ -T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7kUlcsutT6vif -R4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1UdDgQW -BBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v -ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2 -hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2Vy -dmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw -uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdT -mw7pSqBYaWcOrp32pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+C -l5EfKNsYEYwq5GWDVxISjBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/g -hhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVF -wL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOj -GM9O9y5Xt5hwXsjEeLBi ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQG -EwJVUzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREw -DwYDVQQLEwhEU1RDQSBFMTAeFw05ODEyMTAxODEwMjNaFw0xODEyMTAxODQw -MjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVy -ZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEB -AQUAA4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlR -EmlvMVW5SXIACH7TpWJENySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+Lth -zfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2io74CTADKAqjuAQIxZA9SLRN0 -dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBoBgNVHR8E -YTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwg -U2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNV -BAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIx -MDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFGp5fpFpRhgTCgJ3 -pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAMBgNV -HRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3 -DQEBBQUAA4GBACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lN -QseSJqBcNJo4cvj9axY+IO6CizEqkzaFI4iKPANo08kJD038bKTaKHKTDomA -sH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4RbyhkwS7hp86W0N6 -w4pl ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID2DCCAsACEQDQHkCLAAACfAAAAAIAAAABMA0GCSqGSIb3DQEBBQUAMIGp -MQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBM -YWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENv -LjERMA8GA1UECxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBSb290Q0EgWDEx -ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODEyMDEx -ODE4NTVaFw0wODExMjgxODE4NTVaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UE -CBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0Rp -Z2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgWDEx -FjAUBgNVBAMTDURTVCBSb290Q0EgWDExITAfBgkqhkiG9w0BCQEWEmNhQGRp -Z3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -ANLGJrbnpT3BxGjVUG9TxW9JEwm4ryxIjRRqoxdfWvnTLnUv2Chi0ZMv/E3U -q4flCMeZ55I/db3rJbQVwZsZPdJEjdd0IG03Ao9pk1uKxBmd9LIO/BZsubEF -koPRhSxglD5FVaDZqwgh5mDoO3TymVBRaNADLbGAvqPYUrBEzUNKcI5YhZXh -TizWLUFv1oTnyJhEykfbLCSlaSbPa7gnYsP0yXqSI+0TZ4KuRS5F5X5yP4Wd -lGIQ5jyRoa13AOAV7POEgHJ6jm5gl8ckWRA0g1vhpaRptlc1HHhZxtMvOnNn -7pTKBBMFYgZwI7P0fO5F2WQLW0mqpEPOJsREEmy43XkCAwEAATANBgkqhkiG -9w0BAQUFAAOCAQEAojeyP2n714Z5VEkxlTMr89EJFEliYIalsBHiUMIdBlc+ -LegzZL6bqq1fG03UmZWii5rJYnK1aerZWKs17RWiQ9a2vAd5ZWRzfdd5ynvV -WlHG4VMElo04z6MXrDlxawHDi1M8Y+nuecDkvpIyZHqzH5eUYr3qsiAVlfuX -8ngvYzZAOONGDx3drJXK50uQe7FLqdTF65raqtWjlBRGjS0f8zrWkzr2Pnn8 -6Oawde3uPclwx12qgUtGJRzHbBXjlU4PqjI3lAoXJJIThFjSY28r9+ZbYgsT -F7ANUkz+/m9c4pFuHf2kYtdo+o56T9II2pPc8JIRetDccpMMc5NihWjQ9A== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQG -EwJVUzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREw -DwYDVQQLEwhEU1RDQSBFMjAeFw05ODEyMDkxOTE3MjZaFw0xODEyMDkxOTQ3 -MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVy -ZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEB -AQUAA4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fB -w18DW9Fvrn5C6mYjuGODVvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87e -ZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JSxhcxEzu1TdvIxPbDDyQq2gyd -55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBoBgNVHR8E -YTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwg -U2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNV -BAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIw -OTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFB6CTShlgDzJQW6s -NS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAMBgNV -HRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3 -DQEBBQUAA4GBAEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHR -xdf0CiUPPXiBng+xZ8SQTGPdXqfiup/1902lMXucKS1M/mQ+7LZT/uqb7YLb -dHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1mPnHfxsb1gYgAlih -w6ID ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID2DCCAsACEQDQHkCLAAB3bQAAAAEAAAAEMA0GCSqGSIb3DQEBBQUAMIGp -MQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBM -YWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENv -LjERMA8GA1UECxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBSb290Q0EgWDIx -ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODExMzAy -MjQ2MTZaFw0wODExMjcyMjQ2MTZaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UE -CBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0Rp -Z2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgWDIx -FjAUBgNVBAMTDURTVCBSb290Q0EgWDIxITAfBgkqhkiG9w0BCQEWEmNhQGRp -Z3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -ANx18IzAdZaawGIfJvfE4Zrq4FZzW5nNAUSoCLbVp9oaBBg5kkp4o4HC9Xd6 -ULRw/5qrxsfKboNPQpj7Jgva3G3WqZlVUmfpKAOS3OWwBZoPFflrWXJW8vo5 -/Kpo7g8fEIMv/J36F5bdguPmRX3AS4BEH+0s4IT9kVySVGkl5WJp3OXuAFK9 -MwutdQKFp2RQLcUZGTDAJtvJ0/0uma1ZtQtN1EGuhUhDWdy3qOKi3sOP17ih -YqZoUFLkzzGnlIXan0YyF1bl8utmPRL/Q9uY73fPy4GNNLHGUEom0eQ+QVCv -bK4iNC7Va26Dunm4dmVI2gkpZGMiuftHdoWMhkTLCdsCAwEAATANBgkqhkiG -9w0BAQUFAAOCAQEAtTYOXeFhKFoRZcA/gwN5Tb4opgsHAlKFzfiR0BBstWog -WxyQ2TA8xkieil5k+aFxd+8EJx8H6+Qm93N0yUQYGmbT4EOvkTvRyyzYdFQ6 -HE3K1GjNI3wdEJ5F6fYAbqbNGf9PLCmPV03Ed5K+4EwJ+11EhmYhqLkyolbV -6YyDfFk/xPEL553snr2cGA4+wjl5KLcDDQjLxufZATdQEOzMYRZA1K8xdHv8 -PzGn0EdzMzkbzE5q10mDEQb+64JYMzJM8FasHpwvVpp7wUocpf1VNs78lk30 -sPDst2yC7S8xmUJMqbINuBVd8d+6ybVK1GSYsyapMMj9puyrliGtf8J4tg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEgzCCA+ygAwIBAgIEOJ725DANBgkqhkiG9w0BAQQFADCBtDEUMBIGA1UE -ChMLRW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9HQ0NB -X0NQUyBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsT -HChjKSAyMDAwIEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1 -c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAy -MDcxNjE2NDBaFw0yMDAyMDcxNjQ2NDBaMIG0MRQwEgYDVQQKEwtFbnRydXN0 -Lm5ldDFAMD4GA1UECxQ3d3d3LmVudHJ1c3QubmV0L0dDQ0FfQ1BTIGluY29y -cC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDIwMDAg -RW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2xp -ZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQCTdLS25MVL1qFof2LV7PdRV7NySpj10InJrWPNTTVRaoTU -rcloeW+46xHbh65cJFET8VQlhK8pK5/jgOLZy93GRUk0iJBeAZfv6lOm3fzB -3ksqJeTpNfpVBQbliXrqpBFXO/x8PTbNZzVtpKklWb1m9fkn5JVn1j+SgF7y -NH0rhQIDAQABo4IBnjCCAZowEQYJYIZIAYb4QgEBBAQDAgAHMIHdBgNVHR8E -gdUwgdIwgc+ggcyggcmkgcYwgcMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUAw -PgYDVQQLFDd3d3cuZW50cnVzdC5uZXQvR0NDQV9DUFMgaW5jb3JwLiBieSBy -ZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0 -Lm5ldCBMaW1pdGVkMTMwMQYDVQQDEypFbnRydXN0Lm5ldCBDbGllbnQgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw -IoAPMjAwMDAyMDcxNjE2NDBagQ8yMDIwMDIwNzE2NDY0MFowCwYDVR0PBAQD -AgEGMB8GA1UdIwQYMBaAFISLdP3FjcD/J20gN0V8/i3OutN9MB0GA1UdDgQW -BBSEi3T9xY3A/ydtIDdFfP4tzrrTfTAMBgNVHRMEBTADAQH/MB0GCSqGSIb2 -fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQQFAAOBgQBObzWA -O9GK9Q6nIMstZVXQkvTnhLUGJoMShAusO7JE7r3PQNsgDrpuFOow4DtifH+L -a3xKp9U1PL6oXOpLu5OOgGarDyn9TS2/GpsKkMWr2tGzhtQvJFJcem3G8v7l -TRowjJDyutdKPkN+1MhQGof4T4HHdguEOnKdzmVml64mXg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIElTCCA/6gAwIBAgIEOJsRPDANBgkqhkiG9w0BAQQFADCBujEUMBIGA1UE -ChMLRW50cnVzdC5uZXQxPzA9BgNVBAsUNnd3dy5lbnRydXN0Lm5ldC9TU0xf -Q1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc -KGMpIDIwMDAgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVz -dC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wMDAyMDQxNzIwMDBaFw0yMDAyMDQxNzUwMDBaMIG6MRQwEgYDVQQKEwtF -bnRydXN0Lm5ldDE/MD0GA1UECxQ2d3d3LmVudHJ1c3QubmV0L1NTTF9DUFMg -aW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykg -MjAwMCBFbnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5l -dCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0G -CSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHwV9OcfHO8GCGD9JYf9Mzly0XonUw -tZZkJi9ow0SrqHXmAGc0V55lxyKbc+bT3QgON1WqJUaBbL3+qPZ1V1eMkGxK -wz6LS0MKyRFWmponIpnPVZ5h2QLifLZ8OAfc439PmrkDQYC2dWcTC5/oVzbI -XQA23mYU2m52H083jIITiQIDAQABo4IBpDCCAaAwEQYJYIZIAYb4QgEBBAQD -AgAHMIHjBgNVHR8EgdswgdgwgdWggdKggc+kgcwwgckxFDASBgNVBAoTC0Vu -dHJ1c3QubmV0MT8wPQYDVQQLFDZ3d3cuZW50cnVzdC5uZXQvU1NMX0NQUyBp -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAy -MDAwIEVudHJ1c3QubmV0IExpbWl0ZWQxOjA4BgNVBAMTMUVudHJ1c3QubmV0 -IFNlY3VyZSBTZXJ2ZXIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNV -BAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMDAyMDQxNzIwMDBagQ8yMDIwMDIw -NDE3NTAwMFowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFMtswGvjuz7L/CKc -/vuLkpyw8m4iMB0GA1UdDgQWBBTLbMBr47s+y/winP77i5KcsPJuIjAMBgNV -HRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkq -hkiG9w0BAQQFAAOBgQBi24GRzsiad0Iv7L0no1MPUBvqTpLwqa+poLpIYcvv -yQbvH9X07t9WLebKahlzqlO+krNQAraFJnJj2HVQYnUUt7NQGj/KEQALhUVp -bbalrlHhStyCP2yMNLJ3a9kC9n8O6mUE8c1UyrrJzOCE98g+EZfTYAkYvAX/ -bIkz8OwVDw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UE -ChMLRW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNf -MjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsT -HChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1 -c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEy -MjQxNzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0 -Lm5ldDFAMD4GA1UECxQ3d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29y -cC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkg -RW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4 -QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/EC -DNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuXMlBvPci6Zgzj -/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzWnLLP -KQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZd -enoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH -4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB -0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJ -FrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B -AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFh -fGPjK50xA3B20qMooPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVU -KcgF7bISKo30Axv/55IQh7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaoho -wXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2 -+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof888 -6ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIE7TCCBFagAwIBAgIEOAOR7jANBgkqhkiG9w0BAQQFADCByTELMAkGA1UE -BhMCVVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUgwRgYDVQQLFD93d3cuZW50 -cnVzdC5uZXQvQ2xpZW50X0NBX0luZm8vQ1BTIGluY29ycC4gYnkgcmVmLiBs -aW1pdHMgbGlhYi4xJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExp -bWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eTAeFw05OTEwMTIxOTI0MzBaFw0xOTEwMTIxOTU0MzBa -MIHJMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxSDBGBgNV -BAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0FfSW5mby9DUFMgaW5jb3Jw -LiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UECxMcKGMpIDE5OTkgRW50 -cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2xpZW50 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GL -ADCBhwKBgQDIOpleMRffrCdvkHvkGf9FozTC28GoT/Bo6oT9n3V5z8GKUZSv -x1cDR2SerYIbWtp/N3hHuzeYEpbOxhN979IMMFGpOZ5V+Pux5zDeg7K6PvHV -iTs7hbqqdCz+PzFur5GVbgbUB01LLFZHGARS2g4Qk79jkJvh34zmAqTmT173 -iwIBA6OCAeAwggHcMBEGCWCGSAGG+EIBAQQEAwIABzCCASIGA1UdHwSCARkw -ggEVMIHkoIHhoIHepIHbMIHYMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50 -cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0Ff -SW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UE -CxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50 -cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYD -VQQDEwRDUkwxMCygKqAohiZodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9D -bGllbnQxLmNybDArBgNVHRAEJDAigA8xOTk5MTAxMjE5MjQzMFqBDzIwMTkx -MDEyMTkyNDMwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUxPucKXuXzUyW -/O5bs8qZdIuV6kwwHQYDVR0OBBYEFMT7nCl7l81MlvzuW7PKmXSLlepMMAwG -A1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI -hvcNAQEEBQADgYEAP66K8ddmAwWePvrqHEa7pFuPeJoSSJn59DXeDDYHAmsQ -OokUgZwxpnyyQbJq5wcBoUv5nyU7lsqZwz6hURzzwy5E97BnRqqS5TvaHBkU -ODDV4qIxJS7x7EU47fgGWANzYrAQMY9Av2TgXD7FTx/aEkP/TOYGJqibGapE -PHayXOw= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UE -BhMCVVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50 -cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl -MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UE -AxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQsw -CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3 -dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlh -Yi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVkMTow -OAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp -b24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0 -VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHIN -iC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3wkrYKZImZNHk -mGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcwggHT -MBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHY -pIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 -BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChs -aW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBM -aW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNo -dHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAi -gA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMC -AQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYE -FPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9 -B0EABAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKn -CqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2Zcgx -xufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd2cNgQ4xYDiKWL2KjLB+6 -rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQG -EwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1 -cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4 -MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgx -LTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0 -eTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2R -FGiYCh7+2gRvE4RiIcPRfM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO -/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuv -K9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAGA1UdHwRp -MGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEt -MCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 -MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjAL -BgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gjIBBPM5iQn9Qw -HQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMBAf8w -GgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GB -AFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y -7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2u -FHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJV -UzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1 -aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcN -MjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZh -eCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2lu -ZXNzIENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fe -k6lfWg0XTzQaDJj0ItlZ1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5 -/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4aIZX5UkxVWsUPOE9G+m34LjXW -HXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBkMBEGCWCG -SAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4 -MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBq -R3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnm -JXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+WB5Hh1Q+WKG1 -tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+KpYr -tWKmpj29f5JZzVoqgrI3eQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQG -EwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlm -YXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5 -MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXgg -U2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0Et -MjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF -7Y6yEb3+6+e0dMKP/wXn2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKD -pkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HM -HMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAGA1UdHwRp -MGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBT -ZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y -MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjAL -BgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBqy/3YIHqngnYw -HQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMBAf8w -GgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GB -AAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy -0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkt -y3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJV -UzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1 -aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0 -MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoT -E0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJl -IEdsb2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw -gYkCgYEAuucXkAJlsTRVPEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQy -td4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORR -OhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxnhcXIw2EC -AwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8w -HwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6o -oHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf -2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkAZ70Br83gcfxa -z2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIYNMR1 -pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYT -AlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVz -dCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBC -MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UE -AxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEH -CIjaWC9mOSm9BXiLnTjoBbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlC -GDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet8u5fa9IAjbkU+BQVNdnARqN7 -csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+VcT4wt/lAj -Nvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdRe -JivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQAB -o1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9 -qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1luMrMTjANBgkq -hkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Qzxpe -R+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWV -Yrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF -PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot -2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeX -xx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm -Mw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILAgAAAAAA1ni3lAUwDQYJKoZIhvcNAQEEBQAwVzEL -MAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNV -BAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05 -ODA5MDExMjAwMDBaFw0xNDAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkw -FwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRsw -GQYDVQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUA -A4IBDwAwggEKAoIBAQDaDuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR -4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc -71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4 -bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgK -OOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMW -ea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DP -AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIABjAdBgNVHQ4EFgQUYHtmGkUNl8qJ -UC99BM00qP/8/UswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOC -AQEArqqf/LfSyx9fOSkoGJ40yWxPbxrwZKJwSk8ThptgKJ7ogUmYfQq75bCd -PTbbjwVR/wkxKh/diXeeDy5slQTthsu0AD+EAk2AaioteAuubyuig0SDH81Q -gkwkr733pbTIWg/050deSY43lv6aiAU62cDbKYfmGZZHpzqmjIs8d/5GY6dT -2iHRrH5Jokvmw2dZL7OKDrssvamqQnw1wdh/1acxOk5jQzmvCLBhNIzTmKlD -NPYPhyk7ncJWWJh3w/cbrPad+D6qp1RF8PX51TFl/mtYnHGzHtdS6jIX/EBg -Hcl5JLL2bP2oZg6C3ZjL2sJETy6ge/L3ayx2EYRGinij4w== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgw -FgYDVQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRy -dXN0IFNvbHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3Qg -R2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1 -MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYD -VQQLEx5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMT -GkdURSBDeWJlclRydXN0IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4usJTQGz0O9pTAipTHBsiQl8i4 -ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcqlHHK6XALn -ZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8F -LztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh3 -46B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq -81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0PlZPvy5TYnh+d -XIVtx6quTx8itc2VrbqnzPmrC3p/ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIB+jCCAWMCAgGjMA0GCSqGSIb3DQEBBAUAMEUxCzAJBgNVBAYTAlVTMRgw -FgYDVQQKEw9HVEUgQ29ycG9yYXRpb24xHDAaBgNVBAMTE0dURSBDeWJlclRy -dXN0IFJvb3QwHhcNOTYwMjIzMjMwMTAwWhcNMDYwMjIzMjM1OTAwWjBFMQsw -CQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMRwwGgYDVQQD -ExNHVEUgQ3liZXJUcnVzdCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB -iQKBgQC45k+625h8cXyvRLfTD0bZZOWTwUKOx7pJjTUteueLveUFMVnGsS8K -DPufpz+iCWaEVh43KRuH6X4MypqfpX/1FZSj1aJGgthoTNE3FQZor734sLPw -KfWVWgkWYXcKIiXUT0Wqx73llt/51KiOQswkwB6RJ0q1bQaAYznEol44AwID -AQABMA0GCSqGSIb3DQEBBAUAA4GBABKzdcZfHeFhVYAA1IFLezEPI2PnPfMD -+fQ2qLvZ46WXTeorKeDWanOB5sCJo9Px4KWlIjeaY8JIILTbcuPI9tl8vrGv -U9oUtCG41tWW4/5ODFlitppK+ULdjG+BqXH/9ApybW1EDp3zdHSo1TRJ6V6e -6bR64eVaH4QwnNOfpSXY ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARwxCzAJBgNVBAYT -AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu -MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s -LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1 -MjEzMDEGA1UECxMqSVBTIENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24g -QXV0aG9yaXR5MTMwMQYDVQQDEypJUFMgQ0EgQ2hhaW5lZCBDQXMgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlw -cy5lczAeFw0wMTEyMjkwMDUzNThaFw0yNTEyMjcwMDUzNThaMIIBHDELMAkG -A1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vs -b25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNl -cyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYw -OTI5NDUyMTMwMQYDVQQLEypJUFMgQ0EgQ2hhaW5lZCBDQXMgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkxMzAxBgNVBAMTKklQUyBDQSBDaGFpbmVkIENBcyBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1h -aWwuaXBzLmVzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcVpJJspQg -vJhPUOtopKdJC7/SMejHT8KGC/po/UNaivNgkjWZOLtNA1IhW/A3mTXhQSCB -hYEFcYGdtJUZqV92NC5jNzVXjrQfQj8VXOF6wV8TGDIxya2+o8eDZh65nAQT -y2nBBt4wBrszo7Uf8I9vzv+W6FS+ZoCua9tBhDaiPQIDAQABo4IEQzCCBD8w -HQYDVR0OBBYEFKGtMbH5PuEXpsirNPxShwkeYlJBMIIBTgYDVR0jBIIBRTCC -AUGAFKGtMbH5PuEXpsirNPxShwkeYlJBoYIBJKSCASAwggEcMQswCQYDVQQG -EwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmEx -LjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMu -bC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0 -NTIxMzAxBgNVBAsTKklQUyBDQSBDaGFpbmVkIENBcyBDZXJ0aWZpY2F0aW9u -IEF1dGhvcml0eTEzMDEGA1UEAxMqSVBTIENBIENoYWluZWQgQ0FzIENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5p -cHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRk -MGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggr -BgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYK -KwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBz -QG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBCBglg -hkgBhvhCAQ0ENRYzQ2hhaW5lZCBDQSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkg -aHR0cDovL3d3dy5pcHMuZXMvMCkGCWCGSAGG+EIBAgQcFhpodHRwOi8vd3d3 -Lmlwcy5lcy9pcHMyMDAyLzA3BglghkgBhvhCAQQEKhYoaHR0cDovL3d3dy5p -cHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0FDLmNybDA8BglghkgBhvhCAQMELxYt -aHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9yZXZvY2F0aW9uQ0FDLmh0bWw/ -MDkGCWCGSAGG+EIBBwQsFipodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jl -bmV3YWxDQUMuaHRtbD8wNwYJYIZIAYb4QgEIBCoWKGh0dHA6Ly93d3cuaXBz -LmVzL2lwczIwMDIvcG9saWN5Q0FDLmh0bWwwbQYDVR0fBGYwZDAuoCygKoYo -aHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0FDLmNybDAyoDCg -LoYsaHR0cDovL3d3d2JhY2suaXBzLmVzL2lwczIwMDIvaXBzMjAwMkNBQy5j -cmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5p -cHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAERyMJ1WWKJBGyi3leGmGpVfp3hA -K+/blkr8THFj2XOVvQLiogbHvpcqk4A0hgP63Ng9HgfNHnNDJGD1HWHc3Jag -vPsd4+cSACczAsDAK1M92GsDgaPb1pOVIO/Tln4mkImcJpvNb2ar7QMiRDjM -Wb2f2/YHogF/JsRj9SVCXmK9 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYT -AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu -MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s -LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1 -MjEuMCwGA1UECxMlSVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eTEuMCwGA1UEAxMlSVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAx -MTIyOTAwNTkzOFoXDTI1MTIyNzAwNTkzOFowggESMQswCQYDVQQGEwJFUzES -MBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNV -BAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzAp -BgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxLjAs -BgNVBAsTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx -LjAsBgNVBAMTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzANBgkqhkiG -9w0BAQEFAAOBjQAwgYkCgYEA4FEnpwvdr9G5Q1uCN0VWcu+atsIS7ywSzHb5 -BlmvXSHU0lq4oNTzav3KaY1mSPd05u42veiWkXWmcSjK5yISMmmwPh5r9FBS -YmL9Yzt9fuzuOOpi9GyocY3h6YvJP8a1zZRCb92CRTzo3wno7wpVqVZHYUxJ -ZHMQKD/Kvwn/xi8CAwEAAaOCBEowggRGMB0GA1UdDgQWBBTrsxl588GlHKzc -uh9morKbadB4CDCCAUQGA1UdIwSCATswggE3gBTrsxl588GlHKzcuh9morKb -adB4CKGCARqkggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNl -bG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJu -ZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFp -bC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0Eg -Q0xBU0UxIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMg -Q0EgQ0xBU0UxIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcN -AQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8E -BQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUH -AwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIB -FgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcw -GgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0Bt -YWlsLmlwcy5lczBBBglghkgBhvhCAQ0ENBYyQ0xBU0UxIENBIENlcnRpZmlj -YXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC -BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIBBAQt -FitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEuY3Js -MD8GCWCGSAGG+EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jl -dm9jYXRpb25DTEFTRTEuaHRtbD8wPAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93 -d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFMS5odG1sPzA6BglghkgB -hvhCAQgELRYraHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFT -RTEuaHRtbDBzBgNVHR8EbDBqMDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9p -cHMyMDAyL2lwczIwMDJDTEFTRTEuY3JsMDWgM6Axhi9odHRwOi8vd3d3YmFj -ay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0UxLmNybDAvBggrBgEFBQcB -AQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZI -hvcNAQEFBQADgYEAK9Dr/drIyllq2tPMMi7JVBuKYn4VLenZMdMu9Ccj/1ur -xUq2ckCuU3T0vAW0xtnIyXf7t/k0f3gA+Nak5FI/LEpjV4F1Wo7ojPsCwJTG -Kbqz3Bzosq/SLmJbGqmODszFV0VRFOlOHIilkfSj945RyKm+hjM+5i9Ibq9U -kE6tsSU= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYT -AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu -MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s -LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1 -MjEuMCwGA1UECxMlSVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eTEuMCwGA1UEAxMlSVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAx -MTIyOTAxMDE0NFoXDTI1MTIyNzAxMDE0NFowggESMQswCQYDVQQGEwJFUzES -MBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNV -BAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzAp -BgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxLjAs -BgNVBAsTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx -LjAsBgNVBAMTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzANBgkqhkiG -9w0BAQEFAAOBjQAwgYkCgYEAqxf+DrDGaBtT8FK+n/ra+osTBLsBjzLZH49N -zjaY2uQARIwo2BNEKqRrThckQpzTiKRBgtYj+4vJhuW5qYIF3PHeH+AMmVWY -8jjsbJ0gA8DvqqPGZARRLXgNo9KoOtYkTOmWehisEyMiG3zoMRGzXwmqMHBx -RiVrSXGAK5UBsh8CAwEAAaOCBEowggRGMB0GA1UdDgQWBBS4k/8uy9wsjqLn -ev42USGjmFsMNDCCAUQGA1UdIwSCATswggE3gBS4k/8uy9wsjqLnev42USGj -mFsMNKGCARqkggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNl -bG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJu -ZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFp -bC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0Eg -Q0xBU0UzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMg -Q0EgQ0xBU0UzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcN -AQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8E -BQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUH -AwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIB -FgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcw -GgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0Bt -YWlsLmlwcy5lczBBBglghkgBhvhCAQ0ENBYyQ0xBU0UzIENBIENlcnRpZmlj -YXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC -BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIBBAQt -FitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMuY3Js -MD8GCWCGSAGG+EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jl -dm9jYXRpb25DTEFTRTMuaHRtbD8wPAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93 -d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFMy5odG1sPzA6BglghkgB -hvhCAQgELRYraHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFT -RTMuaHRtbDBzBgNVHR8EbDBqMDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9p -cHMyMDAyL2lwczIwMDJDTEFTRTMuY3JsMDWgM6Axhi9odHRwOi8vd3d3YmFj -ay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0UzLmNybDAvBggrBgEFBQcB -AQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZI -hvcNAQEFBQADgYEAF2VcmZVDAyevJuXr0LMXI/dDqsfwfewPxqmurpYPdikc -4gYtfibFPPqhwYHOU7BC0ZdXGhd+pFFhxu7pXu8Fuuu9D6eSb9ijBmgpjnn1 -/7/5p6/ksc7C0YBCJwUENPjDfxZ4IwwHJPJGR607VNCv1TGyr33I6unUVtkO -E7LFRVA= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYT -AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu -MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s -LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1 -MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRo -b3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24g -QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcN -MDExMjI5MDEwNTMyWhcNMjUxMjI3MDEwNTMyWjCCARQxCzAJBgNVBAYTAkVT -MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwG -A1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjEr -MCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEv -MC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwgZ8wDQYJ -KoZIhvcNAQEBBQADgY0AMIGJAoGBALsw19zQVL01Tp/FTILq0VA8R5j8m2md -d81u4D/u6zJfX5/S0HnllXNEITLgCtud186Nq1KLK3jgm1t99P1tCeWu4Wwd -ByOgF9H5fahGRpEiqLJpxq339fWUoTCUvQDMRH/uxJ7JweaPCjbB/SQ9AaD1 -e+J8eGZDi09Z8pvZ+kmzAgMBAAGjggRTMIIETzAdBgNVHQ4EFgQUZyaW56G/ -2LUDnf473P7yiuYV3TAwggFGBgNVHSMEggE9MIIBOYAUZyaW56G/2LUDnf47 -3P7yiuYV3TChggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlC -YXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIElu -dGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBz -QG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBT -IENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT -JklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJ -KoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAM -BgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYI -KwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYB -BAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEE -BAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB -D2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0VBMSBDQSBD -ZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCG -SAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7BglghkgB -hvhCAQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xB -U0VBMS5jcmwwQAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lw -czIwMDIvcmV2b2NhdGlvbkNMQVNFQTEuaHRtbD8wPQYJYIZIAYb4QgEHBDAW -Lmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFQTEuaHRt -bD8wOwYJYIZIAYb4QgEIBC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIv -cG9saWN5Q0xBU0VBMS5odG1sMHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93 -d3cuaXBzLmVzL2lwczIwMDIvaXBzMjAwMkNMQVNFQTEuY3JsMDagNKAyhjBo -dHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMS5j -cmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5p -cHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAH66iqyAAIQVCtWYUQxkxZwCWINm -yq0eB81+atqAB98DNEock8RLWCA1NnHtogo1EqWmZaeFaQoO42Hu6r4okzPV -7Oi+xNtff6j5YzHIa5biKcJboOeXNp13XjFr/tOn2yrb25aLH2betgPAK7N4 -1lUH5Y85UN4HI3LmvSAUS7SG ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYT -AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu -MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s -LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1 -MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRo -b3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24g -QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcN -MDExMjI5MDEwNzUwWhcNMjUxMjI3MDEwNzUwWjCCARQxCzAJBgNVBAYTAkVT -MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwG -A1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjEr -MCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEv -MC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwgZ8wDQYJ -KoZIhvcNAQEBBQADgY0AMIGJAoGBAO6AAPYaZC6tasiDsYun7o/ZttvNG7uG -BiJ2MwwSbUhWYdLcgiViL5/SaTBlA0IjWLxH3GvWdV0XPOH/8lhneaDBgbHU -VqLyjRGZ/fZ98cfEXgIqmuJKtROKAP2Md4bm15T1IHUuDky/dMQ/gT6DtKM4 -Ninn6Cr1jIhBqoCm42zvAgMBAAGjggRTMIIETzAdBgNVHQ4EFgQUHp9XUEe2 -YZM50yz82l09BXW3mQIwggFGBgNVHSMEggE9MIIBOYAUHp9XUEe2YZM50yz8 -2l09BXW3mQKhggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlC -YXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIElu -dGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBz -QG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBT -IENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT -JklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJ -KoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAM -BgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYI -KwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYB -BAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEE -BAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB -D2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0VBMyBDQSBD -ZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCG -SAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7BglghkgB -hvhCAQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xB -U0VBMy5jcmwwQAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lw -czIwMDIvcmV2b2NhdGlvbkNMQVNFQTMuaHRtbD8wPQYJYIZIAYb4QgEHBDAW -Lmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFQTMuaHRt -bD8wOwYJYIZIAYb4QgEIBC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIv -cG9saWN5Q0xBU0VBMy5odG1sMHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93 -d3cuaXBzLmVzL2lwczIwMDIvaXBzMjAwMkNMQVNFQTMuY3JsMDagNKAyhjBo -dHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMy5j -cmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5p -cHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAEo9IEca2on0eisxeewBwMwB9dbB -/MjD81ACUZBYKp/nNQlbMAqBACVHr9QPDp5gJqiVp4MI3y2s6Q73nMify5NF -8bpqxmdRSmlPa/59Cy9SKcJQrSRE7SOzSMtEQMEDlQwKeAYSAfWRMS1Jjbs/ -RU4s4OjNtckUFQzjB4ObJnXv ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICtzCCAiACAQAwDQYJKoZIhvcNAQEEBQAwgaMxCzAJBgNVBAYTAkVTMRIw -EAYDVQQIEwlCQVJDRUxPTkExEjAQBgNVBAcTCUJBUkNFTE9OQTEZMBcGA1UE -ChMQSVBTIFNlZ3VyaWRhZCBDQTEYMBYGA1UECxMPQ2VydGlmaWNhY2lvbmVz -MRcwFQYDVQQDEw5JUFMgU0VSVklET1JFUzEeMBwGCSqGSIb3DQEJARYPaXBz -QG1haWwuaXBzLmVzMB4XDTk4MDEwMTIzMjEwN1oXDTA5MTIyOTIzMjEwN1ow -gaMxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCQVJDRUxPTkExEjAQBgNVBAcT -CUJBUkNFTE9OQTEZMBcGA1UEChMQSVBTIFNlZ3VyaWRhZCBDQTEYMBYGA1UE -CxMPQ2VydGlmaWNhY2lvbmVzMRcwFQYDVQQDEw5JUFMgU0VSVklET1JFUzEe -MBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQCsT1J0nznqjtwlxLyYXZhkJAk8IbPMGbWOlI6H0fg3 -PqHILVikgDVboXVsHUUMH2Fjal5vmwpMwci4YSM1gf/+rHhwLWjhOgeYlQJU -3c0jt4BT18g3RXIGJBK6E2Ehim51KODFDzT9NthFf+G4Nu+z4cYgjui0OLzh -PvYR3oydAQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBACzzw3lYJN7GO9HgQmm4 -7mSzPWIBubOE3yN93ZjPEKn+ANgilgUTB1RXxafey9m4iEL2mdsUdx+2/iU9 -4aI+A6mB0i1sR/WWRowiq8jMDQ6XXotBtDvECgZAHd1G9AHduoIuPD14cJ58 -GNCr+Lh3B0Zx8coLY1xq+XKU1QFPoNtC ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIIODCCB6GgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCAR4xCzAJBgNVBAYT -AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu -MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s -LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1 -MjE0MDIGA1UECxMrSVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9u -IEF1dGhvcml0eTE0MDIGA1UEAxMrSVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwu -aXBzLmVzMB4XDTAxMTIyOTAxMTAxOFoXDTI1MTIyNzAxMTAxOFowggEeMQsw -CQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJj -ZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZp -Y2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEIt -NjA5Mjk0NTIxNDAyBgNVBAsTK0lQUyBDQSBUaW1lc3RhbXBpbmcgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkxNDAyBgNVBAMTK0lQUyBDQSBUaW1lc3RhbXBp -bmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lw -c0BtYWlsLmlwcy5lczCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLju -VqWajOY2ycJioGaBjRrVetJznw6EZLqVtJCneK/K/lRhW86yIFcBrkSSQxA4 -Efdo/BdApWgnMjvEp+ZCccWZ73b/K5Uk9UmSGGjKALWkWi9uy9YbLA1UZ2t6 -KaFYq6JaANZbuxjC3/YeE1Z2m6Vo4pjOxgOKNNtMg0GmqaMCAwEAAaOCBIAw -ggR8MB0GA1UdDgQWBBSL0BBQCYHynQnVDmB4AyKiP8jKZjCCAVAGA1UdIwSC -AUcwggFDgBSL0BBQCYHynQnVDmB4AyKiP8jKZqGCASakggEiMIIBHjELMAkG -A1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vs -b25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNl -cyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYw -OTI5NDUyMTQwMgYDVQQLEytJUFMgQ0EgVGltZXN0YW1waW5nIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5MTQwMgYDVQQDEytJUFMgQ0EgVGltZXN0YW1waW5n -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNA -bWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsG -A1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUF -BwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGC -NwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMw -EYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5l -czBHBglghkgBhvhCAQ0EOhY4VGltZXN0YW1waW5nIENBIENlcnRpZmljYXRl -IGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgECBBwW -Gmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMEAGCWCGSAGG+EIBBAQzFjFo -dHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJUaW1lc3RhbXBpbmcu -Y3JsMEUGCWCGSAGG+EIBAwQ4FjZodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAy -L3Jldm9jYXRpb25UaW1lc3RhbXBpbmcuaHRtbD8wQgYJYIZIAYb4QgEHBDUW -M2h0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbFRpbWVzdGFtcGlu -Zy5odG1sPzBABglghkgBhvhCAQgEMxYxaHR0cDovL3d3dy5pcHMuZXMvaXBz -MjAwMi9wb2xpY3lUaW1lc3RhbXBpbmcuaHRtbDB/BgNVHR8EeDB2MDegNaAz -hjFodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJUaW1lc3RhbXBp -bmcuY3JsMDugOaA3hjVodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9p -cHMyMDAyVGltZXN0YW1waW5nLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYB -BQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQADgYEA -ZbrBzAAalZHK6Ww6vzoeFAh8+4Pua2JR0zORtWB5fgTYXXk36MNbsMRnLWha -sl8OCvrNPzpFoeo2zyYepxEoxZSPhExTCMWTs/zif/WN87GphV+I3pGW7hdb -rqXqcGV4LCFkAZXOzkw+UPS2Wctjjba9GNSHSl/c7+lW8AoM6HU= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQG -EwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9v -dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMg -Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNa -Fw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9W -YWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24g -QXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1 -lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMukJ0KX0J+D -isPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj18 -2d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Sp -x2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZ -yH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospUxbF6lR1xHkop -igPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4wPQYI -KwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFk -aXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw -ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlh -bmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBw -YXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs -ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRp -ZmljYXRpb24gcHJhY3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmlj -YXRlIFBvbGljeS4wIgYIKwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMu -Ym0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYw -gaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJN -MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCLMA4GA1UdDwEB/wQEAwIB -BjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lofFIk3Wdv -OXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10 -buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe -/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6 -isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW -xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQ -NiOKSnQ2+Q== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlD -ZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu -Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRp -b24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNv -bS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYy -NjAwMjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4x -NTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24g -QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8x -IDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3 -DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2f -NUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChM -MFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqYJJgpp0lZpd34 -t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs3x/b -e0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0Wu -PIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A -PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICXDCCAcWgAwIBAgIQCgEBAQAAAnwAAAALAAAAAjANBgkqhkiG9w0BAQUF -ADA6MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0Eg -U2VjdXJpdHkgMTAyNCBWMzAeFw0wMTAyMjIyMTAxNDlaFw0yNjAyMjIyMDAx -NDlaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJT -QSBTZWN1cml0eSAxMDI0IFYzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB -gQDV3f5mCc8kPD6ugU5OisRpgFtZO9+5TUzKtS3DJy08rwBCbbwoppbPf9dY -rIMKo1W1exeQFYRMiu4mmdxY78c4pqqv0I5CyGLXq6yp+0p9v+r+Ek3d/yYt -bzZUaMjShFbuklNhCbM/OZuoyZu9zp9+1BlqFikYvtc6adwlWzMaUQIDAQAB -o2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSME -GDAWgBTEwBykB5T9zU0B1FTapQxf3q4FWjAdBgNVHQ4EFgQUxMAcpAeU/c1N -AdRU2qUMX96uBVowDQYJKoZIhvcNAQEFBQADgYEAPy1q4yZDlX2Jl2X7deRy -HUZXxGFraZ8SmyzVWujAovBDleMf6XbN3Ou8k6BlCsdNT1+nr6JGFLkM88y9 -am63nd4lQtBU/55oc2PcJOsiv6hy8l4A4Q1OOkNumU4/iXgDmMrzVcydro7B -qkWY+o8aoI2II/EVQQ2lRj6RP4vr93E= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUF -ADA6MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0Eg -U2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5 -MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJT -QSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37 -RqtBaB4Y6lXIL5F4iSj7Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E -0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J -6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iHKrtjEAMq -s6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzD -uvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2Mw -YTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAW -gBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NRMKSq6UWuNST6 -/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmYv/3V -EhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5g -EydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+ -f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJq -aHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEk -llgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA -pKnXwiJPZ9d37CAFYd4= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJK -UDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0 -eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMw -OTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1 -c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RD -QTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8 -V6UMbXaKL0u/ZPtM7orw8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpx -xpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uMDPpVmDvY6CKhS3E4eayXkmmz -iX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX5HA49LY6 -tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819 -uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/L -TX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZ -aNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g0dNq -/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94 -nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 -Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNn -PaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfci -oU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi -FL39vmwLAw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJG -STEPMA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENB -MB4XDTAxMDQwNjEwNDkxM1oXDTIxMDQwNjEwNDkxM1owOTELMAkGA1UEBhMC -RkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMSBD -QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue -+H887dF+2rDNbS82rDTG29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mX -y47vPxVnqIJyY1MPQYx9EJUkoVqlBvqSV536pQHydekfvFYmUk54GWVYVQNY -wBSujHxVX3BbdyMGNpfzJLWaRpXk3w0LBUXl0fIdgrvGE+D+qnr9aTCU89JF -hfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBLqdReLjVQCfOAl/QMF6452F/NM8Ec -yonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIINnvmLVz5MxxftLItyM19yejhW -1ebZrgUaHXVFsculJRwSVzb9IjcCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB -/zARBgNVHQ4ECgQIR+IMi/ZTiFIwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEB -BQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE928Jj2VuXZfsSZ9gqXLar -5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0HDjxVyhbM -p6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VOTzF2 -nBBhjrZTOqMRvq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2Uv -kVrCqIexVmiUefkl98HVrhq4uz2PqYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2y -Ix4wzMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9ZIRlXvVWa ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJG -STEPMA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENB -MB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMC -RkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBD -QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE -+hY3/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gX -GM2RX/uJ4+q/Tl18GybTdXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQ -TiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMGf+dJQMjFAbJUWmYdPfz56TwK -noG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8PtOFCx4j1 -P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURr -BGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB -/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEB -BQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zilzqsWuasvfDXL -rNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEIcbCd -jdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr4 -50kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 -Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkeja -nZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQG -EwJOTDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQD -Ex1TdGFhdCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQTAeFw0wMjEyMTcwOTIz -NDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4wHAYDVQQKExVT -dGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRl -cmxhbmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAmNK1URF6gaYUmHFtvsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rF -DBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02PjLwYdjeFnejKScfST5gTCaI+ -Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGcaC1Hoi6Ce -UJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7l -r7HcsBthvJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4Zl -kuxEK7COudxwC0barbxjiDn622r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGO -MAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRVHSAAMDwwOgYIKwYBBQUH -AgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9vdC1w -b2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg -0zTBLL9s+DANBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k -/rvuFbQvBgwp8qiSpGEN/KtcCFtREytNwiphyPgJWPwtArI5fZlmgb9uXJVF -IGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbwMVcoEoJz6TMvplW0 -C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y -nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBp -IzlWYGeQiy52OfsRiJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYV -wSR8MnwDHTuhWEUykw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDXDCCAsWgAwIBAgICA+owDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYT -AkRFMRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYD -VQQKEzFUQyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3 -b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAyIENB -MSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAe -Fw05ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJE -RTEQMA4GA1UECBMHSGFtYnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UE -ChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3VyaXR5IGluIERhdGEgTmV0d29y -a3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTEp -MCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8w -DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANo46O0yAClxgwENv4wB3NrGrTmk -qYov1YtcaF9QxmL1Zr3KkSLsqh1R1z2zUbKDTl3LSbDwTFXlay3HhQswHJJO -gtTKAu33b77c4OMUuAVT8pr0VotanoWT0bSCVq5Nu6hLVxa8/vhYnvgpjbB7 -zXjJT6yLZwzxnPv8V5tXXE8NAgMBAAGjazBpMA8GA1UdEwEB/wQFMAMBAf8w -DgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRy -dXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G -CSqGSIb3DQEBBAUAA4GBAIRS+yjf/x91AbwBvgRWl2p0QiQxg/lGsQaKic+W -LDO/jLVfenKhhQbOhvgFjuj5Jcrag4wGrOs2bYWRNAQ29ELw+HkuCkhcq8xR -T3h2oNmsGb0q0WkEKJHKNhAngFdb0lz1wlurZIFjdFH0l7/NEij3TWZ/p/Ac -ASZ4smZHcFFk ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDXDCCAsWgAwIBAgICA+swDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYT -AkRFMRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYD -VQQKEzFUQyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3 -b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAzIENB -MSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAe -Fw05ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJE -RTEQMA4GA1UECBMHSGFtYnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UE -ChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3VyaXR5IGluIERhdGEgTmV0d29y -a3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTEp -MCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8w -DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALa0wTUFLg2N7KBAahwOJ6ZQkmtQ -GwfeLud2zODa/ISoXoxjaitN2U4CdhHBC/KNecoAtvGwDtf7pBc9r6tpepYn -v68zoZoqWarEtTcI8hKlMbZD9TKWcSgoq40oht+77uMMfTDWw1Krj10nnGvA -o+cFa1dJRLNu6mTP0o56UHd3AgMBAAGjazBpMA8GA1UdEwEB/wQFMAMBAf8w -DgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRy -dXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G -CSqGSIb3DQEBBAUAA4GBABY9xs3Bu4VxhUafPiCPUSiZ7C1FIWMjWwS7TJC4 -iJIETb19AaM/9uzO8d7+feXhPrvGq14L3T2WxMup1Pkm5gZOngylerpuw3yC -GdHHsbHD2w2Om0B8NwvxXej9H5CIpQ5ON2QhqE6NtJ/x3kit1VYYUimLRzQS -CdS7kjXvD9s0 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQG -EwJESzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50 -ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTda -MEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNV -BAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4Nr -XceO+YQwzho7+vvOi20jxsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaq -HF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5 -Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc5IogCSEW -Vmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8n -mHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwID -AQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBY -oFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIEludGVybmV0MR0w -GwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JMMTAr -BgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjAL -BgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw -HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8w -HQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m -gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKs -LtB9KOy282A4aW8+2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7T -mHnaCB4Mb7j4Fifvwm899qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE -64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQ -V0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQG -EwJESzEMMAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0w -MzAyMTEwODM5MzBaFw0zNzAyMTEwOTA5MzBaMDExCzAJBgNVBAYTAkRLMQww -CgYDVQQKEwNUREMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSj -hFuHnEz9pPPEXyG9VhDr2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8 -z3sM8W9Hpg1DTeLpHTk0zY0s2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJH -hNlktxmW/OwZ5LKXJk5KTMuPJItUGBxIYXvViGjaXbXqzRowwYCDdlCqT9HU -3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKjdGqPqcNiKXEx5TukYBdedObaE+3p -Hx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+rTpPGWOmlgtt3xDqZsXKVSQTw -tyv6e1mO3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAQYwgewGA1UdIASB5DCB4TCB3gYIKoFQgSkBAQEwgdEwLwYIKwYB -BQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5kay9yZXBvc2l0b3J5MIGd -BggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRlciBmcmEg -ZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4x -LiBDZXJ0aWZpY2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIg -T0lEIDEuMi4yMDguMTY5LjEuMS4xLjARBglghkgBhvhCAQEEBAMCAAcwgYEG -A1UdHwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEMMAoGA1UEChMDVERD -MRQwEgYDVQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYm -aHR0cDovL2NybC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0Q -BCQwIoAPMjAwMzAyMTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0j -BBgwFoAUYLWF7FZkfhIZJ2cdUBVLc647+RIwHQYDVR0OBBYEFGC1hexWZH4S -GSdnHVAVS3OuO/kSMB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDAN -BgkqhkiG9w0BAQUFAAOCAQEACromJkbTc6gJ82sLMJn9iuFXehHTuJTXCRBu -o7E4A9G28kNBKWKnctj7fAXmMXAnVBhOinxO5dHKjHiIzxvTkIvmI/gLDjND -fZziChmPyQE+dF10yYscA+UYyAFMP8uXBV2YcaaYb7Z8vTd/vuGTJW1v8Aqt -FxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9AOoBmbgGglGBTvH1tJFUuSN6 -AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQYqbsFbS1AoLbrIyi -gfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9BKNDLdr8C2Lq -L19iUw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMC -WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du -MRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlm -aWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFBl -cnNvbmFsIEJhc2ljIENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNp -Y0B0aGF3dGUuY29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVow -gcsxCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNV -BAcTCUNhcGUgVG93bjEaMBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAm -BgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24xITAfBgNV -BAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBDQTEoMCYGCSqGSIb3DQEJARYZ -cGVyc29uYWwtYmFzaWNAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOB -jQAwgYkCgYEAvLyTU23AUE+CFeZIlDWmWr5vQvoPR+53dXLdjUmbllegeNTK -P1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJl+A1OFdKwPQIcOk8RHtQ -fmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7G1sY0b8j -kyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOB -gQAt4plrsD16iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7 -c8a914phXAPjLSeoF+CEhULcXpvGt7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95 -B21P9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN92NWod8isQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMC -WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du -MRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlm -aWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBl -cnNvbmFsIEZyZWVtYWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1m -cmVlbWFpbEB0aGF3dGUuY29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIz -NTk1OVowgdExCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUx -EjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UEChMRVGhhd3RlIENvbnN1bHRp -bmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24x -JDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBGcmVlbWFpbCBDQTErMCkGCSqG -SIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhhd3RlLmNvbTCBnzANBgkq -hkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfYDFG26nKRsIRefS0N -j3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5ErHzmj+hND3Ef -QDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVquzgkCGqY -x7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq -hkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP -MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgC -neSa/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr -5PjRzneigQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMC -WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du -MRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlm -aWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3RlIFBl -cnNvbmFsIFByZW1pdW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXBy -ZW1pdW1AdGhhd3RlLmNvbTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5 -NTlaMIHPMQswCQYDVQQGEwJaQTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIw -EAYDVQQHEwlDYXBlIFRvd24xGjAYBgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5n -MSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMSMw -IQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJlbWl1bSBDQTEqMCgGCSqGSIb3 -DQEJARYbcGVyc29uYWwtcHJlbWl1bUB0aGF3dGUuY29tMIGfMA0GCSqGSIb3 -DQEBAQUAA4GNADCBiQKBgQDJZtn4B0TPuYwu8KHvE0VsBd/eJxZRNkERbGw7 -7f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ8/JE2dWIEt12TfIa/G8j -Hnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYDZicRFTuq -W/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 -DQEBBAUAA4GBAGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIH -b4Vnjt4rueIXsDqg8A6iAJrf8xQVbrvIhVqYgPn/vnQdPfP+MCXRNzRn+qVx -eTBhKXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+WjS9Q2wfD6h+rM+D1 -KzGJ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMC -WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du -MR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2Vy -dGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3Rl -IFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNl -cnZlckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1 -OVowgc4xCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQ -BgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMUVGhhd3RlIENvbnN1bHRpbmcg -Y2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24x -ITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3 -DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhI -NTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQug2SBhRz1JPL -lyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/qgeN -9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0B -AQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI -hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZ -a4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcU -Qg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMC -WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du -MR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2Vy -dGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3Rl -IFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 -ZS5jb20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkG -A1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2Fw -ZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UE -CxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQ -VGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRz -QHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I -/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC -6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCXL+eQbcAoQpnX -TEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzARMA8G -A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWD -TSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e -QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdni -TCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMC -WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmls -bGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmlj -YXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcNOTcw -MTAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTAT -BgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzAN -BgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24x -HzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcN -AQEBBQADgY0AMIGJAoGBANYrWHhhRYZT6jR7UZztsOYuGA7+4F+oJ9O0yeB8 -WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQaWt9MevPZQx08EHp5JduQ/vBR -5zDWQQD9nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL8vg7ij5FrHGSALSQQZj7 -X+36ty6K+Ig3AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcN -AQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCouqoEiYbC9RAIDb/LogWK -0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQpgCed/r8 -zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZCayJ -SdM= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUF -ADCBkzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 -IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEw -HwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVU -TiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2 -MzBaMIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNh -bHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsx -ITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTEbMBkGA1UEAxMS -VVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+O -GQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrr -U0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrL -Z9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykqlXvY8qdOD1R8 -oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv33i+ -Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4Gr -MIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT -MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8v -Y3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUE -IzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3 -DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHc -rpY6CiM+iVnJowftGzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuM -FrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1 -+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdO -jtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jF -VkwPDPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUF -ADCBrjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 -IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEw -HwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0BgNVBAMTLVVU -Ti1VU0VSRmlyc3QtQ2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAe -Fw05OTA3MDkxNzI4NTBaFw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJV -UzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD -VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93 -d3cudXNlcnRydXN0LmNvbTE2MDQGA1UEAxMtVVROLVVTRVJGaXJzdC1DbGll -bnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWlsMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3BYHW8OWX5ShpHornMSMxq -mNVNNRm5pELlzkniii8efNIxB8dOtINknS4p1aJkxIW9hVE1eaROaJB7HHqk -kqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8om+rWV6lL8/K2m2qL+us -obNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLmSGHGTPNp -saguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM1tZU -Ot4KpLoDd7NlyP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws -6wIDAQABo4G5MIG2MAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0G -A1UdDgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNVHR8EUTBPME2gS6BJ -hkdodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGll -bnRBdXRoZW50aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEF -BQcDAgYIKwYBBQUHAwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rk -MPxTbyUkxsrt4jFcKw7u7mFVbwQ+zznexRtJlOTrIEy05p5QLnLZjfWqo7NK -2lYcYJeA3IKirUq9iiv/Cwm0xtcgBEXkzYABurorbs6q15L+5K/r9CYdFip/ -bDCVNy8zEqx/3cfREYxRmLLQo5HQrfafnoOTHh1CuEava2bwm3/q4wMC5QJR -warVNZ1yQAOJujEdxRBoUp7fooXFXAimeOZTT7Hot9MUnpOmw2TjrH5xzbyf -6QMbzPvprDHBr3wVdAKZw7JHpsIyYdfHb0gkUSeh1YdV8nuPmD0Wnu51tvjQ -jvLzxq4oW6fw8zYX/MMF08oDSlQ= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUF -ADCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 -IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEw -HwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVU -Ti1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5 -MTgxOTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQH -Ew5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3 -b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNV -BAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3DQEBAQUA -A4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZ -FvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6N -q9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEH -OG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNdoI6yqqr2jmmI -BsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjfPe58 -BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhb -AgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD -VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWG -M2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3 -YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF -BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0o -XnWO6y1n7k57K9cM//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjA -bPLPSbtNk28GpgoiskliCE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59 -Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4f -Fm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchq -J/kniCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0q -UZ6B+dQ7XnASfxAynB67nfhmqA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUF -ADCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 -IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEw -HwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVU -Ti1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0 -ODM5WhcNMTkwNzA5MTg1NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgT -AlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVT -RVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVz -dC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNh -dGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCz+5Gh5DZV -hawGNFugmliy+LUPBXeDrjKxdpJo7CNKyXY/45y2N3kDuatpjQclthln5LAb -GHNhSuh+zdMvZOOmfAz6F4CjDUeJT1FxL+78P/m4FoCHiZMlIJpDgmkkdihZ -NaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXuOzr0hAReYFmnjDRy7rh4 -xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1axwiP8vv -/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6gyN7i -gEL66S/ozjIEj3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQD -AgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFPqGydvguul49Uuo1hXf -8NPhahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9jcmwudXNlcnRydXN0 -LmNvbS9VVE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0G -CSqGSIb3DQEBBQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXh -i6r/fWRRzwr/vH3YIWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUq -f9FuVSTiuwL7MT++6LzsQCv4AdRWOOTKRIK1YSAhZ2X28AvnNPilwpyjXEAf -hZOVBt5P1CeptqX8Fs1zMT+4ZSfP1FMa8Kxun08FDAOBp4QpxFq9ZFdyrTvP -NximmMatBrTcCKME1SmklpoSZ0qMYEWd8SOasACcaLWYUNPvji6SZbFIPiG+ -FTAqDbUMo2s/rn9X9R+WfN9v3YIwLGUbQErNaLly7HF27FSOH4UMAWr6pjis -H8SE ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUF -ADCBlTELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 -IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEw -HwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAbBgNVBAMTFFVU -Ti1VU0VSRmlyc3QtT2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4 -NDAzNlowgZUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMO -U2FsdCBMYWtlIENpdHkxHjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29y -azEhMB8GA1UECxMYaHR0cDovL3d3dy51c2VydHJ1c3QuY29tMR0wGwYDVQQD -ExRVVE4tVVNFUkZpcnN0LU9iamVjdDCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicPHxzfOpuCaDDASmEd8S8O+r55 -96Uj71VRloTN2+O5bj4x2AogZ8f02b+U60cEPgLOKqJdhwQJ9jCdGIqXsqoc -/EHSoTbL+z2RuufZcDX65OeQw5ujm9M89RKZd7G3CeBo5hy485RjiGpq/gt2 -yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vulBe3/IW+pKvEHDHd17bR -5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehbkkj7RwvC -bNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUCAwEA -AaOBrzCBrDALBgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQU2u1kdBScFDyr3ZmpvVsoTYs8ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0 -cDovL2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmlyc3QtT2JqZWN0LmNy -bDApBgNVHSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQw -DQYJKoZIhvcNAQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXF -wfNfLEzIR1pp6ujwNTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T -7/yxSPlrJSUtUbYsbUXBmMiKVl0+7kNOPmsnjtA6S4ULX9Ptaqd1y9Fahy85 -dRNacrACgZ++8A+EVCBibGnU4U3GDZlDAQ0Slox4nb9QorFEqmrPF3rPbw/U -+CRVX/A0FklmPlBGyWNxODFiuGK581OtbLUrohKqGU8J2l7nk8aOFAj+8DCA -GKCGhU3IfdeLA/5u1fedFqySLKAj5ZyRUh+U3xeUc8OzwcFxBSAAeL0TUh2o -Ps0AH8g= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlD -ZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu -Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRp -b24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNv -bS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYy -NTIyMjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4x -NTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24g -QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8x -IDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3 -DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw -8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m -+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8YTfwggtFzVXSN -dnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwGlN+V -YH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8so -gTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw -nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlD -ZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu -Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRp -b24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNv -bS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYy -NjAwMTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4x -NTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24g -QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8x -IDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3 -DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc -65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQ -b7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QSv4dk+NoS/zcn -wbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZSWI4 -OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZ -oDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC -W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8x -CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UE -CxMuQ2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eTAeFw05NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTlaMF8xCzAJBgNV -BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh -c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCB -nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3 -noaACpEO+jglr0aIguVzqKCbJF0NH8xlbgyw0FaEGIeaBpsQoXPftFg5a27B -9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR4k5FVmkfeAKA2txHkSm7NsljXMXg -1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATANBgkqhkiG9w0BAQIFAAOBgQBM -P7iLxmjf7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZoEWx8QszznC7EBz8UsA9P -/5CSdvnivErpj82ggAr3xSnxgiJduLHdgSOjeyUVRjB5FvjqBUuUfx3CHMjj -t/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0ANACY89FxlA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcEx -CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UE -CxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAt -IEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBU -cnVzdCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVow -gcExCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoG -A1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5j -LiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2ln -biBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq -0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYKVdPfQ4chEWWKfo+9 -Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSmFc/IReumXY6c -PvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQIDAQABMA0G -CSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0Jh9Zr -bWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul -uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4i -P/68DzFc6PLZ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHK -MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNV -BAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5 -IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBD -BgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3 -MTYyMzU5NTlaMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24s -IEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNV -BAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQg -dXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFBy -aW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4nN493GwTFtl63SRR -ZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO8ESlV8dAWB6j -Rx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjVojYJrKsh -JlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjbPG7P -oBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2 -6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHh -v2Vrn5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQ -BfGfMY1aqtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/N -y9Sn2WCVhDr4wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUf -xJM8/XmPBNQ+T+r3ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFM -DSZl4kSAHsef493oCtrspSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5 -SCJ5ShkPshw+IHTZasO+8ih4E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXV -OBRgmaNL3gaWcSzy27YfpO8/7g== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQL -Ey5DbGFzcyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGf -MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZM -JaLtVRKXxaeAufqDwSCg+i8VDXyhYGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvE -erf4Zh+AVPy3wo5ZShRXRtGak75BkQO7FYCTXOvnzAhsPz6zSvz/S2wj1VCC -JkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBAIob -K/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxgJ8pFUs4W7z8GZOeUaHxg -MxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Ncr6Pc5iaAIzy4RHT3 -Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHB -MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNV -BAsTM0NsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRo -b3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4g -LSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24g -VHJ1c3QgTmV0d29yazAeFw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTla -MIHBMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6 -BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIElu -Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNp -Z24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA -p4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjMHiwSViy4AWkszJkf -rbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjwDqL7MWzJ5m+Z -Jwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cCAwEAATAN -BgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9jinb3/ -7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX -rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6x -RnInjBJ7xUS0rg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcox -CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UE -CxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkg -VmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMG -A1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcx -NjIzNTk1OVowgcoxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwg -SW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UE -CxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1 -c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJp -bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWUJ92lvuCwTY+zYVY8 -1nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDOJxOeBUebMXoT -2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUYwZF7C9UT -AJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9okoqQ -HgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN -qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVC -YQ/ESrg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekh -ktdmnLfexbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf -0xwLRtxyID+u7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydE -p85EXdQbkJgNHkKUsQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377B -MnMiIYtYgXsVkXq642RIsH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab -5iXiQkWquJCtvgiPqQtCGJTPcjnhsUPgKM+351psE2tJs//jGHyJizNdrDPX -p/naOlXJWBD5qu9ats9LS98q ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQL -Ey5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGf -MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69q -RUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94f56TuZoAqiN91qyFomNFx3In -zPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Olhec9vn2a -/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtM -EivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPw -TtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzk -uxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcEx -CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UE -CxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAt -IEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBU -cnVzdCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVow -gcExCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoG -A1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5j -LiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2ln -biBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDM -XtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXX -wc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg013gfqLptQ5GV -j0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQABMA0G -CSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01U -bSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i -F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo -1KpYoJ2daZH9 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHK -MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNV -BAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5 -IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBD -BgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3 -MTYyMzU5NTlaMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24s -IEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNV -BAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQg -dXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFBy -aW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2 -R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2tKmFZpGcmTNDo -vFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUccLwg -TS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+V -k7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ -Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJ -OxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my -/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f -j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoA -Wii/gt/4uhMdUIaC/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8S -GhJouPtmmRQURVyu565pF4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbb -o27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh -/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcEx -CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UE -CxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAt -IEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBU -cnVzdCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVow -gcExCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoG -A1UECxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5j -LiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2ln -biBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC6 -8OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDMHO0oW369atyzkSTK -QWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtKqsGgtG7rL+VX -xbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwIDAQABMA0G -CSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwjcSGI -L4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y -cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckzt -ImRPT8qAkbYp ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHK -MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNV -BAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5 -IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBD -BgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3 -MTYyMzU5NTlaMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24s -IEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNV -BAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQg -dXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFBy -aW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYl -S+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ+mGuqPKljYXC -KtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM8BDc -VHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdL -MEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY -ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDD -Zq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1Wr -IhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt -mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csK -vE+MW8VLADsfKoKmfjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluP -QSjA1egtTaRezarZ7c7c2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kP -mF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr -9Xgn2uf3ZkPznoM+IKrDNWCRzg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzEL -MAkGA1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMu -MS4wLAYDVQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9y -aXR5MB4XDTk0MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVowXzELMAkGA1UE -BhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD -VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGb -MA0GCSqGSIb3DQEBAQUAA4GJADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6O -LDfO6zV4ZFQD5YRAUcm/jwjiioII0haGN1XpsSECrXZogZoFokvJSyVmIlZs -iAeP94FZbYQHZXATcXY+m3dM41CJVphIuR2nKRoTLkoRWZweFdVJVCxzOmmC -sZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZIhvcNAQECBQADfgBl3X7hsuyw -4jrg7HFGmhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3YQO2WxZpO8ZECAyIUwxr -l0nHPjXcbLm7qt9cuzovk2C2qUtN8iD3zV9/ZHuO3ABc1/p3yjkWWW8O6tO1 -g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDzTCCAzagAwIBAgIQU2GyYK7bcY6nlLMTM/QHCTANBgkqhkiG9w0BAQUF -ADCBwTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTww -OgYDVQQLEzNDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24g -QXV0aG9yaXR5IC0gRzIxOjA4BgNVBAsTMShjKSAxOTk4IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmswHhcNMDAwOTI2MDAwMDAwWhcNMTAwOTI1MjM1 -OTU5WjCBpTEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBh -dCBodHRwczovL3d3dy52ZXJpc2lnbi5jb20vcnBhIChjKTAwMSwwKgYDVQQD -EyNWZXJpU2lnbiBUaW1lIFN0YW1waW5nIEF1dGhvcml0eSBDQTCBnzANBgkq -hkiG9w0BAQEFAAOBjQAwgYkCgYEA0hmdZ8IAIVlizrQJIkRpivglWtvtDbc2 -fk7gu5Q+kCWHwmFHKdm9VLhjzCx9abQzNvQ3B5rB3UBU/OB4naCTuQk9I1F/ -RMIUdNsKvsvJMDRAmD7Q1yUQgZS9B0+c1lQn3y6ov8uQjI11S7zi6ESHzeZB -CiVu6PQkAsVSD27smHUCAwEAAaOB3zCB3DAPBgNVHRMECDAGAQH/AgEAMEUG -A1UdIAQ+MDwwOgYMYIZIAYb4RQEHFwEDMCowKAYIKwYBBQUHAgEWHGh0dHBz -Oi8vd3d3LnZlcmlzaWduLmNvbS9ycGEwMQYDVR0fBCowKDAmoCSgIoYgaHR0 -cDovL2NybC52ZXJpc2lnbi5jb20vcGNhMy5jcmwwCwYDVR0PBAQDAgEGMEIG -CCsGAQUFBwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRwOi8vb2NzcC52ZXJp -c2lnbi5jb20vb2NzcC9zdGF0dXMwDQYJKoZIhvcNAQEFBQADgYEAgnBold+2 -DcIBcBlK0lRWHqzyRUyHuPU163hLBanInTsZIS5wNEqi9YngFXVF5yg3ADQn -Keg3S/LvRJdrF1Eaw1adPBqK9kpGRjeM+sv1ZFo4aC4cw+9wzrhGBha/937n -tag+RaypJXUie28/sJyU58dzq6wf7iWbwBbtt8pb8BQ= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUF -ADBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlz -YSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMT -E1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0 -MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UE -CxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAa -BgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA -A4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh -28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8bRaVK7362 -rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81 -q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtF -Wsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0 -lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaLdXe6YJ2E5/4t -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOC -AQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR -zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKht -cbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGI -xHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu -YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/ -hC3euiInlhBx6yLt398znM/jra6O1I7mT1GvFpLgXPYHDw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDgDCCAmigAwIBAgICAx4wDQYJKoZIhvcNAQEFBQAwYTELMAkGA1UEBhMC -VVMxDTALBgNVBAoTBFZJU0ExLzAtBgNVBAsTJlZpc2EgSW50ZXJuYXRpb25h -bCBTZXJ2aWNlIEFzc29jaWF0aW9uMRIwEAYDVQQDEwlHUCBSb290IDIwHhcN -MDAwODE2MjI1MTAwWhcNMjAwODE1MjM1OTAwWjBhMQswCQYDVQQGEwJVUzEN -MAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNl -cnZpY2UgQXNzb2NpYXRpb24xEjAQBgNVBAMTCUdQIFJvb3QgMjCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBAKkBcLWqxEDwq2omYXkZAPy/mzdZ -DK9vZBv42pWUJGkzEXDK41Z0ohdXZFwgBuHW73G3O/erwWnQSaSxBNf0V2KJ -XLB1LRckaeNCYOTudNargFbYiCjh+20i/SN8RnNPflRzHqgsVVh1t0zzWkWl -Ahr62p3DRcMiXvOL8WAp0sdftAw6UYPvMPjU58fy+pmjIlC++QU3o63tmsPm -7IgbthknGziLgE3sucfFicv8GjLtI/C1AVj59o/ghalMCXI5Etuz9c9OYmTa -xhkVOmMd6RdVoUwiPDQyRvhlV7or7zaMavrZ2UT0qt2E1w0cslSsMoW0ZA3e -QbuxNMYBhjJk1Z8CAwEAAaNCMEAwHQYDVR0OBBYEFJ59SzS/ca3CBfYDdYDO -qU8axCRMMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqG -SIb3DQEBBQUAA4IBAQAhpXYUVfmtJ3CPPPTVbMjMCqujmAuKBiPFyWHbmQdp -NSYx/scuhMKZYdQN6X0uEyt8joW2hcdLzzW2LEc9zikv2G+fiRxkk78IvXbQ -kIqUs38oW26sTTMs7WXcFsziza6kPWKSBpUmv9+55CCmc2rBvveURNZNbyoL -axhNdBA2aGpawWqn3TYpjLgwi08hPwAuVDAHOrqK5MOeyti12HvOdUVmB/Rt -Ldh6yumJivIj2C/LbgA2T/vwLwHMD8AiZfSr4k5hLQOCfZEWtTDVFN5ex5D8 -ofyrEK9ca3CnB+8phuiyJccg/ybdd+95RBTEvd07xQObdyPsoOy7Wjm1zK0G ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz -MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw -IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR -dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp -li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D -rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ -WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug -F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU -xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC -Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv -dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw -ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl -IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh -c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy -ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh -Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI -KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T -KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq -y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p -dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD -VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL -MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk -fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 -7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R -cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y -mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW -xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK -SnQ2+Q== ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIETzCCAzegAwIBAgIEO63vKTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDEwOTIzMTQxODE3WhcNMTEw -OTIzMTMxODE3WjB1MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v -LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWdu -ZXQgLSBDQSBLbGFzYSAxMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4SRW9Q58g5DY1Hw7h -gCRKBEdPdGn0MFHsfw7rlu/oQm7IChI/uWd9q5wwo77YojtTDjRnpgZsjqBeynX8T90vFILqsY2K -5CF1OESalwvVr3sZiQX79lisuFKat92u6hBFikFIVxfHHB67Af+g7u0dEHdDW7lwy81MwFYxBTRy -9wIDAQABo4IBbTCCAWkwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwggEEBgNVHSAE -gfwwgfkwgfYGDSsGAQQBvj8CAQoBAQAwgeQwgZoGCCsGAQUFBwICMIGNGoGKQ2VydHlmaWthdCB3 -eXN0YXdpb255IHpnb2RuaWUgeiBkb2t1bWVudGVtOiAiUG9saXR5a2EgQ2VydHlmaWthY2ppIGRs -YSBSb290Q0EiLiBDZXJ0eWZpa2F0IHd5c3Rhd2lvbnkgcHJ6ZXogUm9vdENBIHcgaGllcmFyY2hp -aSBDQyBTaWduZXQuMEUGCCsGAQUFBwIBFjlodHRwOi8vd3d3LnNpZ25ldC5wbC9yZXBvenl0b3Jp -dW0vZG9rdW1lbnR5L3BjX3Jvb3RjYS50eHQwHwYDVR0jBBgwFoAUwJvFIw0C4aZOSGsfAOnjmhQb -sa8wHQYDVR0OBBYEFMODHtVZd1T7TftXR/nEI1zR54njMA0GCSqGSIb3DQEBBQUAA4IBAQBRIHQB -FIGh8Jpxt87AgSLwIEEk4+oGy769u3NtoaR0R3WNMdmt7fXTi0tyTQ9V4AIszxVjhnUPaKnF1KYy -f8Tl+YTzk9ZfFkZ3kCdSaILZAOIrmqWNLPmjUQ5/JiMGho0e1YmWUcMci84+pIisTsytFzVP32/W -+sz2H4FQAvOIMmxB7EJX9AdbnXn9EXZ+4nCqi0ft5z96ZqOJJiCB3vSaoYg+wdkcvb6souMJzuc2 -uptXtR1Xf3ihlHaGW+hmnpcwFA6AoNrom6Vgzk6U1ienx0Cw28BhRSKqzKkyXkuK8gRflZUx84uf -tXncwKJrMiE3lvgOOBITRzcahirLer4c ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIE9zCCA9+gAwIBAgIEPL/xoTANBgkqhkiG9w0BAQUFADB2MQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MSAwHgYDVQQDExdDQyBTaWduZXQgLSBQQ0EgS2xhc2EgMjAeFw0wMjA0MTkxMDI5NTNa -Fw0xNzA0MTgxMjUzMDdaMHUxCzAJBgNVBAYTAlBMMR8wHQYDVQQKExZUUCBJbnRlcm5ldCBTcC4g -eiBvLm8uMSQwIgYDVQQLExtDZW50cnVtIENlcnR5ZmlrYWNqaSBTaWduZXQxHzAdBgNVBAMTFkND -IFNpZ25ldCAtIENBIEtsYXNhIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqgLJu -QqY4yavbSgHg8CyfKTx4BokNSDOVz4eD9vptUr11Kqd06ED1hlH7Sg0goBFAfntNU/QTKwSBaNui -me7C4sSEdgsKrPoAhGb4Mq8y7Ty7RqZz7mkzNMqzL2L2U4yQ2QjvpH8MH0IBqOWEcpSkpwnrCDIm -RoTfd+YlZWKi2JceQixUUYIQ45Ox8+x8hHbvvZdgqtcvo8PW27qoHkp/7hMuJ44kDAGrmxffBXl/ -OBRZp0uO1CSLcMcVJzyr2phKhy406MYdWrtNPEluGs0GFDzd0nrIctiWAO4cmct4S72S9Q6e//0G -O9f3/Ca5Kb2I1xYLj/xE+HgjHX9aD2MhAgMBAAGjggGMMIIBiDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjCB4wYDVR0gBIHbMIHYMIHVBg0rBgEEAb4/AhQKAQEAMIHDMHUGCCsGAQUF -BwICMGkaZ0NlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 -eWthIENlcnR5ZmlrYWNqaSBQQ0EyIC0gQ2VydHlmaWthdHkgVXJ6ZWRvdyBLbGFzeSAyIi4wSgYI -KwYBBQUHAgEWPmh0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9kb2t1bWVudHkva2xh -c2EyL3BjX3BjYTIudHh0MD8GA1UdHwQ4MDYwNKAyoDCGLmh0dHA6Ly93d3cuc2lnbmV0LnBsL3Jl -cG96eXRvcml1bS9jcmwvcGNhMi5jcmwwHwYDVR0jBBgwFoAUwGxGyl2CfpYHRonE82AVXO08kMIw -HQYDVR0OBBYEFLtFBlILy4HNKVSzvHxBTM0HDowlMA0GCSqGSIb3DQEBBQUAA4IBAQBWTsCbqXrX -hBBev5v5cIuc6gJM8ww7oR0uMQRZoFSqvQUPWBYM2/TLI/f8UM9hSShUVj3zEsSj/vFHagUVmzuV -Xo5u0WK8iaqATSyEVBhADHrPG6wYcLKJlagge/ILA0m+SieyP2sjYD9MUB9KZIEyBKv0429UuDTw -6P7pslxMWJBSNyQxaLIs0SRKsqZZWkc7ZYAj2apSkBMX2Is1oHA+PwkF6jQMwCao/+CndXPUzfCF -6caa9WwW31W26MlXCvSmJgfiTPwGvm4PkPmOnmWZ3CczzhHl4q7ztHFzshJH3sZWDnrWwBFjzz5e -Pr3WHV1wA7EY6oT4zBx+2gT9XBTB ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEUzCCAzugAwIBAgIEPq+qjzANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQGEwJQTDE3MDUGA1UE -ChMuQ1ppQyBDZW50cmFzdCBTQSB3IGltaWVuaXUgTWluaXN0cmEgR29zcG9kYXJraTEZMBcGA1UE -AxMQQ1ppQyBDZW50cmFzdCBTQTAeFw0wMzA0MzAxMDUwNTVaFw0wODA0MjgxMDUwNTVaMGgxCzAJ -BgNVBAYTAlBMMR8wHQYDVQQKExZUUCBJbnRlcm5ldCBTcC4geiBvLm8uMR8wHQYDVQQDExZDQyBT -aWduZXQgLSBDQSBLbGFzYSAzMRcwFQYDVQQFEw5OdW1lciB3cGlzdTogNDCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBALVdeOM62cPH2NERFxbS5FIp/HSv3fgesdVsTUFxZbGtE+/E0RMl -KZQJHH9emx7vRYubsi4EOLCjYsCOTFvgGRIpZzx7R7T5c0Di5XFkRU4gjBl7aHJoKb5SLzGlWdoX -GsekVtl6keEACrizV2EafqjI8cnBWY7OxQ1ooLQp5AeFjXg+5PT0lO6TUZAubqjFbhVbxSWjqvdj -93RGfyYE76MnNn4c2xWySD07n7uno06TC0IJe6+3WSX1h+76VsIFouWBXOoM7cxxiLjoqdBVu24+ -P8e81SukE7qEvOwDPmk9ZJFtt1nBNg8a1kaixcljrA/43XwOPz6qnJ+cIj/xywECAwEAAaOCAQow -ggEGMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMDMGA1UdIAEB/wQpMCcwJQYEVR0g -ADAdMBsGCCsGAQUFBwIBFg93d3cuY2VudHJhc3QucGwwgY4GA1UdIwSBhjCBg4AU2a7r85Cp1iJN -W0Ca1LR6VG3996ShZaRjMGExCzAJBgNVBAYTAlBMMTcwNQYDVQQKEy5DWmlDIENlbnRyYXN0IFNB -IHcgaW1pZW5pdSBNaW5pc3RyYSBHb3Nwb2RhcmtpMRkwFwYDVQQDExBDWmlDIENlbnRyYXN0IFNB -ggQ9/0sQMB0GA1UdDgQWBBR7Y8wZkHq0zrY7nn1tFSdQ0PlJuTANBgkqhkiG9w0BAQUFAAOCAQEA -ldt/svO5c1MU08FKgrOXCGEbEPbQxhpM0xcd6Iv3dCo6qugEgjEs9Qm5CwUNKMnFsvR27cJWUvZb -MVcvwlwCwclOdwF6u/QRS8bC2HYErhYo9bp9yuxxzuow2A94c5fPqfVrjXy+vDouchAm6+A5Wjzv -J8wxVFDCs+9iGACmyUWr/JGXCYiQIbQkwlkRKHHlan9ymKf1NvIej/3EpeT8fKr6ywxGuhAfqofW -pg3WJY/RCB4lTzD8vZGNwfMFGkWhJkypad3i9w3lGmDVpsHaWtCgGfd0H7tUtWPkP+t7EjIRCD9J -HYnTR+wbbewc5vOI+UobR15ynGfFIaSIiMTVtQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEejCCA2KgAwIBAgIEP4vk6TANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQ -TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu -dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQgLSBD -QSBLbGFzYSAyMB4XDTAzMTAxNDExNTgyMloXDTE3MDQxODEyNTMwN1owdzELMAkG -A1UEBhMCUEwxHzAdBgNVBAoTFlRQIEludGVybmV0IFNwLiB6IG8uby4xJDAiBgNV -BAsTG0NlbnRydW0gQ2VydHlmaWthY2ppIFNpZ25ldDEhMB8GA1UEAxMYQ0MgU2ln -bmV0IC0gT0NTUCBLbGFzYSAyMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCo -VCsaBStblXQYVNthe3dvaCrfvKpPXngh4almm988iIlEv9CVTaAdCfaJNihvA+Vs -Qw8++ix1VqteMQE474/MV/YaXigP0Zr0QB+g+/7PWVlv+5U9Gzp9+Xx4DJay8AoI -iB7Iy5Qf9iZiHm5BiPRIuUXT4ZRbZRYPh0/76vgRsQIDAQABo4IBkjCCAY4wDgYD -VR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMJMEEGA1UdHwQ6MDgwNqA0 -oDKGMGh0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9jcmwva2xhc2Ey -LmNybDCB2AYDVR0gBIHQMIHNMIHKBg4rBgEEAb4/AoFICgwBADCBtzBsBggrBgEF -BQcCAjBgGl5DZXJ0eWZpa2F0IHd5ZGFueSB6Z29kbmllIHogZG9rdW1lbnRlbSAi -UG9saXR5a2EgQ2VydHlmaWthY2ppIC0gQ2VydHlmaWthdHkgcmVzcG9uZGVyb3cg -T0NTUCIuMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnNpZ25ldC5wbC9yZXBvenl0 -b3JpdW0vZG9rdW1lbnR5L3BjX29jc3BfMV8wLnBkZjAfBgNVHSMEGDAWgBS7RQZS -C8uBzSlUs7x8QUzNBw6MJTAdBgNVHQ4EFgQUKEVrOY7cEHvsVgvoyZdytlbtgwEw -CQYDVR0TBAIwADANBgkqhkiG9w0BAQUFAAOCAQEAQrRg5MV6dxr0HU2IsLInxhvt -iUVmSFkIUsBCjzLoewOXA16d2oDyHhI/eE+VgAsp+2ANjZu4xRteHIHoYMsN218M -eD2MLRsYS0U9xxAFK9gDj/KscPbrrdoqLvtPSMhUb4adJS9HLhvUe6BicvBf3A71 -iCNe431axGNDWKnpuj2KUpj4CFHYsWCXky847YtTXDjri9NIwJJauazsrSjK+oXp -ngRS506mdQ7vWrtApkh8zhhWp7duCkjcCo1O8JxqYr2qEW1fXmgOISe010v2mmuv -hHxPyVwoAU4KkOw0nbXZn53yak0is5+XmAjh0wWue44AssHrjC9nUh3mkLt6eQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEezCCA2OgAwIBAgIEP4vnLzANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJQ -TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEfMB0GA1UEAxMWQ0Mg -U2lnbmV0IC0gQ0EgS2xhc2EgMzEXMBUGA1UEBRMOTnVtZXIgd3Bpc3U6IDQwHhcN -MDMxMDE0MTIwODAwWhcNMDgwNDI4MTA1MDU1WjB3MQswCQYDVQQGEwJQTDEfMB0G -A1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBD -ZXJ0eWZpa2FjamkgU2lnbmV0MSEwHwYDVQQDExhDQyBTaWduZXQgLSBPQ1NQIEts -YXNhIDMwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM/9GwvARNuCVN+PqZmO -4FqH8vTqhenUyqRkmAVT4YhLu0a9AXeLAYVDu+NTkYzsAUMAfu55rIKHNLlm6WbF -KvLiKKz4p4pbUr+ToPcwl/TDotidloUdBAxDg0SL+PmQqACZDe3seJho2IYf2vDL -/G4TLMbKmNB0mlWFuN0f4fJNAgMBAAGjggGgMIIBnDAOBgNVHQ8BAf8EBAMCB4Aw -EwYDVR0lBAwwCgYIKwYBBQUHAwkwTwYDVR0fBEgwRjBEoEKgQIY+aHR0cDovL3d3 -dy5zaWduZXQucGwva3dhbGlmaWtvd2FuZS9yZXBvenl0b3JpdW0vY3JsL2tsYXNh -My5jcmwwgdgGA1UdIASB0DCBzTCBygYOKwYBBAG+PwKCLAoCAQAwgbcwbAYIKwYB -BQUHAgIwYBpeQ2VydHlmaWthdCB3eWRhbnkgemdvZG5pZSB6IGRva3VtZW50ZW0g -IlBvbGl0eWthIENlcnR5ZmlrYWNqaSAtIENlcnR5ZmlrYXR5IHJlc3BvbmRlcm93 -IE9DU1AiLjBHBggrBgEFBQcCARY7aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5 -dG9yaXVtL2Rva3VtZW50eS9wY19vY3NwXzFfMC5wZGYwHwYDVR0jBBgwFoAUe2PM -GZB6tM62O559bRUnUND5SbkwHQYDVR0OBBYEFG4jnCMvBALRQXtmDn9TyXQ/EKP+ -MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADggEBACXrKG5Def5lpRwmZom3UEDq -bl7y4U3qomG4B+ok2FVZGgPZti+ZgvrenPj7PtbYCUBPsCSTNrznKinoT3gD9lQQ -xkEHwdc6VD1GlFp+qI64u0+wS9Epatrdf7aBnizrOIB4LJd4E2TWQ6trspetjMIU -upyWls1BmYUxB91R7QkTiAUSNZ87s3auhZuG4f0V0JLVCcg2rn7AN1rfMkgxCbHk -GxiQbYWFljl6aatxR3odnnzVUe1I8uoY2JXpmmUcOG4dNGuQYziyKG3mtXCQWvug -5qi9Mf3KUh1oSTKx6HfLjjNl1+wMB5Mdb8LF0XyZLdJM9yIZh7SBRsYm9QiXevY= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFGjCCBAKgAwIBAgIEPL7eEDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDIwNDE4MTQ1NDA4WhcNMjYw -OTIxMTU0MjE5WjB2MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v -LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWdu -ZXQgLSBQQ0EgS2xhc2EgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM7BrBlbN5ma -M5eg0BOTqoZ+9NBDvU8Lm5rTdrMswFTCathzpVVLK/JD4K3+4oCZ9SRAspEXE4gvwb08ASY6w5s+ -HpRkeJw8YzMFR5kDZD5adgnCAy4vDfIXYZgppXPaTQ8wnfUZ7BZ7Zfa7QBemUIcJIzJBB0UqgtxW -Ceol9IekpBRVmuuSA6QG0Jkm+pGDJ05yj2eQG8jTcBENM7sVA8rGRMyFA4skSZ+D0OG6FS2xC1i9 -JyN0ag1yII/LPx8HK5J4W9MaPRNjAEeaa2qI9EpchwrOxnyVbQfSedCG1VRJfAsE/9tT9CMUPZ3x -W20QjQcSZJqVcmGW9gVsXKQOVLsCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P -AQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQEBMIHkMIGaBggrBgEFBQcC -AjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 -eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6 -IFJvb3RDQSB3IGhpZXJhcmNoaWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5z -aWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw -OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Evcm9vdGNhLmNy -bDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNVHQ4EFgQUwGxGyl2CfpYHRonE -82AVXO08kMIwDQYJKoZIhvcNAQEFBQADggEBABp1TAUsa+BeVWg4cjowc8yTJ5XN3GvN96GObMkx -UGY7U9kVrLI71xBgoNVyzXTiMNDBvjh7vdPWjpl5SDiRpnnKiOFXA43HvNWzUaOkTu1mxjJsZsan -ot1Xt6j0ZDC+03FjLHdYMyM9kSWp6afb4980EPYZCcSzgM5TOGfJmNii5Tq468VFKrX+52Aou1G2 -2Ohu+EEOlOrG7ylKv1hHUJJCjwN0ZVEIn1nDbrU9FeGCz8J9ihVUvnENEBbBkU37PWqWuHitKQDV -tcwTwJJdR8cmKq3NmkwAm9fPacidQLpaw0WkuGrS+fEDhu1Nhy9xELP6NA9GRTCNxm/dXlcwnmY= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFGjCCBAKgAwIBAgIEPV0tNDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDIwODE2MTY0OTU2WhcNMjYw -OTIxMTU0MjE5WjB2MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v -LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWdu -ZXQgLSBQQ0EgS2xhc2EgMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALN3LanJtdue -Ne6geWUTFENa+lEuzqELcoqhYB+a/tJcPEkc6TX/bYPzalRRjqs+quMP6KZTU0DixOrV+K7iWaqA -iQ913HX5IBLmKDCrTVW/ZvSDpiBKbxlHfSNuJxAuVT6HdbzK7yAW38ssX+yS2tZYHZ5FhZcfqzPE -OpO94mAKcBUhk6T/ki0evXX/ZvvktwmF3hKattzwtM4JMLurAEl8SInyEYULw5JdlfcBez2Tg6Db -w34hA1A+ckTwhxzecrB8TUe2BnQKOs9vr2cCACpFFcOmPkM0Drtjctr1QHm1tYSqRFRf9VcV5tfC -3P8QqoK4ONjtLPHc9x5NE1uK/FMCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P -AQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQECMIHkMIGaBggrBgEFBQcC -AjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 -eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6 -IFJvb3RDQSB3IGhpZXJhcmNoaWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5z -aWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw -OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Evcm9vdGNhLmNy -bDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNVHQ4EFgQUXvthcPHlH5BgGhlM -ErJNXWlhlgAwDQYJKoZIhvcNAQEFBQADggEBACIce95Mvn710KCAISA0CuHD4aznTU6pLoCDShW4 -7OR+GTpJUm1coTcUqlBHV9mra4VFrBcBuOkHZoBLq/jmE0QJWnpSEULDcH9J3mF0nqO9SM+mWyJG -dsJF/XU/7smummgjMNQXwzQTtWORF+6v5KUbWX85anO2wR+M6YTBWC55zWpWi4RG3vkHFs5Ze2oF -JTlpuxw9ZgxTnWlwI9QR2MvEhYIUMKMOWxw1nt0kKj+5TCNQQGh/VJJ1dsiroGh/io1DOcePEhKz -1Ag52y6Wf0nJJB9yk0sFakqZH18F7eQecQImgZyyeRtsG95leNugB3BXWCW+KxwiBrtQTXv4dTE= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEzzCCA7egAwIBAgIEO6ocGTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDEwOTIwMTY0MjE5WhcNMjYw -OTIxMTU0MjE5WjBxMQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v -LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWdu -ZXQgLSBSb290Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrr2vydnNpELfGW3Ks -ARiDhJvwDtUe4AbWev+OfMc3+vA29nX8ZmIwno3gmItjo5DbUCCRiCMq5c9epcGu+kg4a3BJChVX -REl8gVh0ST15rr3RKrSc4VgsvQzl0ZUraeQLl8JoRT5PLsUj3qwF78jUCQVckiiLVcnGfZtFCm+D -CJXliQBDMB9XFAUEiO/DtEBs0B7wJGx7lgJeJpQUcGiaOPjcJDYOk7rNAYmmD2gWeSlepufO8luU -YG/YDxTC4mqhRqfa4MnVO5dqy+ICj2UvUpHbZDB0KfGRibgBYeQP1kuqgIzJN4UqknVAJb0aMBSP -l+9k2fAUdchx1njlbdcbAgMBAAGjggFtMIIBaTAPBgNVHRMBAf8EBTADAQH/MIIBBAYDVR0gBIH8 -MIH5MIH2Bg0rBgEEAb4/AgEKAQEAMIHkMIGaBggrBgEFBQcCAjCBjRqBikNlcnR5ZmlrYXQgd3lz -dGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0eWthIENlcnR5ZmlrYWNqaSBkbGEg -Um9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6IFJvb3RDQSB3IGhpZXJhcmNoaWkg -Q0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5dG9yaXVt -L2Rva3VtZW50eS9wY19yb290Y2EudHh0MB0GA1UdDgQWBBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAf -BgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcN -AQEFBQADggEBAGnY5QmYqnnO9OqFOWZxxb25UHRnaRF6IV9aaGit5BZufZj2Tq3v8L3SgE34GOoI -cdRMMG5JEpEU4mN/Ef3oY6Eo+7HfqaPHI4KFmbDSPiK5s+wmf+bQSm0Yq5/h4ZOdcAESlLQeLSt1 -CQk2JoKQJ6pyAf6xJBgWEIlm4RXE4J3324PUiOp83kW6MDvaa1xY976WyInr4rwoLgxVl11LZeKW -ha0RJJxJgw/NyWpKG7LWCm1fglF8JH51vZNndGYq1iKtfnrIOvLZq6bzaCiZm1EurD8HE6P7pmAB -KK6o3C2OXlNfNIgwkDN/cDqk5TYsTkrpfriJPdxXBH8hQOkW89g= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID/TCCA2agAwIBAgIEP4/gkTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQgLSBDQSBLbGFzYSAxMB4XDTAzMTAxNzEyMjkwMloX -DTExMDkyMzExMTgxN1owdjELMAkGA1UEBhMCUEwxHzAdBgNVBAoTFlRQIEludGVybmV0IFNwLiB6 -IG8uby4xJDAiBgNVBAsTG0NlbnRydW0gQ2VydHlmaWthY2ppIFNpZ25ldDEgMB4GA1UEAxMXQ0Mg -U2lnbmV0IC0gVFNBIEtsYXNhIDEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOJYrISEtSsd -uHajROh5/n7NGrkpYTT9NEaPe9+ucuQ37KxIbfJwXJjgUc1dw4wCkcQ12FJarD1X6mSQ4cfN/60v -LfKI5ZD4nhJTMKlAj1pX9ScQ/MuyvKStCbn5WTkjPhjRAM0tdwXSnzuTEunfw0Oup559y3Iqxg1c -ExflB6cfAgMBAAGjggGXMIIBkzBBBgNVHR8EOjA4MDagNKAyhjBodHRwOi8vd3d3LnNpZ25ldC5w -bC9yZXBvenl0b3JpdW0vY3JsL2tsYXNhMS5jcmwwDgYDVR0PAQH/BAQDAgeAMBYGA1UdJQEB/wQM -MAoGCCsGAQUFBwMIMIHaBgNVHSAEgdIwgc8wgcwGDSsGAQQBvj8CZAoRAgEwgbowbwYIKwYBBQUH -AgIwYxphQ2VydHlmaWthdCB3eXN0YXdpb255IHpnb2RuaWUgeiBkb2t1bWVudGVtICJQb2xpdHlr -YSBDZXJ0eWZpa2FjamkgQ0MgU2lnbmV0IC0gWm5ha293YW5pZSBjemFzZW0iLjBHBggrBgEFBQcC -ARY7aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY190c2ExXzJf -MS5wZGYwHwYDVR0jBBgwFoAUw4Me1Vl3VPtN+1dH+cQjXNHnieMwHQYDVR0OBBYEFJdDwEqtcavO -Yd9u9tej53vWXwNBMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADgYEAnpiQkqLCJQYXUrqMHUEz -+z3rOqS0XzSFnVVLhkVssvXc8S3FkJIiQTUrkScjI4CToCzujj3EyfNxH6yiLlMbskF8I31JxIeB -vueqV+s+o76CZm3ycu9hb0I4lswuxoT+q5ZzPR8Irrb51rZXlolR+7KtwMg4sFDJZ8RNgOf7tbA= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290 -IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB -IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA -Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO -BgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEi -MCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJ -ARYSc3VwcG9ydEBjYWNlcnQub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC -CgKCAgEAziLA4kZ97DYoB1CW8qAzQIxL8TtmPzHlawI229Z89vGIj053NgVBlfkJ -8BLPRoZzYLdufujAWGSuzbCtRRcMY/pnCujW0r8+55jE8Ez64AO7NV1sId6eINm6 -zWYyN3L69wj1x81YyY7nDl7qPv4coRQKFWyGhFtkZip6qUtTefWIonvuLwphK42y -fk1WpRPs6tqSnqxEQR5YYGUFZvjARL3LlPdCfgv3ZWiYUQXw8wWRBB0bF4LsyFe7 -w2t6iPGwcswlWyCR7BYCEo8y6RcYSNDHBS4CMEK4JZwFaz+qOqfrU0j36NK2B5jc -G8Y0f3/JHIJ6BVgrCFvzOKKrF11myZjXnhCLotLddJr3cQxyYN/Nb5gznZY0dj4k -epKwDpUeb+agRThHqtdB7Uq3EvbXG4OKDy7YCbZZ16oE/9KTfWgu3YtLq1i6L43q -laegw1SJpfvbi1EinbLDvhG+LJGGi5Z4rSDTii8aP8bQUWWHIbEZAWV/RRyH9XzQ -QUxPKZgh/TMfdQwEUfoZd9vUFBzugcMd9Zi3aQaRIt0AUMyBMawSB3s42mhb5ivU -fslfrejrckzzAeVLIL+aplfKkQABi6F1ITe1Yw1nPkZPcCBnzsXWWdsC4PDSy826 -YreQQejdIOQpvGQpQsgi3Hia/0PsmBsJUUtaWsJx8cTLc6nloQsCAwEAAaOCAc4w -ggHKMB0GA1UdDgQWBBQWtTIb1Mfz4OaO873SsDrusjkY0TCBowYDVR0jBIGbMIGY -gBQWtTIb1Mfz4OaO873SsDrusjkY0aF9pHsweTEQMA4GA1UEChMHUm9vdCBDQTEe -MBwGA1UECxMVaHR0cDovL3d3dy5jYWNlcnQub3JnMSIwIAYDVQQDExlDQSBDZXJ0 -IFNpZ25pbmcgQXV0aG9yaXR5MSEwHwYJKoZIhvcNAQkBFhJzdXBwb3J0QGNhY2Vy -dC5vcmeCAQAwDwYDVR0TAQH/BAUwAwEB/zAyBgNVHR8EKzApMCegJaAjhiFodHRw -czovL3d3dy5jYWNlcnQub3JnL3Jldm9rZS5jcmwwMAYJYIZIAYb4QgEEBCMWIWh0 -dHBzOi8vd3d3LmNhY2VydC5vcmcvcmV2b2tlLmNybDA0BglghkgBhvhCAQgEJxYl -aHR0cDovL3d3dy5jYWNlcnQub3JnL2luZGV4LnBocD9pZD0xMDBWBglghkgBhvhC -AQ0ESRZHVG8gZ2V0IHlvdXIgb3duIGNlcnRpZmljYXRlIGZvciBGUkVFIGhlYWQg -b3ZlciB0byBodHRwOi8vd3d3LmNhY2VydC5vcmcwDQYJKoZIhvcNAQEEBQADggIB -ACjH7pyCArpcgBLKNQodgW+JapnM8mgPf6fhjViVPr3yBsOQWqy1YPaZQwGjiHCc -nWKdpIevZ1gNMDY75q1I08t0AoZxPuIrA2jxNGJARjtT6ij0rPtmlVOKTV39O9lg -18p5aTuxZZKmxoGCXJzN600BiqXfEVWqFcofN8CCmHBh22p8lqOOLlQ+TyGpkO/c -gr/c6EWtTZBzCDyUZbAEmXZ/4rzCahWqlwQ3JNgelE5tDlG+1sSPypZt90Pf6DBl -Jzt7u0NDY8RD97LsaMzhGY4i+5jhe1o+ATc7iwiwovOVThrLm82asduycPAtStvY -sONvRUgzEv/+PDIqVPfE94rwiCPCR/5kenHA0R6mY7AHfqQv0wGP3J8rtsYIqQ+T -SCX8Ev2fQtzzxD72V7DX3WnRBnc0CkvSyqD/HMaMyRa+xMwyN2hzXwj7UfdJUzYF -CpUCTPJ5GhD22Dp1nPMd8aINcGeGG7MW9S/lpOt5hvk9C8JzC6WZrG/8Z7jlLwum -GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk -zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW -omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGCDCCA/CgAwIBAgIBATANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290 -IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB -IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA -Y2FjZXJ0Lm9yZzAeFw0wNTEwMTQwNzM2NTVaFw0zMzAzMjgwNzM2NTVaMFQxFDAS -BgNVBAoTC0NBY2VydCBJbmMuMR4wHAYDVQQLExVodHRwOi8vd3d3LkNBY2VydC5v -cmcxHDAaBgNVBAMTE0NBY2VydCBDbGFzcyAzIFJvb3QwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCrSTURSHzSJn5TlM9Dqd0o10Iqi/OHeBlYfA+e2ol9 -4fvrcpANdKGWZKufoCSZc9riVXbHF3v1BKxGuMO+f2SNEGwk82GcwPKQ+lHm9WkB -Y8MPVuJKQs/iRIwlKKjFeQl9RrmK8+nzNCkIReQcn8uUBByBqBSzmGXEQ+xOgo0J -0b2qW42S0OzekMV/CsLj6+YxWl50PpczWejDAz1gM7/30W9HxM3uYoNSbi4ImqTZ -FRiRpoWSR7CuSOtttyHshRpocjWr//AQXcD0lKdq1TuSfkyQBX6TwSyLpI5idBVx -bgtxA+qvFTia1NIFcm+M+SvrWnIl+TlG43IbPgTDZCciECqKT1inA62+tC4T7V2q -SNfVfdQqe1z6RgRQ5MwOQluM7dvyz/yWk+DbETZUYjQ4jwxgmzuXVjit89Jbi6Bb -6k6WuHzX1aCGcEDTkSm3ojyt9Yy7zxqSiuQ0e8DYbF/pCsLDpyCaWt8sXVJcukfV -m+8kKHA4IC/VfynAskEDaJLM4JzMl0tF7zoQCqtwOpiVcK01seqFK6QcgCExqa5g -eoAmSAC4AcCTY1UikTxW56/bOiXzjzFU6iaLgVn5odFTEcV7nQP2dBHgbbEsPyyG -kZlxmqZ3izRg0RS0LKydr4wQ05/EavhvE/xzWfdmQnQeiuP43NJvmJzLR5iVQAX7 -6QIDAQABo4G/MIG8MA8GA1UdEwEB/wQFMAMBAf8wXQYIKwYBBQUHAQEEUTBPMCMG -CCsGAQUFBzABhhdodHRwOi8vb2NzcC5DQWNlcnQub3JnLzAoBggrBgEFBQcwAoYc -aHR0cDovL3d3dy5DQWNlcnQub3JnL2NhLmNydDBKBgNVHSAEQzBBMD8GCCsGAQQB -gZBKMDMwMQYIKwYBBQUHAgEWJWh0dHA6Ly93d3cuQ0FjZXJ0Lm9yZy9pbmRleC5w -aHA/aWQ9MTAwDQYJKoZIhvcNAQEEBQADggIBAH8IiKHaGlBJ2on7oQhy84r3HsQ6 -tHlbIDCxRd7CXdNlafHCXVRUPIVfuXtCkcKZ/RtRm6tGpaEQU55tiKxzbiwzpvD0 -nuB1wT6IRanhZkP+VlrRekF490DaSjrxC1uluxYG5sLnk7mFTZdPsR44Q4Dvmw2M -77inYACHV30eRBzLI++bPJmdr7UpHEV5FpZNJ23xHGzDwlVks7wU4vOkHx4y/CcV -Bc/dLq4+gmF78CEQGPZE6lM5+dzQmiDgxrvgu1pPxJnIB721vaLbLmINQjRBvP+L -ivVRIqqIMADisNS8vmW61QNXeZvo3MhN+FDtkaVSKKKs+zZYPumUK5FQhxvWXtaM -zPcPEAxSTtAWYeXlCmy/F8dyRlecmPVsYGN6b165Ti/Iubm7aoW8mA3t+T6XhDSU -rgCvoeXnkm5OvfPi2RSLXNLrAWygF6UtEOucekq9ve7O/e0iQKtwOIj1CodqwqsF -YMlIBdpTwd5Ed2qz8zw87YC8pjhKKSRf/lk7myV6VmMAZLldpGJ9VzZPrYPvH5JT -oI53V93lYRE9IwCQTDz6o2CTBKOvNfYOao9PSmCnhQVsRqGP9Md246FZV/dxssRu -FFxtbUFm3xuTsdQAw+7Lzzw9IYCpX2Nl/N3gX6T0K/CFcUHUZyX7GrGXrtaZghNB -0m6lG5kngOcLqagA ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDvjCCA3ygAwIBAgIFJQaThoEwCwYHKoZIzjgEAwUAMIGFMQswCQYDVQQGEwJG -UjEPMA0GA1UECBMGRnJhbmNlMQ4wDAYDVQQHEwVQYXJpczEQMA4GA1UEChMHUE0v -U0dETjEOMAwGA1UECxMFRENTU0kxDjAMBgNVBAMTBUlHQy9BMSMwIQYJKoZIhvcN -AQkBFhRpZ2NhQHNnZG4ucG0uZ291di5mcjAeFw0wMjEyMTMxNDM5MTVaFw0yMDEw -MTcxNDM5MTRaMIGFMQswCQYDVQQGEwJGUjEPMA0GA1UECBMGRnJhbmNlMQ4wDAYD -VQQHEwVQYXJpczEQMA4GA1UEChMHUE0vU0dETjEOMAwGA1UECxMFRENTU0kxDjAM -BgNVBAMTBUlHQy9BMSMwIQYJKoZIhvcNAQkBFhRpZ2NhQHNnZG4ucG0uZ291di5m -cjCCAbYwggErBgcqhkjOOAQBMIIBHgKBgQCFkMImdk9zDzJfTO4XPdAAmLbAdWws -ZiEMZh19RyTo3CyhFqO77OIXrwY6vc1pcc3MgWJ0dgQpAgrDMtmFFxpUu4gmjVsx -8GpxQC+4VOgLY8Cvmcd/UDzYg07EIRto8BwCpPJ/JfUxwzV2V3N713aAX+cEoKZ/ -s+kgxC6nZCA7oQIVALME/JYjkdW2uKIGngsEPbXAjdhDAoGADh/uqWJx94UBm31c -9d8ZTBfRGRnmSSRVFDgPWgA69JD4BR5da8tKz+1HjfMhDXljbMH86ixpD5Ka1Z0V -pRYUPbyAoB37tsmXMJY7kjyD19d5VdaZboUjVvhH6UJy5lpNNNGSvFl4fqkxyvw+ -pq1QV0N5RcvK120hlXdfHUX+YKYDgYQAAoGAQGr7IuKJcYIvJRMjxwl43KxXY2xC -aoCiM/bv117MfI94aNf1UusGhp7CbYAY9CXuL60P0oPMAajbaTE5Z34AuITeHq3Y -CNMHwxalip8BHqSSGmGiQsXeK7T+r1rPXsccZ1c5ikGDZ4xn5gUaCyy2rCmb+fOJ -6VAfCbAbAjmNKwejdzB1MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgFGMBUG -A1UdIAQOMAwwCgYIKoF6AXkBAQEwHQYDVR0OBBYEFPkeNRcUf8idzpKblYbLNxs0 -MQhSMB8GA1UdIwQYMBaAFPkeNRcUf8idzpKblYbLNxs0MQhSMAsGByqGSM44BAMF -AAMvADAsAhRVh+CJA5eVyEYU5AO9Tm7GxX0rmQIUBCqsU5u1WxoZ5lEXicDX5/Ob -sRQ= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYT -AkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQ -TS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG -9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMB4XDTAyMTIxMzE0MjkyM1oXDTIw -MTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAM -BgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEO -MAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2 -LmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaI -s9z4iPf930Pfeo2aSVz2TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2 -xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCWSo7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4 -u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYyHF2fYPepraX/z9E0+X1b -F8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNdfrGoRpAx -Vs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGd -PDPQtQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNV -HSAEDjAMMAoGCCqBegF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAx -NjAfBgNVHSMEGDAWgBSjBS8YYFDCiQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUF -AAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RKq89toB9RlPhJy3Q2FLwV3duJ -L92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3QMZsyK10XZZOY -YLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg -Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2a -NjSaTFR+FwNIlQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R -0982gaEbeC9xs/FZTEYYKKuF0mBWWg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUF -ADCBgTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3Rl -cjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0 -ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJH -QjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxm -b3JkMRowGAYDVQQKExFDT01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09N -T0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH+7uIzg3j -Lz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/a -N5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaa -P+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC -8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+DT+nHbrTUcEL -pNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVIrLsm -9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAO -BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g -PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0 -aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5 -t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP -OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYm -uNg4ON8qa90SzMc/RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjs -LjBOlDW0JB9LeGna8gI4zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV -8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38 -NBejxiEovjBFMR7HeL5YYTisO+IBZQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJF -VTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMw -IQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZ -Q2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0z -NzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1l -cmZpcm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cu -Y2hhbWJlcnNpZ24ub3JnMSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJj -ZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVd -GDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlUxFF6tdpg -6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41 -XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxa -UWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUM -I/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyXroDclDZK9D7O -NhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1UdEwEB -/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFt -YmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p -26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQE -AwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3Jn -MCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD -VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8v -Y3BzLmNoYW1iZXJzaWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJ -KoZIhvcNAQEFBQADggEBAAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0n -bJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tG -fToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QU -u/wNUPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZB -zu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+ -S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfutGWaIZDgqtCYvDi1czyL -+Nw= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJF -VTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMw -IQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMX -R2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcw -OTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJm -aXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNo -YW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJv -b3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAwggEIAoIBAQCicKLQn0KuWxfH -2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J1tPfnZda -n5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH -+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvu -sZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8Co -X6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWhz0hQpe/SyBoT -+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/BAgw -BgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJz -aWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w -TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQD -AgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5v -cmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y -ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0 -dHA6Ly9jcHMuY2hhbWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3Qu -aHRtbDANBgkqhkiG9w0BAQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVP -MvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONG -kyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76Svpyk -BMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+ -xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLT -BQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/AYoFWpO+ocH/+OcOZ6RH -SXZddZAa9SaP8A== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEF -BQAwPTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQD -ExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2 -MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZ -BgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxv -c0NXYKwzCkTsA18cgCSR5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi -8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZVg2v7tK8R1fjeUl7NIknJITe -sezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFOYFWe2yMZ -eVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupd -M5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUC -AwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNV -HQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4QgEBBAQDAgEG -MDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29tL0NS -TC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9W -M2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 -yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzO -UrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW -2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW -//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4F -TUcY1Rbpsda2ENW7l7+ijrRU ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUF -ADBbMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUg -VHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBD -QSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNV -BAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8G -A1UECxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjAN -BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5 -WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzIDZBfZIGxqAgNTNj50wUoUrQB -JcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCapCIlF3Po -HuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKB -Xy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvb -UJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEITajV8fTXpLmaRcpPV -MibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3QuY29t -MGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRw -Oi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt -aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJ -KoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99 -Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t -Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8 -smk/f3rPanTK+gQqnExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir4 -2NInPRmJX1p7ijvMDNpRrscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvk -yCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6 -mis= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUF -ADA/MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAV -BgNVBAMTDkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkz -MDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qg -Q28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdA -wRgUi+DoM3ZJKuM/IUmTrE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJ -o6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9UL2AZd+3UWODyOKIYepLYYHs -Umu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRyxXtqqzTW -MIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX -69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/w -Al0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw -HQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqGSIb3DQEBBQUA -A4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikugdB/O -EIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHR -AosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz -R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJW -FBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06Xyx -V3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUF -ADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD -VQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1 -cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAw -WjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD -VQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1 -cmVkIElEIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWx -KISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHyUmHfnyDX -H+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNu -RMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNs -IumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcX -xH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMBAAGjYzBhMA4G -A1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF66Kv -9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd -823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC -dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthn -gYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+ -fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i -8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwz -Zr8TDRRu838fYxAe+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7m -ULKn+gpFL6Lw8g== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUF -ADBhMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD -VQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9i -YWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGEx -CzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsT -EHd3dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBS -b290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLe -qKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOnTjC3U/dDxGkAV53ijSLdhwZA -AIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5BmV/Sl0f -vBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1 -GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3O -FBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSii -cNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAOBgNVHQ8BAf8E -BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm8KPi -GxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJ -KoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV -5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBA -I+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 -UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDA -GySj4dzp30d8tbQkCAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWV -bd4= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUF -ADBsMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD -VQQLExB3d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdo -IEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTEx -MDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IElu -YzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNl -cnQgSGlnaCBBc3N1cmFuY2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAMbM5XPm+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRn -ogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMSOO7zSW1x -kX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9 -vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlK -V9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5 -OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsgEsxBu24LUTi4 -S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8w -HQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+ -w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec -nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehD -LI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VH -MWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK -mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E -1CAx2/S6cCZdkGCevEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN -7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UE -BhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5l -bnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEf -MB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50 -cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIw -MjM0MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQK -Ew1FbnRydXN0LCBJbmMuMTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BT -IGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAy -MDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZm -Lk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypo -wCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9KlmaI5UXLEWe -H25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68j6xS -lkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94Dk -Zfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB -sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAE -JDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSME -GDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH -hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0G -CSqGSIb3DQEBBQUAA4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW -+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ -47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p -8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE -2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDN -tGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/ -WrQ8 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMC -RVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNV -BAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9u -YWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9m -ZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCB -nTELMAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJj -ZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZp -cm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYX -Y2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IB -DwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8 -c9/Qit5Vj1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9Z -pTQsHVQERc1ouKDAA6XPhUJHlShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx -/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf3H5idPayBQC6haD9HThu -y1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8NeTv -tjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMB -AAGjgZ8wgZwwKgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lv -bmFsLmNvbTASBgNVHRMBAf8ECDAGAQH/AgEBMCsGA1UdEAQkMCKADzIwMDEx -MDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1UdDwEB/wQEAwIBBjAd -BgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD -ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/Gz -R0iLjJcG1+p+o1wqu00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvX -wOaD7FnMP97/T2u3Z36mhoEyIwOdyPdfwUpgpZKpsaSgYMN4h7Mi8yrrW6nt -Bas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm7YjHX1BiAuiZ -dBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/g -e9YGVM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJV -UzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg -R2xvYmFsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBE -MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UE -AxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IB -DwAwggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6Csgncbz -YEbYwbLVjDHZ3CB5JIG/NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96x -PqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1kLUCgsBDTOEhGiKEMuzozKmKY -+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFAVvqgx306 -E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdL -Fnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMB -AAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266 -ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUapEBVYIAUJMA4G -A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7srJe -rJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/Ngd -RN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN -A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/q -kZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa -4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF -H4z1Ir+rzoPz4iIprn2DQKi6bA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUF -ADBYMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8G -A1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYT -AlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVz -dCBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHW -AVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9ju -apYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9nceJSOC7 -KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5 -X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7W -inXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s -0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE -AwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZIhvcN -AQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CeP -bJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl -4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aV -Il6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJly -c1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG -1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJV -UzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3Qg -VW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFow -RTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNV -BAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckU -HUWCq8YdgNY96xCcOq9tJPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430 -SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw -8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs7tqqhZJm -r/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD -/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBO -U5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xdVHppCZbW2xHBjXWo -tM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCXteGYO8A3ZNY9 -lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hBZ3Ki -KN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9F -i1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ -nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1Ud -EwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8G -A1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB -hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIaw -C/yOsjmPRFWrZIRcaanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv -9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7 -/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDV -nVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG -8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxr -u18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2Hr -rDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKWkoRepqO1pD4r2czYG0eq -8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslKxfMnZmaG -rGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9 -fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6 -ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJV -UzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3Qg -VW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAw -WjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4G -A1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6Gq -dHtXr0om/Nj1XqduGdt0DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQw -Ax5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC -5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8QJqVJwy7X -QYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw7 -6L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC -9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IEr -KIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73y/Zl92zxlfgC -OzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAnZqzw -cEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgf -ksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 -Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAP -BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQ -KzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E -BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7 -WJtAJDday6sWSf+zdXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4s -NcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjg -AA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo -4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEn -cKpqA1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2R -LrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8 -mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m1wk8OhwRDqZsN/etRIcs -KMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7dFGdTbHFc -JoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9 -VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSL -akhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEg -MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkds -b2JhbFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAw -WhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3Qg -Q0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs -U2lnbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8o -mUVCxKs+IVSbC9N/hHD6ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe -+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1 -AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjNS7SgfQx5 -TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo -4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99y -qWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IHV2ccHsBqBt5Z -tJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9iYWxz -aWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0 -mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs -J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4 -h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRD -LenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 -9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmg -QWpzU/qlULRuJQ/7TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq -/H5COEBkEveegeGTLg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJV -UzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQL -EyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X -DTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMx -ITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMo -R28gRGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAw -DQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d -/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9 -S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32qRe3H3I2 -TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVl -OARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFA -pMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44 -dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLEsNKR1EwRcbNh -yz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2oatTj -oWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdy -b3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEF -BQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYX -MP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt -I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheab -IZ0KbIIOqPjCDPoQHmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzr -Tia2cyvk0/ZM/iZx4mERdEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBD -pqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/bvZ8= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMC -SFUxETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96 -YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9r -MTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZh -bnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQsw -CQYDVQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExv -Y2sgSGFsb3phdGJpenRvbnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZh -bnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sgVXpsZXRpIChDbGFzcyBCKSBU -YW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCx -6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp -2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5 -sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4IC -nzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8EBAMCAAYwEQYJ -YIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZRUxF -TSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3Mg -U3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh -bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5l -dExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGku -IEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg -YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBl -bGphcmFzIGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIElu -dGVybmV0IGhvbmxhcGphbiBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2Rv -Y3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5u -ZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQg -dGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhl -IE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2Nr -Lm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0G -CSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM43WIEJes -sDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w -2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgB -azMpUIaD8QFI ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMC -SFUxETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96 -YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9r -MTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0 -dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsx -CzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0 -TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0 -dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9jayBFeHByZXNzeiAoQ2xhc3Mg -QykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC -gYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qd -QPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64 -gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEA -AaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0PAQH/BAQDAgAG -MBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJNRklH -WUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxh -bm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz -b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQg -YSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2 -ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0 -ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4g -QXogZWxqYXJhcyBsZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0 -LiBJbnRlcm5ldCBob25sYXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5l -dC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxv -Y2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2Ug -YW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRv -IHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0 -bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQgY3BzQG5ldGxvY2submV0 -LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2xJZIwVzN -mtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5N -NwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeA -yNDYpQcCNJgEjTME1A== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYT -AkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUG -A1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQL -ExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5 -em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0 -N1oXDTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdI -dW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBI -YWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtp -YWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFzcyBBKSBU -YW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAvHSMD7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbb -O51qTGL3cfNk1mE7PetzozfZz+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QV -Or/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC/tmwqcm8WgD/qaiYdPv2 -LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7tqyF -/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCub -MvJIH5+hCoR64sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCC -ApswDgYDVR0PAQH/BAQDAgAGMBIGA1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZI -AYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZRUxFTSEg -RXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv -bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFw -amFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv -Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEg -ZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXog -ZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGph -cmFzIGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVy -bmV0IGhvbmxhcGphbiBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3Mg -Y2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQg -ZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl -IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5l -dExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5l -dC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqG -SIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5ayZrU3/b39/zcT0mwBQO -xmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjPytoU -MaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJ -MSEN1rUQQeJBCWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+u -xdAu6tYPVuxkf1qbFFgBJ34TUMdrKuZoPL9coAob4Q566eKAw+np9v1sEZ7Q -5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM8CgHrTwXZoi1/baI ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMC -SFUxETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96 -YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9r -MUIwQAYDVQQDEzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVneXpvaSAoQ2xh -c3MgUUEpIFRhbnVzaXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9A -bmV0bG9jay5odTAeFw0wMzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJ -MQswCQYDVQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5l -dExvY2sgSGFsb3phdGJpenRvbnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNp -dHZhbnlraWFkb2sxQjBABgNVBAMTOU5ldExvY2sgTWlub3NpdGV0dCBLb3pq -ZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZhbnlraWFkbzEeMBwGCSqGSIb3 -DQEJARYPaW5mb0BuZXRsb2NrLmh1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAx1Ilstg91IRVCacbvWy5FPSKAtt2/GoqeKvld/Bu4IwjZ9ul -ZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e8ia6AFQer7C8HORSjKAy -r7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO53Lhbm+1b -OdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWdvLrq -OU+L73Sa58XQ0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0l -mT+1fMptsK6ZmfoIYOcZwvK9UdPM0wKswREMgM6r3JSda6M5UzrWhQIDAMV9 -o4ICwDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8EBAMCAQYw -ggJ1BglghkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2 -YW55IGEgTmV0TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBT -emFiYWx5emF0YWJhbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0 -LiBBIG1pbm9zaXRldHQgZWxla3Ryb25pa3VzIGFsYWlyYXMgam9naGF0YXMg -ZXJ2ZW55ZXN1bGVzZW5laywgdmFsYW1pbnQgZWxmb2dhZGFzYW5hayBmZWx0 -ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6b2xnYWx0YXRhc2kgU3phYmFseXphdGJh -biwgYXogQWx0YWxhbm9zIFN6ZXJ6b2Rlc2kgRmVsdGV0ZWxla2JlbiBlbG9p -cnQgZWxsZW5vcnplc2kgZWxqYXJhcyBtZWd0ZXRlbGUuIEEgZG9rdW1lbnR1 -bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczovL3d3dy5uZXRsb2NrLmh1L2Rv -Y3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0BuZXRsb2NrLm5ldCBl -LW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVz -ZSBvZiB0aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRoZSBOZXRM -b2NrIFF1YWxpZmllZCBDUFMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3Lm5l -dGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0IGluZm9AbmV0bG9jay5u -ZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3DQEB -BQUAA4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufA -QTPGtpvQMznNwNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68 -d4bDBsxafEp+NFAwLvt/MpqNPfMgW/hqyobzMUwsWYACff44yTB1HLdV47yf -uqhthCgFdbOLDcCRVCHnpgu0mfVRQdzNo0ci2ccBgcTcR08m6h/t280NmPSj -nLRzMkqWmf68f8glWPhY83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR -5qq5aKrN9p2QdRLqOBrKROi3macqaJVmlaut74nLYKkGEsaUR+ko ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMC -Qk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1Zh -ZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNa -MEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRsw -GQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4Gt -Mh6QRr+jhiYaHv5+HBg6XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst -/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yklvc/ulsrHHo1wtZn/qtmUItt -KGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbBlDePSHFj -IuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRc -AitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJl -cZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2 -BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIizPtGo/KPaHbDR -sSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOhD7os -FRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR -7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI -yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8G -A1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwz -JQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU -a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0 -ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcN -AQEFBQADggIBAD4KFk2fBluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJ -RqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQty -U/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgt -JodmVjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUs -fU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1 -O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozchLsib9D45MY56QSIPMO6 -61V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1WVaj+ahJ -efivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1 -B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6y -hhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOT -HcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza -8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMC -Qk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1Zh -ZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRa -MEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRsw -GQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTP -krgEQK0CSzGrvI2RaNggDhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9 -cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOijKTVopAFPD6QuN+8bv+OPEKhy -q1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79KDDRMpsMh -vVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRl -lDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+ -pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJ -k8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjcT5EOE7zelaTf -i5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEXMJPp -Govgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6ts -gLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A -4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEw -DwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMw -gcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj -YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJv -b3QgQ0EgMyBDZXJ0aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFBy -YWN0aWNlIFN0YXRlbWVudC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVv -dmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLA -E+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1 -XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMg -TGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkq -hkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM07ucp2sNbtrCD2dDQ4iH7 -82CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+shvzuXYO8 -BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM -3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hR -OJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54C -rnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x -DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPs -MZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmi -oHfRMJ6szHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRe -cCocIdiP4b0jWy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEo -kt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ -ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUF -ADBIMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9y -YXRpb24xFzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzEx -OFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1Nl -Y3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBD -QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7C -T8rU4niVWJxB4Q2ZQCQXOZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/je -p4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9tDWccV9cGrcrI9f4Or2YlSASW -C12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uHGFaAJsTQ -3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobv -omuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcW -NFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIE -Bh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYjaHR0 -cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUB -BAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 -6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s -7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cp -rp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ -nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZG -BlSm8jIKYyYwa5vR3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShL -HZ4swrhovO0C7jE= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUF -ADBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9y -YXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0 -MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMX -U2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9i -YWwgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxV -aQZx5RNoJLNP2MwhR/jxYDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7H -fAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQbqR8JNGuQsiWUGMu4P51/pin -X0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g8NEXLJXr -9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz -+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvU -d+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGC -NxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYD -VR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAnoCWG -I2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQB -gjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L -URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X -+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895 -P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 -3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNsp -nWzFacxHVaIw98xcf8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJP -Ix/abKwfROHdI3hRW8cW ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJV -UzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG -A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQG -EwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEy -MDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRo -b3JpdHkwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGm -BIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1 -KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZJRRU6ybH -838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4Q -yDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmC -uDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W -93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0GA1UdDgQWBBS/ -X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0fhvRb -Vazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJm -aWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD -bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMB -Af8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1ep -oXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM -PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L -7ShZ3U0WixeDyLJlxy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMt -lb71cZBDzI0fmgAKhynpVSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl9 -0TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/ -D5fs4C8fF5Q= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJ -TDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERp -Z2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20g -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYw -OTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20g -THRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2ln -bmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDBiNsJvGxGfHif -lXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1yo4UcodM9 -tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1 -YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srh -JosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d -5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNiHzvEvqBTViVs -UQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z6+hs -TXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2Oq -qGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ -Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3v -wmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOz -EmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT -37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMC -Aa4wHQYDVR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFsw -LKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3Js -MCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3Js -MIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYB -BQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUG -CCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRp -YXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3RhcnQgQ29tbWVyY2lhbCAo -U3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5LCByZWFk -IHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0 -Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUg -YXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZI -AYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT -TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEA -FmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArex -mvclmAk8jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPle -WKYK34wGmkUWFjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8 -rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNm -ezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 -fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZ -tWgo+2EuvoSoOMCZEoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0 -yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+PwqyvqCUqDvr0tVk+vBtfAii6w0TiYi -BKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl1njFmUNj403g -dy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/ -7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/Fl -UQqmMGqz9IgcgA38corog14= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFFjCCBH+gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBsDELMAkGA1UEBhMC -SUwxDzANBgNVBAgTBklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoT -DVN0YXJ0Q29tIEx0ZC4xGjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkw -JwYDVQQDEyBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8G -CSqGSIb3DQEJARYSYWRtaW5Ac3RhcnRjb20ub3JnMB4XDTA1MDMxNzE3Mzc0 -OFoXDTM1MDMxMDE3Mzc0OFowgbAxCzAJBgNVBAYTAklMMQ8wDQYDVQQIEwZJ -c3JhZWwxDjAMBgNVBAcTBUVpbGF0MRYwFAYDVQQKEw1TdGFydENvbSBMdGQu -MRowGAYDVQQLExFDQSBBdXRob3JpdHkgRGVwLjEpMCcGA1UEAxMgRnJlZSBT -U0wgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEmFk -bWluQHN0YXJ0Y29tLm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA -7YRgACOeyEpRKSfeOqE5tWmrCbIvNP1h3D3TsM+x18LEwrHkllbEvqoUDufM -OlDIOmKdw6OsWXuO7lUaHEe+o5c5s7XvIywI6Nivcy+5yYPo7QAPyHWlLzRM -GOh2iCNJitu27Wjaw7ViKUylS7eYtAkUEKD4/mJ2IhULpNYILzUCAwEAAaOC -AjwwggI4MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgHmMB0GA1UdDgQW -BBQcicOWzL3+MtUNjIExtpidjShkjTCB3QYDVR0jBIHVMIHSgBQcicOWzL3+ -MtUNjIExtpidjShkjaGBtqSBszCBsDELMAkGA1UEBhMCSUwxDzANBgNVBAgT -BklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0 -ZC4xGjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBGcmVl -IFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYS -YWRtaW5Ac3RhcnRjb20ub3JnggEAMB0GA1UdEQQWMBSBEmFkbWluQHN0YXJ0 -Y29tLm9yZzAdBgNVHRIEFjAUgRJhZG1pbkBzdGFydGNvbS5vcmcwEQYJYIZI -AYb4QgEBBAQDAgAHMC8GCWCGSAGG+EIBDQQiFiBGcmVlIFNTTCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eTAyBglghkgBhvhCAQQEJRYjaHR0cDovL2NlcnQu -c3RhcnRjb20ub3JnL2NhLWNybC5jcmwwKAYJYIZIAYb4QgECBBsWGWh0dHA6 -Ly9jZXJ0LnN0YXJ0Y29tLm9yZy8wOQYJYIZIAYb4QgEIBCwWKmh0dHA6Ly9j -ZXJ0LnN0YXJ0Y29tLm9yZy9pbmRleC5waHA/YXBwPTExMTANBgkqhkiG9w0B -AQQFAAOBgQBscSXhnjSRIe/bbL0BCFaPiNhBOlP1ct8nV0t2hPdopP7rPwl+ -KLhX6h/BquL/lp9JmeaylXOWxkjHXo0Hclb4g4+fd68p00UOpO6wNnQt8M2Y -I3s3S9r+UZjEHjQ8iP2ZO1CnwYszx8JSFhKVU2Ui77qLzmLbcCOxgN8aIDjn -fg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJ -BgNVBAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3 -aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1 -MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFH -MR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG -9w0BAQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJC -Eyq8ZVeCQD5XJM1QiyUqt2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9 -lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5CjCA12UNNhPqE21Is8w4ndwtr -vxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpgvd21mWRT -uKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbL -tK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpK -xVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdV -xVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02yMszYF9rNt85m -ndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkOpeUD -DniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59 -je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM -gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOB -rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64 -OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEF -BQcCARYgaHR0cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZI -hvcNAQEFBQADggIBACe645R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhW -fvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g -7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8 -AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS -2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5 -JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a77KwPJ+HbBIrZXAVUjEa -JM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJkvC24JdVU -orgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7X -dVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG -2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEB -nunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt -Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkG -A1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dp -c3NTaWduIFBsYXRpbnVtIENBIC0gRzIwHhcNMDYxMDI1MDgzNjAwWhcNMzYx -MDI1MDgzNjAwWjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWdu -IEFHMSMwIQYDVQQDExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZc -ZB/HL37PZ/pEQtZ2Y5Wu669yIIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeT -IsBQnIJ71NUERFzLtMKfkr4k2HtnIuJpX+UFeNSH2XFwMyVTtIc7KZAoNppV -RDBopIOXfw0enHb/FZ1glwCNioUD7IC+6ixuEFGSzH7VozPY1kneWCqv9hbr -S3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5objM89o03Oy3z2u5yg+gnOI2Ky -6Q0f4nIoj5+saCB9bzuohTEJfwvH6GXp43gOCWcwizSC+13gzJ2BbWLuCB4E -LE6b7P6pT1/9aXjvCR+htL/68++QHkwFix7qepF6w9fl+zC8bBsQWJj3Gl/Q -KTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34TaNhxKFrYzt3oEBSa/m0j -h26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaPpZjydomy -ExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtFKwH3 -HBqi7Ri6Cr2D+m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuW -ae5ogObnmLo2t/5u7Su9IPhlGdpVCX4l3P5hYnL5fhgC72O00Puv5TtjjGeP -AgMBAAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w -HQYDVR0OBBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCv -zAeHFUdvOMW0ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4w -LAYIKwYBBQUHAgEWIGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20v -MA0GCSqGSIb3DQEBBQUAA4ICAQAIhab1Fgz8RBrBY+D5VUYI/HAcQiiWjrfF -wUF1TglxeeVtlspLpYhg0DB0uMoI3LQwnkAHFmtllXcBrqS3NQuB2nEVqXQX -OHtYyvkv+8Bldo1bAbl93oI9ZLi+FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vl -pqD4U99REJNi54Av4tHgvI42Rncz7Lj7jposiU0xEQ8mngS7twSNC/K5/Fqd -Oxa3L8iYq/6KUFkuozv8KV2LwUvJ4ooTHbG/u0IdUt1O2BReEMYxB+9xJ/cb -OQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl9x8DYSjFyMsSoEJL+WuICI20 -MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1puEa+S1BaYEUtLS1 -7Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXaicYwu+uPyyII -oK6q8QNsOktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbGDI8Zf0Ne -bvRbFS/bYV3mZy8/CJT5YLSYMdp08YSTcU1f+2BY0fvEwW2JorsgH51xkcsy -mxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAciIfNAChs0B0QTwoRqjt8Z -Wr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkG -A1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dp -c3NTaWduIFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAy -NTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBB -RzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkq -hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dO -cbpLj6VzHVxumK4DV644N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gRE -pzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm+/pe7R20nqA1W6GSy/BJkv6F -CgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH6INaUFjp -iou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2 -kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aD -Cyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jM -qDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJMoBgs5PAKrYY -C51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBsROop -N4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFu -sB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6 -5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEA -AaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB -tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggr -BgEFBQcCARYgaHR0cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJ -KoZIhvcNAQEFBQADggIBAHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ -1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEG -DyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcS -H9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpH -kXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE -790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8aRl5xB9+lwW/xekkUV7U -1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqPe97Dh4kQ -mUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNV -V4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29 -MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm -0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy -tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUF -ADBkMQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsT -HERpZ2l0YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNz -Y29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4MTgyMjA2MjBa -MGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMc -RGlnaXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Nj -b20gUm9vdCBDQSAxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA -0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiMMW8Xw/qabFbtPMWRV8PNq5ZJ -kCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyFNDhhSbEA -n9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj -/x2lzZAeAR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxz -h+XTF3xmUHJd1BpYwdnP2IkCb6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJ -vbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn7uHbHaBuHYwadzVcFh4r -Ux80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbNcA78 -yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AO -eCMgkckkKmUpWyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjC -L3UcPX7ape8eYIVpQtPM+GP+HkM5haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoI -lmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNYMUJDLXT5xp6mig/p -/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw -HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYB -Af8CAQcwHwYDVR0jBBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0O -BBYEFAMlL95vggE6XCzcK6FptWfUjNP9MA0GCSqGSIb3DQEBBQUAA4ICAQA1 -EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMnjgM+pN0S734e -dAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzn -eAXQMbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXb -D8BJZLsuUBlL0iT43R4HVtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrE -qdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtlvrsRls/bxig5OgjOR1tTWsWZ -/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascClOS5cfGni -LLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFb -jCYDcKF31QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBa -ZmBwXarNeNQk7shBoJMBkpxqnvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZh -vnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCyx/yP2FS1k2Kdzs9Z+z0Y -zirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMWNY6E -0F/6MBr1mmz0DlP5OlvRHA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2 -VMOcUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xh -ecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEPMA0GA1UEBwwGQU5LQVJBMVYwVAYD -VQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg -QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1 -MTMxMDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RS -VVNUIEVsZWt0cm9uaWsgU2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFz -xLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZBTktBUkExVjBUBgNVBAoMTShj -KSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBCaWxpxZ9p -bSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9 -InTojAPBxhEqPZW8qZSwu5GXyGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1 -cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8iSi9BB35JYbOG7E6mQW6E -vAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ8y1U -iBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm -5Rh8i27fbMx4W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51 -b0dewQIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IB -AQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46sWrv7/hg0Uw2ZkUd -82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE -q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oS -N7wBGjSFvW5P55FyB0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8 -KsF8kOipKMDTkcatKIdAaLX/7KfS0zgYnNN9aV3wxqUeJBujR/xpB2jn5Jq0 -7Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2 -VMOcUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xh -ecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYD -VQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0g -R8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUw -HhcNMDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2 -VMOcUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xh -ecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYD -VQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0g -R8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjH -WHtPFoylzkkBH3MOrHUTpvqeLCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9 -irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKIx+XlZEdhR3n9wFHxwZnn -3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2gQrSd -iVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHps -mxcPbe9TmJEr5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1p -zpwACPI2/z7woQ8arBT9pmAPAgMBAAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Z -z58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8GA1UdEwEB/wQFMAMB -Af8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt -Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWo -lKMiVW4XSf/SKfE4Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbc -oCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+hGIAF728JRhX8tepb1mIvDS3LoV4 -nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P9Qk3iCQOLGsg -OqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9R -nuk5UrbnBEI= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUF -ADA/MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIw -NTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQg -Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN8 -6aXfTEc2pBsBHH8eV4qNw8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UK -IXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/ -cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O1RGvqa/l -mr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq -16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdL -iYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUq -dULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FCVGqY8A2tl+lS -XunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1tB6iE -fC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKX -TiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN -Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0G -A1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkG -BGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 -09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2 -WPWus4MzeKR6dBcZTulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2Jyf -tB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3gh -qMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKb -xkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1 -AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephg -IqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7m -XQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6MmnD+iMsJKxYEYMRBWqoTv -LQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk7tfGOB5j -GxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJI -oRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v -3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYs -fPQS ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUF -ADCByjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8w -HQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykg -MjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 -MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENl -cnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcN -MzYwNzE2MjM1OTU5WjCByjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlT -aWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTow -OAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp -emVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1Ymxp -YyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8 -RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbext0uz/o9+B1fs -70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhDY2pS -S9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+Q -ueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ -rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMK -z10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv -Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0 -cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/T -ZafC3ey78DAJ80M5+gKvMzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP -2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGq -CBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU -7qKEKQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqV -ir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4o -tp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8NhnacRHr2lVz2XTIIM6RU -thg/aFzyQkqFOFSDX9HoLPKsEdao7WNq ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE -BhMCVVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBG -YXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0GA1UEAxMmV2VsbHMg -RmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDAxMDExMTY0 -MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoT -C1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0 -aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mXx3Oqfz1c -QJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93O -vRw6esP3E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjB -qAr5dE8Hq6T54oN+J3N0Prj5OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43 -YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4jsNtlAHCEAQgAFG5Uhpq6 -zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGjYTBf -MA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAy -MDAGCCsGAQUFBwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRw -b2xpY3kwDQYJKoZIhvcNAQEFBQADggEBANIn3ZwKdyu7IvICtUpKkfnRLb7k -uxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrvm+0fazbuSCUlFLZW -ohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R -OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zk -r8QA1dhYJPz1j+zxx32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01 -QIroTmMatukgalHizqSQ33ZwmVxwQ023tqcZZE6St8WRPH9IFmV7Fv3L/PvZ -1dZPIWU7Sn9Ho/s= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUF -ADCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5 -LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0w -KwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkw -HhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMC -VVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMb -WFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBH -bG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwuIR1cRN8h -XX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9K -mHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavn -HTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3 -hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRaJSKNNCyy9mgd -Em3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvryxS3T -/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQD -AgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs -jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1 -cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcN -AQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc -/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYS -Nrsf16GBBEYgoyxtqZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT -5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGP -urt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd -50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUF -ADCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYG -A1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UE -CxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYx -MTE3MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTAT -BgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT -ZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0 -ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQ -LZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29 -dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk6KHYcWUNo1F7 -7rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/KaAcd -HJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR3 -2HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7 -W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7OR -tvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE -uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQ -aEfZYGDm/Ac9IiAXxPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqd -E8hhuvU5HIe6uL17In/2/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+ -MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+ -fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEFTCCA36gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBvjELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UE -ChMfU29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9z -dG1hc3RlcjEgMB4GA1UEAxMXQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxJTAjBgkq -hkiG9w0BCQEWFmhvc3RtYXN0ZXJAc3BpLWluYy5vcmcwHhcNMDMwMTE1MTYyOTE3 -WhcNMDcwMTE0MTYyOTE3WjCBvjELMAkGA1UEBhMCVVMxEDAOBgNVBAgTB0luZGlh -bmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMfU29mdHdhcmUgaW4g -dGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1hc3RlcjEgMB4GA1UE -AxMXQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxJTAjBgkqhkiG9w0BCQEWFmhvc3Rt -YXN0ZXJAc3BpLWluYy5vcmcwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAPB6 -rdoiLR3RodtM22LMcfwfqb5OrJNl7fwmvskgF7yP6sdD2bOfDIXhg9852jhY8/kL -VOFe1ELAL2OyN4RAxk0rliZQVgeTgqvgkOVIBbNwgnjN6mqtuWzFiPL+NXQExq40 -I3whM+4lEiwSHaV+MYxWanMdhc+kImT50LKfkxcdAgMBAAGjggEfMIIBGzAdBgNV -HQ4EFgQUB63oQR1/vda/G4F6P4xLiN4E0vowgesGA1UdIwSB4zCB4IAUB63oQR1/ -vda/G4F6P4xLiN4E0vqhgcSkgcEwgb4xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdJ -bmRpYW5hMRUwEwYDVQQHEwxJbmRpYW5hcG9saXMxKDAmBgNVBAoTH1NvZnR3YXJl -IGluIHRoZSBQdWJsaWMgSW50ZXJlc3QxEzARBgNVBAsTCmhvc3RtYXN0ZXIxIDAe -BgNVBAMTF0NlcnRpZmljYXRpb24gQXV0aG9yaXR5MSUwIwYJKoZIhvcNAQkBFhZo -b3N0bWFzdGVyQHNwaS1pbmMub3JnggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcN -AQEEBQADgYEAm/Abn8c2y1nO3fgpAIslxvi9iNBZDhQtJ0VQZY6wgSfANyDOR4DW -iexO/AlorB49KnkFS7TjCAoLOZhcg5FaNiKnlstMI5krQmau1Qnb/vGSNsE/UGms -1ts+QYPUs0KmGEAFUri2XzLy+aQo9Kw74VBvqnxvaaMeY5yMcKNOieY= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIIDjCCBfagAwIBAgIJAOiOtsn4KhQoMA0GCSqGSIb3DQEBBQUAMIG8MQswCQYD -VQQGEwJVUzEQMA4GA1UECBMHSW5kaWFuYTEVMBMGA1UEBxMMSW5kaWFuYXBvbGlz -MSgwJgYDVQQKEx9Tb2Z0d2FyZSBpbiB0aGUgUHVibGljIEludGVyZXN0MRMwEQYD -VQQLEwpob3N0bWFzdGVyMR4wHAYDVQQDExVDZXJ0aWZpY2F0ZSBBdXRob3JpdHkx -JTAjBgkqhkiG9w0BCQEWFmhvc3RtYXN0ZXJAc3BpLWluYy5vcmcwHhcNMDgwNTEz -MDgwNzU2WhcNMTgwNTExMDgwNzU2WjCBvDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMfU29mdHdh -cmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1hc3RlcjEe -MBwGA1UEAxMVQ2VydGlmaWNhdGUgQXV0aG9yaXR5MSUwIwYJKoZIhvcNAQkBFhZo -b3N0bWFzdGVyQHNwaS1pbmMub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC -CgKCAgEA3DbmR0LCxFF1KYdAw9iOIQbSGE7r7yC9kDyFEBOMKVuUY/b0LfEGQpG5 -GcRCaQi/izZF6igFM0lIoCdDkzWKQdh4s/Dvs24t3dHLfer0dSbTPpA67tfnLAS1 -fOH1fMVO73e9XKKTM5LOfYFIz2u1IiwIg/3T1c87Lf21SZBb9q1NE8re06adU1Fx -Y0b4ShZcmO4tbZoWoXaQ4mBDmdaJ1mwuepiyCwMs43pPx93jzONKao15Uvr0wa8u -jyoIyxspgpJyQ7zOiKmqp4pRQ1WFmjcDeJPI8L20QcgHQprLNZd6ioFl3h1UCAHx -ZFy3FxpRvB7DWYd2GBaY7r/2Z4GLBjXFS21ZGcfSxki+bhQog0oQnBv1b7ypjvVp -/rLBVcznFMn5WxRTUQfqzj3kTygfPGEJ1zPSbqdu1McTCW9rXRTunYkbpWry9vjQ -co7qch8vNGopCsUK7BxAhRL3pqXTT63AhYxMfHMgzFMY8bJYTAH1v+pk1Vw5xc5s -zFNaVrpBDyXfa1C2x4qgvQLCxTtVpbJkIoRRKFauMe5e+wsWTUYFkYBE7axt8Feo -+uthSKDLG7Mfjs3FIXcDhB78rKNDCGOM7fkn77SwXWfWT+3Qiz5dW8mRvZYChD3F -TbxCP3T9PF2sXEg2XocxLxhsxGjuoYvJWdAY4wCAs1QnLpnwFVMCAwEAAaOCAg8w -ggILMB0GA1UdDgQWBBQ0cdE41xU2g0dr1zdkQjuOjVKdqzCB8QYDVR0jBIHpMIHm -gBQ0cdE41xU2g0dr1zdkQjuOjVKdq6GBwqSBvzCBvDELMAkGA1UEBhMCVVMxEDAO -BgNVBAgTB0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMf -U29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1h -c3RlcjEeMBwGA1UEAxMVQ2VydGlmaWNhdGUgQXV0aG9yaXR5MSUwIwYJKoZIhvcN -AQkBFhZob3N0bWFzdGVyQHNwaS1pbmMub3JnggkA6I62yfgqFCgwDwYDVR0TAQH/ -BAUwAwEB/zARBglghkgBhvhCAQEEBAMCAAcwCQYDVR0SBAIwADAuBglghkgBhvhC -AQ0EIRYfU29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDAwBglghkgBhvhC -AQQEIxYhaHR0cHM6Ly9jYS5zcGktaW5jLm9yZy9jYS1jcmwucGVtMDIGCWCGSAGG -+EIBAwQlFiNodHRwczovL2NhLnNwaS1pbmMub3JnL2NlcnQtY3JsLnBlbTAhBgNV -HREEGjAYgRZob3N0bWFzdGVyQHNwaS1pbmMub3JnMA4GA1UdDwEB/wQEAwIBBjAN -BgkqhkiG9w0BAQUFAAOCAgEAtM294LnqsgMrfjLp3nI/yUuCXp3ir1UJogxU6M8Y -PCggHam7AwIvUjki+RfPrWeQswN/2BXja367m1YBrzXU2rnHZxeb1NUON7MgQS4M -AcRb+WU+wmHo0vBqlXDDxm/VNaSsWXLhid+hoJ0kvSl56WEq2dMeyUakCHhBknIP -qxR17QnwovBc78MKYiC3wihmrkwvLo9FYyaW8O4x5otVm6o6+YI5HYg84gd1GuEP -sTC8cTLSOv76oYnzQyzWcsR5pxVIBcDYLXIC48s9Fmq6ybgREOJJhcyWR2AFJS7v -dVkz9UcZFu/abF8HyKZQth3LZjQl/GaD68W2MEH4RkRiqMEMVObqTFoo5q7Gt/5/ -O5aoLu7HaD7dAD0prypjq1/uSSotxdz70cbT0ZdWUoa2lOvUYFG3/B6bzAKb1B+P -+UqPti4oOxfMxaYF49LTtcYDyeFIQpvLP+QX4P4NAZUJurgNceQJcHdC2E3hQqlg -g9cXiUPS1N2nGLar1CQlh7XU4vwuImm9rWgs/3K1mKoGnOcqarihk3bOsPN/nOHg -T7jYhkalMwIsJWE3KpLIrIF0aGOHM3a9BX9e1dUCbb2v/ypaqknsmHlHU5H2DjRa -yaXG67Ljxay2oHA1u8hRadDytaIybrw/oDc5fHE2pgXfDBLkFqfF1stjo5VwP+YE -o2A= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc -MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj -IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB -IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE -RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl -U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 -IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU -ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC -QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr -rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S -NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc -QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH -txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP -BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC -AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp -tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa -IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl -6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ -xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU -Cm26OWMohpLzGITY+9HPBVZkVw== ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIGJDCCBY2gAwIBAgIEQoaroDANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC -VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u -ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc -KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u -ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjA3 -MTQxNzEwMjhaFw0xNDA3MTQxNzQwMjhaMFwxCzAJBgNVBAYTAlVTMRUwEwYDVQQK -EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xGzAZBgNV -BAMTEkRpZ2lDZXJ0IEdsb2JhbCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBAMQ8vMy66mLmnkIjr7SyEa5ijdmh04/MFHIZ7Zn2/d5du1nAsMKvaplS -lVcLNf/hhvqvosPBBWUnIHYvClQlfOor3ZVBV5sPO89H6AEGjMVESPwHLvNygzBR -lJ5pOoOph5AU2V7EoniPwT7UGWEOGufcGpUgQb5vF9q4HEHumLD61x01PxanBCgT -XT0FdZouhp4ssBeHIFhX7+HqVWC4LHAhrCljDBD8YLz51Rw3ZNW0+x6rJjlGiKTL -zTBnwCZ55cpo+SLX5dKxu0hMmwuYW0KS5dLtDkcw+t0nVmNqpQHHjq/wTjsbVRVE -1T5NVx7hkeq4oI/OOmNflom6CD7+RLsCAwEAAaOCAwUwggMBMBIGA1UdEwEB/wQI -MAYBAf8CAQAwggEyBgNVHSAEggEpMIIBJTCCASEGCSqGSIb2fQdLAjCCARIwJgYI -KwYBBQUHAgEWGmh0dHA6Ly93d3cuZW50cnVzdC5uZXQvY3BzMIHnBggrBgEFBQcC -AjCB2hqB10ZvciB1c2Ugc29sZWx5IHdpdGggU1NMIGFuZCBTL01JTUUgY2VydGlm -aWNhdGVzIGlzc3VlZCBieSBEaWdpY2VydCwgSW5jLiB0byBhdXRob3JpemVkIHN1 -YnNjcmliZXJzLg0KRE9FUyBOT1QgcmVwcmVzZW50IGFueSBlbmRvcnNlbWVudCBi -eSBFbnRydXN0IEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMgYXMgdG8gdGhlIGlkZW50 -aXR5IG9mIGFueSBjZXJ0aWZpY2F0ZSBob2xkZXIuMDEGA1UdJQQqMCgGCCsGAQUF -BwMBBggrBgEFBQcDAgYIKwYBBQUHAwQGCCsGAQUFBwMJMIIBGAYDVR0fBIIBDzCC -AQswKKAmoCSGImh0dHA6Ly9jcmwuZW50cnVzdC5uZXQvc2VydmVyMS5jcmwwgd6g -gduggdikgdUwgdIxCzAJBgNVBAYTAlVTMRQwEgYDVQQKEwtFbnRydXN0Lm5ldDE7 -MDkGA1UECxMyd3d3LmVudHJ1c3QubmV0L0NQUyBpbmNvcnAuIGJ5IHJlZi4gKGxp -bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0 -ZWQxOjA4BgNVBAMTMUVudHJ1c3QubmV0IFNlY3VyZSBTZXJ2ZXIgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEwCwYDVR0PBAQDAgEGMB8GA1Ud -IwQYMBaAFPAXYhNVPbP/CgBr+1CEl/PtYtAaMB0GA1UdDgQWBBSnxxOgegE8ne+C -SIJI1XNRthJWKjAZBgkqhkiG9n0HQQAEDDAKGwRWNy4xAwIAgTANBgkqhkiG9w0B -AQUFAAOBgQBK8bPOaGnjWKNh7bYWyJOxGDA+4HLfTz3iTeG4/D/ByeNFqV2pwdqj -5TbXjtYPrTavbLxE5ppGlKYRoNBS59pVsPYchftjUnu2mY8f4stHZKLrCGXmUdsc -S21/U58eDTGT1DBdHm4BBydgXbvT9ONsHSAPdSozEKe3idepFxQyAw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEUDCCA7mgAwIBAgIJAN4ppNGwj6yIMA0GCSqGSIb3DQEBBAUAMIHMMQswCQYD -VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5j -aXNjbzEZMBcGA1UEChMQTGluZGVuIExhYiwgSW5jLjEpMCcGA1UECxMgTGluZGVu -IExhYiBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxKTAnBgNVBAMTIExpbmRlbiBMYWIg -Q2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYJKoZIhvcNAQkBFhBjYUBsaW5kZW5s -YWIuY29tMB4XDTA1MDQyMTAyNDAzMVoXDTI1MDQxNjAyNDAzMVowgcwxCzAJBgNV -BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp -c2NvMRkwFwYDVQQKExBMaW5kZW4gTGFiLCBJbmMuMSkwJwYDVQQLEyBMaW5kZW4g -TGFiIENlcnRpZmljYXRlIEF1dGhvcml0eTEpMCcGA1UEAxMgTGluZGVuIExhYiBD -ZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgkqhkiG9w0BCQEWEGNhQGxpbmRlbmxh -Yi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKXh1MThucdTbMg9bYBO -rAm8yWns32YojB0PRfbq8rUjepEhTm3/13s0u399Uc202v4ejcGhkIDWJZd2NZMF -oKrhmRfxGHSKPCuFaXC3jh0lRECj7k8FoPkcmaPjSyodrDFDUUuv+C06oYJoI+rk -8REyal9NwgHvqCzOrZtiTXAdAgMBAAGjggE2MIIBMjAdBgNVHQ4EFgQUO1zK2e1f -1wO1fHAjq6DTJobKDrcwggEBBgNVHSMEgfkwgfaAFDtcytntX9cDtXxwI6ug0yaG -yg63oYHSpIHPMIHMMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEW -MBQGA1UEBxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQTGluZGVuIExhYiwgSW5j -LjEpMCcGA1UECxMgTGluZGVuIExhYiBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxKTAn -BgNVBAMTIExpbmRlbiBMYWIgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYJKoZI -hvcNAQkBFhBjYUBsaW5kZW5sYWIuY29tggkA3imk0bCPrIgwDAYDVR0TBAUwAwEB -/zANBgkqhkiG9w0BAQQFAAOBgQA/ZkgfvwHYqk1UIAKZS3kMCxz0HvYuEQtviwnu -xA39CIJ65Zozs28Eg1aV9/Y+Of7TnWhW+U3J3/wD/GghaAGiKK6vMn9gJBIdBX/9 -e6ef37VGyiOEFFjnUIbuk0RWty0orN76q/lI/xjCi15XSA/VSq2j4vmnwfZcPTDu -glmQ1A== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV -UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy -dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 -MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx -dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f -BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A -cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC -AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ -MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm -aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw -ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj -IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF -MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA -A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y -7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh -1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 ------END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEuDCCA6CgAwIBAgIBBDANBgkqhkiG9w0BAQUFADCBtDELMAkGA1UEBhMCQlIx +EzARBgNVBAoTCklDUC1CcmFzaWwxPTA7BgNVBAsTNEluc3RpdHV0byBOYWNpb25h +bCBkZSBUZWNub2xvZ2lhIGRhIEluZm9ybWFjYW8gLSBJVEkxETAPBgNVBAcTCEJy +YXNpbGlhMQswCQYDVQQIEwJERjExMC8GA1UEAxMoQXV0b3JpZGFkZSBDZXJ0aWZp +Y2Fkb3JhIFJhaXogQnJhc2lsZWlyYTAeFw0wMTExMzAxMjU4MDBaFw0xMTExMzAy +MzU5MDBaMIG0MQswCQYDVQQGEwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDE9MDsG +A1UECxM0SW5zdGl0dXRvIE5hY2lvbmFsIGRlIFRlY25vbG9naWEgZGEgSW5mb3Jt +YWNhbyAtIElUSTERMA8GA1UEBxMIQnJhc2lsaWExCzAJBgNVBAgTAkRGMTEwLwYD +VQQDEyhBdXRvcmlkYWRlIENlcnRpZmljYWRvcmEgUmFpeiBCcmFzaWxlaXJhMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwPMudwX/hvm+Uh2b/lQAcHVA +isamaLkWdkwP9/S/tOKIgRrL6Oy+ZIGlOUdd6uYtk9Ma/3pUpgcfNAj0vYm5gsyj +Qo9emsc+x6m4VWwk9iqMZSCK5EQkAq/Ut4n7KuLE1+gdftwdIgxfUsPt4CyNrY50 +QV57KM2UT8x5rrmzEjr7TICGpSUAl2gVqe6xaii+bmYR1QrmWaBSAG59LrkrjrYt +bRhFboUDe1DK+6T8s5L6k8c8okpbHpa9veMztDVC9sPJ60MWXh6anVKo1UcLcbUR +yEeNvZneVRKAAU6ouwdjDvwlsaKydFKwed0ToQ47bmUKgcm+wV3eTRk36UOnTwID +AQABo4HSMIHPME4GA1UdIARHMEUwQwYFYEwBAQAwOjA4BggrBgEFBQcCARYsaHR0 +cDovL2FjcmFpei5pY3BicmFzaWwuZ292LmJyL0RQQ2FjcmFpei5wZGYwPQYDVR0f +BDYwNDAyoDCgLoYsaHR0cDovL2FjcmFpei5pY3BicmFzaWwuZ292LmJyL0xDUmFj +cmFpei5jcmwwHQYDVR0OBBYEFIr68VeEERM1kEL6V0lUaQ2kxPA3MA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAZA5c1 +U/hgIh6OcgLAfiJgFWpvmDZWqlV30/bHFpj8iBobJSm5uDpt7TirYh1Uxe3fQaGl +YjJe+9zd+izPRbBqXPVQA34EXcwk4qpWuf1hHriWfdrx8AcqSqr6CuQFwSr75Fos +SzlwDADa70mT7wZjAmQhnZx2xJ6wfWlT9VQfS//JYeIc7Fue2JNLd00UOSMMaiK/ +t79enKNHEA2fupH3vEigf5Eh4bVAN5VohrTm6MY53x7XQZZr1ME7a55lFEnSeT0u +mlOAjR2mAbvSM5X5oSZNrmetdzyTj2flCM8CC7MLab0kkdngRIlUBGHF1/S5nmPb +K+9A46sd33oqK8n8 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGCDCCA/CgAwIBAgIBATANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290 +IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB +IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA +Y2FjZXJ0Lm9yZzAeFw0wNTEwMTQwNzM2NTVaFw0zMzAzMjgwNzM2NTVaMFQxFDAS +BgNVBAoTC0NBY2VydCBJbmMuMR4wHAYDVQQLExVodHRwOi8vd3d3LkNBY2VydC5v +cmcxHDAaBgNVBAMTE0NBY2VydCBDbGFzcyAzIFJvb3QwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCrSTURSHzSJn5TlM9Dqd0o10Iqi/OHeBlYfA+e2ol9 +4fvrcpANdKGWZKufoCSZc9riVXbHF3v1BKxGuMO+f2SNEGwk82GcwPKQ+lHm9WkB +Y8MPVuJKQs/iRIwlKKjFeQl9RrmK8+nzNCkIReQcn8uUBByBqBSzmGXEQ+xOgo0J +0b2qW42S0OzekMV/CsLj6+YxWl50PpczWejDAz1gM7/30W9HxM3uYoNSbi4ImqTZ +FRiRpoWSR7CuSOtttyHshRpocjWr//AQXcD0lKdq1TuSfkyQBX6TwSyLpI5idBVx +bgtxA+qvFTia1NIFcm+M+SvrWnIl+TlG43IbPgTDZCciECqKT1inA62+tC4T7V2q +SNfVfdQqe1z6RgRQ5MwOQluM7dvyz/yWk+DbETZUYjQ4jwxgmzuXVjit89Jbi6Bb +6k6WuHzX1aCGcEDTkSm3ojyt9Yy7zxqSiuQ0e8DYbF/pCsLDpyCaWt8sXVJcukfV +m+8kKHA4IC/VfynAskEDaJLM4JzMl0tF7zoQCqtwOpiVcK01seqFK6QcgCExqa5g +eoAmSAC4AcCTY1UikTxW56/bOiXzjzFU6iaLgVn5odFTEcV7nQP2dBHgbbEsPyyG +kZlxmqZ3izRg0RS0LKydr4wQ05/EavhvE/xzWfdmQnQeiuP43NJvmJzLR5iVQAX7 +6QIDAQABo4G/MIG8MA8GA1UdEwEB/wQFMAMBAf8wXQYIKwYBBQUHAQEEUTBPMCMG +CCsGAQUFBzABhhdodHRwOi8vb2NzcC5DQWNlcnQub3JnLzAoBggrBgEFBQcwAoYc +aHR0cDovL3d3dy5DQWNlcnQub3JnL2NhLmNydDBKBgNVHSAEQzBBMD8GCCsGAQQB +gZBKMDMwMQYIKwYBBQUHAgEWJWh0dHA6Ly93d3cuQ0FjZXJ0Lm9yZy9pbmRleC5w +aHA/aWQ9MTAwDQYJKoZIhvcNAQEEBQADggIBAH8IiKHaGlBJ2on7oQhy84r3HsQ6 +tHlbIDCxRd7CXdNlafHCXVRUPIVfuXtCkcKZ/RtRm6tGpaEQU55tiKxzbiwzpvD0 +nuB1wT6IRanhZkP+VlrRekF490DaSjrxC1uluxYG5sLnk7mFTZdPsR44Q4Dvmw2M +77inYACHV30eRBzLI++bPJmdr7UpHEV5FpZNJ23xHGzDwlVks7wU4vOkHx4y/CcV +Bc/dLq4+gmF78CEQGPZE6lM5+dzQmiDgxrvgu1pPxJnIB721vaLbLmINQjRBvP+L +ivVRIqqIMADisNS8vmW61QNXeZvo3MhN+FDtkaVSKKKs+zZYPumUK5FQhxvWXtaM +zPcPEAxSTtAWYeXlCmy/F8dyRlecmPVsYGN6b165Ti/Iubm7aoW8mA3t+T6XhDSU +rgCvoeXnkm5OvfPi2RSLXNLrAWygF6UtEOucekq9ve7O/e0iQKtwOIj1CodqwqsF +YMlIBdpTwd5Ed2qz8zw87YC8pjhKKSRf/lk7myV6VmMAZLldpGJ9VzZPrYPvH5JT +oI53V93lYRE9IwCQTDz6o2CTBKOvNfYOao9PSmCnhQVsRqGP9Md246FZV/dxssRu +FFxtbUFm3xuTsdQAw+7Lzzw9IYCpX2Nl/N3gX6T0K/CFcUHUZyX7GrGXrtaZghNB +0m6lG5kngOcLqagA +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290 +IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB +IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA +Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO +BgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEi +MCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJ +ARYSc3VwcG9ydEBjYWNlcnQub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEAziLA4kZ97DYoB1CW8qAzQIxL8TtmPzHlawI229Z89vGIj053NgVBlfkJ +8BLPRoZzYLdufujAWGSuzbCtRRcMY/pnCujW0r8+55jE8Ez64AO7NV1sId6eINm6 +zWYyN3L69wj1x81YyY7nDl7qPv4coRQKFWyGhFtkZip6qUtTefWIonvuLwphK42y +fk1WpRPs6tqSnqxEQR5YYGUFZvjARL3LlPdCfgv3ZWiYUQXw8wWRBB0bF4LsyFe7 +w2t6iPGwcswlWyCR7BYCEo8y6RcYSNDHBS4CMEK4JZwFaz+qOqfrU0j36NK2B5jc +G8Y0f3/JHIJ6BVgrCFvzOKKrF11myZjXnhCLotLddJr3cQxyYN/Nb5gznZY0dj4k +epKwDpUeb+agRThHqtdB7Uq3EvbXG4OKDy7YCbZZ16oE/9KTfWgu3YtLq1i6L43q +laegw1SJpfvbi1EinbLDvhG+LJGGi5Z4rSDTii8aP8bQUWWHIbEZAWV/RRyH9XzQ +QUxPKZgh/TMfdQwEUfoZd9vUFBzugcMd9Zi3aQaRIt0AUMyBMawSB3s42mhb5ivU +fslfrejrckzzAeVLIL+aplfKkQABi6F1ITe1Yw1nPkZPcCBnzsXWWdsC4PDSy826 +YreQQejdIOQpvGQpQsgi3Hia/0PsmBsJUUtaWsJx8cTLc6nloQsCAwEAAaOCAc4w +ggHKMB0GA1UdDgQWBBQWtTIb1Mfz4OaO873SsDrusjkY0TCBowYDVR0jBIGbMIGY +gBQWtTIb1Mfz4OaO873SsDrusjkY0aF9pHsweTEQMA4GA1UEChMHUm9vdCBDQTEe +MBwGA1UECxMVaHR0cDovL3d3dy5jYWNlcnQub3JnMSIwIAYDVQQDExlDQSBDZXJ0 +IFNpZ25pbmcgQXV0aG9yaXR5MSEwHwYJKoZIhvcNAQkBFhJzdXBwb3J0QGNhY2Vy +dC5vcmeCAQAwDwYDVR0TAQH/BAUwAwEB/zAyBgNVHR8EKzApMCegJaAjhiFodHRw +czovL3d3dy5jYWNlcnQub3JnL3Jldm9rZS5jcmwwMAYJYIZIAYb4QgEEBCMWIWh0 +dHBzOi8vd3d3LmNhY2VydC5vcmcvcmV2b2tlLmNybDA0BglghkgBhvhCAQgEJxYl +aHR0cDovL3d3dy5jYWNlcnQub3JnL2luZGV4LnBocD9pZD0xMDBWBglghkgBhvhC +AQ0ESRZHVG8gZ2V0IHlvdXIgb3duIGNlcnRpZmljYXRlIGZvciBGUkVFIGhlYWQg +b3ZlciB0byBodHRwOi8vd3d3LmNhY2VydC5vcmcwDQYJKoZIhvcNAQEEBQADggIB +ACjH7pyCArpcgBLKNQodgW+JapnM8mgPf6fhjViVPr3yBsOQWqy1YPaZQwGjiHCc +nWKdpIevZ1gNMDY75q1I08t0AoZxPuIrA2jxNGJARjtT6ij0rPtmlVOKTV39O9lg +18p5aTuxZZKmxoGCXJzN600BiqXfEVWqFcofN8CCmHBh22p8lqOOLlQ+TyGpkO/c +gr/c6EWtTZBzCDyUZbAEmXZ/4rzCahWqlwQ3JNgelE5tDlG+1sSPypZt90Pf6DBl +Jzt7u0NDY8RD97LsaMzhGY4i+5jhe1o+ATc7iwiwovOVThrLm82asduycPAtStvY +sONvRUgzEv/+PDIqVPfE94rwiCPCR/5kenHA0R6mY7AHfqQv0wGP3J8rtsYIqQ+T +SCX8Ev2fQtzzxD72V7DX3WnRBnc0CkvSyqD/HMaMyRa+xMwyN2hzXwj7UfdJUzYF +CpUCTPJ5GhD22Dp1nPMd8aINcGeGG7MW9S/lpOt5hvk9C8JzC6WZrG/8Z7jlLwum +GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk +zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW +omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIESzCCAzOgAwIBAgIJAJigUTEEXRQpMA0GCSqGSIb3DQEBBQUAMHYxCzAJBgNV +BAYTAkRFMQ8wDQYDVQQIEwZIZXNzZW4xDjAMBgNVBAcTBUZ1bGRhMRAwDgYDVQQK +EwdEZWJjb25mMRMwEQYDVQQDEwpEZWJjb25mIENBMR8wHQYJKoZIhvcNAQkBFhBq +b2VyZ0BkZWJpYW4ub3JnMB4XDTA1MTEwNTE3NTUxNFoXDTE1MTEwMzE3NTUxNFow +djELMAkGA1UEBhMCREUxDzANBgNVBAgTBkhlc3NlbjEOMAwGA1UEBxMFRnVsZGEx +EDAOBgNVBAoTB0RlYmNvbmYxEzARBgNVBAMTCkRlYmNvbmYgQ0ExHzAdBgkqhkiG +9w0BCQEWEGpvZXJnQGRlYmlhbi5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCvbOo0SrIwI5IMlsshH8WF3dHB9r9JlSKhMPaybawa1EyvZspMQ3wa +F5qxNf3Sj+NElEmjseEqvCZiIIzqwerHu0Qw62cDYCdCd2+Wb5m0bPYB5CGHiyU1 +eNP0je42O0YeXG2BvUujN8AviocVo39X2YwNQ0ryy4OaqYgm2pRlbtT2ESbF+SfV +Y2iqQj/f8ymF+lHo/pz8tbAqxWcqaSiHFAVQJrdqtFhtoodoNiE3q76zJoUkZTXB +k60Yc3MJSnatZCpnsSBr/D7zpntl0THrUjjtdRWCjQVhqfhM1yZJV+ApbLdheFh0 +ZWlSxdnp25p0q0XYw/7G92ELyFDfBUUNAgMBAAGjgdswgdgwHQYDVR0OBBYEFMuV +dFNb4mCWUFbcP5LOtxFLrEVTMIGoBgNVHSMEgaAwgZ2AFMuVdFNb4mCWUFbcP5LO +txFLrEVToXqkeDB2MQswCQYDVQQGEwJERTEPMA0GA1UECBMGSGVzc2VuMQ4wDAYD +VQQHEwVGdWxkYTEQMA4GA1UEChMHRGViY29uZjETMBEGA1UEAxMKRGViY29uZiBD +QTEfMB0GCSqGSIb3DQEJARYQam9lcmdAZGViaWFuLm9yZ4IJAJigUTEEXRQpMAwG +A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAGZXxHg4mnkvilRIM1EQfGdY +S5b/WcyF2MYSTeTvK4aIB6VHwpZoZCnDGj2m2D3CkHT0upAD9o0zM1tdsfncLzV+ +mDT/jNmBtYo4QXx5vEPwvEIcgrWjwk7SyaEUhZjtolTkHB7ACl0oD0r71St4iEPR +qTUCEXk2E47bg1Fz58wNt/yo2+4iqiRjg1XCH4evkQuhpW+dTZnDyFNqwSYZapOE +TBA+9zBb6xD1KM2DdY7r4GiyYItN0BKLfuWbh9LXGbl1C+f4P11g+m2MPiavIeCe +1iazG5pcS3KoTLACsYlEX24TINtg4kcuS81XdllcnsV3Kdts0nIqPj6uhTTZD0k= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs +IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 +MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h +bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt +H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 +uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX +mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX +a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN +E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 +WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD +VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 +Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU +cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx +IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN +AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH +YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC +Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX +c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a +mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw +MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD +VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA +A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul +CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n +tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl +dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch +PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC ++Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O +BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl +MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk +ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB +IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X +7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz +43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY +eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl +pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA +WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx +MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB +ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV +BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV +6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX +GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP +dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH +1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF +62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW +BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL +MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU +cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv +b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6 +IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/ +iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao +GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh +4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm +XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1 +MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK +EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh +BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq +xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G +87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i +2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U +WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1 +0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G +A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr +pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL +ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm +aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv +hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm +hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X +dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3 +P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y +iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no +xqE= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP +bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2 +MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft +ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk +hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym +1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW +OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb +2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko +O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU +AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF +Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb +LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir +oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C +MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds +sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP +bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2 +MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft +ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC +206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci +KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2 +JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9 +BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e +Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B +PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67 +Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq +Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ +o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3 ++L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj +YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj +FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn +xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2 +LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc +obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8 +CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe +IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA +DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F +AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX +Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb +AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl +Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw +RY8mkaKO/qk= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx +HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh +IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyOTA2MDAwMFoXDTM3MTEyMDE1 +MDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg +SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M +IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnej8Mlo2k06AX3dLm/WpcZuS+U +0pPlLYnKhHw/EEMbjIt8hFj4JHxIzyr9wBXZGH6EGhfT257XyuTZ16pYUYfw8ItI +TuLCxFlpMGK2MKKMCxGZYTVtfu/FsRkGIBKOQuHfD5YQUqjPnF+VFNivO3ULMSAf +RC+iYkGzuxgh28pxPIzstrkNn+9R7017EvILDOGsQI93f7DKeHEMXRZxcKLXwjqF +zQ6axOAAsNUl6twr5JQtOJyJQVdkKGUZHLZEtMgxa44Be3ZZJX8VHIQIfHNlIAqh +BC4aMqiaILGcLCFZ5/vP7nAtCMpjPiybkxlqpMKX/7eGV4iFbJ4VFitNLLMCAwEA +AaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUoTYwFsuGkABFgFOxj8jY +PXy+XxIwHwYDVR0jBBgwFoAUoTYwFsuGkABFgFOxj8jYPXy+XxIwDgYDVR0PAQH/ +BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQCKIBilvrMvtKaEAEAwKfq0FHNMeUWn +9nDg6H5kHgqVfGphwu9OH77/yZkfB2FK4V1Mza3u0FIy2VkyvNp5ctZ7CegCgTXT +Ct8RHcl5oIBN/lrXVtbtDyqvpxh1MwzqwWEFT2qaifKNuZ8u77BfWgDrvq2g+EQF +Z7zLBO+eZMXpyD8Fv8YvBxzDNnGGyjhmSs3WuEvGbKeXO/oTLW4jYYehY0KswsuX +n2Fozy1MBJ3XJU8KDk2QixhWqJNIV9xvrr2eZ1d3iVCzvhGbRWeDhhmH05i9CBoW +H1iCC+GWaQVLjuyDUTEH1dSf/1l7qG6Fz9NLqUmwX7A5KGgOc90lmt4S +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIF5jCCA86gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx +HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh +IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyOTA2MDAwMFoXDTM3MDkyODIz +NDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg +SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M +IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALQ3WggWmRToVbEbJGv8x4vmh6mJ +7ouZzU9AhqS2TcnZsdw8TQ2FTBVsRotSeJ/4I/1n9SQ6aF3Q92RhQVSji6UI0ilb +m2BPJoPRYxJWSXakFsKlnUWsi4SVqBax7J/qJBrvuVdcmiQhLE0OcR+mrF1FdAOY +xFSMFkpBd4aVdQxHAWZg/BXxD+r1FHjHDtdugRxev17nOirYlxcwfACtCJ0zr7iZ +YYCLqJV+FNwSbKTQ2O9ASQI2+W6p1h2WVgSysy0WVoaP2SBXgM1nEG2wTPDaRrbq +JS5Gr42whTg0ixQmgiusrpkLjhTXUr2eacOGAgvqdnUxCc4zGSGFQ+aJLZ8lN2fx +I2rSAG2X+Z/nKcrdH9cG6rjJuQkhn8g/BsXS6RJGAE57COtCPStIbp1n3UsC5ETz +kxmlJ85per5n0/xQpCyrw2u544BMzwVhSyvcG7mm0tCq9Stz+86QNZ8MUhy/XCFh +EVsVS6kkUfykXPcXnbDS+gfpj1bkGoxoigTTfFrjnqKhynFbotSg5ymFXQNoKk/S +Btc9+cMDLz9l+WceR0DTYw/j1Y75hauXTLPXJuuWCpTehTacyH+BCQJJKg71ZDIM +gtG6aoIbs0t0EfOMd9afv9w3pKdVBC/UMejTRrkDfNoSTllkt1ExMVCgyhwn2RAu +rda9EGYrw7AiShJbAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FE9pbQN+nZ8HGEO8txBO1b+pxCAoMB8GA1UdIwQYMBaAFE9pbQN+nZ8HGEO8txBO +1b+pxCAoMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAO/Ouyugu +h4X7ZVnnrREUpVe8WJ8kEle7+z802u6teio0cnAxa8cZmIDJgt43d15Ui47y6mdP +yXSEkVYJ1eV6moG2gcKtNuTxVBFT8zRFASbI5Rq8NEQh3q0l/HYWdyGQgJhXnU7q +7C+qPBR7V8F+GBRn7iTGvboVsNIYvbdVgaxTwOjdaRITQrcCtQVBynlQboIOcXKT +RuidDV29rs4prWPVVRaAMCf/drr3uNZK49m1+VLQTkCpx+XCMseqdiThawVQ68W/ +ClTluUI8JPu3B5wwn3la5uBAUhX0/Kr0VvlEl4ftDmVyXr4m+02kLQgH3thcoNyB +M5kYJRF3p+v9WAksmWsbivNSPxpNSGDxoPYzAlOL7SUJuA0t7Zdz7NeWH45gDtoQ +my8YJPamTQr5O8t1wswvziRpyQoijlmn94IM19drNZxDAGrElWe6nEXLuA4399xO +AU++CrYD062KRffaJ00psUjf5BHklka9bAI+1lHIlRcBFanyqqryvy9lG2/QuRqT +9Y41xICHPpQvZuTpqP9BnHAqTyo5GJUefvthATxRCC4oGKQWDzH9OmwjkyB24f0H +hdFbP9IcczLd+rn4jM8Ch3qaluTtT4mNU0OrDhPAARW0eTjb/G49nlG2uBOLZ8/5 +fNkiHfZdxRwBL5joeiQYvITX+txyW/fBOmg= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFajCCBFKgAwIBAgIEPLU9RjANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQKEwli +ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEGA1UEAxMq +YmVUUlVTVGVkIFJvb3QgQ0EtQmFsdGltb3JlIEltcGxlbWVudGF0aW9uMB4XDTAy +MDQxMTA3Mzg1MVoXDTIyMDQxMTA3Mzg1MVowZjESMBAGA1UEChMJYmVUUlVTVGVk +MRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAxBgNVBAMTKmJlVFJVU1Rl +ZCBSb290IENBLUJhbHRpbW9yZSBJbXBsZW1lbnRhdGlvbjCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBALx+xDmcjOPWHIb/ymKt4H8wRXqOGrO4x/nRNv8i +805qX4QQ+2aBw5R5MdKR4XeOGCrDFN5R9U+jK7wYFuK13XneIviCfsuBH/0nLI/6 +l2Qijvj/YaOcGx6Sj8CoCd8JEey3fTGaGuqDIQY8n7pc/5TqarjDa1U0Tz0yH92B +FODEPM2dMPgwqZfT7syj0B9fHBOB1BirlNFjw55/NZKeX0Tq7PQiXLfoPX2k+Ymp +kbIq2eszh+6l/ePazIjmiSZuxyuC0F6dWdsU7JGDBcNeDsYq0ATdcT0gTlgn/FP7 +eHgZFLL8kFKJOGJgB7Sg7KxrUNb9uShr71ItOrL/8QFArDcCAwEAAaOCAh4wggIa +MA8GA1UdEwEB/wQFMAMBAf8wggG1BgNVHSAEggGsMIIBqDCCAaQGDysGAQQBsT4A +AAEJKIORMTCCAY8wggFIBggrBgEFBQcCAjCCAToaggE2UmVsaWFuY2Ugb24gb3Ig +dXNlIG9mIHRoaXMgQ2VydGlmaWNhdGUgY3JlYXRlcyBhbiBhY2tub3dsZWRnbWVu +dCBhbmQgYWNjZXB0YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJk +IHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwgdGhlIENlcnRpZmljYXRpb24g +UHJhY3RpY2UgU3RhdGVtZW50IGFuZCB0aGUgUmVseWluZyBQYXJ0eSBBZ3JlZW1l +bnQsIHdoaWNoIGNhbiBiZSBmb3VuZCBhdCB0aGUgYmVUUlVTVGVkIHdlYiBzaXRl +LCBodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20vcHJvZHVjdHNfc2VydmljZXMvaW5k +ZXguaHRtbDBBBggrBgEFBQcCARY1aHR0cDovL3d3dy5iZXRydXN0ZWQuY29tL3By +b2R1Y3RzX3NlcnZpY2VzL2luZGV4Lmh0bWwwHQYDVR0OBBYEFEU9w6nR3D8kVpgc +cxiIav+DR+22MB8GA1UdIwQYMBaAFEU9w6nR3D8kVpgccxiIav+DR+22MA4GA1Ud +DwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEASZK8o+6svfoNyYt5hhwjdrCA +WXf82n+0S9/DZEtqTg6t8n1ZdwWtColzsPq8y9yNAIiPpqCy6qxSJ7+hSHyXEHu6 +7RMdmgduyzFiEuhjA6p9beP4G3YheBufS0OM00mG9htc9i5gFdPp43t1P9ACg9AY +gkHNZTfqjjJ+vWuZXTARyNtIVBw74acT02pIk/c9jH8F6M7ziCpjBLjqflh8AXtb +4cV97yHgjQ5dUX2xZ/2jvTg2xvI4hocalmhgRvsoFEdV4aeADGvi6t9NfJBIoDa9 +CReJf8Py05yc493EG931t3GzUwWJBtDLSoDByFOQtTwxiBdQn8nEDovYqAJjDQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGUTCCBTmgAwIBAgIEPLVPQDANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQKEwli +ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEGA1UEAxMq +YmVUUlVTVGVkIFJvb3QgQ0EgLSBFbnRydXN0IEltcGxlbWVudGF0aW9uMB4XDTAy +MDQxMTA4MjQyN1oXDTIyMDQxMTA4NTQyN1owZjESMBAGA1UEChMJYmVUUlVTVGVk +MRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAxBgNVBAMTKmJlVFJVU1Rl +ZCBSb290IENBIC0gRW50cnVzdCBJbXBsZW1lbnRhdGlvbjCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBALr0RAOqEmq1Q+xVkrYwfTVXDNvzDSduTPdQqJtO +K2/b9a0cS12zqcH+e0TrW6MFDR/FNCswACnxeECypP869AGIF37m1CbTukzqMvtD +d5eHI8XbQ6P1KqNRXuE70mVpflUVm3rnafdE4Fe1FehmYA8NA/uCjqPoEXtsvsdj +DheT389Lrm5zdeDzqrmkwAkbhepxKYhBMvnwKg5sCfJ0a2ZsUhMfGLzUPvfYbiCe +yv78IZTuEyhL11xeDGbu6bsPwTSxfwh28z0mcMmLJR1iJAzqHHVOwBLkuhMdMCkt +VjMFu5dZfsZJT4nXLySotohAtWSSU1Yk5KKghbNekLQSM80CAwEAAaOCAwUwggMB +MIIBtwYDVR0gBIIBrjCCAaowggGmBg8rBgEEAbE+AAACCSiDkTEwggGRMIIBSQYI +KwYBBQUHAgIwggE7GoIBN1JlbGlhbmNlIG9uIG9yIHVzZSBvZiB0aGlzIENlcnRp +ZmljYXRlIGNyZWF0ZXMgYW4gYWNrbm93bGVkZ21lbnQgYW5kIGFjY2VwdGFuY2Ug +b2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0 +aW9ucyBvZiB1c2UsIHRoZSBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dCBhbmQgdGhlIFJlbHlpbmcgUGFydHkgQWdyZWVtZW50LCB3aGljaCBjYW4gYmUg +Zm91bmQgYXQgdGhlIGJlVFJVU1RlZCB3ZWIgc2l0ZSwgaHR0cHM6Ly93d3cuYmV0 +cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1sMEIGCCsGAQUF +BwIBFjZodHRwczovL3d3dy5iZXRydXN0ZWQuY29tL3Byb2R1Y3RzX3NlcnZpY2Vz +L2luZGV4Lmh0bWwwEQYJYIZIAYb4QgEBBAQDAgAHMIGJBgNVHR8EgYEwfzB9oHug +eaR3MHUxEjAQBgNVBAoTCWJlVFJVU1RlZDEbMBkGA1UECxMSYmVUUlVTVGVkIFJv +b3QgQ0FzMTMwMQYDVQQDEypiZVRSVVNUZWQgUm9vdCBDQSAtIEVudHJ1c3QgSW1w +bGVtZW50YXRpb24xDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMjA0MTEw +ODI0MjdagQ8yMDIyMDQxMTA4NTQyN1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaA +FH1w5a44iwY/qhwaj/nPJDCqhIQWMB0GA1UdDgQWBBR9cOWuOIsGP6ocGo/5zyQw +qoSEFjAMBgNVHRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIE +kDANBgkqhkiG9w0BAQUFAAOCAQEAKrgXzh8QlOu4mre5X+za95IkrNySO8cgjfKZ +5V04ocI07cUTWVwFtStPYZuR+0H8/NU8TZh2BvWBfevdkObRVlTa4y0MnxEylCIB +evZsLHRnBMylj44ss0O1lKLQfelifwa+JwGDnjr9iu6YQ0pr17WXOzq/T220Y/oz +ADQuLW2WyXvKmWO6vvT2MKAtmJbpVkQFqUSjYRDrgqFnXbxdJ3Wqiig2KjiS2d2k +XgClzMx8KSreKJCrt+G2/30lC0DYqjSjLd4H61/OCt3Kfjp9JsFiaDrmLzfzgYYh +xKlkqu9FNtEaZnz46TfW1mG+oq1I59/mdP7TbX3SJdysYlep9w== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFaDCCBFCgAwIBAgIQO1nHe81bV569N1KsdrSqGjANBgkqhkiG9w0BAQUFADBi +MRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENB +czEvMC0GA1UEAxMmYmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVtZW50YXRp +b24wHhcNMDIwNDExMTExODEzWhcNMjIwNDEyMTEwNzI1WjBiMRIwEAYDVQQKEwli +ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEvMC0GA1UEAxMm +YmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVtZW50YXRpb24wggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkujQwCY5X0LkGLG9uJIAiv11DpvpPrILn +HGhwhRujbrWqeNluB0s/6d/16uhUoWGKDi9pdRi3DOUUjXFumLhV/AyV0Jtu4S2I +1DpAa5LxmZZk3tv/ePTulh1HiXzUvrmIdyM6CeYEnm2qXtLIvZpOGd+J6lsOfsPk +tPDgaTuID0GQ+NRxQyTBjyZLO1bp/4xsN+lFrYWMU8NghpBKlsmzVLC7F/AcRdnU +GxlkVgoZ98zh/4avflherHqQH8koOUV7orbHnB/ahdQhhlkwk75TMzf270HPM8er +cmsl9fNTGwxMLvF1S++gh/f+ihXQbNXL+WhTuXAVE8L1LvtDNXUtAgMBAAGjggIY +MIICFDAMBgNVHRMEBTADAQH/MIIBtQYDVR0gBIIBrDCCAagwggGkBg8rBgEEAbE+ +AAADCSiDkTEwggGPMEEGCCsGAQUFBwIBFjVodHRwOi8vd3d3LmJldHJ1c3RlZC5j +b20vcHJvZHVjdHNfc2VydmljZXMvaW5kZXguaHRtbDCCAUgGCCsGAQUFBwICMIIB +OhqCATZSZWxpYW5jZSBvbiBvciB1c2Ugb2YgdGhpcyBDZXJ0aWZpY2F0ZSBjcmVh +dGVzIGFuIGFja25vd2xlZGdtZW50IGFuZCBhY2NlcHRhbmNlIG9mIHRoZSB0aGVu +IGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNl +LCB0aGUgQ2VydGlmaWNhdGlvbiBQcmFjdGljZSBTdGF0ZW1lbnQgYW5kIHRoZSBS +ZWx5aW5nIFBhcnR5IEFncmVlbWVudCwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IHRo +ZSBiZVRSVVNUZWQgd2ViIHNpdGUsIGh0dHA6Ly93d3cuYmV0cnVzdGVkLmNvbS9w +cm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1sMAsGA1UdDwQEAwIBBjAfBgNVHSME +GDAWgBSp7BR++dlDzFMrFK3P9/BZiUHNGTAdBgNVHQ4EFgQUqewUfvnZQ8xTKxSt +z/fwWYlBzRkwDQYJKoZIhvcNAQEFBQADggEBANuXsHXqDMTBmMpWBcCorSZIry0g +6IHHtt9DwSwddUvUQo3neqh03GZCWYez9Wlt2ames30cMcH1VOJZJEnl7r05pmuK +mET7m9cqg5c0Lcd9NUwtNLg+DcTsiCevnpL9UGGCqGAHFFPMZRPB9kdEadIxyKbd +LrML3kqNWz2rDcI1UqJWN8wyiyiFQpyRQHpwKzg21eFzGh/l+n5f3NacOzDq28Bb +J1zTcwfBwvNMm2+fG8oeqqg4MwlYsq78B+g23FW6L09A/nq9BqaBwZMifIYRCgZ3 +SK41ty8ymmFei74pnykkiFY5LKjSq5YDWtRIn7lAhAuYaPsBQ9Yb4gmxlxw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM +MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD +QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM +MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD +QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E +jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo +ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI +ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu +Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg +AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7 +HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA +uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa +TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg +xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q +CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x +O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs +6GAqm4VKQPNriiTsBhYscw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj +YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM +GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua +BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe +3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 +YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR +rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm +ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU +oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t +b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF +AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q +GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 +G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi +l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 +smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp +ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow +fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV +BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM +cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S +HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996 +CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk +3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz +6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV +HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud +EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv +Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw +Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww +DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0 +5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj +Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI +gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ +aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl +izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0 +aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla +MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO +BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD +VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW +fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt +TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL +fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW +1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7 +kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G +A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v +ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo +dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu +Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/ +HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 +pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS +jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+ +xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn +dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV +UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL +EwhEU1RDQSBFMTAeFw05ODEyMTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJ +BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x +ETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCg +bIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJENySZ +j9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlV +Sn5JTe2io74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCG +SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx +JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI +RFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMTAxODEw +MjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFGp5 +fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i ++DAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG +SIb3DQEBBQUAA4GBACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lN +QseSJqBcNJo4cvj9axY+IO6CizEqkzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+ +gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4RbyhkwS7hp86W0N6w4pl +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV +UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL +EwhEU1RDQSBFMjAeFw05ODEyMDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJ +BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x +ETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQC/ +k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGODVvso +LeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3o +TQPMx7JSxhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCG +SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx +JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI +RFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMDkxOTE3 +MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFB6C +TShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5 +WzAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG +SIb3DQEBBQUAA4GBAEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHR +xdf0CiUPPXiBng+xZ8SQTGPdXqfiup/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVL +B3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1mPnHfxsb1gYgAlihw6ID +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEgzCCA+ygAwIBAgIEOJ725DANBgkqhkiG9w0BAQQFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9HQ0NBX0NQUyBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAyMDAw +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENsaWVu +dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAyMDcxNjE2NDBaFw0yMDAy +MDcxNjQ2NDBaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0dDQ0FfQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDIwMDAgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCTdLS25MVL1qFof2LV7PdRV7Ny +Spj10InJrWPNTTVRaoTUrcloeW+46xHbh65cJFET8VQlhK8pK5/jgOLZy93GRUk0 +iJBeAZfv6lOm3fzB3ksqJeTpNfpVBQbliXrqpBFXO/x8PTbNZzVtpKklWb1m9fkn +5JVn1j+SgF7yNH0rhQIDAQABo4IBnjCCAZowEQYJYIZIAYb4QgEBBAQDAgAHMIHd +BgNVHR8EgdUwgdIwgc+ggcyggcmkgcYwgcMxFDASBgNVBAoTC0VudHJ1c3QubmV0 +MUAwPgYDVQQLFDd3d3cuZW50cnVzdC5uZXQvR0NDQV9DUFMgaW5jb3JwLiBieSBy +ZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0Lm5l +dCBMaW1pdGVkMTMwMQYDVQQDEypFbnRydXN0Lm5ldCBDbGllbnQgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMDAy +MDcxNjE2NDBagQ8yMDIwMDIwNzE2NDY0MFowCwYDVR0PBAQDAgEGMB8GA1UdIwQY +MBaAFISLdP3FjcD/J20gN0V8/i3OutN9MB0GA1UdDgQWBBSEi3T9xY3A/ydtIDdF +fP4tzrrTfTAMBgNVHRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4w +AwIEkDANBgkqhkiG9w0BAQQFAAOBgQBObzWAO9GK9Q6nIMstZVXQkvTnhLUGJoMS +hAusO7JE7r3PQNsgDrpuFOow4DtifH+La3xKp9U1PL6oXOpLu5OOgGarDyn9TS2/ +GpsKkMWr2tGzhtQvJFJcem3G8v7lTRowjJDyutdKPkN+1MhQGof4T4HHdguEOnKd +zmVml64mXg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIElTCCA/6gAwIBAgIEOJsRPDANBgkqhkiG9w0BAQQFADCBujEUMBIGA1UEChML +RW50cnVzdC5uZXQxPzA9BgNVBAsUNnd3dy5lbnRydXN0Lm5ldC9TU0xfQ1BTIGlu +Y29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDIwMDAg +RW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJl +IFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAyMDQxNzIwMDBa +Fw0yMDAyMDQxNzUwMDBaMIG6MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDE/MD0GA1UE +CxQ2d3d3LmVudHJ1c3QubmV0L1NTTF9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p +dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0Lm5ldCBMaW1pdGVk +MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp +b24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHwV9OcfHO +8GCGD9JYf9Mzly0XonUwtZZkJi9ow0SrqHXmAGc0V55lxyKbc+bT3QgON1WqJUaB +bL3+qPZ1V1eMkGxKwz6LS0MKyRFWmponIpnPVZ5h2QLifLZ8OAfc439PmrkDQYC2 +dWcTC5/oVzbIXQA23mYU2m52H083jIITiQIDAQABo4IBpDCCAaAwEQYJYIZIAYb4 +QgEBBAQDAgAHMIHjBgNVHR8EgdswgdgwgdWggdKggc+kgcwwgckxFDASBgNVBAoT +C0VudHJ1c3QubmV0MT8wPQYDVQQLFDZ3d3cuZW50cnVzdC5uZXQvU1NMX0NQUyBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAyMDAw +IEVudHJ1c3QubmV0IExpbWl0ZWQxOjA4BgNVBAMTMUVudHJ1c3QubmV0IFNlY3Vy +ZSBTZXJ2ZXIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEw +KwYDVR0QBCQwIoAPMjAwMDAyMDQxNzIwMDBagQ8yMDIwMDIwNDE3NTAwMFowCwYD +VR0PBAQDAgEGMB8GA1UdIwQYMBaAFMtswGvjuz7L/CKc/vuLkpyw8m4iMB0GA1Ud +DgQWBBTLbMBr47s+y/winP77i5KcsPJuIjAMBgNVHRMEBTADAQH/MB0GCSqGSIb2 +fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQQFAAOBgQBi24GRzsia +d0Iv7L0no1MPUBvqTpLwqa+poLpIYcvvyQbvH9X07t9WLebKahlzqlO+krNQAraF +JnJj2HVQYnUUt7NQGj/KEQALhUVpbbalrlHhStyCP2yMNLJ3a9kC9n8O6mUE8c1U +yrrJzOCE98g+EZfTYAkYvAX/bIkz8OwVDw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0xOTEy +MjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGA +vtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJFrlwMB0G +CSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEA +WUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo +oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQ +h7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18 +f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfN +B/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVy +vUxFnmG6v4SBkgPR0ml8xQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIE7TCCBFagAwIBAgIEOAOR7jANBgkqhkiG9w0BAQQFADCByTELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUgwRgYDVQQLFD93d3cuZW50cnVzdC5u +ZXQvQ2xpZW50X0NBX0luZm8vQ1BTIGluY29ycC4gYnkgcmVmLiBsaW1pdHMgbGlh +Yi4xJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV +BAMTKkVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw05OTEwMTIxOTI0MzBaFw0xOTEwMTIxOTU0MzBaMIHJMQswCQYDVQQGEwJVUzEU +MBIGA1UEChMLRW50cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9D +bGllbnRfQ0FfSW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjEl +MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMq +RW50cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0G +CSqGSIb3DQEBAQUAA4GLADCBhwKBgQDIOpleMRffrCdvkHvkGf9FozTC28GoT/Bo +6oT9n3V5z8GKUZSvx1cDR2SerYIbWtp/N3hHuzeYEpbOxhN979IMMFGpOZ5V+Pux +5zDeg7K6PvHViTs7hbqqdCz+PzFur5GVbgbUB01LLFZHGARS2g4Qk79jkJvh34zm +AqTmT173iwIBA6OCAeAwggHcMBEGCWCGSAGG+EIBAQQEAwIABzCCASIGA1UdHwSC +ARkwggEVMIHkoIHhoIHepIHbMIHYMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50 +cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0FfSW5m +by9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UECxMcKGMp +IDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQg +Q2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCyg +KqAohiZodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9DbGllbnQxLmNybDArBgNV +HRAEJDAigA8xOTk5MTAxMjE5MjQzMFqBDzIwMTkxMDEyMTkyNDMwWjALBgNVHQ8E +BAMCAQYwHwYDVR0jBBgwFoAUxPucKXuXzUyW/O5bs8qZdIuV6kwwHQYDVR0OBBYE +FMT7nCl7l81MlvzuW7PKmXSLlepMMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA +BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEEBQADgYEAP66K8ddmAwWePvrqHEa7 +pFuPeJoSSJn59DXeDDYHAmsQOokUgZwxpnyyQbJq5wcBoUv5nyU7lsqZwz6hURzz +wy5E97BnRqqS5TvaHBkUODDV4qIxJS7x7EU47fgGWANzYrAQMY9Av2TgXD7FTx/a +EkP/TOYGJqibGapEPHayXOw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u +ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u +ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 +MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE +ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j +b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg +U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ +I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 +wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC +AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb +oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 +BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p +dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk +MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp +b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 +MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi +E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa +MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI +hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN +95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd +2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV +UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy +dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 +MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx +dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f +BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A +cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC +AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ +MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm +aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw +ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj +IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF +MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA +A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y +7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh +1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT +ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw +MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j +LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ +KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo +RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu +WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw +Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD +AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK +eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM +zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ +WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN +/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2Vj +dXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0 +NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXggU2VjdXJlMSYwJAYD +VQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn2Z0G +vxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/ +BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0C +AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEX +MBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJl +IGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkw +NjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBq +y/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQF +MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA +A4GBAAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy +0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1 +E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT +ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw +MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj +dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l +c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC +UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc +58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ +o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr +aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA +A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA +Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv +8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg +R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 +9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq +fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv +iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU +1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ +bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW +MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA +ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l +uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn +Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS +tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un +hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV +5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILAgAAAAAA1ni3lAUwDQYJKoZIhvcNAQEEBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw +MDBaFw0xNDAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT +aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ +jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp +xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp +1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG +snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ +U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 +9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIABjAdBgNVHQ4EFgQU +YHtmGkUNl8qJUC99BM00qP/8/UswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0B +AQQFAAOCAQEArqqf/LfSyx9fOSkoGJ40yWxPbxrwZKJwSk8ThptgKJ7ogUmYfQq7 +5bCdPTbbjwVR/wkxKh/diXeeDy5slQTthsu0AD+EAk2AaioteAuubyuig0SDH81Q +gkwkr733pbTIWg/050deSY43lv6aiAU62cDbKYfmGZZHpzqmjIs8d/5GY6dT2iHR +rH5Jokvmw2dZL7OKDrssvamqQnw1wdh/1acxOk5jQzmvCLBhNIzTmKlDNPYPhyk7 +ncJWWJh3w/cbrPad+D6qp1RF8PX51TFl/mtYnHGzHtdS6jIX/EBgHcl5JLL2bP2o +Zg6C3ZjL2sJETy6ge/L3ayx2EYRGinij4w== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD +VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv +bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv +b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV +UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU +cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds +b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH +iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS +r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 +04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r +GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 +3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P +lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARwxCzAJBgNVBAYTAkVT +MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE +ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE +ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEzMDEGA1UECxMq +SVBTIENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MTMwMQYD +VQQDEypJUFMgQ0EgQ2hhaW5lZCBDQXMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx +HjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczAeFw0wMTEyMjkwMDUzNTha +Fw0yNTEyMjcwMDUzNThaMIIBHDELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNl +bG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQg +cHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMu +ZXMgQy5JLkYuICBCLTYwOTI5NDUyMTMwMQYDVQQLEypJUFMgQ0EgQ2hhaW5lZCBD +QXMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxMzAxBgNVBAMTKklQUyBDQSBDaGFp +bmVkIENBcyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3DQEJARYP +aXBzQG1haWwuaXBzLmVzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcVpJJ +spQgvJhPUOtopKdJC7/SMejHT8KGC/po/UNaivNgkjWZOLtNA1IhW/A3mTXhQSCB +hYEFcYGdtJUZqV92NC5jNzVXjrQfQj8VXOF6wV8TGDIxya2+o8eDZh65nAQTy2nB +Bt4wBrszo7Uf8I9vzv+W6FS+ZoCua9tBhDaiPQIDAQABo4IEQzCCBD8wHQYDVR0O +BBYEFKGtMbH5PuEXpsirNPxShwkeYlJBMIIBTgYDVR0jBIIBRTCCAUGAFKGtMbH5 +PuEXpsirNPxShwkeYlJBoYIBJKSCASAwggEcMQswCQYDVQQGEwJFUzESMBAGA1UE +CBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJ +bnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0Bt +YWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxMzAxBgNVBAsTKklQUyBDQSBD +aGFpbmVkIENBcyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEzMDEGA1UEAxMqSVBT +IENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI +hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8E +BQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMG +CCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYB +BAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMw +EYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBC +BglghkgBhvhCAQ0ENRYzQ2hhaW5lZCBDQSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkg +aHR0cDovL3d3dy5pcHMuZXMvMCkGCWCGSAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlw +cy5lcy9pcHMyMDAyLzA3BglghkgBhvhCAQQEKhYoaHR0cDovL3d3dy5pcHMuZXMv +aXBzMjAwMi9pcHMyMDAyQ0FDLmNybDA8BglghkgBhvhCAQMELxYtaHR0cDovL3d3 +dy5pcHMuZXMvaXBzMjAwMi9yZXZvY2F0aW9uQ0FDLmh0bWw/MDkGCWCGSAGG+EIB +BwQsFipodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3JlbmV3YWxDQUMuaHRtbD8w +NwYJYIZIAYb4QgEIBCoWKGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5 +Q0FDLmh0bWwwbQYDVR0fBGYwZDAuoCygKoYoaHR0cDovL3d3dy5pcHMuZXMvaXBz +MjAwMi9pcHMyMDAyQ0FDLmNybDAyoDCgLoYsaHR0cDovL3d3d2JhY2suaXBzLmVz +L2lwczIwMDIvaXBzMjAwMkNBQy5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUF +BzABhhNodHRwOi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAERyMJ1W +WKJBGyi3leGmGpVfp3hAK+/blkr8THFj2XOVvQLiogbHvpcqk4A0hgP63Ng9HgfN +HnNDJGD1HWHc3JagvPsd4+cSACczAsDAK1M92GsDgaPb1pOVIO/Tln4mkImcJpvN +b2ar7QMiRDjMWb2f2/YHogF/JsRj9SVCXmK9 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVT +MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE +ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE +ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEuMCwGA1UECxMl +SVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMl +SVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3 +DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAwNTkzOFoXDTI1MTIyNzAw +NTkzOFowggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYD +VQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5n +IFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4g +IEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzAN +BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA4FEnpwvdr9G5Q1uCN0VWcu+atsIS7ywS +zHb5BlmvXSHU0lq4oNTzav3KaY1mSPd05u42veiWkXWmcSjK5yISMmmwPh5r9FBS +YmL9Yzt9fuzuOOpi9GyocY3h6YvJP8a1zZRCb92CRTzo3wno7wpVqVZHYUxJZHMQ +KD/Kvwn/xi8CAwEAAaOCBEowggRGMB0GA1UdDgQWBBTrsxl588GlHKzcuh9morKb +adB4CDCCAUQGA1UdIwSCATswggE3gBTrsxl588GlHKzcuh9morKbadB4CKGCARqk +ggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE +BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBT +ZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBC +LTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0EgQ0xBU0UxIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0EgQ0xBU0UxIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYD +VR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggr +BgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB +FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhC +AQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB +D2lwc0BtYWlsLmlwcy5lczBBBglghkgBhvhCAQ0ENBYyQ0xBU0UxIENBIENlcnRp +ZmljYXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC +BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIBBAQtFito +dHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEuY3JsMD8GCWCG +SAGG+EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25D +TEFTRTEuaHRtbD8wPAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93d3cuaXBzLmVzL2lw +czIwMDIvcmVuZXdhbENMQVNFMS5odG1sPzA6BglghkgBhvhCAQgELRYraHR0cDov +L3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFTRTEuaHRtbDBzBgNVHR8EbDBq +MDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEu +Y3JsMDWgM6Axhi9odHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy +Q0xBU0UxLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9v +Y3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQADgYEAK9Dr/drIyllq2tPMMi7JVBuK +Yn4VLenZMdMu9Ccj/1urxUq2ckCuU3T0vAW0xtnIyXf7t/k0f3gA+Nak5FI/LEpj +V4F1Wo7ojPsCwJTGKbqz3Bzosq/SLmJbGqmODszFV0VRFOlOHIilkfSj945RyKm+ +hjM+5i9Ibq9UkE6tsSU= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVT +MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE +ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE +ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEuMCwGA1UECxMl +SVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMl +SVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3 +DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAxMDE0NFoXDTI1MTIyNzAx +MDE0NFowggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYD +VQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5n +IFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4g +IEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzAN +BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAqxf+DrDGaBtT8FK+n/ra+osTBLsBjzLZ +H49NzjaY2uQARIwo2BNEKqRrThckQpzTiKRBgtYj+4vJhuW5qYIF3PHeH+AMmVWY +8jjsbJ0gA8DvqqPGZARRLXgNo9KoOtYkTOmWehisEyMiG3zoMRGzXwmqMHBxRiVr +SXGAK5UBsh8CAwEAAaOCBEowggRGMB0GA1UdDgQWBBS4k/8uy9wsjqLnev42USGj +mFsMNDCCAUQGA1UdIwSCATswggE3gBS4k/8uy9wsjqLnev42USGjmFsMNKGCARqk +ggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE +BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBT +ZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBC +LTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0EgQ0xBU0UzIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0EgQ0xBU0UzIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYD +VR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggr +BgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB +FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhC +AQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB +D2lwc0BtYWlsLmlwcy5lczBBBglghkgBhvhCAQ0ENBYyQ0xBU0UzIENBIENlcnRp +ZmljYXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC +BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIBBAQtFito +dHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMuY3JsMD8GCWCG +SAGG+EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25D +TEFTRTMuaHRtbD8wPAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93d3cuaXBzLmVzL2lw +czIwMDIvcmVuZXdhbENMQVNFMy5odG1sPzA6BglghkgBhvhCAQgELRYraHR0cDov +L3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFTRTMuaHRtbDBzBgNVHR8EbDBq +MDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMu +Y3JsMDWgM6Axhi9odHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy +Q0xBU0UzLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9v +Y3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQADgYEAF2VcmZVDAyevJuXr0LMXI/dD +qsfwfewPxqmurpYPdikc4gYtfibFPPqhwYHOU7BC0ZdXGhd+pFFhxu7pXu8Fuuu9 +D6eSb9ijBmgpjnn1/7/5p6/ksc7C0YBCJwUENPjDfxZ4IwwHJPJGR607VNCv1TGy +r33I6unUVtkOE7LFRVA= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVT +MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE +ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE +ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMm +SVBTIENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT +JklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI +hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjI5MDEwNTMyWhcNMjUxMjI3 +MDEwNTMyWjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ +BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp +bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G +LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMw +gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALsw19zQVL01Tp/FTILq0VA8R5j8 +m2mdd81u4D/u6zJfX5/S0HnllXNEITLgCtud186Nq1KLK3jgm1t99P1tCeWu4Wwd +ByOgF9H5fahGRpEiqLJpxq339fWUoTCUvQDMRH/uxJ7JweaPCjbB/SQ9AaD1e+J8 +eGZDi09Z8pvZ+kmzAgMBAAGjggRTMIIETzAdBgNVHQ4EFgQUZyaW56G/2LUDnf47 +3P7yiuYV3TAwggFGBgNVHSMEggE9MIIBOYAUZyaW56G/2LUDnf473P7yiuYV3TCh +ggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ +BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp +bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G +LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOC +AQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUF +BwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYB +BAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglg +hkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1Ud +EgQTMBGBD2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0VBMSBD +QSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCG +SAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7BglghkgBhvhC +AQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMS5j +cmwwQAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmV2 +b2NhdGlvbkNMQVNFQTEuaHRtbD8wPQYJYIZIAYb4QgEHBDAWLmh0dHA6Ly93d3cu +aXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFQTEuaHRtbD8wOwYJYIZIAYb4QgEI +BC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5Q0xBU0VBMS5odG1s +MHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvaXBz +MjAwMkNMQVNFQTEuY3JsMDagNKAyhjBodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBz +MjAwMi9pcHMyMDAyQ0xBU0VBMS5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUF +BzABhhNodHRwOi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAH66iqyA +AIQVCtWYUQxkxZwCWINmyq0eB81+atqAB98DNEock8RLWCA1NnHtogo1EqWmZaeF +aQoO42Hu6r4okzPV7Oi+xNtff6j5YzHIa5biKcJboOeXNp13XjFr/tOn2yrb25aL +H2betgPAK7N41lUH5Y85UN4HI3LmvSAUS7SG +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVT +MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE +ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE +ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMm +SVBTIENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT +JklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI +hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjI5MDEwNzUwWhcNMjUxMjI3 +MDEwNzUwWjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ +BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp +bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G +LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMw +gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAO6AAPYaZC6tasiDsYun7o/ZttvN +G7uGBiJ2MwwSbUhWYdLcgiViL5/SaTBlA0IjWLxH3GvWdV0XPOH/8lhneaDBgbHU +VqLyjRGZ/fZ98cfEXgIqmuJKtROKAP2Md4bm15T1IHUuDky/dMQ/gT6DtKM4Ninn +6Cr1jIhBqoCm42zvAgMBAAGjggRTMIIETzAdBgNVHQ4EFgQUHp9XUEe2YZM50yz8 +2l09BXW3mQIwggFGBgNVHSMEggE9MIIBOYAUHp9XUEe2YZM50yz82l09BXW3mQKh +ggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ +BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp +bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G +LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOC +AQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUF +BwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYB +BAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglg +hkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1Ud +EgQTMBGBD2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0VBMyBD +QSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCG +SAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7BglghkgBhvhC +AQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMy5j +cmwwQAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmV2 +b2NhdGlvbkNMQVNFQTMuaHRtbD8wPQYJYIZIAYb4QgEHBDAWLmh0dHA6Ly93d3cu +aXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFQTMuaHRtbD8wOwYJYIZIAYb4QgEI +BC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5Q0xBU0VBMy5odG1s +MHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvaXBz +MjAwMkNMQVNFQTMuY3JsMDagNKAyhjBodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBz +MjAwMi9pcHMyMDAyQ0xBU0VBMy5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUF +BzABhhNodHRwOi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAEo9IEca +2on0eisxeewBwMwB9dbB/MjD81ACUZBYKp/nNQlbMAqBACVHr9QPDp5gJqiVp4MI +3y2s6Q73nMify5NF8bpqxmdRSmlPa/59Cy9SKcJQrSRE7SOzSMtEQMEDlQwKeAYS +AfWRMS1Jjbs/RU4s4OjNtckUFQzjB4ObJnXv +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIIODCCB6GgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCAR4xCzAJBgNVBAYTAkVT +MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE +ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE +ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjE0MDIGA1UECxMr +SVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTE0MDIG +A1UEAxMrSVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAxMTAx +OFoXDTI1MTIyNzAxMTAxOFowggEeMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFy +Y2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5l +dCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlw +cy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxNDAyBgNVBAsTK0lQUyBDQSBUaW1lc3Rh +bXBpbmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxNDAyBgNVBAMTK0lQUyBDQSBU +aW1lc3RhbXBpbmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0B +CQEWD2lwc0BtYWlsLmlwcy5lczCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA +vLjuVqWajOY2ycJioGaBjRrVetJznw6EZLqVtJCneK/K/lRhW86yIFcBrkSSQxA4 +Efdo/BdApWgnMjvEp+ZCccWZ73b/K5Uk9UmSGGjKALWkWi9uy9YbLA1UZ2t6KaFY +q6JaANZbuxjC3/YeE1Z2m6Vo4pjOxgOKNNtMg0GmqaMCAwEAAaOCBIAwggR8MB0G +A1UdDgQWBBSL0BBQCYHynQnVDmB4AyKiP8jKZjCCAVAGA1UdIwSCAUcwggFDgBSL +0BBQCYHynQnVDmB4AyKiP8jKZqGCASakggEiMIIBHjELMAkGA1UEBhMCRVMxEjAQ +BgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJ +UFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJp +cHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMTQwMgYDVQQLEytJUFMg +Q0EgVGltZXN0YW1waW5nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MTQwMgYDVQQD +EytJUFMgQ0EgVGltZXN0YW1waW5nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4w +HAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAM +BgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYB +BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIB +FgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYD +VR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlw +cy5lczBHBglghkgBhvhCAQ0EOhY4VGltZXN0YW1waW5nIENBIENlcnRpZmljYXRl +IGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgECBBwWGmh0 +dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMEAGCWCGSAGG+EIBBAQzFjFodHRwOi8v +d3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJUaW1lc3RhbXBpbmcuY3JsMEUGCWCG +SAGG+EIBAwQ4FjZodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25U +aW1lc3RhbXBpbmcuaHRtbD8wQgYJYIZIAYb4QgEHBDUWM2h0dHA6Ly93d3cuaXBz +LmVzL2lwczIwMDIvcmVuZXdhbFRpbWVzdGFtcGluZy5odG1sPzBABglghkgBhvhC +AQgEMxYxaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lUaW1lc3RhbXBp +bmcuaHRtbDB/BgNVHR8EeDB2MDegNaAzhjFodHRwOi8vd3d3Lmlwcy5lcy9pcHMy +MDAyL2lwczIwMDJUaW1lc3RhbXBpbmcuY3JsMDugOaA3hjVodHRwOi8vd3d3YmFj +ay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyVGltZXN0YW1waW5nLmNybDAvBggrBgEF +BQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZI +hvcNAQEFBQADgYEAZbrBzAAalZHK6Ww6vzoeFAh8+4Pua2JR0zORtWB5fgTYXXk3 +6MNbsMRnLWhasl8OCvrNPzpFoeo2zyYepxEoxZSPhExTCMWTs/zif/WN87GphV+I +3pGW7hdbrqXqcGV4LCFkAZXOzkw+UPS2Wctjjba9GNSHSl/c7+lW8AoM6HU= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz +MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw +IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR +dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp +li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D +rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ +WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug +F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU +xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC +Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv +dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw +ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl +IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh +c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy +ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI +KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T +KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq +y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p +dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD +VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL +MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk +fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 +7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R +cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y +mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW +xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK +SnQ2+Q== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy +NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD +cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs +2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY +JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE +Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ +n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A +PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICXDCCAcWgAwIBAgIQCgEBAQAAAnwAAAALAAAAAjANBgkqhkiG9w0BAQUFADA6 +MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp +dHkgMTAyNCBWMzAeFw0wMTAyMjIyMTAxNDlaFw0yNjAyMjIyMDAxNDlaMDoxGTAX +BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAx +MDI0IFYzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDV3f5mCc8kPD6ugU5O +isRpgFtZO9+5TUzKtS3DJy08rwBCbbwoppbPf9dYrIMKo1W1exeQFYRMiu4mmdxY +78c4pqqv0I5CyGLXq6yp+0p9v+r+Ek3d/yYtbzZUaMjShFbuklNhCbM/OZuoyZu9 +zp9+1BlqFikYvtc6adwlWzMaUQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBTEwBykB5T9zU0B1FTapQxf3q4FWjAd +BgNVHQ4EFgQUxMAcpAeU/c1NAdRU2qUMX96uBVowDQYJKoZIhvcNAQEFBQADgYEA +Py1q4yZDlX2Jl2X7deRyHUZXxGFraZ8SmyzVWujAovBDleMf6XbN3Ou8k6BlCsdN +T1+nr6JGFLkM88y9am63nd4lQtBU/55oc2PcJOsiv6hy8l4A4Q1OOkNumU4/iXgD +mMrzVcydro7BqkWY+o8aoI2II/EVQQ2lRj6RP4vr93E= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6 +MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp +dHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAX +BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAy +MDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt49VcdKA3Xtp +eafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7Jylg +/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGl +wSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnh +AMFRD0xS+ARaqn1y07iHKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2 +PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpu +AWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NR +MKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYc +HnmYv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/ +Zb5gEydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+ +f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVO +rSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEkllgVsRch +6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kApKnXwiJPZ9d3 +7CAFYd4= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY +MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t +dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 +WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD +VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 +9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ +DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 +Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N +QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ +xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G +A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG +kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr +Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 +Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU +JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot +RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP +MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAx +MDQwNjEwNDkxM1oXDTIxMDQwNjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNV +BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMSBDQTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H887dF+2rDNbS82rDTG +29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9EJUk +oVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk +3w0LBUXl0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBL +qdReLjVQCfOAl/QMF6452F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIIN +nvmLVz5MxxftLItyM19yejhW1ebZrgUaHXVFsculJRwSVzb9IjcCAwEAAaMzMDEw +DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZTiFIwCwYDVR0PBAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE928Jj2VuX +ZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0H +DjxVyhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VO +TzF2nBBhjrZTOqMRvq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2Uv +kVrCqIexVmiUefkl98HVrhq4uz2PqYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4w +zMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9ZIRlXvVWa +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP +MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx +MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV +BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o +Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt +5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s +3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej +vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu +8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw +DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil +zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ +3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD +FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 +Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 +ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJO +TDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEy +MTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4wHAYDVQQKExVTdGFhdCBkZXIgTmVk +ZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENB +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFtvszn +ExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw71 +9tV2U02PjLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MO +hXeiD+EwR+4A5zN9RGcaC1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+U +tFE5A3+y3qcym7RHjm+0Sq7lr7HcsBthvJly3uSJt3omXdozSVtSnA71iq3DuD3o +BmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn622r+I/q85Ej0ZytqERAh +SQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRVHSAAMDww +OgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMv +cm9vdC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA +7Jbg0zTBLL9s+DANBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k +/rvuFbQvBgwp8qiSpGEN/KtcCFtREytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzm +eafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbwMVcoEoJz6TMvplW0C5GUR5z6 +u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3ynGQI0DvDKcWy +7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR +iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJE +SzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQg +Um9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNV +BAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNVBAsTFFREQyBJbnRl +cm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxLhA +vJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20jxsNu +Zp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a +0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc1 +4izbSysseLlJ28TQx5yc5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGN +eGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcD +R0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUG +A1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIElu +dGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxME +Q1JMMTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3 +WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw +HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJ +KoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4IBAQBO +Q8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540mgwV5dOy0uaOX +wTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ +2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm89 +9qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0 +jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38 +aQNiuJkFBT1reBK9sG9l +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJE +SzEMMAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEw +ODM5MzBaFw0zNzAyMTEwOTA5MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNU +REMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuHnEz9pPPEXyG9VhDr +2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0zY0s +2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItU +GBxIYXvViGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKj +dGqPqcNiKXEx5TukYBdedObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+r +TpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/ +BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB5DCB4TCB3gYIKoFQgSkB +AQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5kay9yZXBv +c2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRl +ciBmcmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEu +MS4xLiBDZXJ0aWZpY2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIg +T0lEIDEuMi4yMDguMTY5LjEuMS4xLjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1Ud +HwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEMMAoGA1UEChMDVERDMRQwEgYD +VQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYmaHR0cDovL2Ny +bC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy +MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZ +J2cdUBVLc647+RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqG +SIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACrom +JkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4A9G28kNBKWKnctj7fAXmMXAnVBhO +inxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYscA+UYyAFMP8uXBV2Y +caaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9AOoB +mbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQ +YqbsFbS1AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9 +BKNDLdr8C2LqL19iUw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD +VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT +ZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFBlcnNvbmFsIEJhc2lj +IENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNpY0B0aGF3dGUuY29tMB4X +DTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgcsxCzAJBgNVBAYTAlpBMRUw +EwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UE +ChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2Vy +dmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBD +QTEoMCYGCSqGSIb3DQEJARYZcGVyc29uYWwtYmFzaWNAdGhhd3RlLmNvbTCBnzAN +BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLyTU23AUE+CFeZIlDWmWr5vQvoPR+53 +dXLdjUmbllegeNTKP1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJl+A1OFdK +wPQIcOk8RHtQfmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7 +G1sY0b8jkyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQF +AAOBgQAt4plrsD16iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7 +c8a914phXAPjLSeoF+CEhULcXpvGt7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95B21P +9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN92NWod8isQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD +VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT +ZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBlcnNvbmFsIEZyZWVt +YWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1mcmVlbWFpbEB0aGF3dGUu +Y29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgdExCzAJBgNVBAYT +AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEa +MBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRp +b24gU2VydmljZXMgRGl2aXNpb24xJDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBG +cmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhh +d3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfY +DFG26nKRsIRefS0Nj3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5E +rHzmj+hND3EfQDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVq +uzgkCGqYx7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zAN +BgkqhkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP +MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgCneSa +/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr5PjRznei +gQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD +VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT +ZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3RlIFBlcnNvbmFsIFByZW1p +dW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXByZW1pdW1AdGhhd3RlLmNv +bTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5NTlaMIHPMQswCQYDVQQGEwJa +QTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRvd24xGjAY +BgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5nMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9u +IFNlcnZpY2VzIERpdmlzaW9uMSMwIQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJl +bWl1bSBDQTEqMCgGCSqGSIb3DQEJARYbcGVyc29uYWwtcHJlbWl1bUB0aGF3dGUu +Y29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJZtn4B0TPuYwu8KHvE0Vs +Bd/eJxZRNkERbGw77f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ8/JE2dWI +Et12TfIa/G8jHnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYD +ZicRFTuqW/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqG +SIb3DQEBBAUAA4GBAGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIH +b4Vnjt4rueIXsDqg8A6iAJrf8xQVbrvIhVqYgPn/vnQdPfP+MCXRNzRn+qVxeTBh +KXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+WjS9Q2wfD6h+rM+D1KzGJ +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy +dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t +MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB +MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG +A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp +b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl +cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv +bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE +VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ +ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR +uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG +9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI +hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM +pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm +MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx +MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 +dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl +cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 +DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD +gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 +yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX +L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj +EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG +7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e +QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ +qdq5snUb9kLy78fyGPmJvKP/iiMucEc= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzAN +BgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAd +BgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcNOTcwMTAxMDAwMDAwWhcN +MjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4g +Q2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsG +A1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1l +c3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANYrWHhhRYZT +6jR7UZztsOYuGA7+4F+oJ9O0yeB8WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQa +Wt9MevPZQx08EHp5JduQ/vBR5zDWQQD9nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL +8vg7ij5FrHGSALSQQZj7X+36ty6K+Ig3AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMB +Af8wDQYJKoZIhvcNAQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCouqoEiYbC +9RAIDb/LogWK0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQ +pgCed/r8zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZ +CayJSdM= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB +kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw +IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG +EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD +VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu +dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6 +E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ +D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK +4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq +lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW +bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB +o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT +MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js +LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr +BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB +AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft +Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj +j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH +KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv +2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3 +mfnGV/TJVTl4uix5yaaIK/QI +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCB +rjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0BgNVBAMTLVVUTi1VU0VSRmlyc3Qt +Q2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05OTA3MDkxNzI4NTBa +Fw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAV +BgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5l +dHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UE +AxMtVVROLVVTRVJGaXJzdC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWls +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3B +YHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIxB8dOtINknS4p1aJkxIW9 +hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8om+rWV6l +L8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLm +SGHGTPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM +1tZUOt4KpLoDd7NlyP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws +6wIDAQABo4G5MIG2MAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNVHR8EUTBPME2gS6BJhkdodHRw +Oi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGllbnRBdXRoZW50 +aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH +AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u +7mFVbwQ+zznexRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0 +xtcgBEXkzYABurorbs6q15L+5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQ +rfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarVNZ1yQAOJujEdxRBoUp7fooXFXAim +eOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZw7JHpsIyYdfHb0gk +USeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB +lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt +SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG +A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe +MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v +d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh +cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn +0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ +M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a +MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd +oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI +DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy +oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0 +dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy +bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF +BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM +//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli +CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE +CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t +3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS +KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCB +ozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3Qt +TmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5WhcNMTkwNzA5MTg1 +NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 +IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYD +VQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VS +Rmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQCz+5Gh5DZVhawGNFugmliy+LUPBXeDrjKxdpJo7CNKyXY/45y2 +N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4CjDUeJT1FxL+78P/m4FoCH +iZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXuOzr0hARe +YFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1 +axwiP8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6g +yN7igEL66S/ozjIEj3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQD +AgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPh +ahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9V +VE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0GCSqGSIb3DQEB +BQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y +IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6Lzs +QCv4AdRWOOTKRIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4 +ZSfP1FMa8Kxun08FDAOBp4QpxFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qM +YEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAqDbUMo2s/rn9X9R+WfN9v3YIwLGUb +QErNaLly7HF27FSOH4UMAWr6pjisH8SE +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUFADCB +lTELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAbBgNVBAMTFFVUTi1VU0VSRmlyc3Qt +T2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4NDAzNlowgZUxCzAJBgNV +BAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxHjAc +BgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3 +dy51c2VydHJ1c3QuY29tMR0wGwYDVQQDExRVVE4tVVNFUkZpcnN0LU9iamVjdDCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicP +HxzfOpuCaDDASmEd8S8O+r5596Uj71VRloTN2+O5bj4x2AogZ8f02b+U60cEPgLO +KqJdhwQJ9jCdGIqXsqoc/EHSoTbL+z2RuufZcDX65OeQw5ujm9M89RKZd7G3CeBo +5hy485RjiGpq/gt2yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vulBe3/IW+ +pKvEHDHd17bR5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehb +kkj7RwvCbNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUC +AwEAAaOBrzCBrDALBgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQU2u1kdBScFDyr3ZmpvVsoTYs8ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDov +L2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmlyc3QtT2JqZWN0LmNybDApBgNV +HSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQwDQYJKoZIhvcN +AQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXFwfNfLEzIR1pp6ujw +NTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T7/yxSPlrJSUtUbYsbUXB +mMiKVl0+7kNOPmsnjtA6S4ULX9Ptaqd1y9Fahy85dRNacrACgZ++8A+EVCBibGnU +4U3GDZlDAQ0Slox4nb9QorFEqmrPF3rPbw/U+CRVX/A0FklmPlBGyWNxODFiuGK5 +81OtbLUrohKqGU8J2l7nk8aOFAj+8DCAGKCGhU3IfdeLA/5u1fedFqySLKAj5ZyR +Uh+U3xeUc8OzwcFxBSAAeL0TUh2oPs0AH8g= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy +NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y +LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ +TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y +TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 +LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW +I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw +nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy +NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY +dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 +WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS +v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v +UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu +IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC +W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8xCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh +c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05 +NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTlaMF8xCzAJBgNVBAYTAlVTMRcwFQYD +VQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMSBQdWJsaWMgUHJp +bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOB +jQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3noaACpEO+jglr0aIguVzqKCbJF0N +H8xlbgyw0FaEGIeaBpsQoXPftFg5a27B9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR +4k5FVmkfeAKA2txHkSm7NsljXMXg1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATAN +BgkqhkiG9w0BAQIFAAOBgQBMP7iLxmjf7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZo +EWx8QszznC7EBz8UsA9P/5CSdvnivErpj82ggAr3xSnxgiJduLHdgSOjeyUVRjB5 +FvjqBUuUfx3CHMjjt/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0ANACY89Fx +lA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYK +VdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSm +Fc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0J +h9ZrbWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul +uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68 +DzFc6PLZ +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4 +nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO +8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjV +ojYJrKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjb +PG7PoBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2 +6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vr +n5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQBfGfMY1a +qtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/Ny9Sn2WCVhDr4 +wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3 +ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrs +pSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4 +E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAyIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZMJaLtVRKXxaeAufqDwSCg+i8VDXyh +YGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvEerf4Zh+AVPy3wo5ZShRXRtGak75BkQO7 +FYCTXOvnzAhsPz6zSvz/S2wj1VCCJkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0G +CSqGSIb3DQEBAgUAA4GBAIobK/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxg +J8pFUs4W7z8GZOeUaHxgMxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Nc +r6Pc5iaAIzy4RHT3Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0Ns +YXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH +MjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y +aXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazAe +Fw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJVUzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGlj +IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx +KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjM +HiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjw +DqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cC +AwEAATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9ji +nb3/7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX +rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnIn +jBJ7xUS0rg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVy +aVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24s +IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNp +Z24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJBgNV +BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNp +Z24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIElu +Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24g +Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt +IEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWU +J92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDO +JxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUY +wZF7C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9o +koqQHgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN +qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/E +Srg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekhktdmnLfe +xbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf0xwLRtxyID+u +7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU +sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RI +sH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTP +cjnhsUPgKM+351psE2tJs//jGHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE +BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is +I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G +CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do +lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc +AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 +pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 +13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk +U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i +F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY +oJ2daZH9 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b +N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t +KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu +kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm +CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ +Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu +imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te +2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe +DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p +F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt +TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDM +HO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtK +qsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwj +cSGIL4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y +cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRP +T8qAkbYp +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1 +GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ ++mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd +U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm +NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY +ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ +ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1 +CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq +g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm +fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c +2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/ +bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr +MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl +cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw +CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h +dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l +cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h +2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E +lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV +ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq +299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t +vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL +dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF +AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR +zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 +LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd +7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw +++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDgDCCAmigAwIBAgICAx4wDQYJKoZIhvcNAQEFBQAwYTELMAkGA1UEBhMCVVMx +DTALBgNVBAoTBFZJU0ExLzAtBgNVBAsTJlZpc2EgSW50ZXJuYXRpb25hbCBTZXJ2 +aWNlIEFzc29jaWF0aW9uMRIwEAYDVQQDEwlHUCBSb290IDIwHhcNMDAwODE2MjI1 +MTAwWhcNMjAwODE1MjM1OTAwWjBhMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklT +QTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRp +b24xEjAQBgNVBAMTCUdQIFJvb3QgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAKkBcLWqxEDwq2omYXkZAPy/mzdZDK9vZBv42pWUJGkzEXDK41Z0ohdX +ZFwgBuHW73G3O/erwWnQSaSxBNf0V2KJXLB1LRckaeNCYOTudNargFbYiCjh+20i +/SN8RnNPflRzHqgsVVh1t0zzWkWlAhr62p3DRcMiXvOL8WAp0sdftAw6UYPvMPjU +58fy+pmjIlC++QU3o63tmsPm7IgbthknGziLgE3sucfFicv8GjLtI/C1AVj59o/g +halMCXI5Etuz9c9OYmTaxhkVOmMd6RdVoUwiPDQyRvhlV7or7zaMavrZ2UT0qt2E +1w0cslSsMoW0ZA3eQbuxNMYBhjJk1Z8CAwEAAaNCMEAwHQYDVR0OBBYEFJ59SzS/ +ca3CBfYDdYDOqU8axCRMMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQAhpXYUVfmtJ3CPPPTVbMjMCqujmAuKBiPFyWHb +mQdpNSYx/scuhMKZYdQN6X0uEyt8joW2hcdLzzW2LEc9zikv2G+fiRxkk78IvXbQ +kIqUs38oW26sTTMs7WXcFsziza6kPWKSBpUmv9+55CCmc2rBvveURNZNbyoLaxhN +dBA2aGpawWqn3TYpjLgwi08hPwAuVDAHOrqK5MOeyti12HvOdUVmB/RtLdh6yumJ +ivIj2C/LbgA2T/vwLwHMD8AiZfSr4k5hLQOCfZEWtTDVFN5ex5D8ofyrEK9ca3Cn +B+8phuiyJccg/ybdd+95RBTEvd07xQObdyPsoOy7Wjm1zK0G +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIETzCCAzegAwIBAgIEO63vKTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQ +TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu +dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBS +b290Q0EwHhcNMDEwOTIzMTQxODE3WhcNMTEwOTIzMTMxODE3WjB1MQswCQYDVQQG +EwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMb +Q2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQg +LSBDQSBLbGFzYSAxMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4SRW9Q58g +5DY1Hw7hgCRKBEdPdGn0MFHsfw7rlu/oQm7IChI/uWd9q5wwo77YojtTDjRnpgZs +jqBeynX8T90vFILqsY2K5CF1OESalwvVr3sZiQX79lisuFKat92u6hBFikFIVxfH +HB67Af+g7u0dEHdDW7lwy81MwFYxBTRy9wIDAQABo4IBbTCCAWkwDwYDVR0TAQH/ +BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwggEEBgNVHSAEgfwwgfkwgfYGDSsGAQQB +vj8CAQoBAQAwgeQwgZoGCCsGAQUFBwICMIGNGoGKQ2VydHlmaWthdCB3eXN0YXdp +b255IHpnb2RuaWUgeiBkb2t1bWVudGVtOiAiUG9saXR5a2EgQ2VydHlmaWthY2pp +IGRsYSBSb290Q0EiLiBDZXJ0eWZpa2F0IHd5c3Rhd2lvbnkgcHJ6ZXogUm9vdENB +IHcgaGllcmFyY2hpaSBDQyBTaWduZXQuMEUGCCsGAQUFBwIBFjlodHRwOi8vd3d3 +LnNpZ25ldC5wbC9yZXBvenl0b3JpdW0vZG9rdW1lbnR5L3BjX3Jvb3RjYS50eHQw +HwYDVR0jBBgwFoAUwJvFIw0C4aZOSGsfAOnjmhQbsa8wHQYDVR0OBBYEFMODHtVZ +d1T7TftXR/nEI1zR54njMA0GCSqGSIb3DQEBBQUAA4IBAQBRIHQBFIGh8Jpxt87A +gSLwIEEk4+oGy769u3NtoaR0R3WNMdmt7fXTi0tyTQ9V4AIszxVjhnUPaKnF1KYy +f8Tl+YTzk9ZfFkZ3kCdSaILZAOIrmqWNLPmjUQ5/JiMGho0e1YmWUcMci84+pIis +TsytFzVP32/W+sz2H4FQAvOIMmxB7EJX9AdbnXn9EXZ+4nCqi0ft5z96ZqOJJiCB +3vSaoYg+wdkcvb6souMJzuc2uptXtR1Xf3ihlHaGW+hmnpcwFA6AoNrom6Vgzk6U +1ienx0Cw28BhRSKqzKkyXkuK8gRflZUx84uftXncwKJrMiE3lvgOOBITRzcahirL +er4c +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIE9zCCA9+gAwIBAgIEPL/xoTANBgkqhkiG9w0BAQUFADB2MQswCQYDVQQGEwJQ +TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu +dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWduZXQgLSBQ +Q0EgS2xhc2EgMjAeFw0wMjA0MTkxMDI5NTNaFw0xNzA0MTgxMjUzMDdaMHUxCzAJ +BgNVBAYTAlBMMR8wHQYDVQQKExZUUCBJbnRlcm5ldCBTcC4geiBvLm8uMSQwIgYD +VQQLExtDZW50cnVtIENlcnR5ZmlrYWNqaSBTaWduZXQxHzAdBgNVBAMTFkNDIFNp +Z25ldCAtIENBIEtsYXNhIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCqgLJuQqY4yavbSgHg8CyfKTx4BokNSDOVz4eD9vptUr11Kqd06ED1hlH7Sg0g +oBFAfntNU/QTKwSBaNuime7C4sSEdgsKrPoAhGb4Mq8y7Ty7RqZz7mkzNMqzL2L2 +U4yQ2QjvpH8MH0IBqOWEcpSkpwnrCDImRoTfd+YlZWKi2JceQixUUYIQ45Ox8+x8 +hHbvvZdgqtcvo8PW27qoHkp/7hMuJ44kDAGrmxffBXl/OBRZp0uO1CSLcMcVJzyr +2phKhy406MYdWrtNPEluGs0GFDzd0nrIctiWAO4cmct4S72S9Q6e//0GO9f3/Ca5 +Kb2I1xYLj/xE+HgjHX9aD2MhAgMBAAGjggGMMIIBiDAPBgNVHRMBAf8EBTADAQH/ +MA4GA1UdDwEB/wQEAwIBBjCB4wYDVR0gBIHbMIHYMIHVBg0rBgEEAb4/AhQKAQEA +MIHDMHUGCCsGAQUFBwICMGkaZ0NlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmll +IHogZG9rdW1lbnRlbTogIlBvbGl0eWthIENlcnR5ZmlrYWNqaSBQQ0EyIC0gQ2Vy +dHlmaWthdHkgVXJ6ZWRvdyBLbGFzeSAyIi4wSgYIKwYBBQUHAgEWPmh0dHA6Ly93 +d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9kb2t1bWVudHkva2xhc2EyL3BjX3Bj +YTIudHh0MD8GA1UdHwQ4MDYwNKAyoDCGLmh0dHA6Ly93d3cuc2lnbmV0LnBsL3Jl +cG96eXRvcml1bS9jcmwvcGNhMi5jcmwwHwYDVR0jBBgwFoAUwGxGyl2CfpYHRonE +82AVXO08kMIwHQYDVR0OBBYEFLtFBlILy4HNKVSzvHxBTM0HDowlMA0GCSqGSIb3 +DQEBBQUAA4IBAQBWTsCbqXrXhBBev5v5cIuc6gJM8ww7oR0uMQRZoFSqvQUPWBYM +2/TLI/f8UM9hSShUVj3zEsSj/vFHagUVmzuVXo5u0WK8iaqATSyEVBhADHrPG6wY +cLKJlagge/ILA0m+SieyP2sjYD9MUB9KZIEyBKv0429UuDTw6P7pslxMWJBSNyQx +aLIs0SRKsqZZWkc7ZYAj2apSkBMX2Is1oHA+PwkF6jQMwCao/+CndXPUzfCF6caa +9WwW31W26MlXCvSmJgfiTPwGvm4PkPmOnmWZ3CczzhHl4q7ztHFzshJH3sZWDnrW +wBFjzz5ePr3WHV1wA7EY6oT4zBx+2gT9XBTB +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEejCCA2KgAwIBAgIEP4vk6TANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQ +TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu +dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQgLSBD +QSBLbGFzYSAyMB4XDTAzMTAxNDExNTgyMloXDTE3MDQxODEyNTMwN1owdzELMAkG +A1UEBhMCUEwxHzAdBgNVBAoTFlRQIEludGVybmV0IFNwLiB6IG8uby4xJDAiBgNV +BAsTG0NlbnRydW0gQ2VydHlmaWthY2ppIFNpZ25ldDEhMB8GA1UEAxMYQ0MgU2ln +bmV0IC0gT0NTUCBLbGFzYSAyMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCo +VCsaBStblXQYVNthe3dvaCrfvKpPXngh4almm988iIlEv9CVTaAdCfaJNihvA+Vs +Qw8++ix1VqteMQE474/MV/YaXigP0Zr0QB+g+/7PWVlv+5U9Gzp9+Xx4DJay8AoI +iB7Iy5Qf9iZiHm5BiPRIuUXT4ZRbZRYPh0/76vgRsQIDAQABo4IBkjCCAY4wDgYD +VR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMJMEEGA1UdHwQ6MDgwNqA0 +oDKGMGh0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9jcmwva2xhc2Ey +LmNybDCB2AYDVR0gBIHQMIHNMIHKBg4rBgEEAb4/AoFICgwBADCBtzBsBggrBgEF +BQcCAjBgGl5DZXJ0eWZpa2F0IHd5ZGFueSB6Z29kbmllIHogZG9rdW1lbnRlbSAi +UG9saXR5a2EgQ2VydHlmaWthY2ppIC0gQ2VydHlmaWthdHkgcmVzcG9uZGVyb3cg +T0NTUCIuMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnNpZ25ldC5wbC9yZXBvenl0 +b3JpdW0vZG9rdW1lbnR5L3BjX29jc3BfMV8wLnBkZjAfBgNVHSMEGDAWgBS7RQZS +C8uBzSlUs7x8QUzNBw6MJTAdBgNVHQ4EFgQUKEVrOY7cEHvsVgvoyZdytlbtgwEw +CQYDVR0TBAIwADANBgkqhkiG9w0BAQUFAAOCAQEAQrRg5MV6dxr0HU2IsLInxhvt +iUVmSFkIUsBCjzLoewOXA16d2oDyHhI/eE+VgAsp+2ANjZu4xRteHIHoYMsN218M +eD2MLRsYS0U9xxAFK9gDj/KscPbrrdoqLvtPSMhUb4adJS9HLhvUe6BicvBf3A71 +iCNe431axGNDWKnpuj2KUpj4CFHYsWCXky847YtTXDjri9NIwJJauazsrSjK+oXp +ngRS506mdQ7vWrtApkh8zhhWp7duCkjcCo1O8JxqYr2qEW1fXmgOISe010v2mmuv +hHxPyVwoAU4KkOw0nbXZn53yak0is5+XmAjh0wWue44AssHrjC9nUh3mkLt6eQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFGjCCBAKgAwIBAgIEPL7eEDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQ +TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu +dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBS +b290Q0EwHhcNMDIwNDE4MTQ1NDA4WhcNMjYwOTIxMTU0MjE5WjB2MQswCQYDVQQG +EwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMb +Q2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWduZXQg +LSBQQ0EgS2xhc2EgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM7B +rBlbN5maM5eg0BOTqoZ+9NBDvU8Lm5rTdrMswFTCathzpVVLK/JD4K3+4oCZ9SRA +spEXE4gvwb08ASY6w5s+HpRkeJw8YzMFR5kDZD5adgnCAy4vDfIXYZgppXPaTQ8w +nfUZ7BZ7Zfa7QBemUIcJIzJBB0UqgtxWCeol9IekpBRVmuuSA6QG0Jkm+pGDJ05y +j2eQG8jTcBENM7sVA8rGRMyFA4skSZ+D0OG6FS2xC1i9JyN0ag1yII/LPx8HK5J4 +W9MaPRNjAEeaa2qI9EpchwrOxnyVbQfSedCG1VRJfAsE/9tT9CMUPZ3xW20QjQcS +ZJqVcmGW9gVsXKQOVLsCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQEBMIHk +MIGaBggrBgEFBQcCAjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmll +IHogZG9rdW1lbnRlbTogIlBvbGl0eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENB +Ii4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6IFJvb3RDQSB3IGhpZXJhcmNo +aWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5zaWduZXQucGwv +cmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw +OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Ev +cm9vdGNhLmNybDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNV +HQ4EFgQUwGxGyl2CfpYHRonE82AVXO08kMIwDQYJKoZIhvcNAQEFBQADggEBABp1 +TAUsa+BeVWg4cjowc8yTJ5XN3GvN96GObMkxUGY7U9kVrLI71xBgoNVyzXTiMNDB +vjh7vdPWjpl5SDiRpnnKiOFXA43HvNWzUaOkTu1mxjJsZsanot1Xt6j0ZDC+03Fj +LHdYMyM9kSWp6afb4980EPYZCcSzgM5TOGfJmNii5Tq468VFKrX+52Aou1G22Ohu ++EEOlOrG7ylKv1hHUJJCjwN0ZVEIn1nDbrU9FeGCz8J9ihVUvnENEBbBkU37PWqW +uHitKQDVtcwTwJJdR8cmKq3NmkwAm9fPacidQLpaw0WkuGrS+fEDhu1Nhy9xELP6 +NA9GRTCNxm/dXlcwnmY= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFGjCCBAKgAwIBAgIEPV0tNDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQ +TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu +dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBS +b290Q0EwHhcNMDIwODE2MTY0OTU2WhcNMjYwOTIxMTU0MjE5WjB2MQswCQYDVQQG +EwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMb +Q2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWduZXQg +LSBQQ0EgS2xhc2EgMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALN3 +LanJtdueNe6geWUTFENa+lEuzqELcoqhYB+a/tJcPEkc6TX/bYPzalRRjqs+quMP +6KZTU0DixOrV+K7iWaqAiQ913HX5IBLmKDCrTVW/ZvSDpiBKbxlHfSNuJxAuVT6H +dbzK7yAW38ssX+yS2tZYHZ5FhZcfqzPEOpO94mAKcBUhk6T/ki0evXX/ZvvktwmF +3hKattzwtM4JMLurAEl8SInyEYULw5JdlfcBez2Tg6Dbw34hA1A+ckTwhxzecrB8 +TUe2BnQKOs9vr2cCACpFFcOmPkM0Drtjctr1QHm1tYSqRFRf9VcV5tfC3P8QqoK4 +ONjtLPHc9x5NE1uK/FMCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQECMIHk +MIGaBggrBgEFBQcCAjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmll +IHogZG9rdW1lbnRlbTogIlBvbGl0eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENB +Ii4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6IFJvb3RDQSB3IGhpZXJhcmNo +aWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5zaWduZXQucGwv +cmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw +OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Ev +cm9vdGNhLmNybDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNV +HQ4EFgQUXvthcPHlH5BgGhlMErJNXWlhlgAwDQYJKoZIhvcNAQEFBQADggEBACIc +e95Mvn710KCAISA0CuHD4aznTU6pLoCDShW47OR+GTpJUm1coTcUqlBHV9mra4VF +rBcBuOkHZoBLq/jmE0QJWnpSEULDcH9J3mF0nqO9SM+mWyJGdsJF/XU/7smummgj +MNQXwzQTtWORF+6v5KUbWX85anO2wR+M6YTBWC55zWpWi4RG3vkHFs5Ze2oFJTlp +uxw9ZgxTnWlwI9QR2MvEhYIUMKMOWxw1nt0kKj+5TCNQQGh/VJJ1dsiroGh/io1D +OcePEhKz1Ag52y6Wf0nJJB9yk0sFakqZH18F7eQecQImgZyyeRtsG95leNugB3BX +WCW+KxwiBrtQTXv4dTE= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEzzCCA7egAwIBAgIEO6ocGTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQ +TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu +dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBS +b290Q0EwHhcNMDEwOTIwMTY0MjE5WhcNMjYwOTIxMTU0MjE5WjBxMQswCQYDVQQG +EwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMb +Q2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQg +LSBSb290Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrr2vydnNp +ELfGW3KsARiDhJvwDtUe4AbWev+OfMc3+vA29nX8ZmIwno3gmItjo5DbUCCRiCMq +5c9epcGu+kg4a3BJChVXREl8gVh0ST15rr3RKrSc4VgsvQzl0ZUraeQLl8JoRT5P +LsUj3qwF78jUCQVckiiLVcnGfZtFCm+DCJXliQBDMB9XFAUEiO/DtEBs0B7wJGx7 +lgJeJpQUcGiaOPjcJDYOk7rNAYmmD2gWeSlepufO8luUYG/YDxTC4mqhRqfa4MnV +O5dqy+ICj2UvUpHbZDB0KfGRibgBYeQP1kuqgIzJN4UqknVAJb0aMBSPl+9k2fAU +dchx1njlbdcbAgMBAAGjggFtMIIBaTAPBgNVHRMBAf8EBTADAQH/MIIBBAYDVR0g +BIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQEAMIHkMIGaBggrBgEFBQcCAjCBjRqBikNl +cnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 +eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdp +b255IHByemV6IFJvb3RDQSB3IGhpZXJhcmNoaWkgQ0MgU2lnbmV0LjBFBggrBgEF +BQcCARY5aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50 +eS9wY19yb290Y2EudHh0MB0GA1UdDgQWBBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAf +BgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAOBgNVHQ8BAf8EBAMCAQYw +DQYJKoZIhvcNAQEFBQADggEBAGnY5QmYqnnO9OqFOWZxxb25UHRnaRF6IV9aaGit +5BZufZj2Tq3v8L3SgE34GOoIcdRMMG5JEpEU4mN/Ef3oY6Eo+7HfqaPHI4KFmbDS +PiK5s+wmf+bQSm0Yq5/h4ZOdcAESlLQeLSt1CQk2JoKQJ6pyAf6xJBgWEIlm4RXE +4J3324PUiOp83kW6MDvaa1xY976WyInr4rwoLgxVl11LZeKWha0RJJxJgw/NyWpK +G7LWCm1fglF8JH51vZNndGYq1iKtfnrIOvLZq6bzaCiZm1EurD8HE6P7pmABKK6o +3C2OXlNfNIgwkDN/cDqk5TYsTkrpfriJPdxXBH8hQOkW89g= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID/TCCA2agAwIBAgIEP4/gkTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQ +TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu +dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQgLSBD +QSBLbGFzYSAxMB4XDTAzMTAxNzEyMjkwMloXDTExMDkyMzExMTgxN1owdjELMAkG +A1UEBhMCUEwxHzAdBgNVBAoTFlRQIEludGVybmV0IFNwLiB6IG8uby4xJDAiBgNV +BAsTG0NlbnRydW0gQ2VydHlmaWthY2ppIFNpZ25ldDEgMB4GA1UEAxMXQ0MgU2ln +bmV0IC0gVFNBIEtsYXNhIDEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOJY +rISEtSsduHajROh5/n7NGrkpYTT9NEaPe9+ucuQ37KxIbfJwXJjgUc1dw4wCkcQ1 +2FJarD1X6mSQ4cfN/60vLfKI5ZD4nhJTMKlAj1pX9ScQ/MuyvKStCbn5WTkjPhjR +AM0tdwXSnzuTEunfw0Oup559y3Iqxg1cExflB6cfAgMBAAGjggGXMIIBkzBBBgNV +HR8EOjA4MDagNKAyhjBodHRwOi8vd3d3LnNpZ25ldC5wbC9yZXBvenl0b3JpdW0v +Y3JsL2tsYXNhMS5jcmwwDgYDVR0PAQH/BAQDAgeAMBYGA1UdJQEB/wQMMAoGCCsG +AQUFBwMIMIHaBgNVHSAEgdIwgc8wgcwGDSsGAQQBvj8CZAoRAgEwgbowbwYIKwYB +BQUHAgIwYxphQ2VydHlmaWthdCB3eXN0YXdpb255IHpnb2RuaWUgeiBkb2t1bWVu +dGVtICJQb2xpdHlrYSBDZXJ0eWZpa2FjamkgQ0MgU2lnbmV0IC0gWm5ha293YW5p +ZSBjemFzZW0iLjBHBggrBgEFBQcCARY7aHR0cDovL3d3dy5zaWduZXQucGwvcmVw +b3p5dG9yaXVtL2Rva3VtZW50eS9wY190c2ExXzJfMS5wZGYwHwYDVR0jBBgwFoAU +w4Me1Vl3VPtN+1dH+cQjXNHnieMwHQYDVR0OBBYEFJdDwEqtcavOYd9u9tej53vW +XwNBMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADgYEAnpiQkqLCJQYXUrqMHUEz ++z3rOqS0XzSFnVVLhkVssvXc8S3FkJIiQTUrkScjI4CToCzujj3EyfNxH6yiLlMb +skF8I31JxIeBvueqV+s+o76CZm3ycu9hb0I4lswuxoT+q5ZzPR8Irrb51rZXlolR ++7KtwMg4sFDJZ8RNgOf7tbA= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDvjCCA3ygAwIBAgIFJQaThoEwCwYHKoZIzjgEAwUAMIGFMQswCQYDVQQGEwJG +UjEPMA0GA1UECBMGRnJhbmNlMQ4wDAYDVQQHEwVQYXJpczEQMA4GA1UEChMHUE0v +U0dETjEOMAwGA1UECxMFRENTU0kxDjAMBgNVBAMTBUlHQy9BMSMwIQYJKoZIhvcN +AQkBFhRpZ2NhQHNnZG4ucG0uZ291di5mcjAeFw0wMjEyMTMxNDM5MTVaFw0yMDEw +MTcxNDM5MTRaMIGFMQswCQYDVQQGEwJGUjEPMA0GA1UECBMGRnJhbmNlMQ4wDAYD +VQQHEwVQYXJpczEQMA4GA1UEChMHUE0vU0dETjEOMAwGA1UECxMFRENTU0kxDjAM +BgNVBAMTBUlHQy9BMSMwIQYJKoZIhvcNAQkBFhRpZ2NhQHNnZG4ucG0uZ291di5m +cjCCAbYwggErBgcqhkjOOAQBMIIBHgKBgQCFkMImdk9zDzJfTO4XPdAAmLbAdWws +ZiEMZh19RyTo3CyhFqO77OIXrwY6vc1pcc3MgWJ0dgQpAgrDMtmFFxpUu4gmjVsx +8GpxQC+4VOgLY8Cvmcd/UDzYg07EIRto8BwCpPJ/JfUxwzV2V3N713aAX+cEoKZ/ +s+kgxC6nZCA7oQIVALME/JYjkdW2uKIGngsEPbXAjdhDAoGADh/uqWJx94UBm31c +9d8ZTBfRGRnmSSRVFDgPWgA69JD4BR5da8tKz+1HjfMhDXljbMH86ixpD5Ka1Z0V +pRYUPbyAoB37tsmXMJY7kjyD19d5VdaZboUjVvhH6UJy5lpNNNGSvFl4fqkxyvw+ +pq1QV0N5RcvK120hlXdfHUX+YKYDgYQAAoGAQGr7IuKJcYIvJRMjxwl43KxXY2xC +aoCiM/bv117MfI94aNf1UusGhp7CbYAY9CXuL60P0oPMAajbaTE5Z34AuITeHq3Y +CNMHwxalip8BHqSSGmGiQsXeK7T+r1rPXsccZ1c5ikGDZ4xn5gUaCyy2rCmb+fOJ +6VAfCbAbAjmNKwejdzB1MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgFGMBUG +A1UdIAQOMAwwCgYIKoF6AXkBAQEwHQYDVR0OBBYEFPkeNRcUf8idzpKblYbLNxs0 +MQhSMB8GA1UdIwQYMBaAFPkeNRcUf8idzpKblYbLNxs0MQhSMAsGByqGSM44BAMF +AAMvADAsAhRVh+CJA5eVyEYU5AO9Tm7GxX0rmQIUBCqsU5u1WxoZ5lEXicDX5/Ob +sRQ= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYT +AkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQ +TS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG +9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMB4XDTAyMTIxMzE0MjkyM1oXDTIw +MTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAM +BgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEO +MAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2 +LmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaI +s9z4iPf930Pfeo2aSVz2TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2 +xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCWSo7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4 +u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYyHF2fYPepraX/z9E0+X1b +F8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNdfrGoRpAx +Vs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGd +PDPQtQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNV +HSAEDjAMMAoGCCqBegF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAx +NjAfBgNVHSMEGDAWgBSjBS8YYFDCiQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUF +AAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RKq89toB9RlPhJy3Q2FLwV3duJ +L92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3QMZsyK10XZZOY +YLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg +Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2a +NjSaTFR+FwNIlQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R +0982gaEbeC9xs/FZTEYYKKuF0mBWWg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp ++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +ZQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn +MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL +ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg +b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa +MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB +ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw +IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B +AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb +unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d +BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq +7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3 +0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX +roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG +A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j +aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p +26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA +BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud +EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN +BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz +aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB +AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd +p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi +1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc +XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0 +eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu +tGWaIZDgqtCYvDi1czyL+Nw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn +MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL +ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo +YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9 +MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy +NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G +A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA +A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0 +Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s +QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV +eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795 +B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh +z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T +AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i +ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w +TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH +MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD +VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE +VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh +bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B +AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM +bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi +ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG +VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c +ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/ +AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw +PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz +cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 +MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz +IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ +ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR +VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL +kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd +EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas +H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 +HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud +DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 +QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu +Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ +AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 +yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR +FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA +ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB +kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx +ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w +MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD +VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx +FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu +ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7 +gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH +fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a +ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT +ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF +MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk +c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto +dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt +aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI +hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk +QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/ +h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq +nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR +rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2 +9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ +MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT +DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow +PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD +Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O +rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq +OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b +xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw +7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD +aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG +SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 +ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr +AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz +R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 +JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo +Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw +NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw +NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy +ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV +BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo +Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 +4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 +KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI +rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi +94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB +sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi +gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo +kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE +vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t +O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua +AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP +9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ +eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m +0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMx +IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1 +dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w +HhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTELMAkGA1UEBhMCRVMx +IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1 +dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5u +Cp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5Vj1H5WuretXDE7aTt/6MNbg9kUDGvASdY +rv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJHlShbz++AbOCQl4oBPB3z +hxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf3H5idPay +BQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcL +iam8NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcb +AgMBAAGjgZ8wgZwwKgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lv +bmFsLmNvbTASBgNVHRMBAf8ECDAGAQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0 +MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E +FgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQADggEBAEdz/o0n +VPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq +u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36m +hoEyIwOdyPdfwUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzfl +ZKG+TQyTmAyX9odtsz/ny4Cm7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBp +QWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YGVM+h4k0460tQtcsm9MracEpqoeJ5 +quGnM/b9Sh/22WA= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs +IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg +R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A +PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8 +Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL +TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL +5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7 +S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe +2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap +EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td +EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv +/NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN +A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0 +abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF +I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz +4iIprn2DQKi6bA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY +MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo +R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx +MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 +AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA +ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 +7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W +kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI +mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ +KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 +6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl +4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K +oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj +UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU +AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy +c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 +IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV +VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 +cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT +QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh +F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v +c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w +mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd +VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX +teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ +f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe +Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ +nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB +/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY +MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG +9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX +IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn +ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z +uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN +Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja +QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW +koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 +ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt +DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm +bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy +c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD +VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 +c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 +WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG +FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq +XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL +se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb +KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd +IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 +y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt +hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc +QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 +Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV +HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ +KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ +L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr +Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo +ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY +T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz +GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m +1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV +OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH +6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX +QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 +MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL +v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 +eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq +tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd +C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa +zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB +mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH +V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n +bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG +3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs +J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO +291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS +ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd +AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD +EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05 +OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G +A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh +Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l +dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG +SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK +gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX +iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc +Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E +BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G +SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu +b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh +bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv +Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln +aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0 +IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh +c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph +biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo +ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP +UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj +YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo +dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA +bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06 +sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa +n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS +NitjrFgBazMpUIaD8QFI +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD +EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X +DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw +DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u +c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr +TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN +BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA +OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC +2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW +RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P +AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW +ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0 +YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz +b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO +ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB +IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs +b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs +ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s +YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg +a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g +SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0 +aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg +YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg +Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY +ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g +pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4 +Fp1hBWeAyNDYpQcCNJgEjTME1A== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhV +MRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMe +TmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0 +dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFzcyBB +KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oXDTE5MDIxOTIzMTQ0 +N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhC +dWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQu +MRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBL +b3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSMD7tM9DceqQWC2ObhbHDqeLVu0ThEDaiD +zl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZz+qMkjvN9wfcZnSX9EUi +3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC/tmwqcm8 +WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LY +Oph7tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2Esi +NCubMvJIH5+hCoR64sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCC +ApswDgYDVR0PAQH/BAQDAgAGMBIGA1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4 +QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZRUxFTSEgRXplbiB0 +YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRhdGFz +aSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu +IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtm +ZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMg +ZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVs +amFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJhc2EgbWVndGFsYWxoYXRv +IGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBzOi8vd3d3 +Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6 +ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1 +YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3Qg +dG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRs +b2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0G +CSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5ayZrU3/b39/zcT0mwBQO +xmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjPytoUMaFP +0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQ +QeJBCWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxk +f1qbFFgBJ34TUMdrKuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK +8CtmdWOMovsEPoMOmzbwGOQmIMOM8CgHrTwXZoi1/baI +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQD +EzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVneXpvaSAoQ2xhc3MgUUEpIFRhbnVz +aXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0bG9jay5odTAeFw0w +MzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTERMA8G +A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh +Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5l +dExvY2sgTWlub3NpdGV0dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZh +bnlraWFkbzEeMBwGCSqGSIb3DQEJARYPaW5mb0BuZXRsb2NrLmh1MIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRVCacbvWy5FPSKAtt2/Goq +eKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e8ia6AFQe +r7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO5 +3Lhbm+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWd +vLrqOU+L73Sa58XQ0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0l +mT+1fMptsK6ZmfoIYOcZwvK9UdPM0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4IC +wDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8EBAMCAQYwggJ1Bglg +hkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2YW55IGEgTmV0 +TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh +biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQg +ZWxla3Ryb25pa3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywg +dmFsYW1pbnQgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6 +b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwgYXogQWx0YWxhbm9zIFN6ZXJ6b2Rl +c2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kgZWxqYXJhcyBtZWd0 +ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczovL3d3 +dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0Bu +ZXRsb2NrLm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBh +bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRo +ZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3 +Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0IGluZm9AbmV0bG9jay5u +ZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3DQEBBQUA +A4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQ +MznNwNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+ +NFAwLvt/MpqNPfMgW/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCR +VCHnpgu0mfVRQdzNo0ci2ccBgcTcR08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY +83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR5qq5aKrN9p2QdRLqOBrKROi3 +macqaJVmlaut74nLYKkGEsaUR+ko +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa +GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg +Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J +WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB +rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp ++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 +ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i +Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz +PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og +/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH +oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI +yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud +EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 +A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL +MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f +BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn +g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl +fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K +WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha +B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc +hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR +TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD +mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z +ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y +4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza +8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM +V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB +4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr +H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd +8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv +vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT +mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe +btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc +T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt +WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ +c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A +4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD +VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG +CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 +aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw +czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G +A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg +Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 +7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem +d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd ++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B +4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN +t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x +DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 +k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s +zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j +Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT +mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK +4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz +MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv +cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz +Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO +0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao +wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj +7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS +8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT +BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg +JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 +6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ +3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm +D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS +CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx +MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg +Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ +iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa +/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ +jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI +HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 +sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w +gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw +KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG +AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L +URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO +H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm +I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY +iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl +MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp +U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw +NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE +ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp +ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 +DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf +8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN ++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 +X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa +K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA +1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G +A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR +zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 +YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD +bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w +DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 +L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D +eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp +VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY +WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg +Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9 +MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi +U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh +cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk +pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf +OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C +Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT +Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi +HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM +Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w ++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ +Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 +Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B +26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID +AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE +FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j +ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js +LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM +BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0 +Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy +dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh +cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh +YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg +dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp +bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ +YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT +TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ +9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8 +jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW +FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz +ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1 +ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L +EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu +L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq +yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC +O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V +um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh +NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFFjCCBH+gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBsDELMAkGA1UEBhMCSUwx +DzANBgNVBAgTBklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0 +Q29tIEx0ZC4xGjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBG +cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYS +YWRtaW5Ac3RhcnRjb20ub3JnMB4XDTA1MDMxNzE3Mzc0OFoXDTM1MDMxMDE3Mzc0 +OFowgbAxCzAJBgNVBAYTAklMMQ8wDQYDVQQIEwZJc3JhZWwxDjAMBgNVBAcTBUVp +bGF0MRYwFAYDVQQKEw1TdGFydENvbSBMdGQuMRowGAYDVQQLExFDQSBBdXRob3Jp +dHkgRGVwLjEpMCcGA1UEAxMgRnJlZSBTU0wgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkxITAfBgkqhkiG9w0BCQEWEmFkbWluQHN0YXJ0Y29tLm9yZzCBnzANBgkqhkiG +9w0BAQEFAAOBjQAwgYkCgYEA7YRgACOeyEpRKSfeOqE5tWmrCbIvNP1h3D3TsM+x +18LEwrHkllbEvqoUDufMOlDIOmKdw6OsWXuO7lUaHEe+o5c5s7XvIywI6Nivcy+5 +yYPo7QAPyHWlLzRMGOh2iCNJitu27Wjaw7ViKUylS7eYtAkUEKD4/mJ2IhULpNYI +LzUCAwEAAaOCAjwwggI4MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgHmMB0G +A1UdDgQWBBQcicOWzL3+MtUNjIExtpidjShkjTCB3QYDVR0jBIHVMIHSgBQcicOW +zL3+MtUNjIExtpidjShkjaGBtqSBszCBsDELMAkGA1UEBhMCSUwxDzANBgNVBAgT +BklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4x +GjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBGcmVlIFNTTCBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYSYWRtaW5Ac3Rh +cnRjb20ub3JnggEAMB0GA1UdEQQWMBSBEmFkbWluQHN0YXJ0Y29tLm9yZzAdBgNV +HRIEFjAUgRJhZG1pbkBzdGFydGNvbS5vcmcwEQYJYIZIAYb4QgEBBAQDAgAHMC8G +CWCGSAGG+EIBDQQiFiBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAy +BglghkgBhvhCAQQEJRYjaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL2NhLWNybC5j +cmwwKAYJYIZIAYb4QgECBBsWGWh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy8wOQYJ +YIZIAYb4QgEIBCwWKmh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9pbmRleC5waHA/ +YXBwPTExMTANBgkqhkiG9w0BAQQFAAOBgQBscSXhnjSRIe/bbL0BCFaPiNhBOlP1 +ct8nV0t2hPdopP7rPwl+KLhX6h/BquL/lp9JmeaylXOWxkjHXo0Hclb4g4+fd68p +00UOpO6wNnQt8M2YI3s3S9r+UZjEHjQ8iP2ZO1CnwYszx8JSFhKVU2Ui77qLzmLb +cCOxgN8aIDjnfg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV +BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln +biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF +MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT +d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 +76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ +bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c +6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE +emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd +MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt +MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y +MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y +FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi +aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM +gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB +qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 +lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn +8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov +L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 +45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO +UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 +O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC +bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv +GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a +77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC +hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 +92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp +Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w +ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt +Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE +BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWdu +IFBsYXRpbnVtIENBIC0gRzIwHhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAw +WjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMSMwIQYDVQQD +ExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu669y +IIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2Htn +IuJpX+UFeNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+ +6ixuEFGSzH7VozPY1kneWCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5ob +jM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIoj5+saCB9bzuohTEJfwvH6GXp43gOCWcw +izSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/68++QHkwFix7qepF6w9fl ++zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34TaNhxKFrY +zt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaP +pZjydomyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtF +KwH3HBqi7Ri6Cr2D+m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuW +ae5ogObnmLo2t/5u7Su9IPhlGdpVCX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMB +AAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCvzAeHFUdvOMW0 +ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW +IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUA +A4ICAQAIhab1Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0 +uMoI3LQwnkAHFmtllXcBrqS3NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+ +FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4U99REJNi54Av4tHgvI42Rncz7Lj7 +jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8KV2LwUvJ4ooTHbG/ +u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl9x8D +YSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1 +puEa+S1BaYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXa +icYwu+uPyyIIoK6q8QNsOktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbG +DI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSYMdp08YSTcU1f+2BY0fvEwW2JorsgH51x +kcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAciIfNAChs0B0QTwoRqjt8Z +Wr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE +BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu +IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow +RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY +U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv +Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br +YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF +nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH +6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt +eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/ +c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ +MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH +HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf +jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6 +5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB +rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU +F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c +wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 +cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB +AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp +WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9 +xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ +2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ +IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8 +aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X +em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR +dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/ +OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+ +hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy +tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBk +MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0 +YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg +Q0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4MTgyMjA2MjBaMGQxCzAJBgNVBAYT +AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp +Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9 +m2BtRsiMMW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdih +FvkcxC7mlSpnzNApbjyFNDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/ +TilftKaNXXsLmREDA/7n29uj/x2lzZAeAR81sH8A25Bvxn570e56eqeqDFdvpG3F +EzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkCb6dJtDZd0KTeByy2dbco +kdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn7uHbHaBu +HYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNF +vJbNcA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo +19AOeCMgkckkKmUpWyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjC +L3UcPX7ape8eYIVpQtPM+GP+HkM5haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJW +bjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNYMUJDLXT5xp6mig/p/r+D5kNX +JLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw +FDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j +BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzc +K6FptWfUjNP9MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzf +ky9NfEBWMXrrpA9gzXrzvsMnjgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7Ik +Vh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQMbFamIp1TpBcahQq4FJHgmDmHtqB +sfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4HVtA4oJVwIHaM190e +3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtlvrsR +ls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ip +mXeascClOS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HH +b6D0jqTsNFFbjCYDcKF31QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksf +rK/7DZBaZmBwXarNeNQk7shBoJMBkpxqnvy5JMWzFYJ+vq6VK+uxwNrjAWALXmms +hFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCyx/yP2FS1k2Kdzs9Z+z0Y +zirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMWNY6E0F/6 +MBr1mmz0DlP5OlvRHA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOc +UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMQswCQYDVQQGDAJUUjEPMA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykg +MjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 +dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMxMDI3MTdaFw0xNTAz +MjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2Vy +dGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYD +VQQHDAZBTktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kg +xLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEu +xZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7 +XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GXyGl8hMW0kWxsE2qkVa2k +heiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8iSi9BB35J +YbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5C +urKZ8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1 +JuTm5Rh8i27fbMx4W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51 +b0dewQIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV +9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46sWrv7/hg0Uw2ZkUd82YCdAR7 +kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxEq8Sn5RTOPEFh +fEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy +B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdA +aLX/7KfS0zgYnNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKS +RGQDJereW26fyfJOrN3H +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOc +UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xS +S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg +SGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcNMDUxMTA3MTAwNzU3 +WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVrdHJv +bmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJU +UjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSw +bGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWe +LiAoYykgS2FzxLFtIDIwMDUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqeLCDe2JAOCtFp0if7qnef +J1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKIx+XlZEdh +R3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJ +Qv2gQrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGX +JHpsmxcPbe9TmJEr5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1p +zpwACPI2/z7woQ8arBT9pmAPAgMBAAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58S +Fq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8GA1UdEwEB/wQFMAMBAf8wDQYJ +KoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/nttRbj2hWyfIvwq +ECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 +Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFz +gw2lGh1uEpJ+hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotH +uFEJjOp9zYhys2AzsfAKRO8P9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LS +y3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5UrbnBEI= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ +MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow +PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR +IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q +gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy +yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts +F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 +jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx +ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC +VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK +YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH +EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN +Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud +DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE +MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK +UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf +qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK +ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE +JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 +hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 +EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm +nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX +udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz +ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe +LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl +pYYsfPQS +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW +ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 +nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex +t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz +SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG +BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ +rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ +NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E +BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH +BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv +MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE +p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y +5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK +WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ +4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N +hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9v +dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDAxMDExMTY0MTI4WhcNMjEwMTE0 +MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSww +KgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0G +A1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n13 +5zHCLielTWi5MbqNQ1mXx3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHE +SxP9cMIlrCL1dQu3U+SlK93OvRw6esP3E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4O +JgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5OEL8pahbSCOz6+MlsoCu +ltQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4jsNtlAHCE +AQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMB +AAGjYTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcB +CzAyMDAGCCsGAQUFBwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRw +b2xpY3kwDQYJKoZIhvcNAQEFBQADggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo +7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrvm+0fazbuSCUlFLZWohDo7qd/ +0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0ROhPs7fpvcmR7 +nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx +x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ +33ZwmVxwQ023tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB +gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk +MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY +UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx +NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 +dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy +dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 +38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP +KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q +DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 +qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa +JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi +PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P +BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs +jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 +eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR +vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa +IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy +i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ +O+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB +qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV +BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw +NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j +LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG +A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs +W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta +3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk +6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 +Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J +NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP +r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU +DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz +YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 +/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ +LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 +jVaMaA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIIDjCCBfagAwIBAgIJAOiOtsn4KhQoMA0GCSqGSIb3DQEBBQUAMIG8MQswCQYD +VQQGEwJVUzEQMA4GA1UECBMHSW5kaWFuYTEVMBMGA1UEBxMMSW5kaWFuYXBvbGlz +MSgwJgYDVQQKEx9Tb2Z0d2FyZSBpbiB0aGUgUHVibGljIEludGVyZXN0MRMwEQYD +VQQLEwpob3N0bWFzdGVyMR4wHAYDVQQDExVDZXJ0aWZpY2F0ZSBBdXRob3JpdHkx +JTAjBgkqhkiG9w0BCQEWFmhvc3RtYXN0ZXJAc3BpLWluYy5vcmcwHhcNMDgwNTEz +MDgwNzU2WhcNMTgwNTExMDgwNzU2WjCBvDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMfU29mdHdh +cmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1hc3RlcjEe +MBwGA1UEAxMVQ2VydGlmaWNhdGUgQXV0aG9yaXR5MSUwIwYJKoZIhvcNAQkBFhZo +b3N0bWFzdGVyQHNwaS1pbmMub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEA3DbmR0LCxFF1KYdAw9iOIQbSGE7r7yC9kDyFEBOMKVuUY/b0LfEGQpG5 +GcRCaQi/izZF6igFM0lIoCdDkzWKQdh4s/Dvs24t3dHLfer0dSbTPpA67tfnLAS1 +fOH1fMVO73e9XKKTM5LOfYFIz2u1IiwIg/3T1c87Lf21SZBb9q1NE8re06adU1Fx +Y0b4ShZcmO4tbZoWoXaQ4mBDmdaJ1mwuepiyCwMs43pPx93jzONKao15Uvr0wa8u +jyoIyxspgpJyQ7zOiKmqp4pRQ1WFmjcDeJPI8L20QcgHQprLNZd6ioFl3h1UCAHx +ZFy3FxpRvB7DWYd2GBaY7r/2Z4GLBjXFS21ZGcfSxki+bhQog0oQnBv1b7ypjvVp +/rLBVcznFMn5WxRTUQfqzj3kTygfPGEJ1zPSbqdu1McTCW9rXRTunYkbpWry9vjQ +co7qch8vNGopCsUK7BxAhRL3pqXTT63AhYxMfHMgzFMY8bJYTAH1v+pk1Vw5xc5s +zFNaVrpBDyXfa1C2x4qgvQLCxTtVpbJkIoRRKFauMe5e+wsWTUYFkYBE7axt8Feo ++uthSKDLG7Mfjs3FIXcDhB78rKNDCGOM7fkn77SwXWfWT+3Qiz5dW8mRvZYChD3F +TbxCP3T9PF2sXEg2XocxLxhsxGjuoYvJWdAY4wCAs1QnLpnwFVMCAwEAAaOCAg8w +ggILMB0GA1UdDgQWBBQ0cdE41xU2g0dr1zdkQjuOjVKdqzCB8QYDVR0jBIHpMIHm +gBQ0cdE41xU2g0dr1zdkQjuOjVKdq6GBwqSBvzCBvDELMAkGA1UEBhMCVVMxEDAO +BgNVBAgTB0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMf +U29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1h +c3RlcjEeMBwGA1UEAxMVQ2VydGlmaWNhdGUgQXV0aG9yaXR5MSUwIwYJKoZIhvcN +AQkBFhZob3N0bWFzdGVyQHNwaS1pbmMub3JnggkA6I62yfgqFCgwDwYDVR0TAQH/ +BAUwAwEB/zARBglghkgBhvhCAQEEBAMCAAcwCQYDVR0SBAIwADAuBglghkgBhvhC +AQ0EIRYfU29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDAwBglghkgBhvhC +AQQEIxYhaHR0cHM6Ly9jYS5zcGktaW5jLm9yZy9jYS1jcmwucGVtMDIGCWCGSAGG ++EIBAwQlFiNodHRwczovL2NhLnNwaS1pbmMub3JnL2NlcnQtY3JsLnBlbTAhBgNV +HREEGjAYgRZob3N0bWFzdGVyQHNwaS1pbmMub3JnMA4GA1UdDwEB/wQEAwIBBjAN +BgkqhkiG9w0BAQUFAAOCAgEAtM294LnqsgMrfjLp3nI/yUuCXp3ir1UJogxU6M8Y +PCggHam7AwIvUjki+RfPrWeQswN/2BXja367m1YBrzXU2rnHZxeb1NUON7MgQS4M +AcRb+WU+wmHo0vBqlXDDxm/VNaSsWXLhid+hoJ0kvSl56WEq2dMeyUakCHhBknIP +qxR17QnwovBc78MKYiC3wihmrkwvLo9FYyaW8O4x5otVm6o6+YI5HYg84gd1GuEP +sTC8cTLSOv76oYnzQyzWcsR5pxVIBcDYLXIC48s9Fmq6ybgREOJJhcyWR2AFJS7v +dVkz9UcZFu/abF8HyKZQth3LZjQl/GaD68W2MEH4RkRiqMEMVObqTFoo5q7Gt/5/ +O5aoLu7HaD7dAD0prypjq1/uSSotxdz70cbT0ZdWUoa2lOvUYFG3/B6bzAKb1B+P ++UqPti4oOxfMxaYF49LTtcYDyeFIQpvLP+QX4P4NAZUJurgNceQJcHdC2E3hQqlg +g9cXiUPS1N2nGLar1CQlh7XU4vwuImm9rWgs/3K1mKoGnOcqarihk3bOsPN/nOHg +T7jYhkalMwIsJWE3KpLIrIF0aGOHM3a9BX9e1dUCbb2v/ypaqknsmHlHU5H2DjRa +yaXG67Ljxay2oHA1u8hRadDytaIybrw/oDc5fHE2pgXfDBLkFqfF1stjo5VwP+YE +o2A= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc +MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj +IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB +IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE +RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl +U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 +IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU +ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC +QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr +rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S +NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc +QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH +txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP +BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC +AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp +tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa +IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl +6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ +xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGJDCCBY2gAwIBAgIEQoaroDANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u +ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u +ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjA3 +MTQxNzEwMjhaFw0xNDA3MTQxNzQwMjhaMFwxCzAJBgNVBAYTAlVTMRUwEwYDVQQK +EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xGzAZBgNV +BAMTEkRpZ2lDZXJ0IEdsb2JhbCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAMQ8vMy66mLmnkIjr7SyEa5ijdmh04/MFHIZ7Zn2/d5du1nAsMKvaplS +lVcLNf/hhvqvosPBBWUnIHYvClQlfOor3ZVBV5sPO89H6AEGjMVESPwHLvNygzBR +lJ5pOoOph5AU2V7EoniPwT7UGWEOGufcGpUgQb5vF9q4HEHumLD61x01PxanBCgT +XT0FdZouhp4ssBeHIFhX7+HqVWC4LHAhrCljDBD8YLz51Rw3ZNW0+x6rJjlGiKTL +zTBnwCZ55cpo+SLX5dKxu0hMmwuYW0KS5dLtDkcw+t0nVmNqpQHHjq/wTjsbVRVE +1T5NVx7hkeq4oI/OOmNflom6CD7+RLsCAwEAAaOCAwUwggMBMBIGA1UdEwEB/wQI +MAYBAf8CAQAwggEyBgNVHSAEggEpMIIBJTCCASEGCSqGSIb2fQdLAjCCARIwJgYI +KwYBBQUHAgEWGmh0dHA6Ly93d3cuZW50cnVzdC5uZXQvY3BzMIHnBggrBgEFBQcC +AjCB2hqB10ZvciB1c2Ugc29sZWx5IHdpdGggU1NMIGFuZCBTL01JTUUgY2VydGlm +aWNhdGVzIGlzc3VlZCBieSBEaWdpY2VydCwgSW5jLiB0byBhdXRob3JpemVkIHN1 +YnNjcmliZXJzLg0KRE9FUyBOT1QgcmVwcmVzZW50IGFueSBlbmRvcnNlbWVudCBi +eSBFbnRydXN0IEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMgYXMgdG8gdGhlIGlkZW50 +aXR5IG9mIGFueSBjZXJ0aWZpY2F0ZSBob2xkZXIuMDEGA1UdJQQqMCgGCCsGAQUF +BwMBBggrBgEFBQcDAgYIKwYBBQUHAwQGCCsGAQUFBwMJMIIBGAYDVR0fBIIBDzCC +AQswKKAmoCSGImh0dHA6Ly9jcmwuZW50cnVzdC5uZXQvc2VydmVyMS5jcmwwgd6g +gduggdikgdUwgdIxCzAJBgNVBAYTAlVTMRQwEgYDVQQKEwtFbnRydXN0Lm5ldDE7 +MDkGA1UECxMyd3d3LmVudHJ1c3QubmV0L0NQUyBpbmNvcnAuIGJ5IHJlZi4gKGxp +bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0 +ZWQxOjA4BgNVBAMTMUVudHJ1c3QubmV0IFNlY3VyZSBTZXJ2ZXIgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEwCwYDVR0PBAQDAgEGMB8GA1Ud +IwQYMBaAFPAXYhNVPbP/CgBr+1CEl/PtYtAaMB0GA1UdDgQWBBSnxxOgegE8ne+C +SIJI1XNRthJWKjAZBgkqhkiG9n0HQQAEDDAKGwRWNy4xAwIAgTANBgkqhkiG9w0B +AQUFAAOBgQBK8bPOaGnjWKNh7bYWyJOxGDA+4HLfTz3iTeG4/D/ByeNFqV2pwdqj +5TbXjtYPrTavbLxE5ppGlKYRoNBS59pVsPYchftjUnu2mY8f4stHZKLrCGXmUdsc +S21/U58eDTGT1DBdHm4BBydgXbvT9ONsHSAPdSozEKe3idepFxQyAw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEUDCCA7mgAwIBAgIJAN4ppNGwj6yIMA0GCSqGSIb3DQEBBAUAMIHMMQswCQYD +VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5j +aXNjbzEZMBcGA1UEChMQTGluZGVuIExhYiwgSW5jLjEpMCcGA1UECxMgTGluZGVu +IExhYiBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxKTAnBgNVBAMTIExpbmRlbiBMYWIg +Q2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYJKoZIhvcNAQkBFhBjYUBsaW5kZW5s +YWIuY29tMB4XDTA1MDQyMTAyNDAzMVoXDTI1MDQxNjAyNDAzMVowgcwxCzAJBgNV +BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp +c2NvMRkwFwYDVQQKExBMaW5kZW4gTGFiLCBJbmMuMSkwJwYDVQQLEyBMaW5kZW4g +TGFiIENlcnRpZmljYXRlIEF1dGhvcml0eTEpMCcGA1UEAxMgTGluZGVuIExhYiBD +ZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgkqhkiG9w0BCQEWEGNhQGxpbmRlbmxh +Yi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKXh1MThucdTbMg9bYBO +rAm8yWns32YojB0PRfbq8rUjepEhTm3/13s0u399Uc202v4ejcGhkIDWJZd2NZMF +oKrhmRfxGHSKPCuFaXC3jh0lRECj7k8FoPkcmaPjSyodrDFDUUuv+C06oYJoI+rk +8REyal9NwgHvqCzOrZtiTXAdAgMBAAGjggE2MIIBMjAdBgNVHQ4EFgQUO1zK2e1f +1wO1fHAjq6DTJobKDrcwggEBBgNVHSMEgfkwgfaAFDtcytntX9cDtXxwI6ug0yaG +yg63oYHSpIHPMIHMMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEW +MBQGA1UEBxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQTGluZGVuIExhYiwgSW5j +LjEpMCcGA1UECxMgTGluZGVuIExhYiBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxKTAn +BgNVBAMTIExpbmRlbiBMYWIgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYJKoZI +hvcNAQkBFhBjYUBsaW5kZW5sYWIuY29tggkA3imk0bCPrIgwDAYDVR0TBAUwAwEB +/zANBgkqhkiG9w0BAQQFAAOBgQA/ZkgfvwHYqk1UIAKZS3kMCxz0HvYuEQtviwnu +xA39CIJ65Zozs28Eg1aV9/Y+Of7TnWhW+U3J3/wD/GghaAGiKK6vMn9gJBIdBX/9 +e6ef37VGyiOEFFjnUIbuk0RWty0orN76q/lI/xjCi15XSA/VSq2j4vmnwfZcPTDu +glmQ1A== +-----END CERTIFICATE----- -- cgit v1.2.3 From 1a2cc89cc59d92e768e109a1a822bfedfd9aaf01 Mon Sep 17 00:00:00 2001 From: callum <none@none> Date: Fri, 1 Apr 2011 14:48:56 -0700 Subject: SOCIAL-859 FIX SSL issues re-emerged on OS X 10.6.7 (and possibly other OSs) --- indra/newview/app_settings/CA.pem | 6471 +++++++++++++++++-------------------- 1 file changed, 2946 insertions(+), 3525 deletions(-) diff --git a/indra/newview/app_settings/CA.pem b/indra/newview/app_settings/CA.pem index 7cebbf48b2..63bb036c92 100644 --- a/indra/newview/app_settings/CA.pem +++ b/indra/newview/app_settings/CA.pem @@ -128,2094 +128,999 @@ TBA+9zBb6xD1KM2DdY7r4GiyYItN0BKLfuWbh9LXGbl1C+f4P11g+m2MPiavIeCe 1iazG5pcS3KoTLACsYlEX24TINtg4kcuS81XdllcnsV3Kdts0nIqPj6uhTTZD0k= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIDtTCCAp2gAwIBAgIRANAeQJAAAEZSAAAAAQAAAAQwDQYJKoZIhvcNAQEF -BQAwgYkxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJEQzETMBEGA1UEBxMKV2Fz -aGluZ3RvbjEXMBUGA1UEChMOQUJBLkVDT00sIElOQy4xGTAXBgNVBAMTEEFC -QS5FQ09NIFJvb3QgQ0ExJDAiBgkqhkiG9w0BCQEWFWFkbWluQGRpZ3NpZ3Ry -dXN0LmNvbTAeFw05OTA3MTIxNzMzNTNaFw0wOTA3MDkxNzMzNTNaMIGJMQsw -CQYDVQQGEwJVUzELMAkGA1UECBMCREMxEzARBgNVBAcTCldhc2hpbmd0b24x -FzAVBgNVBAoTDkFCQS5FQ09NLCBJTkMuMRkwFwYDVQQDExBBQkEuRUNPTSBS -b290IENBMSQwIgYJKoZIhvcNAQkBFhVhZG1pbkBkaWdzaWd0cnVzdC5jb20w -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx0xHgeVVDBwhMywVC -AOINg0Y95JO6tgbTDVm9PsHOQ2cBiiGo77zM0KLMsFWWU4RmBQDaREmA2FQK -pSWGlO1jVv9wbKOhGdJ4vmgqRF4vz8wYXke8OrFGPR7wuSw0X4x8TAgpnUBV -6zx9g9618PeKgw6hTLQ6pbNfWiKX7BmbwQVo/ea3qZGULOR4SCQaJRk665Wc -OQqKz0Ky8BzVX/tr7WhWezkscjiw7pOp03t3POtxA6k4ShZsiSrK2jMTecJV -jO2cu/LLWxD4LmE1xilMKtAqY9FlWbT4zfn0AIS2V0KFnTKo+SpU+/94Qby9 -cSj0u5C8/5Y0BONFnqFGKECBAgMBAAGjFjAUMBIGA1UdEwEB/wQIMAYBAf8C -AQgwDQYJKoZIhvcNAQEFBQADggEBAARvJYbk5pYntNlCwNDJALF/VD6Hsm0k -qS8Kfv2kRLD4VAe9G52dyntQJHsRW0mjpr8SdNWJt7cvmGQlFLdh6X9ggGvT -ZOirvRrWUfrAtF13Gn9kCF55xgVM8XrdTX3O5kh7VNJhkoHWG9YA8A6eKHeg -TYjHInYZw8eeG6Z3ePhfm1bR8PIXrI6dWeYf/le22V7hXZ9F7GFoGUHhsiAm -/lowdiT/QHI8eZ98IkirRs3bs4Ysj78FQdPB4xTjQRcm0HyncUwZ6EoPclgx -fexgeqMiKL0ZJGA/O4dzwGvky663qyVDslUte6sGDnVdNOVdc22esnVApVnJ -TzFxiNmIf1Q= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJT -RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4 -dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5h -bCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzEL -MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1B -ZGRUcnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1 -c3QgRXh0ZXJuYWwgQ0EgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBALf3GjPm8gAELTngTlvtH7xsD821+iO2zt6bETOXpClMfZOfvUq8 -k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfwTz/oMp50 -ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504 -B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDez -eWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5 -aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0WicCAwEAAaOB -3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0PBAQD -AgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6 -xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU -cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdv -cmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJ -KoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl -j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5R -xNKWt9x+Tu5w/Rw56wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjT -K3rMUUKhemPR5ruhxSvCNr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1 -n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHx -REzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49O -hgQ= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJT -RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU -UCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3Qw -HhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJT -RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU -UCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3Qw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwze -xODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY654eyNAbFvAWlA3yCyykQruGI -gb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWroulpOj0O -M3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1Lc -sRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5 -mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG -9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0OBBYEFJWxtPCU -tr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ -MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQsw -CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk -ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAx -IENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0 -MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph -iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9 -tTEv2dB8Xfjea4MYeDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL -/bscVjby/rK25Xa71SJlpz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlV -g3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6 -tkD9xOQ14R0WHNC8K47Wcdk= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJT -RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU -UCBOZXR3b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAe -Fw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNF -MRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ -IE5ldHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+ -A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c -+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1id9NEHif2 -P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKX -C1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8R -s3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9 -BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQWBBSBPjfYkrAf -d59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zCB -jgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkG -A1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU -cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENB -IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmu -G7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL -+YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbj -PGsye/Kf8Lb93/AoGEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bY -GozH7ZxOmuASu7VqTITh4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6 -NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9HEufOX1362Kqx -My3ZdvJOOjMMK7MtkAY= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJT -RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU -UCBOZXR3b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9v -dDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYT -AlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3Qg -VFRQIE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBS -b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoek -n0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKk -IhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3KP0q6p6z -sLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1t -UvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R -+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvES -a0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0GA1UdDgQWBBQ5 -lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw -AwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkw -ZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL -ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVh -bGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2Vh -lRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG -GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx9 -5dr6h+sNNVJn0J6XdgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKF -Yqa0p9m9N5xotS1WfbC3P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVA -wRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQw -dOUeqN48Jzd/g66ed8/wMLH/S5noxqE= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJV -UzEcMBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1l -cmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4X -DTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMx -HDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJp -Y2EgT25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCa -xlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CGv2BlnEtUiMJIxUo5vxTjWVXl -GbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44zDyL9Hy7n -BzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145Lcx -VR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiE -mf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCu -JKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Zo/Z5 -9m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUA -A4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF -Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOM -IOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTI -dGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g -Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j -8uB9Gr784N/Xx6dssPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJV -UzEcMBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1l -cmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4X -DTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMx -HDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJp -Y2EgT25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssN -t79Hc9PwVU3dxgz6sWYFas14tNwC206B89enfHG8dWOgXeMHDEjsJcQDIPT/ -DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8f3SkWq7x -uhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE -18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxr -kJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMD -bi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8BPeraunzgWGcX -uVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn6KVu -Y8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9 -W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ -o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48 -ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124Hhn -AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op -aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNee -MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypL -M7PmG2tZTiLMubekJcmnxPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qf -tIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjR -Ywu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R -+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr -+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVM -nNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMADjMSW7yV5TKQqLPGbIOt -d+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh1NolNscI -WC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZ -ZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y -3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz -2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs +IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 +MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h +bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt +H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 +uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX +mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX +a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN +E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 +WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD +VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 +Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU +cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx +IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN +AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH +YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC +Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX +c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a +mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw +MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD +VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA +A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul +CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n +tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl +dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch +PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC ++Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O +BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl +MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk +ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB +IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X +7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz +43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY +eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl +pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA +WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx +MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB +ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV +BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV +6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX +GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP +dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH +1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF +62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW +BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL +MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU +cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv +b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6 +IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/ +iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao +GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh +4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm +XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1 +MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK +EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh +BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq +xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G +87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i +2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U +WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1 +0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G +A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr +pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL +ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm +aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv +hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm +hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X +dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3 +P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y +iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no +xqE= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP +bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2 +MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft +ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk +hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym +1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW +OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb +2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko +O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU +AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF +Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb +LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir +oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C +MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds +sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP +bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2 +MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft +ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC +206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci +KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2 +JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9 +BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e +Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B +PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67 +Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq +Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ +o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3 ++L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj +YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj +FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn +xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2 +LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc +obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8 +CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe +IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA +DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F +AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX +Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb +AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl +Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw RY8mkaKO/qk= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMC -VVMxHTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNB -bWVyaWNhIE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIg -Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyOTA2MDAw -MFoXDTM3MTEyMDE1MDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRB -T0wgVGltZSBXYXJuZXIgSW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUg -SW5jLjE3MDUGA1UEAxMuQU9MIFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAJnej8Mlo2k06AX3dLm/WpcZuS+U0pPlLYnKhHw/EEMbjIt8hFj4JHxI -zyr9wBXZGH6EGhfT257XyuTZ16pYUYfw8ItITuLCxFlpMGK2MKKMCxGZYTVt -fu/FsRkGIBKOQuHfD5YQUqjPnF+VFNivO3ULMSAfRC+iYkGzuxgh28pxPIzs -trkNn+9R7017EvILDOGsQI93f7DKeHEMXRZxcKLXwjqFzQ6axOAAsNUl6twr -5JQtOJyJQVdkKGUZHLZEtMgxa44Be3ZZJX8VHIQIfHNlIAqhBC4aMqiaILGc -LCFZ5/vP7nAtCMpjPiybkxlqpMKX/7eGV4iFbJ4VFitNLLMCAwEAAaNjMGEw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUoTYwFsuGkABFgFOxj8jYPXy+ -XxIwHwYDVR0jBBgwFoAUoTYwFsuGkABFgFOxj8jYPXy+XxIwDgYDVR0PAQH/ -BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQCKIBilvrMvtKaEAEAwKfq0FHNM -eUWn9nDg6H5kHgqVfGphwu9OH77/yZkfB2FK4V1Mza3u0FIy2VkyvNp5ctZ7 -CegCgTXTCt8RHcl5oIBN/lrXVtbtDyqvpxh1MwzqwWEFT2qaifKNuZ8u77Bf -WgDrvq2g+EQFZ7zLBO+eZMXpyD8Fv8YvBxzDNnGGyjhmSs3WuEvGbKeXO/oT -LW4jYYehY0KswsuXn2Fozy1MBJ3XJU8KDk2QixhWqJNIV9xvrr2eZ1d3iVCz -vhGbRWeDhhmH05i9CBoWH1iCC+GWaQVLjuyDUTEH1dSf/1l7qG6Fz9NLqUmw -X7A5KGgOc90lmt4S ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIF5jCCA86gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMC -VVMxHTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNB -bWVyaWNhIE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIg -Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyOTA2MDAw -MFoXDTM3MDkyODIzNDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRB -T0wgVGltZSBXYXJuZXIgSW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUg -SW5jLjE3MDUGA1UEAxMuQU9MIFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC -ggIBALQ3WggWmRToVbEbJGv8x4vmh6mJ7ouZzU9AhqS2TcnZsdw8TQ2FTBVs -RotSeJ/4I/1n9SQ6aF3Q92RhQVSji6UI0ilbm2BPJoPRYxJWSXakFsKlnUWs -i4SVqBax7J/qJBrvuVdcmiQhLE0OcR+mrF1FdAOYxFSMFkpBd4aVdQxHAWZg -/BXxD+r1FHjHDtdugRxev17nOirYlxcwfACtCJ0zr7iZYYCLqJV+FNwSbKTQ -2O9ASQI2+W6p1h2WVgSysy0WVoaP2SBXgM1nEG2wTPDaRrbqJS5Gr42whTg0 -ixQmgiusrpkLjhTXUr2eacOGAgvqdnUxCc4zGSGFQ+aJLZ8lN2fxI2rSAG2X -+Z/nKcrdH9cG6rjJuQkhn8g/BsXS6RJGAE57COtCPStIbp1n3UsC5ETzkxml -J85per5n0/xQpCyrw2u544BMzwVhSyvcG7mm0tCq9Stz+86QNZ8MUhy/XCFh -EVsVS6kkUfykXPcXnbDS+gfpj1bkGoxoigTTfFrjnqKhynFbotSg5ymFXQNo -Kk/SBtc9+cMDLz9l+WceR0DTYw/j1Y75hauXTLPXJuuWCpTehTacyH+BCQJJ -Kg71ZDIMgtG6aoIbs0t0EfOMd9afv9w3pKdVBC/UMejTRrkDfNoSTllkt1Ex -MVCgyhwn2RAurda9EGYrw7AiShJbAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMB -Af8wHQYDVR0OBBYEFE9pbQN+nZ8HGEO8txBO1b+pxCAoMB8GA1UdIwQYMBaA -FE9pbQN+nZ8HGEO8txBO1b+pxCAoMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG -9w0BAQUFAAOCAgEAO/Ouyuguh4X7ZVnnrREUpVe8WJ8kEle7+z802u6teio0 -cnAxa8cZmIDJgt43d15Ui47y6mdPyXSEkVYJ1eV6moG2gcKtNuTxVBFT8zRF -ASbI5Rq8NEQh3q0l/HYWdyGQgJhXnU7q7C+qPBR7V8F+GBRn7iTGvboVsNIY -vbdVgaxTwOjdaRITQrcCtQVBynlQboIOcXKTRuidDV29rs4prWPVVRaAMCf/ -drr3uNZK49m1+VLQTkCpx+XCMseqdiThawVQ68W/ClTluUI8JPu3B5wwn3la -5uBAUhX0/Kr0VvlEl4ftDmVyXr4m+02kLQgH3thcoNyBM5kYJRF3p+v9WAks -mWsbivNSPxpNSGDxoPYzAlOL7SUJuA0t7Zdz7NeWH45gDtoQmy8YJPamTQr5 -O8t1wswvziRpyQoijlmn94IM19drNZxDAGrElWe6nEXLuA4399xOAU++CrYD -062KRffaJ00psUjf5BHklka9bAI+1lHIlRcBFanyqqryvy9lG2/QuRqT9Y41 -xICHPpQvZuTpqP9BnHAqTyo5GJUefvthATxRCC4oGKQWDzH9OmwjkyB24f0H -hdFbP9IcczLd+rn4jM8Ch3qaluTtT4mNU0OrDhPAARW0eTjb/G49nlG2uBOL -Z8/5fNkiHfZdxRwBL5joeiQYvITX+txyW/fBOmg= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQG -EwJJRTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0 -MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUx -MjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNV -BAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZ -QmFsdGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAKMEuyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+h -Xe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gR -QKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/CG9VwcPCP -wBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1 -pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNT -Px8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkC -AwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1BE3wMBIGA1Ud -EwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUA -A4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkT -I7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx -jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/ -oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67 -G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H -RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFajCCBFKgAwIBAgIEPLU9RjANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQK -EwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEG -A1UEAxMqYmVUUlVTVGVkIFJvb3QgQ0EtQmFsdGltb3JlIEltcGxlbWVudGF0 -aW9uMB4XDTAyMDQxMTA3Mzg1MVoXDTIyMDQxMTA3Mzg1MVowZjESMBAGA1UE -ChMJYmVUUlVTVGVkMRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAx -BgNVBAMTKmJlVFJVU1RlZCBSb290IENBLUJhbHRpbW9yZSBJbXBsZW1lbnRh -dGlvbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALx+xDmcjOPW -HIb/ymKt4H8wRXqOGrO4x/nRNv8i805qX4QQ+2aBw5R5MdKR4XeOGCrDFN5R -9U+jK7wYFuK13XneIviCfsuBH/0nLI/6l2Qijvj/YaOcGx6Sj8CoCd8JEey3 -fTGaGuqDIQY8n7pc/5TqarjDa1U0Tz0yH92BFODEPM2dMPgwqZfT7syj0B9f -HBOB1BirlNFjw55/NZKeX0Tq7PQiXLfoPX2k+YmpkbIq2eszh+6l/ePazIjm -iSZuxyuC0F6dWdsU7JGDBcNeDsYq0ATdcT0gTlgn/FP7eHgZFLL8kFKJOGJg -B7Sg7KxrUNb9uShr71ItOrL/8QFArDcCAwEAAaOCAh4wggIaMA8GA1UdEwEB -/wQFMAMBAf8wggG1BgNVHSAEggGsMIIBqDCCAaQGDysGAQQBsT4AAAEJKIOR -MTCCAY8wggFIBggrBgEFBQcCAjCCAToaggE2UmVsaWFuY2Ugb24gb3IgdXNl -IG9mIHRoaXMgQ2VydGlmaWNhdGUgY3JlYXRlcyBhbiBhY2tub3dsZWRnbWVu -dCBhbmQgYWNjZXB0YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5k -YXJkIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwgdGhlIENlcnRpZmlj -YXRpb24gUHJhY3RpY2UgU3RhdGVtZW50IGFuZCB0aGUgUmVseWluZyBQYXJ0 -eSBBZ3JlZW1lbnQsIHdoaWNoIGNhbiBiZSBmb3VuZCBhdCB0aGUgYmVUUlVT -VGVkIHdlYiBzaXRlLCBodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20vcHJvZHVj -dHNfc2VydmljZXMvaW5kZXguaHRtbDBBBggrBgEFBQcCARY1aHR0cDovL3d3 -dy5iZXRydXN0ZWQuY29tL3Byb2R1Y3RzX3NlcnZpY2VzL2luZGV4Lmh0bWww -HQYDVR0OBBYEFEU9w6nR3D8kVpgccxiIav+DR+22MB8GA1UdIwQYMBaAFEU9 -w6nR3D8kVpgccxiIav+DR+22MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0B -AQUFAAOCAQEASZK8o+6svfoNyYt5hhwjdrCAWXf82n+0S9/DZEtqTg6t8n1Z -dwWtColzsPq8y9yNAIiPpqCy6qxSJ7+hSHyXEHu67RMdmgduyzFiEuhjA6p9 -beP4G3YheBufS0OM00mG9htc9i5gFdPp43t1P9ACg9AYgkHNZTfqjjJ+vWuZ -XTARyNtIVBw74acT02pIk/c9jH8F6M7ziCpjBLjqflh8AXtb4cV97yHgjQ5d -UX2xZ/2jvTg2xvI4hocalmhgRvsoFEdV4aeADGvi6t9NfJBIoDa9CReJf8Py -05yc493EG931t3GzUwWJBtDLSoDByFOQtTwxiBdQn8nEDovYqAJjDQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFLDCCBBSgAwIBAgIEOU99hzANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQG -EwJXVzESMBAGA1UEChMJYmVUUlVTVGVkMRswGQYDVQQDExJiZVRSVVNUZWQg -Um9vdCBDQXMxGjAYBgNVBAMTEWJlVFJVU1RlZCBSb290IENBMB4XDTAwMDYy -MDE0MjEwNFoXDTEwMDYyMDEzMjEwNFowWjELMAkGA1UEBhMCV1cxEjAQBgNV -BAoTCWJlVFJVU1RlZDEbMBkGA1UEAxMSYmVUUlVTVGVkIFJvb3QgQ0FzMRow -GAYDVQQDExFiZVRSVVNUZWQgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBANS0c3oTCjhVAb6JVuGUntS+WutKNHUbYSnE4a0IYCF4 -SP+00PpeQY1hRIfo7clY+vyTmt9P6j41ffgzeubx181vSUs9Ty1uDoM6GHh3 -o8/n9E1z2Jo7Gh2+lVPPIJfCzz4kUmwMjmVZxXH/YgmPqsWPzGCgc0rXOD8V -cr+il7dw6K/ifhYGTPWqZCZyByWtNfwYsSbX2P8ZDoMbjNx4RWc0PfSvHI3k -bWvtILNnmrRhyxdviTX/507AMhLn7uzf/5cwdO2NR47rtMNE5qdMf1ZD6Li8 -tr76g5fmu/vEtpO+GRg+jIG5c4gW9JZDnGdzF5DYCW5jrEq2I8QBoa2k5MUC -AwEAAaOCAfgwggH0MA8GA1UdEwEB/wQFMAMBAf8wggFZBgNVHSAEggFQMIIB -TDCCAUgGCisGAQQBsT4BAAAwggE4MIIBAQYIKwYBBQUHAgIwgfQagfFSZWxp -YW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVz -IGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0 -ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGFuZCBjZXJ0aWZpY2F0aW9u -IHByYWN0aWNlIHN0YXRlbWVudCwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IGJl -VFJVU1RlZCdzIHdlYiBzaXRlLCBodHRwczovL3d3dy5iZVRSVVNUZWQuY29t -L3ZhdWx0L3Rlcm1zMDEGCCsGAQUFBwIBFiVodHRwczovL3d3dy5iZVRSVVNU -ZWQuY29tL3ZhdWx0L3Rlcm1zMDQGA1UdHwQtMCswKaAnoCWkIzAhMRIwEAYD -VQQKEwliZVRSVVNUZWQxCzAJBgNVBAYTAldXMB0GA1UdDgQWBBQquZtpLjub -2M3eKjEENGvKBxirZzAfBgNVHSMEGDAWgBQquZtpLjub2M3eKjEENGvKBxir -ZzAOBgNVHQ8BAf8EBAMCAf4wDQYJKoZIhvcNAQEFBQADggEBAHlh26Nebhax -6nZR+csVm8tpvuaBa58oH2U+3RGFktToQb9+M70j5/Egv6S0phkBxoyNNXxl -pE8JpNbYIxUFE6dDea/bow6be3ga8wSGWsb2jCBHOElQBp1yZzrwmAOtlmdE -/D8QDYZN5AA7KXvOOzuZhmElQITcE2K3+spZ1gMe1lMBzW1MaFVA4e5rxyoA -AEiCswoBw2AqDPeCNe5IhpbkdNQ96gFxugR1QKepfzk5mlWXKWWuGVUlBXJH -0+gY3Ljpr0NzARJ0o+FcXxVdJPP55PS2Z2cS52QiivalQaYctmBjRYoQtLpG -EK5BV2VsPyMQPyEQWbfkQN0mDCP2qq4= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGUTCCBTmgAwIBAgIEPLVPQDANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQK -EwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEG -A1UEAxMqYmVUUlVTVGVkIFJvb3QgQ0EgLSBFbnRydXN0IEltcGxlbWVudGF0 -aW9uMB4XDTAyMDQxMTA4MjQyN1oXDTIyMDQxMTA4NTQyN1owZjESMBAGA1UE -ChMJYmVUUlVTVGVkMRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAx -BgNVBAMTKmJlVFJVU1RlZCBSb290IENBIC0gRW50cnVzdCBJbXBsZW1lbnRh -dGlvbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALr0RAOqEmq1 -Q+xVkrYwfTVXDNvzDSduTPdQqJtOK2/b9a0cS12zqcH+e0TrW6MFDR/FNCsw -ACnxeECypP869AGIF37m1CbTukzqMvtDd5eHI8XbQ6P1KqNRXuE70mVpflUV -m3rnafdE4Fe1FehmYA8NA/uCjqPoEXtsvsdjDheT389Lrm5zdeDzqrmkwAkb -hepxKYhBMvnwKg5sCfJ0a2ZsUhMfGLzUPvfYbiCeyv78IZTuEyhL11xeDGbu -6bsPwTSxfwh28z0mcMmLJR1iJAzqHHVOwBLkuhMdMCktVjMFu5dZfsZJT4nX -LySotohAtWSSU1Yk5KKghbNekLQSM80CAwEAAaOCAwUwggMBMIIBtwYDVR0g -BIIBrjCCAaowggGmBg8rBgEEAbE+AAACCSiDkTEwggGRMIIBSQYIKwYBBQUH -AgIwggE7GoIBN1JlbGlhbmNlIG9uIG9yIHVzZSBvZiB0aGlzIENlcnRpZmlj -YXRlIGNyZWF0ZXMgYW4gYWNrbm93bGVkZ21lbnQgYW5kIGFjY2VwdGFuY2Ug -b2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29u -ZGl0aW9ucyBvZiB1c2UsIHRoZSBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0 -YXRlbWVudCBhbmQgdGhlIFJlbHlpbmcgUGFydHkgQWdyZWVtZW50LCB3aGlj -aCBjYW4gYmUgZm91bmQgYXQgdGhlIGJlVFJVU1RlZCB3ZWIgc2l0ZSwgaHR0 -cHM6Ly93d3cuYmV0cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9pbmRl -eC5odG1sMEIGCCsGAQUFBwIBFjZodHRwczovL3d3dy5iZXRydXN0ZWQuY29t -L3Byb2R1Y3RzX3NlcnZpY2VzL2luZGV4Lmh0bWwwEQYJYIZIAYb4QgEBBAQD -AgAHMIGJBgNVHR8EgYEwfzB9oHugeaR3MHUxEjAQBgNVBAoTCWJlVFJVU1Rl -ZDEbMBkGA1UECxMSYmVUUlVTVGVkIFJvb3QgQ0FzMTMwMQYDVQQDEypiZVRS -VVNUZWQgUm9vdCBDQSAtIEVudHJ1c3QgSW1wbGVtZW50YXRpb24xDTALBgNV -BAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMjA0MTEwODI0MjdagQ8yMDIyMDQx -MTA4NTQyN1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFH1w5a44iwY/qhwa -j/nPJDCqhIQWMB0GA1UdDgQWBBR9cOWuOIsGP6ocGo/5zyQwqoSEFjAMBgNV -HRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDANBgkq -hkiG9w0BAQUFAAOCAQEAKrgXzh8QlOu4mre5X+za95IkrNySO8cgjfKZ5V04 -ocI07cUTWVwFtStPYZuR+0H8/NU8TZh2BvWBfevdkObRVlTa4y0MnxEylCIB -evZsLHRnBMylj44ss0O1lKLQfelifwa+JwGDnjr9iu6YQ0pr17WXOzq/T220 -Y/ozADQuLW2WyXvKmWO6vvT2MKAtmJbpVkQFqUSjYRDrgqFnXbxdJ3Wqiig2 -KjiS2d2kXgClzMx8KSreKJCrt+G2/30lC0DYqjSjLd4H61/OCt3Kfjp9JsFi -aDrmLzfzgYYhxKlkqu9FNtEaZnz46TfW1mG+oq1I59/mdP7TbX3SJdysYlep -9w== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFaDCCBFCgAwIBAgIQO1nHe81bV569N1KsdrSqGjANBgkqhkiG9w0BAQUF -ADBiMRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBS -b290IENBczEvMC0GA1UEAxMmYmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1w -bGVtZW50YXRpb24wHhcNMDIwNDExMTExODEzWhcNMjIwNDEyMTEwNzI1WjBi -MRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290 -IENBczEvMC0GA1UEAxMmYmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVt -ZW50YXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkujQw -CY5X0LkGLG9uJIAiv11DpvpPrILnHGhwhRujbrWqeNluB0s/6d/16uhUoWGK -Di9pdRi3DOUUjXFumLhV/AyV0Jtu4S2I1DpAa5LxmZZk3tv/ePTulh1HiXzU -vrmIdyM6CeYEnm2qXtLIvZpOGd+J6lsOfsPktPDgaTuID0GQ+NRxQyTBjyZL -O1bp/4xsN+lFrYWMU8NghpBKlsmzVLC7F/AcRdnUGxlkVgoZ98zh/4avflhe -rHqQH8koOUV7orbHnB/ahdQhhlkwk75TMzf270HPM8ercmsl9fNTGwxMLvF1 -S++gh/f+ihXQbNXL+WhTuXAVE8L1LvtDNXUtAgMBAAGjggIYMIICFDAMBgNV -HRMEBTADAQH/MIIBtQYDVR0gBIIBrDCCAagwggGkBg8rBgEEAbE+AAADCSiD -kTEwggGPMEEGCCsGAQUFBwIBFjVodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20v -cHJvZHVjdHNfc2VydmljZXMvaW5kZXguaHRtbDCCAUgGCCsGAQUFBwICMIIB -OhqCATZSZWxpYW5jZSBvbiBvciB1c2Ugb2YgdGhpcyBDZXJ0aWZpY2F0ZSBj -cmVhdGVzIGFuIGFja25vd2xlZGdtZW50IGFuZCBhY2NlcHRhbmNlIG9mIHRo -ZSB0aGVuIGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlv -bnMgb2YgdXNlLCB0aGUgQ2VydGlmaWNhdGlvbiBQcmFjdGljZSBTdGF0ZW1l -bnQgYW5kIHRoZSBSZWx5aW5nIFBhcnR5IEFncmVlbWVudCwgd2hpY2ggY2Fu -IGJlIGZvdW5kIGF0IHRoZSBiZVRSVVNUZWQgd2ViIHNpdGUsIGh0dHA6Ly93 -d3cuYmV0cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1s -MAsGA1UdDwQEAwIBBjAfBgNVHSMEGDAWgBSp7BR++dlDzFMrFK3P9/BZiUHN -GTAdBgNVHQ4EFgQUqewUfvnZQ8xTKxStz/fwWYlBzRkwDQYJKoZIhvcNAQEF -BQADggEBANuXsHXqDMTBmMpWBcCorSZIry0g6IHHtt9DwSwddUvUQo3neqh0 -3GZCWYez9Wlt2ames30cMcH1VOJZJEnl7r05pmuKmET7m9cqg5c0Lcd9NUwt -NLg+DcTsiCevnpL9UGGCqGAHFFPMZRPB9kdEadIxyKbdLrML3kqNWz2rDcI1 -UqJWN8wyiyiFQpyRQHpwKzg21eFzGh/l+n5f3NacOzDq28BbJ1zTcwfBwvNM -m2+fG8oeqqg4MwlYsq78B+g23FW6L09A/nq9BqaBwZMifIYRCgZ3SK41ty8y -mmFei74pnykkiFY5LKjSq5YDWtRIn7lAhAuYaPsBQ9Yb4gmxlxw= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYT -AlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNl -cnR1bSBDQTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJ -BgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNV -BAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AM6xwS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYV -M42sLQnFdvkrOYCJ5JdLkKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/Ox -LjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE -7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/KUz/iDsaW -VhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu -/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYD -VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESS -bLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQaTOs9qmdvLdTN -/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvgGrZg -FCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqT -E5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x -O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYV -IZQs6GAqm4VKQPNriiTsBhYscw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJH -QjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxm -b3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFB -IENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIz -MTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu -Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENB -IExpbWl0ZWQxITAfBgNVBAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL5AnfRu4ep2hxxNRUSO -vkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhGC1Pqy0wk -wLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfH -dr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf04 -9vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULi -mAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cmez6KJcfA3Z3m -NWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEKIz6W -8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB -Af8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v -QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwu -Y29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG -9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm -7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHC -v8S5dIa2LX1rzNLzRt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdV -CYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAV -GI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C12yxow+ev+to -51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJH -QjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxm -b3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2Vj -dXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4 -MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIg -TWFuY2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2Rv -IENBIExpbWl0ZWQxJDAiBgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2 -aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMBxM4KK0HDr -c4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP9nQ95IDC -+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8 -j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWC -iIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtG -Cd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz6YiO/O1R65Nx -Tq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4EFgQU -PNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB -/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv -Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNo -dHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNl -cy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm -4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiF -Gv45jN5bBAS0VPmjZ55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXG -De+X3EyrEeFryzHRbPtIgKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsF -Vy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfU -a7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6s -Cx1HRR3B7Hzs/Sk= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJH -QjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxm -b3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1 -c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0y -ODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVy -IE1hbmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9k -byBDQSBMaW1pdGVkMSUwIwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNl -cnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhT -WvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh73TkVvFVI -xO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9 -C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/ -oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW1O24zG71++IsWL1/ -T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7kUlcsutT6vif -R4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1UdDgQW -BBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v -ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2 -hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2Vy -dmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw -uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdT -mw7pSqBYaWcOrp32pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+C -l5EfKNsYEYwq5GWDVxISjBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/g -hhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVF -wL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOj -GM9O9y5Xt5hwXsjEeLBi ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQG -EwJVUzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREw -DwYDVQQLEwhEU1RDQSBFMTAeFw05ODEyMTAxODEwMjNaFw0xODEyMTAxODQw -MjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVy -ZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEB -AQUAA4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlR -EmlvMVW5SXIACH7TpWJENySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+Lth -zfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2io74CTADKAqjuAQIxZA9SLRN0 -dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBoBgNVHR8E -YTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwg -U2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNV -BAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIx -MDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFGp5fpFpRhgTCgJ3 -pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAMBgNV -HRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3 -DQEBBQUAA4GBACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lN -QseSJqBcNJo4cvj9axY+IO6CizEqkzaFI4iKPANo08kJD038bKTaKHKTDomA -sH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4RbyhkwS7hp86W0N6 -w4pl ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID2DCCAsACEQDQHkCLAAACfAAAAAIAAAABMA0GCSqGSIb3DQEBBQUAMIGp -MQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBM -YWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENv -LjERMA8GA1UECxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBSb290Q0EgWDEx -ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODEyMDEx -ODE4NTVaFw0wODExMjgxODE4NTVaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UE -CBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0Rp -Z2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgWDEx -FjAUBgNVBAMTDURTVCBSb290Q0EgWDExITAfBgkqhkiG9w0BCQEWEmNhQGRp -Z3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -ANLGJrbnpT3BxGjVUG9TxW9JEwm4ryxIjRRqoxdfWvnTLnUv2Chi0ZMv/E3U -q4flCMeZ55I/db3rJbQVwZsZPdJEjdd0IG03Ao9pk1uKxBmd9LIO/BZsubEF -koPRhSxglD5FVaDZqwgh5mDoO3TymVBRaNADLbGAvqPYUrBEzUNKcI5YhZXh -TizWLUFv1oTnyJhEykfbLCSlaSbPa7gnYsP0yXqSI+0TZ4KuRS5F5X5yP4Wd -lGIQ5jyRoa13AOAV7POEgHJ6jm5gl8ckWRA0g1vhpaRptlc1HHhZxtMvOnNn -7pTKBBMFYgZwI7P0fO5F2WQLW0mqpEPOJsREEmy43XkCAwEAATANBgkqhkiG -9w0BAQUFAAOCAQEAojeyP2n714Z5VEkxlTMr89EJFEliYIalsBHiUMIdBlc+ -LegzZL6bqq1fG03UmZWii5rJYnK1aerZWKs17RWiQ9a2vAd5ZWRzfdd5ynvV -WlHG4VMElo04z6MXrDlxawHDi1M8Y+nuecDkvpIyZHqzH5eUYr3qsiAVlfuX -8ngvYzZAOONGDx3drJXK50uQe7FLqdTF65raqtWjlBRGjS0f8zrWkzr2Pnn8 -6Oawde3uPclwx12qgUtGJRzHbBXjlU4PqjI3lAoXJJIThFjSY28r9+ZbYgsT -F7ANUkz+/m9c4pFuHf2kYtdo+o56T9II2pPc8JIRetDccpMMc5NihWjQ9A== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQG -EwJVUzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREw -DwYDVQQLEwhEU1RDQSBFMjAeFw05ODEyMDkxOTE3MjZaFw0xODEyMDkxOTQ3 -MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVy -ZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEB -AQUAA4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fB -w18DW9Fvrn5C6mYjuGODVvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87e -ZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JSxhcxEzu1TdvIxPbDDyQq2gyd -55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBoBgNVHR8E -YTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwg -U2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNV -BAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIw -OTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFB6CTShlgDzJQW6s -NS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAMBgNV -HRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3 -DQEBBQUAA4GBAEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHR -xdf0CiUPPXiBng+xZ8SQTGPdXqfiup/1902lMXucKS1M/mQ+7LZT/uqb7YLb -dHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1mPnHfxsb1gYgAlih -w6ID ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID2DCCAsACEQDQHkCLAAB3bQAAAAEAAAAEMA0GCSqGSIb3DQEBBQUAMIGp -MQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBM -YWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENv -LjERMA8GA1UECxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBSb290Q0EgWDIx -ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODExMzAy -MjQ2MTZaFw0wODExMjcyMjQ2MTZaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UE -CBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0Rp -Z2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgWDIx -FjAUBgNVBAMTDURTVCBSb290Q0EgWDIxITAfBgkqhkiG9w0BCQEWEmNhQGRp -Z3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -ANx18IzAdZaawGIfJvfE4Zrq4FZzW5nNAUSoCLbVp9oaBBg5kkp4o4HC9Xd6 -ULRw/5qrxsfKboNPQpj7Jgva3G3WqZlVUmfpKAOS3OWwBZoPFflrWXJW8vo5 -/Kpo7g8fEIMv/J36F5bdguPmRX3AS4BEH+0s4IT9kVySVGkl5WJp3OXuAFK9 -MwutdQKFp2RQLcUZGTDAJtvJ0/0uma1ZtQtN1EGuhUhDWdy3qOKi3sOP17ih -YqZoUFLkzzGnlIXan0YyF1bl8utmPRL/Q9uY73fPy4GNNLHGUEom0eQ+QVCv -bK4iNC7Va26Dunm4dmVI2gkpZGMiuftHdoWMhkTLCdsCAwEAATANBgkqhkiG -9w0BAQUFAAOCAQEAtTYOXeFhKFoRZcA/gwN5Tb4opgsHAlKFzfiR0BBstWog -WxyQ2TA8xkieil5k+aFxd+8EJx8H6+Qm93N0yUQYGmbT4EOvkTvRyyzYdFQ6 -HE3K1GjNI3wdEJ5F6fYAbqbNGf9PLCmPV03Ed5K+4EwJ+11EhmYhqLkyolbV -6YyDfFk/xPEL553snr2cGA4+wjl5KLcDDQjLxufZATdQEOzMYRZA1K8xdHv8 -PzGn0EdzMzkbzE5q10mDEQb+64JYMzJM8FasHpwvVpp7wUocpf1VNs78lk30 -sPDst2yC7S8xmUJMqbINuBVd8d+6ybVK1GSYsyapMMj9puyrliGtf8J4tg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEgzCCA+ygAwIBAgIEOJ725DANBgkqhkiG9w0BAQQFADCBtDEUMBIGA1UE -ChMLRW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9HQ0NB -X0NQUyBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsT -HChjKSAyMDAwIEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1 -c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAy -MDcxNjE2NDBaFw0yMDAyMDcxNjQ2NDBaMIG0MRQwEgYDVQQKEwtFbnRydXN0 -Lm5ldDFAMD4GA1UECxQ3d3d3LmVudHJ1c3QubmV0L0dDQ0FfQ1BTIGluY29y -cC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDIwMDAg -RW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2xp -ZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQCTdLS25MVL1qFof2LV7PdRV7NySpj10InJrWPNTTVRaoTU -rcloeW+46xHbh65cJFET8VQlhK8pK5/jgOLZy93GRUk0iJBeAZfv6lOm3fzB -3ksqJeTpNfpVBQbliXrqpBFXO/x8PTbNZzVtpKklWb1m9fkn5JVn1j+SgF7y -NH0rhQIDAQABo4IBnjCCAZowEQYJYIZIAYb4QgEBBAQDAgAHMIHdBgNVHR8E -gdUwgdIwgc+ggcyggcmkgcYwgcMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUAw -PgYDVQQLFDd3d3cuZW50cnVzdC5uZXQvR0NDQV9DUFMgaW5jb3JwLiBieSBy -ZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0 -Lm5ldCBMaW1pdGVkMTMwMQYDVQQDEypFbnRydXN0Lm5ldCBDbGllbnQgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw -IoAPMjAwMDAyMDcxNjE2NDBagQ8yMDIwMDIwNzE2NDY0MFowCwYDVR0PBAQD -AgEGMB8GA1UdIwQYMBaAFISLdP3FjcD/J20gN0V8/i3OutN9MB0GA1UdDgQW -BBSEi3T9xY3A/ydtIDdFfP4tzrrTfTAMBgNVHRMEBTADAQH/MB0GCSqGSIb2 -fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQQFAAOBgQBObzWA -O9GK9Q6nIMstZVXQkvTnhLUGJoMShAusO7JE7r3PQNsgDrpuFOow4DtifH+L -a3xKp9U1PL6oXOpLu5OOgGarDyn9TS2/GpsKkMWr2tGzhtQvJFJcem3G8v7l -TRowjJDyutdKPkN+1MhQGof4T4HHdguEOnKdzmVml64mXg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIElTCCA/6gAwIBAgIEOJsRPDANBgkqhkiG9w0BAQQFADCBujEUMBIGA1UE -ChMLRW50cnVzdC5uZXQxPzA9BgNVBAsUNnd3dy5lbnRydXN0Lm5ldC9TU0xf -Q1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc -KGMpIDIwMDAgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVz -dC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wMDAyMDQxNzIwMDBaFw0yMDAyMDQxNzUwMDBaMIG6MRQwEgYDVQQKEwtF -bnRydXN0Lm5ldDE/MD0GA1UECxQ2d3d3LmVudHJ1c3QubmV0L1NTTF9DUFMg -aW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykg -MjAwMCBFbnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5l -dCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0G -CSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHwV9OcfHO8GCGD9JYf9Mzly0XonUw -tZZkJi9ow0SrqHXmAGc0V55lxyKbc+bT3QgON1WqJUaBbL3+qPZ1V1eMkGxK -wz6LS0MKyRFWmponIpnPVZ5h2QLifLZ8OAfc439PmrkDQYC2dWcTC5/oVzbI -XQA23mYU2m52H083jIITiQIDAQABo4IBpDCCAaAwEQYJYIZIAYb4QgEBBAQD -AgAHMIHjBgNVHR8EgdswgdgwgdWggdKggc+kgcwwgckxFDASBgNVBAoTC0Vu -dHJ1c3QubmV0MT8wPQYDVQQLFDZ3d3cuZW50cnVzdC5uZXQvU1NMX0NQUyBp -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAy -MDAwIEVudHJ1c3QubmV0IExpbWl0ZWQxOjA4BgNVBAMTMUVudHJ1c3QubmV0 -IFNlY3VyZSBTZXJ2ZXIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNV -BAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMDAyMDQxNzIwMDBagQ8yMDIwMDIw -NDE3NTAwMFowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFMtswGvjuz7L/CKc -/vuLkpyw8m4iMB0GA1UdDgQWBBTLbMBr47s+y/winP77i5KcsPJuIjAMBgNV -HRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkq -hkiG9w0BAQQFAAOBgQBi24GRzsiad0Iv7L0no1MPUBvqTpLwqa+poLpIYcvv -yQbvH9X07t9WLebKahlzqlO+krNQAraFJnJj2HVQYnUUt7NQGj/KEQALhUVp -bbalrlHhStyCP2yMNLJ3a9kC9n8O6mUE8c1UyrrJzOCE98g+EZfTYAkYvAX/ -bIkz8OwVDw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UE -ChMLRW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNf -MjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsT -HChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1 -c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEy -MjQxNzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0 -Lm5ldDFAMD4GA1UECxQ3d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29y -cC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkg -RW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4 -QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/EC -DNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuXMlBvPci6Zgzj -/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzWnLLP -KQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZd -enoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH -4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB -0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJ -FrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B -AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFh -fGPjK50xA3B20qMooPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVU -KcgF7bISKo30Axv/55IQh7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaoho -wXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2 -+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof888 -6ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIE7TCCBFagAwIBAgIEOAOR7jANBgkqhkiG9w0BAQQFADCByTELMAkGA1UE -BhMCVVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUgwRgYDVQQLFD93d3cuZW50 -cnVzdC5uZXQvQ2xpZW50X0NBX0luZm8vQ1BTIGluY29ycC4gYnkgcmVmLiBs -aW1pdHMgbGlhYi4xJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExp -bWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eTAeFw05OTEwMTIxOTI0MzBaFw0xOTEwMTIxOTU0MzBa -MIHJMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxSDBGBgNV -BAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0FfSW5mby9DUFMgaW5jb3Jw -LiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UECxMcKGMpIDE5OTkgRW50 -cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2xpZW50 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GL -ADCBhwKBgQDIOpleMRffrCdvkHvkGf9FozTC28GoT/Bo6oT9n3V5z8GKUZSv -x1cDR2SerYIbWtp/N3hHuzeYEpbOxhN979IMMFGpOZ5V+Pux5zDeg7K6PvHV -iTs7hbqqdCz+PzFur5GVbgbUB01LLFZHGARS2g4Qk79jkJvh34zmAqTmT173 -iwIBA6OCAeAwggHcMBEGCWCGSAGG+EIBAQQEAwIABzCCASIGA1UdHwSCARkw -ggEVMIHkoIHhoIHepIHbMIHYMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50 -cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0Ff -SW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UE -CxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50 -cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYD -VQQDEwRDUkwxMCygKqAohiZodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9D -bGllbnQxLmNybDArBgNVHRAEJDAigA8xOTk5MTAxMjE5MjQzMFqBDzIwMTkx -MDEyMTkyNDMwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUxPucKXuXzUyW -/O5bs8qZdIuV6kwwHQYDVR0OBBYEFMT7nCl7l81MlvzuW7PKmXSLlepMMAwG -A1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI -hvcNAQEEBQADgYEAP66K8ddmAwWePvrqHEa7pFuPeJoSSJn59DXeDDYHAmsQ -OokUgZwxpnyyQbJq5wcBoUv5nyU7lsqZwz6hURzzwy5E97BnRqqS5TvaHBkU -ODDV4qIxJS7x7EU47fgGWANzYrAQMY9Av2TgXD7FTx/aEkP/TOYGJqibGapE -PHayXOw= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UE -BhMCVVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50 -cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl -MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UE -AxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQsw -CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3 -dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlh -Yi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVkMTow -OAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp -b24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0 -VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHIN -iC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3wkrYKZImZNHk -mGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcwggHT -MBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHY -pIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 -BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChs -aW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBM -aW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNo -dHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAi -gA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMC -AQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYE -FPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9 -B0EABAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKn -CqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2Zcgx -xufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd2cNgQ4xYDiKWL2KjLB+6 -rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQG -EwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1 -cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4 -MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgx -LTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0 -eTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2R -FGiYCh7+2gRvE4RiIcPRfM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO -/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuv -K9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAGA1UdHwRp -MGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEt -MCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 -MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjAL -BgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gjIBBPM5iQn9Qw -HQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMBAf8w -GgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GB -AFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y -7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2u -FHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJV -UzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1 -aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcN -MjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZh -eCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2lu -ZXNzIENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fe -k6lfWg0XTzQaDJj0ItlZ1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5 -/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4aIZX5UkxVWsUPOE9G+m34LjXW -HXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBkMBEGCWCG -SAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4 -MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBq -R3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnm -JXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+WB5Hh1Q+WKG1 -tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+KpYr -tWKmpj29f5JZzVoqgrI3eQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQG -EwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlm -YXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5 -MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXgg -U2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0Et -MjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF -7Y6yEb3+6+e0dMKP/wXn2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKD -pkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HM -HMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAGA1UdHwRp -MGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBT -ZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y -MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjAL -BgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBqy/3YIHqngnYw -HQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMBAf8w -GgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GB -AAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy -0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkt -y3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJV -UzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1 -aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0 -MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoT -E0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJl -IEdsb2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw -gYkCgYEAuucXkAJlsTRVPEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQy -td4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORR -OhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxnhcXIw2EC -AwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8w -HwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6o -oHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf -2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkAZ70Br83gcfxa -z2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIYNMR1 -pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYT -AlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVz -dCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBC -MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UE -AxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEH -CIjaWC9mOSm9BXiLnTjoBbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlC -GDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet8u5fa9IAjbkU+BQVNdnARqN7 -csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+VcT4wt/lAj -Nvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdRe -JivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQAB -o1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9 -qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1luMrMTjANBgkq -hkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Qzxpe -R+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWV -Yrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF -PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot -2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeX -xx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm -Mw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILAgAAAAAA1ni3lAUwDQYJKoZIhvcNAQEEBQAwVzEL -MAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNV -BAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05 -ODA5MDExMjAwMDBaFw0xNDAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkw -FwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRsw -GQYDVQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUA -A4IBDwAwggEKAoIBAQDaDuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR -4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc -71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4 -bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgK -OOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMW -ea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DP -AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIABjAdBgNVHQ4EFgQUYHtmGkUNl8qJ -UC99BM00qP/8/UswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOC -AQEArqqf/LfSyx9fOSkoGJ40yWxPbxrwZKJwSk8ThptgKJ7ogUmYfQq75bCd -PTbbjwVR/wkxKh/diXeeDy5slQTthsu0AD+EAk2AaioteAuubyuig0SDH81Q -gkwkr733pbTIWg/050deSY43lv6aiAU62cDbKYfmGZZHpzqmjIs8d/5GY6dT -2iHRrH5Jokvmw2dZL7OKDrssvamqQnw1wdh/1acxOk5jQzmvCLBhNIzTmKlD -NPYPhyk7ncJWWJh3w/cbrPad+D6qp1RF8PX51TFl/mtYnHGzHtdS6jIX/EBg -Hcl5JLL2bP2oZg6C3ZjL2sJETy6ge/L3ayx2EYRGinij4w== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgw -FgYDVQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRy -dXN0IFNvbHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3Qg -R2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1 -MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYD -VQQLEx5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMT -GkdURSBDeWJlclRydXN0IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4usJTQGz0O9pTAipTHBsiQl8i4 -ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcqlHHK6XALn -ZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8F -LztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh3 -46B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq -81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0PlZPvy5TYnh+d -XIVtx6quTx8itc2VrbqnzPmrC3p/ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIB+jCCAWMCAgGjMA0GCSqGSIb3DQEBBAUAMEUxCzAJBgNVBAYTAlVTMRgw -FgYDVQQKEw9HVEUgQ29ycG9yYXRpb24xHDAaBgNVBAMTE0dURSBDeWJlclRy -dXN0IFJvb3QwHhcNOTYwMjIzMjMwMTAwWhcNMDYwMjIzMjM1OTAwWjBFMQsw -CQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMRwwGgYDVQQD -ExNHVEUgQ3liZXJUcnVzdCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB -iQKBgQC45k+625h8cXyvRLfTD0bZZOWTwUKOx7pJjTUteueLveUFMVnGsS8K -DPufpz+iCWaEVh43KRuH6X4MypqfpX/1FZSj1aJGgthoTNE3FQZor734sLPw -KfWVWgkWYXcKIiXUT0Wqx73llt/51KiOQswkwB6RJ0q1bQaAYznEol44AwID -AQABMA0GCSqGSIb3DQEBBAUAA4GBABKzdcZfHeFhVYAA1IFLezEPI2PnPfMD -+fQ2qLvZ46WXTeorKeDWanOB5sCJo9Px4KWlIjeaY8JIILTbcuPI9tl8vrGv -U9oUtCG41tWW4/5ODFlitppK+ULdjG+BqXH/9ApybW1EDp3zdHSo1TRJ6V6e -6bR64eVaH4QwnNOfpSXY ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARwxCzAJBgNVBAYT -AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu -MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s -LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1 -MjEzMDEGA1UECxMqSVBTIENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24g -QXV0aG9yaXR5MTMwMQYDVQQDEypJUFMgQ0EgQ2hhaW5lZCBDQXMgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlw -cy5lczAeFw0wMTEyMjkwMDUzNThaFw0yNTEyMjcwMDUzNThaMIIBHDELMAkG -A1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vs -b25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNl -cyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYw -OTI5NDUyMTMwMQYDVQQLEypJUFMgQ0EgQ2hhaW5lZCBDQXMgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkxMzAxBgNVBAMTKklQUyBDQSBDaGFpbmVkIENBcyBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1h -aWwuaXBzLmVzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcVpJJspQg -vJhPUOtopKdJC7/SMejHT8KGC/po/UNaivNgkjWZOLtNA1IhW/A3mTXhQSCB -hYEFcYGdtJUZqV92NC5jNzVXjrQfQj8VXOF6wV8TGDIxya2+o8eDZh65nAQT -y2nBBt4wBrszo7Uf8I9vzv+W6FS+ZoCua9tBhDaiPQIDAQABo4IEQzCCBD8w -HQYDVR0OBBYEFKGtMbH5PuEXpsirNPxShwkeYlJBMIIBTgYDVR0jBIIBRTCC -AUGAFKGtMbH5PuEXpsirNPxShwkeYlJBoYIBJKSCASAwggEcMQswCQYDVQQG -EwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmEx -LjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMu -bC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0 -NTIxMzAxBgNVBAsTKklQUyBDQSBDaGFpbmVkIENBcyBDZXJ0aWZpY2F0aW9u -IEF1dGhvcml0eTEzMDEGA1UEAxMqSVBTIENBIENoYWluZWQgQ0FzIENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5p -cHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRk -MGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggr -BgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYK -KwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBz -QG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBCBglg -hkgBhvhCAQ0ENRYzQ2hhaW5lZCBDQSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkg -aHR0cDovL3d3dy5pcHMuZXMvMCkGCWCGSAGG+EIBAgQcFhpodHRwOi8vd3d3 -Lmlwcy5lcy9pcHMyMDAyLzA3BglghkgBhvhCAQQEKhYoaHR0cDovL3d3dy5p -cHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0FDLmNybDA8BglghkgBhvhCAQMELxYt -aHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9yZXZvY2F0aW9uQ0FDLmh0bWw/ -MDkGCWCGSAGG+EIBBwQsFipodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jl -bmV3YWxDQUMuaHRtbD8wNwYJYIZIAYb4QgEIBCoWKGh0dHA6Ly93d3cuaXBz -LmVzL2lwczIwMDIvcG9saWN5Q0FDLmh0bWwwbQYDVR0fBGYwZDAuoCygKoYo -aHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0FDLmNybDAyoDCg -LoYsaHR0cDovL3d3d2JhY2suaXBzLmVzL2lwczIwMDIvaXBzMjAwMkNBQy5j -cmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5p -cHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAERyMJ1WWKJBGyi3leGmGpVfp3hA -K+/blkr8THFj2XOVvQLiogbHvpcqk4A0hgP63Ng9HgfNHnNDJGD1HWHc3Jag -vPsd4+cSACczAsDAK1M92GsDgaPb1pOVIO/Tln4mkImcJpvNb2ar7QMiRDjM -Wb2f2/YHogF/JsRj9SVCXmK9 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYT -AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu -MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s -LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1 -MjEuMCwGA1UECxMlSVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eTEuMCwGA1UEAxMlSVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAx -MTIyOTAwNTkzOFoXDTI1MTIyNzAwNTkzOFowggESMQswCQYDVQQGEwJFUzES -MBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNV -BAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzAp -BgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxLjAs -BgNVBAsTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx -LjAsBgNVBAMTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzANBgkqhkiG -9w0BAQEFAAOBjQAwgYkCgYEA4FEnpwvdr9G5Q1uCN0VWcu+atsIS7ywSzHb5 -BlmvXSHU0lq4oNTzav3KaY1mSPd05u42veiWkXWmcSjK5yISMmmwPh5r9FBS -YmL9Yzt9fuzuOOpi9GyocY3h6YvJP8a1zZRCb92CRTzo3wno7wpVqVZHYUxJ -ZHMQKD/Kvwn/xi8CAwEAAaOCBEowggRGMB0GA1UdDgQWBBTrsxl588GlHKzc -uh9morKbadB4CDCCAUQGA1UdIwSCATswggE3gBTrsxl588GlHKzcuh9morKb -adB4CKGCARqkggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNl -bG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJu -ZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFp -bC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0Eg -Q0xBU0UxIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMg -Q0EgQ0xBU0UxIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcN -AQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8E -BQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUH -AwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIB -FgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcw -GgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0Bt -YWlsLmlwcy5lczBBBglghkgBhvhCAQ0ENBYyQ0xBU0UxIENBIENlcnRpZmlj -YXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC -BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIBBAQt -FitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEuY3Js -MD8GCWCGSAGG+EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jl -dm9jYXRpb25DTEFTRTEuaHRtbD8wPAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93 -d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFMS5odG1sPzA6BglghkgB -hvhCAQgELRYraHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFT -RTEuaHRtbDBzBgNVHR8EbDBqMDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9p -cHMyMDAyL2lwczIwMDJDTEFTRTEuY3JsMDWgM6Axhi9odHRwOi8vd3d3YmFj -ay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0UxLmNybDAvBggrBgEFBQcB -AQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZI -hvcNAQEFBQADgYEAK9Dr/drIyllq2tPMMi7JVBuKYn4VLenZMdMu9Ccj/1ur -xUq2ckCuU3T0vAW0xtnIyXf7t/k0f3gA+Nak5FI/LEpjV4F1Wo7ojPsCwJTG -Kbqz3Bzosq/SLmJbGqmODszFV0VRFOlOHIilkfSj945RyKm+hjM+5i9Ibq9U -kE6tsSU= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYT -AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu -MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s -LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1 -MjEuMCwGA1UECxMlSVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eTEuMCwGA1UEAxMlSVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAx -MTIyOTAxMDE0NFoXDTI1MTIyNzAxMDE0NFowggESMQswCQYDVQQGEwJFUzES -MBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNV -BAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzAp -BgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxLjAs -BgNVBAsTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx -LjAsBgNVBAMTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzANBgkqhkiG -9w0BAQEFAAOBjQAwgYkCgYEAqxf+DrDGaBtT8FK+n/ra+osTBLsBjzLZH49N -zjaY2uQARIwo2BNEKqRrThckQpzTiKRBgtYj+4vJhuW5qYIF3PHeH+AMmVWY -8jjsbJ0gA8DvqqPGZARRLXgNo9KoOtYkTOmWehisEyMiG3zoMRGzXwmqMHBx -RiVrSXGAK5UBsh8CAwEAAaOCBEowggRGMB0GA1UdDgQWBBS4k/8uy9wsjqLn -ev42USGjmFsMNDCCAUQGA1UdIwSCATswggE3gBS4k/8uy9wsjqLnev42USGj -mFsMNKGCARqkggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNl -bG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJu -ZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFp -bC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0Eg -Q0xBU0UzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMg -Q0EgQ0xBU0UzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcN -AQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8E -BQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUH -AwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIB -FgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcw -GgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0Bt -YWlsLmlwcy5lczBBBglghkgBhvhCAQ0ENBYyQ0xBU0UzIENBIENlcnRpZmlj -YXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC -BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIBBAQt -FitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMuY3Js -MD8GCWCGSAGG+EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jl -dm9jYXRpb25DTEFTRTMuaHRtbD8wPAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93 -d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFMy5odG1sPzA6BglghkgB -hvhCAQgELRYraHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFT -RTMuaHRtbDBzBgNVHR8EbDBqMDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9p -cHMyMDAyL2lwczIwMDJDTEFTRTMuY3JsMDWgM6Axhi9odHRwOi8vd3d3YmFj -ay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0UzLmNybDAvBggrBgEFBQcB -AQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZI -hvcNAQEFBQADgYEAF2VcmZVDAyevJuXr0LMXI/dDqsfwfewPxqmurpYPdikc -4gYtfibFPPqhwYHOU7BC0ZdXGhd+pFFhxu7pXu8Fuuu9D6eSb9ijBmgpjnn1 -/7/5p6/ksc7C0YBCJwUENPjDfxZ4IwwHJPJGR607VNCv1TGyr33I6unUVtkO -E7LFRVA= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYT -AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu -MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s -LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1 -MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRo -b3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24g -QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcN -MDExMjI5MDEwNTMyWhcNMjUxMjI3MDEwNTMyWjCCARQxCzAJBgNVBAYTAkVT -MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwG -A1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjEr -MCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEv -MC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwgZ8wDQYJ -KoZIhvcNAQEBBQADgY0AMIGJAoGBALsw19zQVL01Tp/FTILq0VA8R5j8m2md -d81u4D/u6zJfX5/S0HnllXNEITLgCtud186Nq1KLK3jgm1t99P1tCeWu4Wwd -ByOgF9H5fahGRpEiqLJpxq339fWUoTCUvQDMRH/uxJ7JweaPCjbB/SQ9AaD1 -e+J8eGZDi09Z8pvZ+kmzAgMBAAGjggRTMIIETzAdBgNVHQ4EFgQUZyaW56G/ -2LUDnf473P7yiuYV3TAwggFGBgNVHSMEggE9MIIBOYAUZyaW56G/2LUDnf47 -3P7yiuYV3TChggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlC -YXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIElu -dGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBz -QG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBT -IENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT -JklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJ -KoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAM -BgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYI -KwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYB -BAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEE -BAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB -D2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0VBMSBDQSBD -ZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCG -SAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7BglghkgB -hvhCAQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xB -U0VBMS5jcmwwQAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lw -czIwMDIvcmV2b2NhdGlvbkNMQVNFQTEuaHRtbD8wPQYJYIZIAYb4QgEHBDAW -Lmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFQTEuaHRt -bD8wOwYJYIZIAYb4QgEIBC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIv -cG9saWN5Q0xBU0VBMS5odG1sMHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93 -d3cuaXBzLmVzL2lwczIwMDIvaXBzMjAwMkNMQVNFQTEuY3JsMDagNKAyhjBo -dHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMS5j -cmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5p -cHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAH66iqyAAIQVCtWYUQxkxZwCWINm -yq0eB81+atqAB98DNEock8RLWCA1NnHtogo1EqWmZaeFaQoO42Hu6r4okzPV -7Oi+xNtff6j5YzHIa5biKcJboOeXNp13XjFr/tOn2yrb25aLH2betgPAK7N4 -1lUH5Y85UN4HI3LmvSAUS7SG ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYT -AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu -MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s -LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1 -MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRo -b3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24g -QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcN -MDExMjI5MDEwNzUwWhcNMjUxMjI3MDEwNzUwWjCCARQxCzAJBgNVBAYTAkVT -MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwG -A1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjEr -MCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEv -MC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwgZ8wDQYJ -KoZIhvcNAQEBBQADgY0AMIGJAoGBAO6AAPYaZC6tasiDsYun7o/ZttvNG7uG -BiJ2MwwSbUhWYdLcgiViL5/SaTBlA0IjWLxH3GvWdV0XPOH/8lhneaDBgbHU -VqLyjRGZ/fZ98cfEXgIqmuJKtROKAP2Md4bm15T1IHUuDky/dMQ/gT6DtKM4 -Ninn6Cr1jIhBqoCm42zvAgMBAAGjggRTMIIETzAdBgNVHQ4EFgQUHp9XUEe2 -YZM50yz82l09BXW3mQIwggFGBgNVHSMEggE9MIIBOYAUHp9XUEe2YZM50yz8 -2l09BXW3mQKhggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlC -YXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIElu -dGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBz -QG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBT -IENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT -JklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJ -KoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAM -BgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYI -KwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYB -BAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEE -BAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB -D2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0VBMyBDQSBD -ZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCG -SAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7BglghkgB -hvhCAQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xB -U0VBMy5jcmwwQAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lw -czIwMDIvcmV2b2NhdGlvbkNMQVNFQTMuaHRtbD8wPQYJYIZIAYb4QgEHBDAW -Lmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFQTMuaHRt -bD8wOwYJYIZIAYb4QgEIBC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIv -cG9saWN5Q0xBU0VBMy5odG1sMHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93 -d3cuaXBzLmVzL2lwczIwMDIvaXBzMjAwMkNMQVNFQTMuY3JsMDagNKAyhjBo -dHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMy5j -cmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5p -cHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAEo9IEca2on0eisxeewBwMwB9dbB -/MjD81ACUZBYKp/nNQlbMAqBACVHr9QPDp5gJqiVp4MI3y2s6Q73nMify5NF -8bpqxmdRSmlPa/59Cy9SKcJQrSRE7SOzSMtEQMEDlQwKeAYSAfWRMS1Jjbs/ -RU4s4OjNtckUFQzjB4ObJnXv ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICtzCCAiACAQAwDQYJKoZIhvcNAQEEBQAwgaMxCzAJBgNVBAYTAkVTMRIw -EAYDVQQIEwlCQVJDRUxPTkExEjAQBgNVBAcTCUJBUkNFTE9OQTEZMBcGA1UE -ChMQSVBTIFNlZ3VyaWRhZCBDQTEYMBYGA1UECxMPQ2VydGlmaWNhY2lvbmVz -MRcwFQYDVQQDEw5JUFMgU0VSVklET1JFUzEeMBwGCSqGSIb3DQEJARYPaXBz -QG1haWwuaXBzLmVzMB4XDTk4MDEwMTIzMjEwN1oXDTA5MTIyOTIzMjEwN1ow -gaMxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCQVJDRUxPTkExEjAQBgNVBAcT -CUJBUkNFTE9OQTEZMBcGA1UEChMQSVBTIFNlZ3VyaWRhZCBDQTEYMBYGA1UE -CxMPQ2VydGlmaWNhY2lvbmVzMRcwFQYDVQQDEw5JUFMgU0VSVklET1JFUzEe -MBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQCsT1J0nznqjtwlxLyYXZhkJAk8IbPMGbWOlI6H0fg3 -PqHILVikgDVboXVsHUUMH2Fjal5vmwpMwci4YSM1gf/+rHhwLWjhOgeYlQJU -3c0jt4BT18g3RXIGJBK6E2Ehim51KODFDzT9NthFf+G4Nu+z4cYgjui0OLzh -PvYR3oydAQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBACzzw3lYJN7GO9HgQmm4 -7mSzPWIBubOE3yN93ZjPEKn+ANgilgUTB1RXxafey9m4iEL2mdsUdx+2/iU9 -4aI+A6mB0i1sR/WWRowiq8jMDQ6XXotBtDvECgZAHd1G9AHduoIuPD14cJ58 -GNCr+Lh3B0Zx8coLY1xq+XKU1QFPoNtC ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIIODCCB6GgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCAR4xCzAJBgNVBAYT -AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu -MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s -LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1 -MjE0MDIGA1UECxMrSVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9u -IEF1dGhvcml0eTE0MDIGA1UEAxMrSVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwu -aXBzLmVzMB4XDTAxMTIyOTAxMTAxOFoXDTI1MTIyNzAxMTAxOFowggEeMQsw -CQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJj -ZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZp -Y2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEIt -NjA5Mjk0NTIxNDAyBgNVBAsTK0lQUyBDQSBUaW1lc3RhbXBpbmcgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkxNDAyBgNVBAMTK0lQUyBDQSBUaW1lc3RhbXBp -bmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lw -c0BtYWlsLmlwcy5lczCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLju -VqWajOY2ycJioGaBjRrVetJznw6EZLqVtJCneK/K/lRhW86yIFcBrkSSQxA4 -Efdo/BdApWgnMjvEp+ZCccWZ73b/K5Uk9UmSGGjKALWkWi9uy9YbLA1UZ2t6 -KaFYq6JaANZbuxjC3/YeE1Z2m6Vo4pjOxgOKNNtMg0GmqaMCAwEAAaOCBIAw -ggR8MB0GA1UdDgQWBBSL0BBQCYHynQnVDmB4AyKiP8jKZjCCAVAGA1UdIwSC -AUcwggFDgBSL0BBQCYHynQnVDmB4AyKiP8jKZqGCASakggEiMIIBHjELMAkG -A1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vs -b25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNl -cyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYw -OTI5NDUyMTQwMgYDVQQLEytJUFMgQ0EgVGltZXN0YW1waW5nIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5MTQwMgYDVQQDEytJUFMgQ0EgVGltZXN0YW1waW5n -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNA -bWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsG -A1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUF -BwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGC -NwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMw -EYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5l -czBHBglghkgBhvhCAQ0EOhY4VGltZXN0YW1waW5nIENBIENlcnRpZmljYXRl -IGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgECBBwW -Gmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMEAGCWCGSAGG+EIBBAQzFjFo -dHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJUaW1lc3RhbXBpbmcu -Y3JsMEUGCWCGSAGG+EIBAwQ4FjZodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAy -L3Jldm9jYXRpb25UaW1lc3RhbXBpbmcuaHRtbD8wQgYJYIZIAYb4QgEHBDUW -M2h0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbFRpbWVzdGFtcGlu -Zy5odG1sPzBABglghkgBhvhCAQgEMxYxaHR0cDovL3d3dy5pcHMuZXMvaXBz -MjAwMi9wb2xpY3lUaW1lc3RhbXBpbmcuaHRtbDB/BgNVHR8EeDB2MDegNaAz -hjFodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJUaW1lc3RhbXBp -bmcuY3JsMDugOaA3hjVodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9p -cHMyMDAyVGltZXN0YW1waW5nLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYB -BQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQADgYEA -ZbrBzAAalZHK6Ww6vzoeFAh8+4Pua2JR0zORtWB5fgTYXXk36MNbsMRnLWha -sl8OCvrNPzpFoeo2zyYepxEoxZSPhExTCMWTs/zif/WN87GphV+I3pGW7hdb -rqXqcGV4LCFkAZXOzkw+UPS2Wctjjba9GNSHSl/c7+lW8AoM6HU= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQG -EwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9v -dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMg -Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNa -Fw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9W -YWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24g -QXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1 -lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMukJ0KX0J+D -isPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj18 -2d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Sp -x2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZ -yH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospUxbF6lR1xHkop -igPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4wPQYI -KwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFk -aXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw -ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlh -bmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBw -YXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs -ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRp -ZmljYXRpb24gcHJhY3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmlj -YXRlIFBvbGljeS4wIgYIKwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMu -Ym0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYw -gaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJN -MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCLMA4GA1UdDwEB/wQEAwIB -BjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lofFIk3Wdv -OXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10 -buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe -/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6 -isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW -xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQ -NiOKSnQ2+Q== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlD -ZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu -Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRp -b24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNv -bS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYy -NjAwMjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4x -NTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24g -QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8x -IDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3 -DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2f -NUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChM -MFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqYJJgpp0lZpd34 -t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs3x/b -e0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0Wu -PIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A -PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICXDCCAcWgAwIBAgIQCgEBAQAAAnwAAAALAAAAAjANBgkqhkiG9w0BAQUF -ADA6MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0Eg -U2VjdXJpdHkgMTAyNCBWMzAeFw0wMTAyMjIyMTAxNDlaFw0yNjAyMjIyMDAx -NDlaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJT -QSBTZWN1cml0eSAxMDI0IFYzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB -gQDV3f5mCc8kPD6ugU5OisRpgFtZO9+5TUzKtS3DJy08rwBCbbwoppbPf9dY -rIMKo1W1exeQFYRMiu4mmdxY78c4pqqv0I5CyGLXq6yp+0p9v+r+Ek3d/yYt -bzZUaMjShFbuklNhCbM/OZuoyZu9zp9+1BlqFikYvtc6adwlWzMaUQIDAQAB -o2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSME -GDAWgBTEwBykB5T9zU0B1FTapQxf3q4FWjAdBgNVHQ4EFgQUxMAcpAeU/c1N -AdRU2qUMX96uBVowDQYJKoZIhvcNAQEFBQADgYEAPy1q4yZDlX2Jl2X7deRy -HUZXxGFraZ8SmyzVWujAovBDleMf6XbN3Ou8k6BlCsdNT1+nr6JGFLkM88y9 -am63nd4lQtBU/55oc2PcJOsiv6hy8l4A4Q1OOkNumU4/iXgDmMrzVcydro7B -qkWY+o8aoI2II/EVQQ2lRj6RP4vr93E= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUF -ADA6MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0Eg -U2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5 -MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJT -QSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37 -RqtBaB4Y6lXIL5F4iSj7Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E -0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J -6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iHKrtjEAMq -s6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzD -uvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2Mw -YTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAW -gBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NRMKSq6UWuNST6 -/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmYv/3V -EhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5g -EydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+ -f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJq -aHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEk -llgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA -pKnXwiJPZ9d37CAFYd4= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJK -UDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0 -eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMw -OTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1 -c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RD -QTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8 -V6UMbXaKL0u/ZPtM7orw8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpx -xpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uMDPpVmDvY6CKhS3E4eayXkmmz -iX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX5HA49LY6 -tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819 -uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/L -TX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZ -aNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g0dNq -/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94 -nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 -Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNn -PaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfci -oU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi -FL39vmwLAw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJG -STEPMA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENB -MB4XDTAxMDQwNjEwNDkxM1oXDTIxMDQwNjEwNDkxM1owOTELMAkGA1UEBhMC -RkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMSBD -QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue -+H887dF+2rDNbS82rDTG29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mX -y47vPxVnqIJyY1MPQYx9EJUkoVqlBvqSV536pQHydekfvFYmUk54GWVYVQNY -wBSujHxVX3BbdyMGNpfzJLWaRpXk3w0LBUXl0fIdgrvGE+D+qnr9aTCU89JF -hfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBLqdReLjVQCfOAl/QMF6452F/NM8Ec -yonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIINnvmLVz5MxxftLItyM19yejhW -1ebZrgUaHXVFsculJRwSVzb9IjcCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB -/zARBgNVHQ4ECgQIR+IMi/ZTiFIwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEB -BQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE928Jj2VuXZfsSZ9gqXLar -5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0HDjxVyhbM -p6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VOTzF2 -nBBhjrZTOqMRvq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2Uv -kVrCqIexVmiUefkl98HVrhq4uz2PqYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2y -Ix4wzMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9ZIRlXvVWa ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJG -STEPMA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENB -MB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMC -RkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBD -QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE -+hY3/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gX -GM2RX/uJ4+q/Tl18GybTdXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQ -TiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMGf+dJQMjFAbJUWmYdPfz56TwK -noG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8PtOFCx4j1 -P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURr -BGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB -/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEB -BQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zilzqsWuasvfDXL -rNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEIcbCd -jdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr4 -50kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 -Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkeja -nZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQG -EwJOTDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQD -Ex1TdGFhdCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQTAeFw0wMjEyMTcwOTIz -NDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4wHAYDVQQKExVT -dGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRl -cmxhbmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAmNK1URF6gaYUmHFtvsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rF -DBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02PjLwYdjeFnejKScfST5gTCaI+ -Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGcaC1Hoi6Ce -UJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7l -r7HcsBthvJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4Zl -kuxEK7COudxwC0barbxjiDn622r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGO -MAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRVHSAAMDwwOgYIKwYBBQUH -AgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9vdC1w -b2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg -0zTBLL9s+DANBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k -/rvuFbQvBgwp8qiSpGEN/KtcCFtREytNwiphyPgJWPwtArI5fZlmgb9uXJVF -IGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbwMVcoEoJz6TMvplW0 -C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y -nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBp -IzlWYGeQiy52OfsRiJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYV -wSR8MnwDHTuhWEUykw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDXDCCAsWgAwIBAgICA+owDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYT -AkRFMRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYD -VQQKEzFUQyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3 -b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAyIENB -MSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAe -Fw05ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJE -RTEQMA4GA1UECBMHSGFtYnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UE -ChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3VyaXR5IGluIERhdGEgTmV0d29y -a3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTEp -MCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8w -DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANo46O0yAClxgwENv4wB3NrGrTmk -qYov1YtcaF9QxmL1Zr3KkSLsqh1R1z2zUbKDTl3LSbDwTFXlay3HhQswHJJO -gtTKAu33b77c4OMUuAVT8pr0VotanoWT0bSCVq5Nu6hLVxa8/vhYnvgpjbB7 -zXjJT6yLZwzxnPv8V5tXXE8NAgMBAAGjazBpMA8GA1UdEwEB/wQFMAMBAf8w -DgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRy -dXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G -CSqGSIb3DQEBBAUAA4GBAIRS+yjf/x91AbwBvgRWl2p0QiQxg/lGsQaKic+W -LDO/jLVfenKhhQbOhvgFjuj5Jcrag4wGrOs2bYWRNAQ29ELw+HkuCkhcq8xR -T3h2oNmsGb0q0WkEKJHKNhAngFdb0lz1wlurZIFjdFH0l7/NEij3TWZ/p/Ac -ASZ4smZHcFFk ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDXDCCAsWgAwIBAgICA+swDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYT -AkRFMRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYD -VQQKEzFUQyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3 -b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAzIENB -MSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAe -Fw05ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJE -RTEQMA4GA1UECBMHSGFtYnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UE -ChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3VyaXR5IGluIERhdGEgTmV0d29y -a3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTEp -MCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8w -DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALa0wTUFLg2N7KBAahwOJ6ZQkmtQ -GwfeLud2zODa/ISoXoxjaitN2U4CdhHBC/KNecoAtvGwDtf7pBc9r6tpepYn -v68zoZoqWarEtTcI8hKlMbZD9TKWcSgoq40oht+77uMMfTDWw1Krj10nnGvA -o+cFa1dJRLNu6mTP0o56UHd3AgMBAAGjazBpMA8GA1UdEwEB/wQFMAMBAf8w -DgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRy -dXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G -CSqGSIb3DQEBBAUAA4GBABY9xs3Bu4VxhUafPiCPUSiZ7C1FIWMjWwS7TJC4 -iJIETb19AaM/9uzO8d7+feXhPrvGq14L3T2WxMup1Pkm5gZOngylerpuw3yC -GdHHsbHD2w2Om0B8NwvxXej9H5CIpQ5ON2QhqE6NtJ/x3kit1VYYUimLRzQS -CdS7kjXvD9s0 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQG -EwJESzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50 -ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTda -MEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNV -BAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4Nr -XceO+YQwzho7+vvOi20jxsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaq -HF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5 -Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc5IogCSEW -Vmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8n -mHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwID -AQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBY -oFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIEludGVybmV0MR0w -GwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JMMTAr -BgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjAL -BgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw -HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8w -HQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m -gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKs -LtB9KOy282A4aW8+2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7T -mHnaCB4Mb7j4Fifvwm899qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE -64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQ -V0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQG -EwJESzEMMAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0w -MzAyMTEwODM5MzBaFw0zNzAyMTEwOTA5MzBaMDExCzAJBgNVBAYTAkRLMQww -CgYDVQQKEwNUREMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSj -hFuHnEz9pPPEXyG9VhDr2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8 -z3sM8W9Hpg1DTeLpHTk0zY0s2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJH -hNlktxmW/OwZ5LKXJk5KTMuPJItUGBxIYXvViGjaXbXqzRowwYCDdlCqT9HU -3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKjdGqPqcNiKXEx5TukYBdedObaE+3p -Hx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+rTpPGWOmlgtt3xDqZsXKVSQTw -tyv6e1mO3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAQYwgewGA1UdIASB5DCB4TCB3gYIKoFQgSkBAQEwgdEwLwYIKwYB -BQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5kay9yZXBvc2l0b3J5MIGd -BggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRlciBmcmEg -ZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4x -LiBDZXJ0aWZpY2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIg -T0lEIDEuMi4yMDguMTY5LjEuMS4xLjARBglghkgBhvhCAQEEBAMCAAcwgYEG -A1UdHwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEMMAoGA1UEChMDVERD -MRQwEgYDVQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYm -aHR0cDovL2NybC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0Q -BCQwIoAPMjAwMzAyMTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0j -BBgwFoAUYLWF7FZkfhIZJ2cdUBVLc647+RIwHQYDVR0OBBYEFGC1hexWZH4S -GSdnHVAVS3OuO/kSMB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDAN -BgkqhkiG9w0BAQUFAAOCAQEACromJkbTc6gJ82sLMJn9iuFXehHTuJTXCRBu -o7E4A9G28kNBKWKnctj7fAXmMXAnVBhOinxO5dHKjHiIzxvTkIvmI/gLDjND -fZziChmPyQE+dF10yYscA+UYyAFMP8uXBV2YcaaYb7Z8vTd/vuGTJW1v8Aqt -FxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9AOoBmbgGglGBTvH1tJFUuSN6 -AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQYqbsFbS1AoLbrIyi -gfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9BKNDLdr8C2Lq -L19iUw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMC -WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du -MRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlm -aWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFBl -cnNvbmFsIEJhc2ljIENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNp -Y0B0aGF3dGUuY29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVow -gcsxCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNV -BAcTCUNhcGUgVG93bjEaMBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAm -BgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24xITAfBgNV -BAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBDQTEoMCYGCSqGSIb3DQEJARYZ -cGVyc29uYWwtYmFzaWNAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOB -jQAwgYkCgYEAvLyTU23AUE+CFeZIlDWmWr5vQvoPR+53dXLdjUmbllegeNTK -P1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJl+A1OFdKwPQIcOk8RHtQ -fmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7G1sY0b8j -kyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOB -gQAt4plrsD16iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7 -c8a914phXAPjLSeoF+CEhULcXpvGt7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95 -B21P9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN92NWod8isQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMC -WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du -MRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlm -aWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBl -cnNvbmFsIEZyZWVtYWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1m -cmVlbWFpbEB0aGF3dGUuY29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIz -NTk1OVowgdExCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUx -EjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UEChMRVGhhd3RlIENvbnN1bHRp -bmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24x -JDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBGcmVlbWFpbCBDQTErMCkGCSqG -SIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhhd3RlLmNvbTCBnzANBgkq -hkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfYDFG26nKRsIRefS0N -j3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5ErHzmj+hND3Ef -QDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVquzgkCGqY -x7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq -hkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP -MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgC -neSa/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr -5PjRzneigQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMC -WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du -MRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlm -aWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3RlIFBl -cnNvbmFsIFByZW1pdW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXBy -ZW1pdW1AdGhhd3RlLmNvbTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5 -NTlaMIHPMQswCQYDVQQGEwJaQTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIw -EAYDVQQHEwlDYXBlIFRvd24xGjAYBgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5n -MSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMSMw -IQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJlbWl1bSBDQTEqMCgGCSqGSIb3 -DQEJARYbcGVyc29uYWwtcHJlbWl1bUB0aGF3dGUuY29tMIGfMA0GCSqGSIb3 -DQEBAQUAA4GNADCBiQKBgQDJZtn4B0TPuYwu8KHvE0VsBd/eJxZRNkERbGw7 -7f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ8/JE2dWIEt12TfIa/G8j -Hnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYDZicRFTuq -W/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 -DQEBBAUAA4GBAGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIH -b4Vnjt4rueIXsDqg8A6iAJrf8xQVbrvIhVqYgPn/vnQdPfP+MCXRNzRn+qVx -eTBhKXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+WjS9Q2wfD6h+rM+D1 -KzGJ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMC -WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du -MR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2Vy -dGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3Rl -IFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNl -cnZlckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1 -OVowgc4xCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQ -BgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMUVGhhd3RlIENvbnN1bHRpbmcg -Y2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24x -ITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3 -DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhI -NTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQug2SBhRz1JPL -lyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/qgeN -9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0B -AQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI -hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZ -a4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcU -Qg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMC -WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du -MR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2Vy -dGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3Rl -IFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 -ZS5jb20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkG -A1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2Fw -ZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UE -CxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQ -VGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRz -QHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I -/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC -6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCXL+eQbcAoQpnX -TEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzARMA8G -A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWD -TSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e -QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdni -TCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMC -WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmls -bGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmlj -YXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcNOTcw -MTAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTAT -BgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzAN -BgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24x -HzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcN -AQEBBQADgY0AMIGJAoGBANYrWHhhRYZT6jR7UZztsOYuGA7+4F+oJ9O0yeB8 -WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQaWt9MevPZQx08EHp5JduQ/vBR -5zDWQQD9nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL8vg7ij5FrHGSALSQQZj7 -X+36ty6K+Ig3AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcN -AQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCouqoEiYbC9RAIDb/LogWK -0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQpgCed/r8 -zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZCayJ -SdM= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUF -ADCBkzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 -IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEw -HwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVU -TiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2 -MzBaMIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNh -bHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsx -ITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTEbMBkGA1UEAxMS -VVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+O -GQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrr -U0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrL -Z9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykqlXvY8qdOD1R8 -oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv33i+ -Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4Gr -MIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT -MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8v -Y3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUE -IzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3 -DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHc -rpY6CiM+iVnJowftGzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuM -FrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1 -+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdO -jtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jF -VkwPDPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUF -ADCBrjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 -IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEw -HwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0BgNVBAMTLVVU -Ti1VU0VSRmlyc3QtQ2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAe -Fw05OTA3MDkxNzI4NTBaFw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJV -UzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD -VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93 -d3cudXNlcnRydXN0LmNvbTE2MDQGA1UEAxMtVVROLVVTRVJGaXJzdC1DbGll -bnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWlsMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3BYHW8OWX5ShpHornMSMxq -mNVNNRm5pELlzkniii8efNIxB8dOtINknS4p1aJkxIW9hVE1eaROaJB7HHqk -kqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8om+rWV6lL8/K2m2qL+us -obNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLmSGHGTPNp -saguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM1tZU -Ot4KpLoDd7NlyP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws -6wIDAQABo4G5MIG2MAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0G -A1UdDgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNVHR8EUTBPME2gS6BJ -hkdodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGll -bnRBdXRoZW50aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEF -BQcDAgYIKwYBBQUHAwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rk -MPxTbyUkxsrt4jFcKw7u7mFVbwQ+zznexRtJlOTrIEy05p5QLnLZjfWqo7NK -2lYcYJeA3IKirUq9iiv/Cwm0xtcgBEXkzYABurorbs6q15L+5K/r9CYdFip/ -bDCVNy8zEqx/3cfREYxRmLLQo5HQrfafnoOTHh1CuEava2bwm3/q4wMC5QJR -warVNZ1yQAOJujEdxRBoUp7fooXFXAimeOZTT7Hot9MUnpOmw2TjrH5xzbyf -6QMbzPvprDHBr3wVdAKZw7JHpsIyYdfHb0gkUSeh1YdV8nuPmD0Wnu51tvjQ -jvLzxq4oW6fw8zYX/MMF08oDSlQ= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUF -ADCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 -IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEw -HwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVU -Ti1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5 -MTgxOTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQH -Ew5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3 -b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNV -BAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3DQEBAQUA -A4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZ -FvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6N -q9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEH -OG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNdoI6yqqr2jmmI -BsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjfPe58 -BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhb -AgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD -VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWG -M2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3 -YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF -BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0o -XnWO6y1n7k57K9cM//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjA -bPLPSbtNk28GpgoiskliCE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59 -Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4f -Fm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchq -J/kniCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0q -UZ6B+dQ7XnASfxAynB67nfhmqA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUF -ADCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 -IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEw -HwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVU -Ti1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0 -ODM5WhcNMTkwNzA5MTg1NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgT -AlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVT -RVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVz -dC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNh -dGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCz+5Gh5DZV -hawGNFugmliy+LUPBXeDrjKxdpJo7CNKyXY/45y2N3kDuatpjQclthln5LAb -GHNhSuh+zdMvZOOmfAz6F4CjDUeJT1FxL+78P/m4FoCHiZMlIJpDgmkkdihZ -NaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXuOzr0hAReYFmnjDRy7rh4 -xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1axwiP8vv -/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6gyN7i -gEL66S/ozjIEj3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQD -AgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFPqGydvguul49Uuo1hXf -8NPhahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9jcmwudXNlcnRydXN0 -LmNvbS9VVE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0G -CSqGSIb3DQEBBQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXh -i6r/fWRRzwr/vH3YIWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUq -f9FuVSTiuwL7MT++6LzsQCv4AdRWOOTKRIK1YSAhZ2X28AvnNPilwpyjXEAf -hZOVBt5P1CeptqX8Fs1zMT+4ZSfP1FMa8Kxun08FDAOBp4QpxFq9ZFdyrTvP -NximmMatBrTcCKME1SmklpoSZ0qMYEWd8SOasACcaLWYUNPvji6SZbFIPiG+ -FTAqDbUMo2s/rn9X9R+WfN9v3YIwLGUbQErNaLly7HF27FSOH4UMAWr6pjis -H8SE ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUF -ADCBlTELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 -IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEw -HwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAbBgNVBAMTFFVU -Ti1VU0VSRmlyc3QtT2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4 -NDAzNlowgZUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMO -U2FsdCBMYWtlIENpdHkxHjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29y -azEhMB8GA1UECxMYaHR0cDovL3d3dy51c2VydHJ1c3QuY29tMR0wGwYDVQQD -ExRVVE4tVVNFUkZpcnN0LU9iamVjdDCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicPHxzfOpuCaDDASmEd8S8O+r55 -96Uj71VRloTN2+O5bj4x2AogZ8f02b+U60cEPgLOKqJdhwQJ9jCdGIqXsqoc -/EHSoTbL+z2RuufZcDX65OeQw5ujm9M89RKZd7G3CeBo5hy485RjiGpq/gt2 -yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vulBe3/IW+pKvEHDHd17bR -5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehbkkj7RwvC -bNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUCAwEA -AaOBrzCBrDALBgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQU2u1kdBScFDyr3ZmpvVsoTYs8ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0 -cDovL2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmlyc3QtT2JqZWN0LmNy -bDApBgNVHSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQw -DQYJKoZIhvcNAQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXF -wfNfLEzIR1pp6ujwNTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T -7/yxSPlrJSUtUbYsbUXBmMiKVl0+7kNOPmsnjtA6S4ULX9Ptaqd1y9Fahy85 -dRNacrACgZ++8A+EVCBibGnU4U3GDZlDAQ0Slox4nb9QorFEqmrPF3rPbw/U -+CRVX/A0FklmPlBGyWNxODFiuGK581OtbLUrohKqGU8J2l7nk8aOFAj+8DCA -GKCGhU3IfdeLA/5u1fedFqySLKAj5ZyRUh+U3xeUc8OzwcFxBSAAeL0TUh2o -Ps0AH8g= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlD -ZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu -Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRp -b24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNv -bS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYy -NTIyMjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4x -NTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24g -QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8x -IDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3 -DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw -8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m -+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8YTfwggtFzVXSN -dnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwGlN+V -YH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8so -gTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw -nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI +MIID5jCCAs6gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx +HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh +IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyOTA2MDAwMFoXDTM3MTEyMDE1 +MDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg +SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M +IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnej8Mlo2k06AX3dLm/WpcZuS+U +0pPlLYnKhHw/EEMbjIt8hFj4JHxIzyr9wBXZGH6EGhfT257XyuTZ16pYUYfw8ItI +TuLCxFlpMGK2MKKMCxGZYTVtfu/FsRkGIBKOQuHfD5YQUqjPnF+VFNivO3ULMSAf +RC+iYkGzuxgh28pxPIzstrkNn+9R7017EvILDOGsQI93f7DKeHEMXRZxcKLXwjqF +zQ6axOAAsNUl6twr5JQtOJyJQVdkKGUZHLZEtMgxa44Be3ZZJX8VHIQIfHNlIAqh +BC4aMqiaILGcLCFZ5/vP7nAtCMpjPiybkxlqpMKX/7eGV4iFbJ4VFitNLLMCAwEA +AaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUoTYwFsuGkABFgFOxj8jY +PXy+XxIwHwYDVR0jBBgwFoAUoTYwFsuGkABFgFOxj8jYPXy+XxIwDgYDVR0PAQH/ +BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQCKIBilvrMvtKaEAEAwKfq0FHNMeUWn +9nDg6H5kHgqVfGphwu9OH77/yZkfB2FK4V1Mza3u0FIy2VkyvNp5ctZ7CegCgTXT +Ct8RHcl5oIBN/lrXVtbtDyqvpxh1MwzqwWEFT2qaifKNuZ8u77BfWgDrvq2g+EQF +Z7zLBO+eZMXpyD8Fv8YvBxzDNnGGyjhmSs3WuEvGbKeXO/oTLW4jYYehY0KswsuX +n2Fozy1MBJ3XJU8KDk2QixhWqJNIV9xvrr2eZ1d3iVCzvhGbRWeDhhmH05i9CBoW +H1iCC+GWaQVLjuyDUTEH1dSf/1l7qG6Fz9NLqUmwX7A5KGgOc90lmt4S +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIF5jCCA86gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx +HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh +IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyOTA2MDAwMFoXDTM3MDkyODIz +NDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg +SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M +IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALQ3WggWmRToVbEbJGv8x4vmh6mJ +7ouZzU9AhqS2TcnZsdw8TQ2FTBVsRotSeJ/4I/1n9SQ6aF3Q92RhQVSji6UI0ilb +m2BPJoPRYxJWSXakFsKlnUWsi4SVqBax7J/qJBrvuVdcmiQhLE0OcR+mrF1FdAOY +xFSMFkpBd4aVdQxHAWZg/BXxD+r1FHjHDtdugRxev17nOirYlxcwfACtCJ0zr7iZ +YYCLqJV+FNwSbKTQ2O9ASQI2+W6p1h2WVgSysy0WVoaP2SBXgM1nEG2wTPDaRrbq +JS5Gr42whTg0ixQmgiusrpkLjhTXUr2eacOGAgvqdnUxCc4zGSGFQ+aJLZ8lN2fx +I2rSAG2X+Z/nKcrdH9cG6rjJuQkhn8g/BsXS6RJGAE57COtCPStIbp1n3UsC5ETz +kxmlJ85per5n0/xQpCyrw2u544BMzwVhSyvcG7mm0tCq9Stz+86QNZ8MUhy/XCFh +EVsVS6kkUfykXPcXnbDS+gfpj1bkGoxoigTTfFrjnqKhynFbotSg5ymFXQNoKk/S +Btc9+cMDLz9l+WceR0DTYw/j1Y75hauXTLPXJuuWCpTehTacyH+BCQJJKg71ZDIM +gtG6aoIbs0t0EfOMd9afv9w3pKdVBC/UMejTRrkDfNoSTllkt1ExMVCgyhwn2RAu +rda9EGYrw7AiShJbAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FE9pbQN+nZ8HGEO8txBO1b+pxCAoMB8GA1UdIwQYMBaAFE9pbQN+nZ8HGEO8txBO +1b+pxCAoMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAO/Ouyugu +h4X7ZVnnrREUpVe8WJ8kEle7+z802u6teio0cnAxa8cZmIDJgt43d15Ui47y6mdP +yXSEkVYJ1eV6moG2gcKtNuTxVBFT8zRFASbI5Rq8NEQh3q0l/HYWdyGQgJhXnU7q +7C+qPBR7V8F+GBRn7iTGvboVsNIYvbdVgaxTwOjdaRITQrcCtQVBynlQboIOcXKT +RuidDV29rs4prWPVVRaAMCf/drr3uNZK49m1+VLQTkCpx+XCMseqdiThawVQ68W/ +ClTluUI8JPu3B5wwn3la5uBAUhX0/Kr0VvlEl4ftDmVyXr4m+02kLQgH3thcoNyB +M5kYJRF3p+v9WAksmWsbivNSPxpNSGDxoPYzAlOL7SUJuA0t7Zdz7NeWH45gDtoQ +my8YJPamTQr5O8t1wswvziRpyQoijlmn94IM19drNZxDAGrElWe6nEXLuA4399xO +AU++CrYD062KRffaJ00psUjf5BHklka9bAI+1lHIlRcBFanyqqryvy9lG2/QuRqT +9Y41xICHPpQvZuTpqP9BnHAqTyo5GJUefvthATxRCC4oGKQWDzH9OmwjkyB24f0H +hdFbP9IcczLd+rn4jM8Ch3qaluTtT4mNU0OrDhPAARW0eTjb/G49nlG2uBOLZ8/5 +fNkiHfZdxRwBL5joeiQYvITX+txyW/fBOmg= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFajCCBFKgAwIBAgIEPLU9RjANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQKEwli +ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEGA1UEAxMq +YmVUUlVTVGVkIFJvb3QgQ0EtQmFsdGltb3JlIEltcGxlbWVudGF0aW9uMB4XDTAy +MDQxMTA3Mzg1MVoXDTIyMDQxMTA3Mzg1MVowZjESMBAGA1UEChMJYmVUUlVTVGVk +MRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAxBgNVBAMTKmJlVFJVU1Rl +ZCBSb290IENBLUJhbHRpbW9yZSBJbXBsZW1lbnRhdGlvbjCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBALx+xDmcjOPWHIb/ymKt4H8wRXqOGrO4x/nRNv8i +805qX4QQ+2aBw5R5MdKR4XeOGCrDFN5R9U+jK7wYFuK13XneIviCfsuBH/0nLI/6 +l2Qijvj/YaOcGx6Sj8CoCd8JEey3fTGaGuqDIQY8n7pc/5TqarjDa1U0Tz0yH92B +FODEPM2dMPgwqZfT7syj0B9fHBOB1BirlNFjw55/NZKeX0Tq7PQiXLfoPX2k+Ymp +kbIq2eszh+6l/ePazIjmiSZuxyuC0F6dWdsU7JGDBcNeDsYq0ATdcT0gTlgn/FP7 +eHgZFLL8kFKJOGJgB7Sg7KxrUNb9uShr71ItOrL/8QFArDcCAwEAAaOCAh4wggIa +MA8GA1UdEwEB/wQFMAMBAf8wggG1BgNVHSAEggGsMIIBqDCCAaQGDysGAQQBsT4A +AAEJKIORMTCCAY8wggFIBggrBgEFBQcCAjCCAToaggE2UmVsaWFuY2Ugb24gb3Ig +dXNlIG9mIHRoaXMgQ2VydGlmaWNhdGUgY3JlYXRlcyBhbiBhY2tub3dsZWRnbWVu +dCBhbmQgYWNjZXB0YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJk +IHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwgdGhlIENlcnRpZmljYXRpb24g +UHJhY3RpY2UgU3RhdGVtZW50IGFuZCB0aGUgUmVseWluZyBQYXJ0eSBBZ3JlZW1l +bnQsIHdoaWNoIGNhbiBiZSBmb3VuZCBhdCB0aGUgYmVUUlVTVGVkIHdlYiBzaXRl +LCBodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20vcHJvZHVjdHNfc2VydmljZXMvaW5k +ZXguaHRtbDBBBggrBgEFBQcCARY1aHR0cDovL3d3dy5iZXRydXN0ZWQuY29tL3By +b2R1Y3RzX3NlcnZpY2VzL2luZGV4Lmh0bWwwHQYDVR0OBBYEFEU9w6nR3D8kVpgc +cxiIav+DR+22MB8GA1UdIwQYMBaAFEU9w6nR3D8kVpgccxiIav+DR+22MA4GA1Ud +DwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEASZK8o+6svfoNyYt5hhwjdrCA +WXf82n+0S9/DZEtqTg6t8n1ZdwWtColzsPq8y9yNAIiPpqCy6qxSJ7+hSHyXEHu6 +7RMdmgduyzFiEuhjA6p9beP4G3YheBufS0OM00mG9htc9i5gFdPp43t1P9ACg9AY +gkHNZTfqjjJ+vWuZXTARyNtIVBw74acT02pIk/c9jH8F6M7ziCpjBLjqflh8AXtb +4cV97yHgjQ5dUX2xZ/2jvTg2xvI4hocalmhgRvsoFEdV4aeADGvi6t9NfJBIoDa9 +CReJf8Py05yc493EG931t3GzUwWJBtDLSoDByFOQtTwxiBdQn8nEDovYqAJjDQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGUTCCBTmgAwIBAgIEPLVPQDANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQKEwli +ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEGA1UEAxMq +YmVUUlVTVGVkIFJvb3QgQ0EgLSBFbnRydXN0IEltcGxlbWVudGF0aW9uMB4XDTAy +MDQxMTA4MjQyN1oXDTIyMDQxMTA4NTQyN1owZjESMBAGA1UEChMJYmVUUlVTVGVk +MRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAxBgNVBAMTKmJlVFJVU1Rl +ZCBSb290IENBIC0gRW50cnVzdCBJbXBsZW1lbnRhdGlvbjCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBALr0RAOqEmq1Q+xVkrYwfTVXDNvzDSduTPdQqJtO +K2/b9a0cS12zqcH+e0TrW6MFDR/FNCswACnxeECypP869AGIF37m1CbTukzqMvtD +d5eHI8XbQ6P1KqNRXuE70mVpflUVm3rnafdE4Fe1FehmYA8NA/uCjqPoEXtsvsdj +DheT389Lrm5zdeDzqrmkwAkbhepxKYhBMvnwKg5sCfJ0a2ZsUhMfGLzUPvfYbiCe +yv78IZTuEyhL11xeDGbu6bsPwTSxfwh28z0mcMmLJR1iJAzqHHVOwBLkuhMdMCkt +VjMFu5dZfsZJT4nXLySotohAtWSSU1Yk5KKghbNekLQSM80CAwEAAaOCAwUwggMB +MIIBtwYDVR0gBIIBrjCCAaowggGmBg8rBgEEAbE+AAACCSiDkTEwggGRMIIBSQYI +KwYBBQUHAgIwggE7GoIBN1JlbGlhbmNlIG9uIG9yIHVzZSBvZiB0aGlzIENlcnRp +ZmljYXRlIGNyZWF0ZXMgYW4gYWNrbm93bGVkZ21lbnQgYW5kIGFjY2VwdGFuY2Ug +b2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0 +aW9ucyBvZiB1c2UsIHRoZSBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dCBhbmQgdGhlIFJlbHlpbmcgUGFydHkgQWdyZWVtZW50LCB3aGljaCBjYW4gYmUg +Zm91bmQgYXQgdGhlIGJlVFJVU1RlZCB3ZWIgc2l0ZSwgaHR0cHM6Ly93d3cuYmV0 +cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1sMEIGCCsGAQUF +BwIBFjZodHRwczovL3d3dy5iZXRydXN0ZWQuY29tL3Byb2R1Y3RzX3NlcnZpY2Vz +L2luZGV4Lmh0bWwwEQYJYIZIAYb4QgEBBAQDAgAHMIGJBgNVHR8EgYEwfzB9oHug +eaR3MHUxEjAQBgNVBAoTCWJlVFJVU1RlZDEbMBkGA1UECxMSYmVUUlVTVGVkIFJv +b3QgQ0FzMTMwMQYDVQQDEypiZVRSVVNUZWQgUm9vdCBDQSAtIEVudHJ1c3QgSW1w +bGVtZW50YXRpb24xDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMjA0MTEw +ODI0MjdagQ8yMDIyMDQxMTA4NTQyN1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaA +FH1w5a44iwY/qhwaj/nPJDCqhIQWMB0GA1UdDgQWBBR9cOWuOIsGP6ocGo/5zyQw +qoSEFjAMBgNVHRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIE +kDANBgkqhkiG9w0BAQUFAAOCAQEAKrgXzh8QlOu4mre5X+za95IkrNySO8cgjfKZ +5V04ocI07cUTWVwFtStPYZuR+0H8/NU8TZh2BvWBfevdkObRVlTa4y0MnxEylCIB +evZsLHRnBMylj44ss0O1lKLQfelifwa+JwGDnjr9iu6YQ0pr17WXOzq/T220Y/oz +ADQuLW2WyXvKmWO6vvT2MKAtmJbpVkQFqUSjYRDrgqFnXbxdJ3Wqiig2KjiS2d2k +XgClzMx8KSreKJCrt+G2/30lC0DYqjSjLd4H61/OCt3Kfjp9JsFiaDrmLzfzgYYh +xKlkqu9FNtEaZnz46TfW1mG+oq1I59/mdP7TbX3SJdysYlep9w== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFaDCCBFCgAwIBAgIQO1nHe81bV569N1KsdrSqGjANBgkqhkiG9w0BAQUFADBi +MRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENB +czEvMC0GA1UEAxMmYmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVtZW50YXRp +b24wHhcNMDIwNDExMTExODEzWhcNMjIwNDEyMTEwNzI1WjBiMRIwEAYDVQQKEwli +ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEvMC0GA1UEAxMm +YmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVtZW50YXRpb24wggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkujQwCY5X0LkGLG9uJIAiv11DpvpPrILn +HGhwhRujbrWqeNluB0s/6d/16uhUoWGKDi9pdRi3DOUUjXFumLhV/AyV0Jtu4S2I +1DpAa5LxmZZk3tv/ePTulh1HiXzUvrmIdyM6CeYEnm2qXtLIvZpOGd+J6lsOfsPk +tPDgaTuID0GQ+NRxQyTBjyZLO1bp/4xsN+lFrYWMU8NghpBKlsmzVLC7F/AcRdnU +GxlkVgoZ98zh/4avflherHqQH8koOUV7orbHnB/ahdQhhlkwk75TMzf270HPM8er +cmsl9fNTGwxMLvF1S++gh/f+ihXQbNXL+WhTuXAVE8L1LvtDNXUtAgMBAAGjggIY +MIICFDAMBgNVHRMEBTADAQH/MIIBtQYDVR0gBIIBrDCCAagwggGkBg8rBgEEAbE+ +AAADCSiDkTEwggGPMEEGCCsGAQUFBwIBFjVodHRwOi8vd3d3LmJldHJ1c3RlZC5j +b20vcHJvZHVjdHNfc2VydmljZXMvaW5kZXguaHRtbDCCAUgGCCsGAQUFBwICMIIB +OhqCATZSZWxpYW5jZSBvbiBvciB1c2Ugb2YgdGhpcyBDZXJ0aWZpY2F0ZSBjcmVh +dGVzIGFuIGFja25vd2xlZGdtZW50IGFuZCBhY2NlcHRhbmNlIG9mIHRoZSB0aGVu +IGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNl +LCB0aGUgQ2VydGlmaWNhdGlvbiBQcmFjdGljZSBTdGF0ZW1lbnQgYW5kIHRoZSBS +ZWx5aW5nIFBhcnR5IEFncmVlbWVudCwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IHRo +ZSBiZVRSVVNUZWQgd2ViIHNpdGUsIGh0dHA6Ly93d3cuYmV0cnVzdGVkLmNvbS9w +cm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1sMAsGA1UdDwQEAwIBBjAfBgNVHSME +GDAWgBSp7BR++dlDzFMrFK3P9/BZiUHNGTAdBgNVHQ4EFgQUqewUfvnZQ8xTKxSt +z/fwWYlBzRkwDQYJKoZIhvcNAQEFBQADggEBANuXsHXqDMTBmMpWBcCorSZIry0g +6IHHtt9DwSwddUvUQo3neqh03GZCWYez9Wlt2ames30cMcH1VOJZJEnl7r05pmuK +mET7m9cqg5c0Lcd9NUwtNLg+DcTsiCevnpL9UGGCqGAHFFPMZRPB9kdEadIxyKbd +LrML3kqNWz2rDcI1UqJWN8wyiyiFQpyRQHpwKzg21eFzGh/l+n5f3NacOzDq28Bb +J1zTcwfBwvNMm2+fG8oeqqg4MwlYsq78B+g23FW6L09A/nq9BqaBwZMifIYRCgZ3 +SK41ty8ymmFei74pnykkiFY5LKjSq5YDWtRIn7lAhAuYaPsBQ9Yb4gmxlxw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM +MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD +QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM +MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD +QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E +jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo +ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI +ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu +Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg +AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7 +HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA +uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa +TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg +xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q +CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x +O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs +6GAqm4VKQPNriiTsBhYscw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj +YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM +GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua +BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe +3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 +YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR +rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm +ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU +oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t +b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF +AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q +GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 +G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi +l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 +smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp +ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow +fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV +BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM +cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S +HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996 +CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk +3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz +6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV +HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud +EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv +Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw +Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww +DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0 +5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj +Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI +gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ +aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl +izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0 +aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla +MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO +BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD +VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW +fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt +TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL +fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW +1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7 +kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G +A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v +ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo +dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu +Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/ +HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 +pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS +jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+ +xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn +dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV +UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL +EwhEU1RDQSBFMTAeFw05ODEyMTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJ +BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x +ETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCg +bIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJENySZ +j9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlV +Sn5JTe2io74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCG +SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx +JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI +RFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMTAxODEw +MjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFGp5 +fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i ++DAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG +SIb3DQEBBQUAA4GBACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lN +QseSJqBcNJo4cvj9axY+IO6CizEqkzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+ +gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4RbyhkwS7hp86W0N6w4pl +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV +UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL +EwhEU1RDQSBFMjAeFw05ODEyMDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJ +BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x +ETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQC/ +k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGODVvso +LeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3o +TQPMx7JSxhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCG +SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx +JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI +RFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMDkxOTE3 +MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFB6C +TShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5 +WzAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG +SIb3DQEBBQUAA4GBAEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHR +xdf0CiUPPXiBng+xZ8SQTGPdXqfiup/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVL +B3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1mPnHfxsb1gYgAlihw6ID +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEgzCCA+ygAwIBAgIEOJ725DANBgkqhkiG9w0BAQQFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9HQ0NBX0NQUyBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAyMDAw +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENsaWVu +dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAyMDcxNjE2NDBaFw0yMDAy +MDcxNjQ2NDBaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0dDQ0FfQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDIwMDAgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCTdLS25MVL1qFof2LV7PdRV7Ny +Spj10InJrWPNTTVRaoTUrcloeW+46xHbh65cJFET8VQlhK8pK5/jgOLZy93GRUk0 +iJBeAZfv6lOm3fzB3ksqJeTpNfpVBQbliXrqpBFXO/x8PTbNZzVtpKklWb1m9fkn +5JVn1j+SgF7yNH0rhQIDAQABo4IBnjCCAZowEQYJYIZIAYb4QgEBBAQDAgAHMIHd +BgNVHR8EgdUwgdIwgc+ggcyggcmkgcYwgcMxFDASBgNVBAoTC0VudHJ1c3QubmV0 +MUAwPgYDVQQLFDd3d3cuZW50cnVzdC5uZXQvR0NDQV9DUFMgaW5jb3JwLiBieSBy +ZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0Lm5l +dCBMaW1pdGVkMTMwMQYDVQQDEypFbnRydXN0Lm5ldCBDbGllbnQgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMDAy +MDcxNjE2NDBagQ8yMDIwMDIwNzE2NDY0MFowCwYDVR0PBAQDAgEGMB8GA1UdIwQY +MBaAFISLdP3FjcD/J20gN0V8/i3OutN9MB0GA1UdDgQWBBSEi3T9xY3A/ydtIDdF +fP4tzrrTfTAMBgNVHRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4w +AwIEkDANBgkqhkiG9w0BAQQFAAOBgQBObzWAO9GK9Q6nIMstZVXQkvTnhLUGJoMS +hAusO7JE7r3PQNsgDrpuFOow4DtifH+La3xKp9U1PL6oXOpLu5OOgGarDyn9TS2/ +GpsKkMWr2tGzhtQvJFJcem3G8v7lTRowjJDyutdKPkN+1MhQGof4T4HHdguEOnKd +zmVml64mXg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIElTCCA/6gAwIBAgIEOJsRPDANBgkqhkiG9w0BAQQFADCBujEUMBIGA1UEChML +RW50cnVzdC5uZXQxPzA9BgNVBAsUNnd3dy5lbnRydXN0Lm5ldC9TU0xfQ1BTIGlu +Y29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDIwMDAg +RW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJl +IFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAyMDQxNzIwMDBa +Fw0yMDAyMDQxNzUwMDBaMIG6MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDE/MD0GA1UE +CxQ2d3d3LmVudHJ1c3QubmV0L1NTTF9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p +dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0Lm5ldCBMaW1pdGVk +MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp +b24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHwV9OcfHO +8GCGD9JYf9Mzly0XonUwtZZkJi9ow0SrqHXmAGc0V55lxyKbc+bT3QgON1WqJUaB +bL3+qPZ1V1eMkGxKwz6LS0MKyRFWmponIpnPVZ5h2QLifLZ8OAfc439PmrkDQYC2 +dWcTC5/oVzbIXQA23mYU2m52H083jIITiQIDAQABo4IBpDCCAaAwEQYJYIZIAYb4 +QgEBBAQDAgAHMIHjBgNVHR8EgdswgdgwgdWggdKggc+kgcwwgckxFDASBgNVBAoT +C0VudHJ1c3QubmV0MT8wPQYDVQQLFDZ3d3cuZW50cnVzdC5uZXQvU1NMX0NQUyBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAyMDAw +IEVudHJ1c3QubmV0IExpbWl0ZWQxOjA4BgNVBAMTMUVudHJ1c3QubmV0IFNlY3Vy +ZSBTZXJ2ZXIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEw +KwYDVR0QBCQwIoAPMjAwMDAyMDQxNzIwMDBagQ8yMDIwMDIwNDE3NTAwMFowCwYD +VR0PBAQDAgEGMB8GA1UdIwQYMBaAFMtswGvjuz7L/CKc/vuLkpyw8m4iMB0GA1Ud +DgQWBBTLbMBr47s+y/winP77i5KcsPJuIjAMBgNVHRMEBTADAQH/MB0GCSqGSIb2 +fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQQFAAOBgQBi24GRzsia +d0Iv7L0no1MPUBvqTpLwqa+poLpIYcvvyQbvH9X07t9WLebKahlzqlO+krNQAraF +JnJj2HVQYnUUt7NQGj/KEQALhUVpbbalrlHhStyCP2yMNLJ3a9kC9n8O6mUE8c1U +yrrJzOCE98g+EZfTYAkYvAX/bIkz8OwVDw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0xOTEy +MjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGA +vtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJFrlwMB0G +CSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEA +WUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo +oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQ +h7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18 +f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfN +B/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVy +vUxFnmG6v4SBkgPR0ml8xQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIE7TCCBFagAwIBAgIEOAOR7jANBgkqhkiG9w0BAQQFADCByTELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUgwRgYDVQQLFD93d3cuZW50cnVzdC5u +ZXQvQ2xpZW50X0NBX0luZm8vQ1BTIGluY29ycC4gYnkgcmVmLiBsaW1pdHMgbGlh +Yi4xJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV +BAMTKkVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw05OTEwMTIxOTI0MzBaFw0xOTEwMTIxOTU0MzBaMIHJMQswCQYDVQQGEwJVUzEU +MBIGA1UEChMLRW50cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9D +bGllbnRfQ0FfSW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjEl +MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMq +RW50cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0G +CSqGSIb3DQEBAQUAA4GLADCBhwKBgQDIOpleMRffrCdvkHvkGf9FozTC28GoT/Bo +6oT9n3V5z8GKUZSvx1cDR2SerYIbWtp/N3hHuzeYEpbOxhN979IMMFGpOZ5V+Pux +5zDeg7K6PvHViTs7hbqqdCz+PzFur5GVbgbUB01LLFZHGARS2g4Qk79jkJvh34zm +AqTmT173iwIBA6OCAeAwggHcMBEGCWCGSAGG+EIBAQQEAwIABzCCASIGA1UdHwSC +ARkwggEVMIHkoIHhoIHepIHbMIHYMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50 +cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0FfSW5m +by9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UECxMcKGMp +IDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQg +Q2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCyg +KqAohiZodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9DbGllbnQxLmNybDArBgNV +HRAEJDAigA8xOTk5MTAxMjE5MjQzMFqBDzIwMTkxMDEyMTkyNDMwWjALBgNVHQ8E +BAMCAQYwHwYDVR0jBBgwFoAUxPucKXuXzUyW/O5bs8qZdIuV6kwwHQYDVR0OBBYE +FMT7nCl7l81MlvzuW7PKmXSLlepMMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA +BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEEBQADgYEAP66K8ddmAwWePvrqHEa7 +pFuPeJoSSJn59DXeDDYHAmsQOokUgZwxpnyyQbJq5wcBoUv5nyU7lsqZwz6hURzz +wy5E97BnRqqS5TvaHBkUODDV4qIxJS7x7EU47fgGWANzYrAQMY9Av2TgXD7FTx/a +EkP/TOYGJqibGapEPHayXOw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u +ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u +ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 +MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE +ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j +b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg +U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ +I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 +wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC +AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb +oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 +BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p +dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk +MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp +b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 +MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi +E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa +MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI +hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN +95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd +2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlD -ZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu -Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRp -b24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNv -bS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYy -NjAwMTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4x -NTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24g -QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8x -IDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3 -DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc -65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQ -b7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QSv4dk+NoS/zcn -wbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZSWI4 -OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZ -oDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC -W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd +MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV +UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy +dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 +MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx +dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f +BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A +cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC +AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ +MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm +aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw +ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj +IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF +MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA +A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y +7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh +1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8x -CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UE -CxMuQ2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eTAeFw05NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTlaMF8xCzAJBgNV -BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh -c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCB -nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3 -noaACpEO+jglr0aIguVzqKCbJF0NH8xlbgyw0FaEGIeaBpsQoXPftFg5a27B -9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR4k5FVmkfeAKA2txHkSm7NsljXMXg -1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATANBgkqhkiG9w0BAQIFAAOBgQBM -P7iLxmjf7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZoEWx8QszznC7EBz8UsA9P -/5CSdvnivErpj82ggAr3xSnxgiJduLHdgSOjeyUVRjB5FvjqBUuUfx3CHMjj -t/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0ANACY89FxlA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcEx -CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UE -CxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAt -IEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBU -cnVzdCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVow -gcExCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoG -A1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5j -LiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2ln -biBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq -0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYKVdPfQ4chEWWKfo+9 -Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSmFc/IReumXY6c -PvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQIDAQABMA0G -CSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0Jh9Zr -bWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul -uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4i -P/68DzFc6PLZ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHK -MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNV -BAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5 -IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBD -BgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3 -MTYyMzU5NTlaMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24s -IEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNV -BAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQg -dXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFBy -aW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4nN493GwTFtl63SRR -ZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO8ESlV8dAWB6j -Rx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjVojYJrKsh -JlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjbPG7P -oBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2 -6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHh -v2Vrn5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQ -BfGfMY1aqtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/N -y9Sn2WCVhDr4wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUf -xJM8/XmPBNQ+T+r3ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFM -DSZl4kSAHsef493oCtrspSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5 -SCJ5ShkPshw+IHTZasO+8ih4E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXV -OBRgmaNL3gaWcSzy27YfpO8/7g== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQL -Ey5DbGFzcyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGf -MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZM -JaLtVRKXxaeAufqDwSCg+i8VDXyhYGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvE -erf4Zh+AVPy3wo5ZShRXRtGak75BkQO7FYCTXOvnzAhsPz6zSvz/S2wj1VCC -JkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBAIob -K/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxgJ8pFUs4W7z8GZOeUaHxg -MxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Ncr6Pc5iaAIzy4RHT3 -Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHB -MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNV -BAsTM0NsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRo -b3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4g -LSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24g -VHJ1c3QgTmV0d29yazAeFw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTla -MIHBMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6 -BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIElu -Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNp -Z24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA -p4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjMHiwSViy4AWkszJkf -rbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjwDqL7MWzJ5m+Z -Jwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cCAwEAATAN -BgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9jinb3/ -7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX -rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6x -RnInjBJ7xUS0rg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcox -CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UE -CxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkg -VmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMG -A1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcx -NjIzNTk1OVowgcoxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwg -SW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UE -CxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1 -c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJp -bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWUJ92lvuCwTY+zYVY8 -1nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDOJxOeBUebMXoT -2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUYwZF7C9UT -AJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9okoqQ -HgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN -qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVC -YQ/ESrg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekh -ktdmnLfexbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf -0xwLRtxyID+u7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydE -p85EXdQbkJgNHkKUsQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377B -MnMiIYtYgXsVkXq642RIsH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab -5iXiQkWquJCtvgiPqQtCGJTPcjnhsUPgKM+351psE2tJs//jGHyJizNdrDPX -p/naOlXJWBD5qu9ats9LS98q ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQL -Ey5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGf -MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69q -RUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94f56TuZoAqiN91qyFomNFx3In -zPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Olhec9vn2a -/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtM -EivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPw -TtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzk -uxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcEx -CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UE -CxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAt -IEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBU -cnVzdCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVow -gcExCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoG -A1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5j -LiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2ln -biBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDM -XtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXX -wc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg013gfqLptQ5GV -j0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQABMA0G -CSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01U -bSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i -F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo -1KpYoJ2daZH9 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHK -MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNV -BAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5 -IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBD -BgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3 -MTYyMzU5NTlaMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24s -IEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNV -BAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQg -dXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFBy -aW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2 -R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2tKmFZpGcmTNDo -vFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUccLwg -TS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+V -k7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ -Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJ -OxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my -/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f -j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoA -Wii/gt/4uhMdUIaC/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8S -GhJouPtmmRQURVyu565pF4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbb -o27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh -/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcEx -CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UE -CxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAt -IEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBU -cnVzdCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVow -gcExCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoG -A1UECxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5j -LiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2ln -biBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC6 -8OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDMHO0oW369atyzkSTK -QWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtKqsGgtG7rL+VX -xbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwIDAQABMA0G -CSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwjcSGI -L4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y -cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckzt -ImRPT8qAkbYp ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHK -MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNV -BAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5 -IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBD -BgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3 -MTYyMzU5NTlaMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24s -IEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNV -BAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQg -dXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFBy -aW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYl -S+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ+mGuqPKljYXC -KtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM8BDc -VHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdL -MEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY -ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDD -Zq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1Wr -IhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt -mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csK -vE+MW8VLADsfKoKmfjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluP -QSjA1egtTaRezarZ7c7c2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kP -mF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr -9Xgn2uf3ZkPznoM+IKrDNWCRzg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzEL -MAkGA1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMu -MS4wLAYDVQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9y -aXR5MB4XDTk0MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVowXzELMAkGA1UE -BhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD -VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGb -MA0GCSqGSIb3DQEBAQUAA4GJADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6O -LDfO6zV4ZFQD5YRAUcm/jwjiioII0haGN1XpsSECrXZogZoFokvJSyVmIlZs -iAeP94FZbYQHZXATcXY+m3dM41CJVphIuR2nKRoTLkoRWZweFdVJVCxzOmmC -sZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZIhvcNAQECBQADfgBl3X7hsuyw -4jrg7HFGmhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3YQO2WxZpO8ZECAyIUwxr -l0nHPjXcbLm7qt9cuzovk2C2qUtN8iD3zV9/ZHuO3ABc1/p3yjkWWW8O6tO1 -g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDzTCCAzagAwIBAgIQU2GyYK7bcY6nlLMTM/QHCTANBgkqhkiG9w0BAQUF -ADCBwTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTww -OgYDVQQLEzNDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24g -QXV0aG9yaXR5IC0gRzIxOjA4BgNVBAsTMShjKSAxOTk4IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmswHhcNMDAwOTI2MDAwMDAwWhcNMTAwOTI1MjM1 -OTU5WjCBpTEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBh -dCBodHRwczovL3d3dy52ZXJpc2lnbi5jb20vcnBhIChjKTAwMSwwKgYDVQQD -EyNWZXJpU2lnbiBUaW1lIFN0YW1waW5nIEF1dGhvcml0eSBDQTCBnzANBgkq -hkiG9w0BAQEFAAOBjQAwgYkCgYEA0hmdZ8IAIVlizrQJIkRpivglWtvtDbc2 -fk7gu5Q+kCWHwmFHKdm9VLhjzCx9abQzNvQ3B5rB3UBU/OB4naCTuQk9I1F/ -RMIUdNsKvsvJMDRAmD7Q1yUQgZS9B0+c1lQn3y6ov8uQjI11S7zi6ESHzeZB -CiVu6PQkAsVSD27smHUCAwEAAaOB3zCB3DAPBgNVHRMECDAGAQH/AgEAMEUG -A1UdIAQ+MDwwOgYMYIZIAYb4RQEHFwEDMCowKAYIKwYBBQUHAgEWHGh0dHBz -Oi8vd3d3LnZlcmlzaWduLmNvbS9ycGEwMQYDVR0fBCowKDAmoCSgIoYgaHR0 -cDovL2NybC52ZXJpc2lnbi5jb20vcGNhMy5jcmwwCwYDVR0PBAQDAgEGMEIG -CCsGAQUFBwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRwOi8vb2NzcC52ZXJp -c2lnbi5jb20vb2NzcC9zdGF0dXMwDQYJKoZIhvcNAQEFBQADgYEAgnBold+2 -DcIBcBlK0lRWHqzyRUyHuPU163hLBanInTsZIS5wNEqi9YngFXVF5yg3ADQn -Keg3S/LvRJdrF1Eaw1adPBqK9kpGRjeM+sv1ZFo4aC4cw+9wzrhGBha/937n -tag+RaypJXUie28/sJyU58dzq6wf7iWbwBbtt8pb8BQ= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUF -ADBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlz -YSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMT -E1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0 -MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UE -CxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAa -BgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA -A4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh -28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8bRaVK7362 -rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81 -q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtF -Wsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0 -lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaLdXe6YJ2E5/4t -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOC -AQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR -zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKht -cbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGI -xHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu -YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/ -hC3euiInlhBx6yLt398znM/jra6O1I7mT1GvFpLgXPYHDw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDgDCCAmigAwIBAgICAx4wDQYJKoZIhvcNAQEFBQAwYTELMAkGA1UEBhMC -VVMxDTALBgNVBAoTBFZJU0ExLzAtBgNVBAsTJlZpc2EgSW50ZXJuYXRpb25h -bCBTZXJ2aWNlIEFzc29jaWF0aW9uMRIwEAYDVQQDEwlHUCBSb290IDIwHhcN -MDAwODE2MjI1MTAwWhcNMjAwODE1MjM1OTAwWjBhMQswCQYDVQQGEwJVUzEN -MAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNl -cnZpY2UgQXNzb2NpYXRpb24xEjAQBgNVBAMTCUdQIFJvb3QgMjCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBAKkBcLWqxEDwq2omYXkZAPy/mzdZ -DK9vZBv42pWUJGkzEXDK41Z0ohdXZFwgBuHW73G3O/erwWnQSaSxBNf0V2KJ -XLB1LRckaeNCYOTudNargFbYiCjh+20i/SN8RnNPflRzHqgsVVh1t0zzWkWl -Ahr62p3DRcMiXvOL8WAp0sdftAw6UYPvMPjU58fy+pmjIlC++QU3o63tmsPm -7IgbthknGziLgE3sucfFicv8GjLtI/C1AVj59o/ghalMCXI5Etuz9c9OYmTa -xhkVOmMd6RdVoUwiPDQyRvhlV7or7zaMavrZ2UT0qt2E1w0cslSsMoW0ZA3e -QbuxNMYBhjJk1Z8CAwEAAaNCMEAwHQYDVR0OBBYEFJ59SzS/ca3CBfYDdYDO -qU8axCRMMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqG -SIb3DQEBBQUAA4IBAQAhpXYUVfmtJ3CPPPTVbMjMCqujmAuKBiPFyWHbmQdp -NSYx/scuhMKZYdQN6X0uEyt8joW2hcdLzzW2LEc9zikv2G+fiRxkk78IvXbQ -kIqUs38oW26sTTMs7WXcFsziza6kPWKSBpUmv9+55CCmc2rBvveURNZNbyoL -axhNdBA2aGpawWqn3TYpjLgwi08hPwAuVDAHOrqK5MOeyti12HvOdUVmB/Rt -Ldh6yumJivIj2C/LbgA2T/vwLwHMD8AiZfSr4k5hLQOCfZEWtTDVFN5ex5D8 -ofyrEK9ca3CnB+8phuiyJccg/ybdd+95RBTEvd07xQObdyPsoOy7Wjm1zK0G +MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT +ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw +MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j +LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ +KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo +RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu +WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw +Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD +AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK +eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM +zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ +WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN +/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2Vj +dXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0 +NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXggU2VjdXJlMSYwJAYD +VQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn2Z0G +vxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/ +BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0C +AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEX +MBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJl +IGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkw +NjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBq +y/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQF +MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA +A4GBAAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy +0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1 +E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT +ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw +MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj +dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l +c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC +UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc +58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ +o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr +aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA +A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA +Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv +8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg +R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 +9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq +fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv +iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU +1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ +bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW +MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA +ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l +uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn +Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS +tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un +hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV +5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILAgAAAAAA1ni3lAUwDQYJKoZIhvcNAQEEBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw +MDBaFw0xNDAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT +aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ +jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp +xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp +1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG +snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ +U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 +9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIABjAdBgNVHQ4EFgQU +YHtmGkUNl8qJUC99BM00qP/8/UswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0B +AQQFAAOCAQEArqqf/LfSyx9fOSkoGJ40yWxPbxrwZKJwSk8ThptgKJ7ogUmYfQq7 +5bCdPTbbjwVR/wkxKh/diXeeDy5slQTthsu0AD+EAk2AaioteAuubyuig0SDH81Q +gkwkr733pbTIWg/050deSY43lv6aiAU62cDbKYfmGZZHpzqmjIs8d/5GY6dT2iHR +rH5Jokvmw2dZL7OKDrssvamqQnw1wdh/1acxOk5jQzmvCLBhNIzTmKlDNPYPhyk7 +ncJWWJh3w/cbrPad+D6qp1RF8PX51TFl/mtYnHGzHtdS6jIX/EBgHcl5JLL2bP2o +Zg6C3ZjL2sJETy6ge/L3ayx2EYRGinij4w== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD +VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv +bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv +b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV +UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU +cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds +b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH +iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS +r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 +04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r +GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 +3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P +lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARwxCzAJBgNVBAYTAkVT +MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE +ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE +ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEzMDEGA1UECxMq +SVBTIENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MTMwMQYD +VQQDEypJUFMgQ0EgQ2hhaW5lZCBDQXMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx +HjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczAeFw0wMTEyMjkwMDUzNTha +Fw0yNTEyMjcwMDUzNThaMIIBHDELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNl +bG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQg +cHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMu +ZXMgQy5JLkYuICBCLTYwOTI5NDUyMTMwMQYDVQQLEypJUFMgQ0EgQ2hhaW5lZCBD +QXMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxMzAxBgNVBAMTKklQUyBDQSBDaGFp +bmVkIENBcyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3DQEJARYP +aXBzQG1haWwuaXBzLmVzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcVpJJ +spQgvJhPUOtopKdJC7/SMejHT8KGC/po/UNaivNgkjWZOLtNA1IhW/A3mTXhQSCB +hYEFcYGdtJUZqV92NC5jNzVXjrQfQj8VXOF6wV8TGDIxya2+o8eDZh65nAQTy2nB +Bt4wBrszo7Uf8I9vzv+W6FS+ZoCua9tBhDaiPQIDAQABo4IEQzCCBD8wHQYDVR0O +BBYEFKGtMbH5PuEXpsirNPxShwkeYlJBMIIBTgYDVR0jBIIBRTCCAUGAFKGtMbH5 +PuEXpsirNPxShwkeYlJBoYIBJKSCASAwggEcMQswCQYDVQQGEwJFUzESMBAGA1UE +CBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJ +bnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0Bt +YWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxMzAxBgNVBAsTKklQUyBDQSBD +aGFpbmVkIENBcyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEzMDEGA1UEAxMqSVBT +IENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI +hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8E +BQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMG +CCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYB +BAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMw +EYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBC +BglghkgBhvhCAQ0ENRYzQ2hhaW5lZCBDQSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkg +aHR0cDovL3d3dy5pcHMuZXMvMCkGCWCGSAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlw +cy5lcy9pcHMyMDAyLzA3BglghkgBhvhCAQQEKhYoaHR0cDovL3d3dy5pcHMuZXMv +aXBzMjAwMi9pcHMyMDAyQ0FDLmNybDA8BglghkgBhvhCAQMELxYtaHR0cDovL3d3 +dy5pcHMuZXMvaXBzMjAwMi9yZXZvY2F0aW9uQ0FDLmh0bWw/MDkGCWCGSAGG+EIB +BwQsFipodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3JlbmV3YWxDQUMuaHRtbD8w +NwYJYIZIAYb4QgEIBCoWKGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5 +Q0FDLmh0bWwwbQYDVR0fBGYwZDAuoCygKoYoaHR0cDovL3d3dy5pcHMuZXMvaXBz +MjAwMi9pcHMyMDAyQ0FDLmNybDAyoDCgLoYsaHR0cDovL3d3d2JhY2suaXBzLmVz +L2lwczIwMDIvaXBzMjAwMkNBQy5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUF +BzABhhNodHRwOi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAERyMJ1W +WKJBGyi3leGmGpVfp3hAK+/blkr8THFj2XOVvQLiogbHvpcqk4A0hgP63Ng9HgfN +HnNDJGD1HWHc3JagvPsd4+cSACczAsDAK1M92GsDgaPb1pOVIO/Tln4mkImcJpvN +b2ar7QMiRDjMWb2f2/YHogF/JsRj9SVCXmK9 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVT +MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE +ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE +ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEuMCwGA1UECxMl +SVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMl +SVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3 +DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAwNTkzOFoXDTI1MTIyNzAw +NTkzOFowggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYD +VQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5n +IFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4g +IEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzAN +BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA4FEnpwvdr9G5Q1uCN0VWcu+atsIS7ywS +zHb5BlmvXSHU0lq4oNTzav3KaY1mSPd05u42veiWkXWmcSjK5yISMmmwPh5r9FBS +YmL9Yzt9fuzuOOpi9GyocY3h6YvJP8a1zZRCb92CRTzo3wno7wpVqVZHYUxJZHMQ +KD/Kvwn/xi8CAwEAAaOCBEowggRGMB0GA1UdDgQWBBTrsxl588GlHKzcuh9morKb +adB4CDCCAUQGA1UdIwSCATswggE3gBTrsxl588GlHKzcuh9morKbadB4CKGCARqk +ggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE +BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBT +ZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBC +LTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0EgQ0xBU0UxIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0EgQ0xBU0UxIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYD +VR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggr +BgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB +FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhC +AQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB +D2lwc0BtYWlsLmlwcy5lczBBBglghkgBhvhCAQ0ENBYyQ0xBU0UxIENBIENlcnRp +ZmljYXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC +BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIBBAQtFito +dHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEuY3JsMD8GCWCG +SAGG+EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25D +TEFTRTEuaHRtbD8wPAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93d3cuaXBzLmVzL2lw +czIwMDIvcmVuZXdhbENMQVNFMS5odG1sPzA6BglghkgBhvhCAQgELRYraHR0cDov +L3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFTRTEuaHRtbDBzBgNVHR8EbDBq +MDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEu +Y3JsMDWgM6Axhi9odHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy +Q0xBU0UxLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9v +Y3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQADgYEAK9Dr/drIyllq2tPMMi7JVBuK +Yn4VLenZMdMu9Ccj/1urxUq2ckCuU3T0vAW0xtnIyXf7t/k0f3gA+Nak5FI/LEpj +V4F1Wo7ojPsCwJTGKbqz3Bzosq/SLmJbGqmODszFV0VRFOlOHIilkfSj945RyKm+ +hjM+5i9Ibq9UkE6tsSU= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVT +MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE +ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE +ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEuMCwGA1UECxMl +SVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMl +SVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3 +DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAxMDE0NFoXDTI1MTIyNzAx +MDE0NFowggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYD +VQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5n +IFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4g +IEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzAN +BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAqxf+DrDGaBtT8FK+n/ra+osTBLsBjzLZ +H49NzjaY2uQARIwo2BNEKqRrThckQpzTiKRBgtYj+4vJhuW5qYIF3PHeH+AMmVWY +8jjsbJ0gA8DvqqPGZARRLXgNo9KoOtYkTOmWehisEyMiG3zoMRGzXwmqMHBxRiVr +SXGAK5UBsh8CAwEAAaOCBEowggRGMB0GA1UdDgQWBBS4k/8uy9wsjqLnev42USGj +mFsMNDCCAUQGA1UdIwSCATswggE3gBS4k/8uy9wsjqLnev42USGjmFsMNKGCARqk +ggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE +BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBT +ZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBC +LTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0EgQ0xBU0UzIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0EgQ0xBU0UzIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYD +VR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggr +BgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB +FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhC +AQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB +D2lwc0BtYWlsLmlwcy5lczBBBglghkgBhvhCAQ0ENBYyQ0xBU0UzIENBIENlcnRp +ZmljYXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC +BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIBBAQtFito +dHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMuY3JsMD8GCWCG +SAGG+EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25D +TEFTRTMuaHRtbD8wPAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93d3cuaXBzLmVzL2lw +czIwMDIvcmVuZXdhbENMQVNFMy5odG1sPzA6BglghkgBhvhCAQgELRYraHR0cDov +L3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFTRTMuaHRtbDBzBgNVHR8EbDBq +MDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMu +Y3JsMDWgM6Axhi9odHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy +Q0xBU0UzLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9v +Y3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQADgYEAF2VcmZVDAyevJuXr0LMXI/dD +qsfwfewPxqmurpYPdikc4gYtfibFPPqhwYHOU7BC0ZdXGhd+pFFhxu7pXu8Fuuu9 +D6eSb9ijBmgpjnn1/7/5p6/ksc7C0YBCJwUENPjDfxZ4IwwHJPJGR607VNCv1TGy +r33I6unUVtkOE7LFRVA= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVT +MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE +ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE +ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMm +SVBTIENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT +JklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI +hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjI5MDEwNTMyWhcNMjUxMjI3 +MDEwNTMyWjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ +BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp +bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G +LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMw +gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALsw19zQVL01Tp/FTILq0VA8R5j8 +m2mdd81u4D/u6zJfX5/S0HnllXNEITLgCtud186Nq1KLK3jgm1t99P1tCeWu4Wwd +ByOgF9H5fahGRpEiqLJpxq339fWUoTCUvQDMRH/uxJ7JweaPCjbB/SQ9AaD1e+J8 +eGZDi09Z8pvZ+kmzAgMBAAGjggRTMIIETzAdBgNVHQ4EFgQUZyaW56G/2LUDnf47 +3P7yiuYV3TAwggFGBgNVHSMEggE9MIIBOYAUZyaW56G/2LUDnf473P7yiuYV3TCh +ggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ +BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp +bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G +LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOC +AQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUF +BwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYB +BAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglg +hkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1Ud +EgQTMBGBD2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0VBMSBD +QSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCG +SAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7BglghkgBhvhC +AQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMS5j +cmwwQAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmV2 +b2NhdGlvbkNMQVNFQTEuaHRtbD8wPQYJYIZIAYb4QgEHBDAWLmh0dHA6Ly93d3cu +aXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFQTEuaHRtbD8wOwYJYIZIAYb4QgEI +BC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5Q0xBU0VBMS5odG1s +MHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvaXBz +MjAwMkNMQVNFQTEuY3JsMDagNKAyhjBodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBz +MjAwMi9pcHMyMDAyQ0xBU0VBMS5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUF +BzABhhNodHRwOi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAH66iqyA +AIQVCtWYUQxkxZwCWINmyq0eB81+atqAB98DNEock8RLWCA1NnHtogo1EqWmZaeF +aQoO42Hu6r4okzPV7Oi+xNtff6j5YzHIa5biKcJboOeXNp13XjFr/tOn2yrb25aL +H2betgPAK7N41lUH5Y85UN4HI3LmvSAUS7SG +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVT +MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE +ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE +ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMm +SVBTIENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT +JklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI +hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjI5MDEwNzUwWhcNMjUxMjI3 +MDEwNzUwWjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ +BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp +bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G +LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMw +gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAO6AAPYaZC6tasiDsYun7o/ZttvN +G7uGBiJ2MwwSbUhWYdLcgiViL5/SaTBlA0IjWLxH3GvWdV0XPOH/8lhneaDBgbHU +VqLyjRGZ/fZ98cfEXgIqmuJKtROKAP2Md4bm15T1IHUuDky/dMQ/gT6DtKM4Ninn +6Cr1jIhBqoCm42zvAgMBAAGjggRTMIIETzAdBgNVHQ4EFgQUHp9XUEe2YZM50yz8 +2l09BXW3mQIwggFGBgNVHSMEggE9MIIBOYAUHp9XUEe2YZM50yz82l09BXW3mQKh +ggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ +BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp +bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G +LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOC +AQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUF +BwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYB +BAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglg +hkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1Ud +EgQTMBGBD2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0VBMyBD +QSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCG +SAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7BglghkgBhvhC +AQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMy5j +cmwwQAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmV2 +b2NhdGlvbkNMQVNFQTMuaHRtbD8wPQYJYIZIAYb4QgEHBDAWLmh0dHA6Ly93d3cu +aXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFQTMuaHRtbD8wOwYJYIZIAYb4QgEI +BC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5Q0xBU0VBMy5odG1s +MHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvaXBz +MjAwMkNMQVNFQTMuY3JsMDagNKAyhjBodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBz +MjAwMi9pcHMyMDAyQ0xBU0VBMy5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUF +BzABhhNodHRwOi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAEo9IEca +2on0eisxeewBwMwB9dbB/MjD81ACUZBYKp/nNQlbMAqBACVHr9QPDp5gJqiVp4MI +3y2s6Q73nMify5NF8bpqxmdRSmlPa/59Cy9SKcJQrSRE7SOzSMtEQMEDlQwKeAYS +AfWRMS1Jjbs/RU4s4OjNtckUFQzjB4ObJnXv +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIIODCCB6GgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCAR4xCzAJBgNVBAYTAkVT +MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE +ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE +ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjE0MDIGA1UECxMr +SVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTE0MDIG +A1UEAxMrSVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAxMTAx +OFoXDTI1MTIyNzAxMTAxOFowggEeMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFy +Y2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5l +dCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlw +cy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxNDAyBgNVBAsTK0lQUyBDQSBUaW1lc3Rh +bXBpbmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxNDAyBgNVBAMTK0lQUyBDQSBU +aW1lc3RhbXBpbmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0B +CQEWD2lwc0BtYWlsLmlwcy5lczCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA +vLjuVqWajOY2ycJioGaBjRrVetJznw6EZLqVtJCneK/K/lRhW86yIFcBrkSSQxA4 +Efdo/BdApWgnMjvEp+ZCccWZ73b/K5Uk9UmSGGjKALWkWi9uy9YbLA1UZ2t6KaFY +q6JaANZbuxjC3/YeE1Z2m6Vo4pjOxgOKNNtMg0GmqaMCAwEAAaOCBIAwggR8MB0G +A1UdDgQWBBSL0BBQCYHynQnVDmB4AyKiP8jKZjCCAVAGA1UdIwSCAUcwggFDgBSL +0BBQCYHynQnVDmB4AyKiP8jKZqGCASakggEiMIIBHjELMAkGA1UEBhMCRVMxEjAQ +BgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJ +UFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJp +cHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMTQwMgYDVQQLEytJUFMg +Q0EgVGltZXN0YW1waW5nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MTQwMgYDVQQD +EytJUFMgQ0EgVGltZXN0YW1waW5nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4w +HAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAM +BgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYB +BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIB +FgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYD +VR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlw +cy5lczBHBglghkgBhvhCAQ0EOhY4VGltZXN0YW1waW5nIENBIENlcnRpZmljYXRl +IGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgECBBwWGmh0 +dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMEAGCWCGSAGG+EIBBAQzFjFodHRwOi8v +d3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJUaW1lc3RhbXBpbmcuY3JsMEUGCWCG +SAGG+EIBAwQ4FjZodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25U +aW1lc3RhbXBpbmcuaHRtbD8wQgYJYIZIAYb4QgEHBDUWM2h0dHA6Ly93d3cuaXBz +LmVzL2lwczIwMDIvcmVuZXdhbFRpbWVzdGFtcGluZy5odG1sPzBABglghkgBhvhC +AQgEMxYxaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lUaW1lc3RhbXBp +bmcuaHRtbDB/BgNVHR8EeDB2MDegNaAzhjFodHRwOi8vd3d3Lmlwcy5lcy9pcHMy +MDAyL2lwczIwMDJUaW1lc3RhbXBpbmcuY3JsMDugOaA3hjVodHRwOi8vd3d3YmFj +ay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyVGltZXN0YW1waW5nLmNybDAvBggrBgEF +BQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZI +hvcNAQEFBQADgYEAZbrBzAAalZHK6Ww6vzoeFAh8+4Pua2JR0zORtWB5fgTYXXk3 +6MNbsMRnLWhasl8OCvrNPzpFoeo2zyYepxEoxZSPhExTCMWTs/zif/WN87GphV+I +3pGW7hdbrqXqcGV4LCFkAZXOzkw+UPS2Wctjjba9GNSHSl/c7+lW8AoM6HU= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC @@ -2251,75 +1156,787 @@ mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK SnQ2+Q== -----END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIETzCCAzegAwIBAgIEO63vKTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDEwOTIzMTQxODE3WhcNMTEw -OTIzMTMxODE3WjB1MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v -LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWdu -ZXQgLSBDQSBLbGFzYSAxMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4SRW9Q58g5DY1Hw7h -gCRKBEdPdGn0MFHsfw7rlu/oQm7IChI/uWd9q5wwo77YojtTDjRnpgZsjqBeynX8T90vFILqsY2K -5CF1OESalwvVr3sZiQX79lisuFKat92u6hBFikFIVxfHHB67Af+g7u0dEHdDW7lwy81MwFYxBTRy -9wIDAQABo4IBbTCCAWkwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwggEEBgNVHSAE -gfwwgfkwgfYGDSsGAQQBvj8CAQoBAQAwgeQwgZoGCCsGAQUFBwICMIGNGoGKQ2VydHlmaWthdCB3 -eXN0YXdpb255IHpnb2RuaWUgeiBkb2t1bWVudGVtOiAiUG9saXR5a2EgQ2VydHlmaWthY2ppIGRs -YSBSb290Q0EiLiBDZXJ0eWZpa2F0IHd5c3Rhd2lvbnkgcHJ6ZXogUm9vdENBIHcgaGllcmFyY2hp -aSBDQyBTaWduZXQuMEUGCCsGAQUFBwIBFjlodHRwOi8vd3d3LnNpZ25ldC5wbC9yZXBvenl0b3Jp -dW0vZG9rdW1lbnR5L3BjX3Jvb3RjYS50eHQwHwYDVR0jBBgwFoAUwJvFIw0C4aZOSGsfAOnjmhQb -sa8wHQYDVR0OBBYEFMODHtVZd1T7TftXR/nEI1zR54njMA0GCSqGSIb3DQEBBQUAA4IBAQBRIHQB -FIGh8Jpxt87AgSLwIEEk4+oGy769u3NtoaR0R3WNMdmt7fXTi0tyTQ9V4AIszxVjhnUPaKnF1KYy -f8Tl+YTzk9ZfFkZ3kCdSaILZAOIrmqWNLPmjUQ5/JiMGho0e1YmWUcMci84+pIisTsytFzVP32/W -+sz2H4FQAvOIMmxB7EJX9AdbnXn9EXZ+4nCqi0ft5z96ZqOJJiCB3vSaoYg+wdkcvb6souMJzuc2 -uptXtR1Xf3ihlHaGW+hmnpcwFA6AoNrom6Vgzk6U1ienx0Cw28BhRSKqzKkyXkuK8gRflZUx84uf -tXncwKJrMiE3lvgOOBITRzcahirLer4c ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIE9zCCA9+gAwIBAgIEPL/xoTANBgkqhkiG9w0BAQUFADB2MQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MSAwHgYDVQQDExdDQyBTaWduZXQgLSBQQ0EgS2xhc2EgMjAeFw0wMjA0MTkxMDI5NTNa -Fw0xNzA0MTgxMjUzMDdaMHUxCzAJBgNVBAYTAlBMMR8wHQYDVQQKExZUUCBJbnRlcm5ldCBTcC4g -eiBvLm8uMSQwIgYDVQQLExtDZW50cnVtIENlcnR5ZmlrYWNqaSBTaWduZXQxHzAdBgNVBAMTFkND -IFNpZ25ldCAtIENBIEtsYXNhIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqgLJu -QqY4yavbSgHg8CyfKTx4BokNSDOVz4eD9vptUr11Kqd06ED1hlH7Sg0goBFAfntNU/QTKwSBaNui -me7C4sSEdgsKrPoAhGb4Mq8y7Ty7RqZz7mkzNMqzL2L2U4yQ2QjvpH8MH0IBqOWEcpSkpwnrCDIm -RoTfd+YlZWKi2JceQixUUYIQ45Ox8+x8hHbvvZdgqtcvo8PW27qoHkp/7hMuJ44kDAGrmxffBXl/ -OBRZp0uO1CSLcMcVJzyr2phKhy406MYdWrtNPEluGs0GFDzd0nrIctiWAO4cmct4S72S9Q6e//0G -O9f3/Ca5Kb2I1xYLj/xE+HgjHX9aD2MhAgMBAAGjggGMMIIBiDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjCB4wYDVR0gBIHbMIHYMIHVBg0rBgEEAb4/AhQKAQEAMIHDMHUGCCsGAQUF -BwICMGkaZ0NlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 -eWthIENlcnR5ZmlrYWNqaSBQQ0EyIC0gQ2VydHlmaWthdHkgVXJ6ZWRvdyBLbGFzeSAyIi4wSgYI -KwYBBQUHAgEWPmh0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9kb2t1bWVudHkva2xh -c2EyL3BjX3BjYTIudHh0MD8GA1UdHwQ4MDYwNKAyoDCGLmh0dHA6Ly93d3cuc2lnbmV0LnBsL3Jl -cG96eXRvcml1bS9jcmwvcGNhMi5jcmwwHwYDVR0jBBgwFoAUwGxGyl2CfpYHRonE82AVXO08kMIw -HQYDVR0OBBYEFLtFBlILy4HNKVSzvHxBTM0HDowlMA0GCSqGSIb3DQEBBQUAA4IBAQBWTsCbqXrX -hBBev5v5cIuc6gJM8ww7oR0uMQRZoFSqvQUPWBYM2/TLI/f8UM9hSShUVj3zEsSj/vFHagUVmzuV -Xo5u0WK8iaqATSyEVBhADHrPG6wYcLKJlagge/ILA0m+SieyP2sjYD9MUB9KZIEyBKv0429UuDTw -6P7pslxMWJBSNyQxaLIs0SRKsqZZWkc7ZYAj2apSkBMX2Is1oHA+PwkF6jQMwCao/+CndXPUzfCF -6caa9WwW31W26MlXCvSmJgfiTPwGvm4PkPmOnmWZ3CczzhHl4q7ztHFzshJH3sZWDnrWwBFjzz5e -Pr3WHV1wA7EY6oT4zBx+2gT9XBTB ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEUzCCAzugAwIBAgIEPq+qjzANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQGEwJQTDE3MDUGA1UE -ChMuQ1ppQyBDZW50cmFzdCBTQSB3IGltaWVuaXUgTWluaXN0cmEgR29zcG9kYXJraTEZMBcGA1UE -AxMQQ1ppQyBDZW50cmFzdCBTQTAeFw0wMzA0MzAxMDUwNTVaFw0wODA0MjgxMDUwNTVaMGgxCzAJ -BgNVBAYTAlBMMR8wHQYDVQQKExZUUCBJbnRlcm5ldCBTcC4geiBvLm8uMR8wHQYDVQQDExZDQyBT -aWduZXQgLSBDQSBLbGFzYSAzMRcwFQYDVQQFEw5OdW1lciB3cGlzdTogNDCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBALVdeOM62cPH2NERFxbS5FIp/HSv3fgesdVsTUFxZbGtE+/E0RMl -KZQJHH9emx7vRYubsi4EOLCjYsCOTFvgGRIpZzx7R7T5c0Di5XFkRU4gjBl7aHJoKb5SLzGlWdoX -GsekVtl6keEACrizV2EafqjI8cnBWY7OxQ1ooLQp5AeFjXg+5PT0lO6TUZAubqjFbhVbxSWjqvdj -93RGfyYE76MnNn4c2xWySD07n7uno06TC0IJe6+3WSX1h+76VsIFouWBXOoM7cxxiLjoqdBVu24+ -P8e81SukE7qEvOwDPmk9ZJFtt1nBNg8a1kaixcljrA/43XwOPz6qnJ+cIj/xywECAwEAAaOCAQow -ggEGMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMDMGA1UdIAEB/wQpMCcwJQYEVR0g -ADAdMBsGCCsGAQUFBwIBFg93d3cuY2VudHJhc3QucGwwgY4GA1UdIwSBhjCBg4AU2a7r85Cp1iJN -W0Ca1LR6VG3996ShZaRjMGExCzAJBgNVBAYTAlBMMTcwNQYDVQQKEy5DWmlDIENlbnRyYXN0IFNB -IHcgaW1pZW5pdSBNaW5pc3RyYSBHb3Nwb2RhcmtpMRkwFwYDVQQDExBDWmlDIENlbnRyYXN0IFNB -ggQ9/0sQMB0GA1UdDgQWBBR7Y8wZkHq0zrY7nn1tFSdQ0PlJuTANBgkqhkiG9w0BAQUFAAOCAQEA -ldt/svO5c1MU08FKgrOXCGEbEPbQxhpM0xcd6Iv3dCo6qugEgjEs9Qm5CwUNKMnFsvR27cJWUvZb -MVcvwlwCwclOdwF6u/QRS8bC2HYErhYo9bp9yuxxzuow2A94c5fPqfVrjXy+vDouchAm6+A5Wjzv -J8wxVFDCs+9iGACmyUWr/JGXCYiQIbQkwlkRKHHlan9ymKf1NvIej/3EpeT8fKr6ywxGuhAfqofW -pg3WJY/RCB4lTzD8vZGNwfMFGkWhJkypad3i9w3lGmDVpsHaWtCgGfd0H7tUtWPkP+t7EjIRCD9J -HYnTR+wbbewc5vOI+UobR15ynGfFIaSIiMTVtQ== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy +NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD +cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs +2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY +JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE +Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ +n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A +PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICXDCCAcWgAwIBAgIQCgEBAQAAAnwAAAALAAAAAjANBgkqhkiG9w0BAQUFADA6 +MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp +dHkgMTAyNCBWMzAeFw0wMTAyMjIyMTAxNDlaFw0yNjAyMjIyMDAxNDlaMDoxGTAX +BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAx +MDI0IFYzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDV3f5mCc8kPD6ugU5O +isRpgFtZO9+5TUzKtS3DJy08rwBCbbwoppbPf9dYrIMKo1W1exeQFYRMiu4mmdxY +78c4pqqv0I5CyGLXq6yp+0p9v+r+Ek3d/yYtbzZUaMjShFbuklNhCbM/OZuoyZu9 +zp9+1BlqFikYvtc6adwlWzMaUQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBTEwBykB5T9zU0B1FTapQxf3q4FWjAd +BgNVHQ4EFgQUxMAcpAeU/c1NAdRU2qUMX96uBVowDQYJKoZIhvcNAQEFBQADgYEA +Py1q4yZDlX2Jl2X7deRyHUZXxGFraZ8SmyzVWujAovBDleMf6XbN3Ou8k6BlCsdN +T1+nr6JGFLkM88y9am63nd4lQtBU/55oc2PcJOsiv6hy8l4A4Q1OOkNumU4/iXgD +mMrzVcydro7BqkWY+o8aoI2II/EVQQ2lRj6RP4vr93E= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6 +MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp +dHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAX +BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAy +MDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt49VcdKA3Xtp +eafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7Jylg +/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGl +wSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnh +AMFRD0xS+ARaqn1y07iHKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2 +PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpu +AWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NR +MKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYc +HnmYv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/ +Zb5gEydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+ +f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVO +rSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEkllgVsRch +6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kApKnXwiJPZ9d3 +7CAFYd4= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY +MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t +dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 +WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD +VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 +9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ +DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 +Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N +QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ +xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G +A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG +kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr +Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 +Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU +JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot +RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP +MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAx +MDQwNjEwNDkxM1oXDTIxMDQwNjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNV +BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMSBDQTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H887dF+2rDNbS82rDTG +29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9EJUk +oVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk +3w0LBUXl0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBL +qdReLjVQCfOAl/QMF6452F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIIN +nvmLVz5MxxftLItyM19yejhW1ebZrgUaHXVFsculJRwSVzb9IjcCAwEAAaMzMDEw +DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZTiFIwCwYDVR0PBAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE928Jj2VuX +ZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0H +DjxVyhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VO +TzF2nBBhjrZTOqMRvq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2Uv +kVrCqIexVmiUefkl98HVrhq4uz2PqYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4w +zMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9ZIRlXvVWa +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP +MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx +MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV +BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o +Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt +5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s +3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej +vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu +8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw +DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil +zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ +3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD +FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 +Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 +ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJO +TDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEy +MTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4wHAYDVQQKExVTdGFhdCBkZXIgTmVk +ZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENB +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFtvszn +ExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw71 +9tV2U02PjLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MO +hXeiD+EwR+4A5zN9RGcaC1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+U +tFE5A3+y3qcym7RHjm+0Sq7lr7HcsBthvJly3uSJt3omXdozSVtSnA71iq3DuD3o +BmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn622r+I/q85Ej0ZytqERAh +SQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRVHSAAMDww +OgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMv +cm9vdC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA +7Jbg0zTBLL9s+DANBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k +/rvuFbQvBgwp8qiSpGEN/KtcCFtREytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzm +eafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbwMVcoEoJz6TMvplW0C5GUR5z6 +u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3ynGQI0DvDKcWy +7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR +iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJE +SzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQg +Um9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNV +BAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNVBAsTFFREQyBJbnRl +cm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxLhA +vJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20jxsNu +Zp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a +0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc1 +4izbSysseLlJ28TQx5yc5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGN +eGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcD +R0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUG +A1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIElu +dGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxME +Q1JMMTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3 +WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw +HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJ +KoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4IBAQBO +Q8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540mgwV5dOy0uaOX +wTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ +2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm89 +9qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0 +jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38 +aQNiuJkFBT1reBK9sG9l +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJE +SzEMMAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEw +ODM5MzBaFw0zNzAyMTEwOTA5MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNU +REMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuHnEz9pPPEXyG9VhDr +2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0zY0s +2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItU +GBxIYXvViGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKj +dGqPqcNiKXEx5TukYBdedObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+r +TpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/ +BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB5DCB4TCB3gYIKoFQgSkB +AQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5kay9yZXBv +c2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRl +ciBmcmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEu +MS4xLiBDZXJ0aWZpY2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIg +T0lEIDEuMi4yMDguMTY5LjEuMS4xLjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1Ud +HwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEMMAoGA1UEChMDVERDMRQwEgYD +VQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYmaHR0cDovL2Ny +bC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy +MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZ +J2cdUBVLc647+RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqG +SIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACrom +JkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4A9G28kNBKWKnctj7fAXmMXAnVBhO +inxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYscA+UYyAFMP8uXBV2Y +caaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9AOoB +mbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQ +YqbsFbS1AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9 +BKNDLdr8C2LqL19iUw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD +VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT +ZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFBlcnNvbmFsIEJhc2lj +IENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNpY0B0aGF3dGUuY29tMB4X +DTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgcsxCzAJBgNVBAYTAlpBMRUw +EwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UE +ChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2Vy +dmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBD +QTEoMCYGCSqGSIb3DQEJARYZcGVyc29uYWwtYmFzaWNAdGhhd3RlLmNvbTCBnzAN +BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLyTU23AUE+CFeZIlDWmWr5vQvoPR+53 +dXLdjUmbllegeNTKP1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJl+A1OFdK +wPQIcOk8RHtQfmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7 +G1sY0b8jkyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQF +AAOBgQAt4plrsD16iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7 +c8a914phXAPjLSeoF+CEhULcXpvGt7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95B21P +9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN92NWod8isQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD +VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT +ZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBlcnNvbmFsIEZyZWVt +YWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1mcmVlbWFpbEB0aGF3dGUu +Y29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgdExCzAJBgNVBAYT +AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEa +MBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRp +b24gU2VydmljZXMgRGl2aXNpb24xJDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBG +cmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhh +d3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfY +DFG26nKRsIRefS0Nj3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5E +rHzmj+hND3EfQDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVq +uzgkCGqYx7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zAN +BgkqhkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP +MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgCneSa +/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr5PjRznei +gQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD +VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT +ZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3RlIFBlcnNvbmFsIFByZW1p +dW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXByZW1pdW1AdGhhd3RlLmNv +bTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5NTlaMIHPMQswCQYDVQQGEwJa +QTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRvd24xGjAY +BgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5nMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9u +IFNlcnZpY2VzIERpdmlzaW9uMSMwIQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJl +bWl1bSBDQTEqMCgGCSqGSIb3DQEJARYbcGVyc29uYWwtcHJlbWl1bUB0aGF3dGUu +Y29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJZtn4B0TPuYwu8KHvE0Vs +Bd/eJxZRNkERbGw77f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ8/JE2dWI +Et12TfIa/G8jHnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYD +ZicRFTuqW/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqG +SIb3DQEBBAUAA4GBAGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIH +b4Vnjt4rueIXsDqg8A6iAJrf8xQVbrvIhVqYgPn/vnQdPfP+MCXRNzRn+qVxeTBh +KXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+WjS9Q2wfD6h+rM+D1KzGJ +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy +dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t +MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB +MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG +A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp +b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl +cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv +bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE +VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ +ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR +uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG +9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI +hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM +pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm +MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx +MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 +dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl +cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 +DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD +gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 +yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX +L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj +EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG +7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e +QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ +qdq5snUb9kLy78fyGPmJvKP/iiMucEc= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzAN +BgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAd +BgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcNOTcwMTAxMDAwMDAwWhcN +MjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4g +Q2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsG +A1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1l +c3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANYrWHhhRYZT +6jR7UZztsOYuGA7+4F+oJ9O0yeB8WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQa +Wt9MevPZQx08EHp5JduQ/vBR5zDWQQD9nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL +8vg7ij5FrHGSALSQQZj7X+36ty6K+Ig3AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMB +Af8wDQYJKoZIhvcNAQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCouqoEiYbC +9RAIDb/LogWK0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQ +pgCed/r8zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZ +CayJSdM= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB +kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw +IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG +EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD +VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu +dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6 +E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ +D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK +4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq +lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW +bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB +o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT +MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js +LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr +BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB +AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft +Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj +j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH +KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv +2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3 +mfnGV/TJVTl4uix5yaaIK/QI +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCB +rjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0BgNVBAMTLVVUTi1VU0VSRmlyc3Qt +Q2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05OTA3MDkxNzI4NTBa +Fw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAV +BgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5l +dHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UE +AxMtVVROLVVTRVJGaXJzdC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWls +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3B +YHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIxB8dOtINknS4p1aJkxIW9 +hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8om+rWV6l +L8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLm +SGHGTPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM +1tZUOt4KpLoDd7NlyP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws +6wIDAQABo4G5MIG2MAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNVHR8EUTBPME2gS6BJhkdodHRw +Oi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGllbnRBdXRoZW50 +aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH +AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u +7mFVbwQ+zznexRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0 +xtcgBEXkzYABurorbs6q15L+5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQ +rfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarVNZ1yQAOJujEdxRBoUp7fooXFXAim +eOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZw7JHpsIyYdfHb0gk +USeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB +lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt +SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG +A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe +MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v +d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh +cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn +0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ +M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a +MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd +oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI +DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy +oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0 +dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy +bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF +BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM +//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli +CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE +CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t +3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS +KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCB +ozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3Qt +TmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5WhcNMTkwNzA5MTg1 +NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 +IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYD +VQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VS +Rmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQCz+5Gh5DZVhawGNFugmliy+LUPBXeDrjKxdpJo7CNKyXY/45y2 +N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4CjDUeJT1FxL+78P/m4FoCH +iZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXuOzr0hARe +YFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1 +axwiP8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6g +yN7igEL66S/ozjIEj3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQD +AgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPh +ahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9V +VE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0GCSqGSIb3DQEB +BQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y +IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6Lzs +QCv4AdRWOOTKRIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4 +ZSfP1FMa8Kxun08FDAOBp4QpxFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qM +YEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAqDbUMo2s/rn9X9R+WfN9v3YIwLGUb +QErNaLly7HF27FSOH4UMAWr6pjisH8SE +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUFADCB +lTELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAbBgNVBAMTFFVUTi1VU0VSRmlyc3Qt +T2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4NDAzNlowgZUxCzAJBgNV +BAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxHjAc +BgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3 +dy51c2VydHJ1c3QuY29tMR0wGwYDVQQDExRVVE4tVVNFUkZpcnN0LU9iamVjdDCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicP +HxzfOpuCaDDASmEd8S8O+r5596Uj71VRloTN2+O5bj4x2AogZ8f02b+U60cEPgLO +KqJdhwQJ9jCdGIqXsqoc/EHSoTbL+z2RuufZcDX65OeQw5ujm9M89RKZd7G3CeBo +5hy485RjiGpq/gt2yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vulBe3/IW+ +pKvEHDHd17bR5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehb +kkj7RwvCbNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUC +AwEAAaOBrzCBrDALBgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQU2u1kdBScFDyr3ZmpvVsoTYs8ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDov +L2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmlyc3QtT2JqZWN0LmNybDApBgNV +HSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQwDQYJKoZIhvcN +AQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXFwfNfLEzIR1pp6ujw +NTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T7/yxSPlrJSUtUbYsbUXB +mMiKVl0+7kNOPmsnjtA6S4ULX9Ptaqd1y9Fahy85dRNacrACgZ++8A+EVCBibGnU +4U3GDZlDAQ0Slox4nb9QorFEqmrPF3rPbw/U+CRVX/A0FklmPlBGyWNxODFiuGK5 +81OtbLUrohKqGU8J2l7nk8aOFAj+8DCAGKCGhU3IfdeLA/5u1fedFqySLKAj5ZyR +Uh+U3xeUc8OzwcFxBSAAeL0TUh2oPs0AH8g= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy +NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y +LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ +TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y +TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 +LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW +I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw +nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy +NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY +dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 +WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS +v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v +UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu +IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC +W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8xCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh +c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05 +NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTlaMF8xCzAJBgNVBAYTAlVTMRcwFQYD +VQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMSBQdWJsaWMgUHJp +bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOB +jQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3noaACpEO+jglr0aIguVzqKCbJF0N +H8xlbgyw0FaEGIeaBpsQoXPftFg5a27B9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR +4k5FVmkfeAKA2txHkSm7NsljXMXg1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATAN +BgkqhkiG9w0BAQIFAAOBgQBMP7iLxmjf7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZo +EWx8QszznC7EBz8UsA9P/5CSdvnivErpj82ggAr3xSnxgiJduLHdgSOjeyUVRjB5 +FvjqBUuUfx3CHMjjt/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0ANACY89Fx +lA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYK +VdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSm +Fc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0J +h9ZrbWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul +uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68 +DzFc6PLZ +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4 +nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO +8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjV +ojYJrKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjb +PG7PoBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2 +6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vr +n5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQBfGfMY1a +qtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/Ny9Sn2WCVhDr4 +wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3 +ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrs +pSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4 +E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAyIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZMJaLtVRKXxaeAufqDwSCg+i8VDXyh +YGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvEerf4Zh+AVPy3wo5ZShRXRtGak75BkQO7 +FYCTXOvnzAhsPz6zSvz/S2wj1VCCJkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0G +CSqGSIb3DQEBAgUAA4GBAIobK/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxg +J8pFUs4W7z8GZOeUaHxgMxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Nc +r6Pc5iaAIzy4RHT3Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0Ns +YXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH +MjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y +aXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazAe +Fw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJVUzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGlj +IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx +KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjM +HiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjw +DqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cC +AwEAATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9ji +nb3/7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX +rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnIn +jBJ7xUS0rg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVy +aVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24s +IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNp +Z24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJBgNV +BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNp +Z24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIElu +Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24g +Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt +IEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWU +J92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDO +JxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUY +wZF7C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9o +koqQHgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN +qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/E +Srg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekhktdmnLfe +xbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf0xwLRtxyID+u +7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU +sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RI +sH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTP +cjnhsUPgKM+351psE2tJs//jGHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE +BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is +I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G +CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do +lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc +AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 +pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 +13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk +U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i +F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY +oJ2daZH9 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b +N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t +KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu +kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm +CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ +Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu +imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te +2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe +DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p +F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt +TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDM +HO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtK +qsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwj +cSGIL4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y +cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRP +T8qAkbYp +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1 +GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ ++mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd +U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm +NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY +ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ +ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1 +CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq +g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm +fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c +2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/ +bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr +MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl +cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw +CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h +dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l +cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h +2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E +lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV +ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq +299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t +vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL +dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF +AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR +zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 +LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd +7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw +++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDgDCCAmigAwIBAgICAx4wDQYJKoZIhvcNAQEFBQAwYTELMAkGA1UEBhMCVVMx +DTALBgNVBAoTBFZJU0ExLzAtBgNVBAsTJlZpc2EgSW50ZXJuYXRpb25hbCBTZXJ2 +aWNlIEFzc29jaWF0aW9uMRIwEAYDVQQDEwlHUCBSb290IDIwHhcNMDAwODE2MjI1 +MTAwWhcNMjAwODE1MjM1OTAwWjBhMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklT +QTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRp +b24xEjAQBgNVBAMTCUdQIFJvb3QgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAKkBcLWqxEDwq2omYXkZAPy/mzdZDK9vZBv42pWUJGkzEXDK41Z0ohdX +ZFwgBuHW73G3O/erwWnQSaSxBNf0V2KJXLB1LRckaeNCYOTudNargFbYiCjh+20i +/SN8RnNPflRzHqgsVVh1t0zzWkWlAhr62p3DRcMiXvOL8WAp0sdftAw6UYPvMPjU +58fy+pmjIlC++QU3o63tmsPm7IgbthknGziLgE3sucfFicv8GjLtI/C1AVj59o/g +halMCXI5Etuz9c9OYmTaxhkVOmMd6RdVoUwiPDQyRvhlV7or7zaMavrZ2UT0qt2E +1w0cslSsMoW0ZA3eQbuxNMYBhjJk1Z8CAwEAAaNCMEAwHQYDVR0OBBYEFJ59SzS/ +ca3CBfYDdYDOqU8axCRMMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQAhpXYUVfmtJ3CPPPTVbMjMCqujmAuKBiPFyWHb +mQdpNSYx/scuhMKZYdQN6X0uEyt8joW2hcdLzzW2LEc9zikv2G+fiRxkk78IvXbQ +kIqUs38oW26sTTMs7WXcFsziza6kPWKSBpUmv9+55CCmc2rBvveURNZNbyoLaxhN +dBA2aGpawWqn3TYpjLgwi08hPwAuVDAHOrqK5MOeyti12HvOdUVmB/RtLdh6yumJ +ivIj2C/LbgA2T/vwLwHMD8AiZfSr4k5hLQOCfZEWtTDVFN5ex5D8ofyrEK9ca3Cn +B+8phuiyJccg/ybdd+95RBTEvd07xQObdyPsoOy7Wjm1zK0G +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIETzCCAzegAwIBAgIEO63vKTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQ +TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu +dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBS +b290Q0EwHhcNMDEwOTIzMTQxODE3WhcNMTEwOTIzMTMxODE3WjB1MQswCQYDVQQG +EwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMb +Q2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQg +LSBDQSBLbGFzYSAxMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4SRW9Q58g +5DY1Hw7hgCRKBEdPdGn0MFHsfw7rlu/oQm7IChI/uWd9q5wwo77YojtTDjRnpgZs +jqBeynX8T90vFILqsY2K5CF1OESalwvVr3sZiQX79lisuFKat92u6hBFikFIVxfH +HB67Af+g7u0dEHdDW7lwy81MwFYxBTRy9wIDAQABo4IBbTCCAWkwDwYDVR0TAQH/ +BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwggEEBgNVHSAEgfwwgfkwgfYGDSsGAQQB +vj8CAQoBAQAwgeQwgZoGCCsGAQUFBwICMIGNGoGKQ2VydHlmaWthdCB3eXN0YXdp +b255IHpnb2RuaWUgeiBkb2t1bWVudGVtOiAiUG9saXR5a2EgQ2VydHlmaWthY2pp +IGRsYSBSb290Q0EiLiBDZXJ0eWZpa2F0IHd5c3Rhd2lvbnkgcHJ6ZXogUm9vdENB +IHcgaGllcmFyY2hpaSBDQyBTaWduZXQuMEUGCCsGAQUFBwIBFjlodHRwOi8vd3d3 +LnNpZ25ldC5wbC9yZXBvenl0b3JpdW0vZG9rdW1lbnR5L3BjX3Jvb3RjYS50eHQw +HwYDVR0jBBgwFoAUwJvFIw0C4aZOSGsfAOnjmhQbsa8wHQYDVR0OBBYEFMODHtVZ +d1T7TftXR/nEI1zR54njMA0GCSqGSIb3DQEBBQUAA4IBAQBRIHQBFIGh8Jpxt87A +gSLwIEEk4+oGy769u3NtoaR0R3WNMdmt7fXTi0tyTQ9V4AIszxVjhnUPaKnF1KYy +f8Tl+YTzk9ZfFkZ3kCdSaILZAOIrmqWNLPmjUQ5/JiMGho0e1YmWUcMci84+pIis +TsytFzVP32/W+sz2H4FQAvOIMmxB7EJX9AdbnXn9EXZ+4nCqi0ft5z96ZqOJJiCB +3vSaoYg+wdkcvb6souMJzuc2uptXtR1Xf3ihlHaGW+hmnpcwFA6AoNrom6Vgzk6U +1ienx0Cw28BhRSKqzKkyXkuK8gRflZUx84uftXncwKJrMiE3lvgOOBITRzcahirL +er4c +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIE9zCCA9+gAwIBAgIEPL/xoTANBgkqhkiG9w0BAQUFADB2MQswCQYDVQQGEwJQ +TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu +dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWduZXQgLSBQ +Q0EgS2xhc2EgMjAeFw0wMjA0MTkxMDI5NTNaFw0xNzA0MTgxMjUzMDdaMHUxCzAJ +BgNVBAYTAlBMMR8wHQYDVQQKExZUUCBJbnRlcm5ldCBTcC4geiBvLm8uMSQwIgYD +VQQLExtDZW50cnVtIENlcnR5ZmlrYWNqaSBTaWduZXQxHzAdBgNVBAMTFkNDIFNp +Z25ldCAtIENBIEtsYXNhIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCqgLJuQqY4yavbSgHg8CyfKTx4BokNSDOVz4eD9vptUr11Kqd06ED1hlH7Sg0g +oBFAfntNU/QTKwSBaNuime7C4sSEdgsKrPoAhGb4Mq8y7Ty7RqZz7mkzNMqzL2L2 +U4yQ2QjvpH8MH0IBqOWEcpSkpwnrCDImRoTfd+YlZWKi2JceQixUUYIQ45Ox8+x8 +hHbvvZdgqtcvo8PW27qoHkp/7hMuJ44kDAGrmxffBXl/OBRZp0uO1CSLcMcVJzyr +2phKhy406MYdWrtNPEluGs0GFDzd0nrIctiWAO4cmct4S72S9Q6e//0GO9f3/Ca5 +Kb2I1xYLj/xE+HgjHX9aD2MhAgMBAAGjggGMMIIBiDAPBgNVHRMBAf8EBTADAQH/ +MA4GA1UdDwEB/wQEAwIBBjCB4wYDVR0gBIHbMIHYMIHVBg0rBgEEAb4/AhQKAQEA +MIHDMHUGCCsGAQUFBwICMGkaZ0NlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmll +IHogZG9rdW1lbnRlbTogIlBvbGl0eWthIENlcnR5ZmlrYWNqaSBQQ0EyIC0gQ2Vy +dHlmaWthdHkgVXJ6ZWRvdyBLbGFzeSAyIi4wSgYIKwYBBQUHAgEWPmh0dHA6Ly93 +d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9kb2t1bWVudHkva2xhc2EyL3BjX3Bj +YTIudHh0MD8GA1UdHwQ4MDYwNKAyoDCGLmh0dHA6Ly93d3cuc2lnbmV0LnBsL3Jl +cG96eXRvcml1bS9jcmwvcGNhMi5jcmwwHwYDVR0jBBgwFoAUwGxGyl2CfpYHRonE +82AVXO08kMIwHQYDVR0OBBYEFLtFBlILy4HNKVSzvHxBTM0HDowlMA0GCSqGSIb3 +DQEBBQUAA4IBAQBWTsCbqXrXhBBev5v5cIuc6gJM8ww7oR0uMQRZoFSqvQUPWBYM +2/TLI/f8UM9hSShUVj3zEsSj/vFHagUVmzuVXo5u0WK8iaqATSyEVBhADHrPG6wY +cLKJlagge/ILA0m+SieyP2sjYD9MUB9KZIEyBKv0429UuDTw6P7pslxMWJBSNyQx +aLIs0SRKsqZZWkc7ZYAj2apSkBMX2Is1oHA+PwkF6jQMwCao/+CndXPUzfCF6caa +9WwW31W26MlXCvSmJgfiTPwGvm4PkPmOnmWZ3CczzhHl4q7ztHFzshJH3sZWDnrW +wBFjzz5ePr3WHV1wA7EY6oT4zBx+2gT9XBTB -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEejCCA2KgAwIBAgIEP4vk6TANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQ @@ -2348,200 +1965,116 @@ ngRS506mdQ7vWrtApkh8zhhWp7duCkjcCo1O8JxqYr2qEW1fXmgOISe010v2mmuv hHxPyVwoAU4KkOw0nbXZn53yak0is5+XmAjh0wWue44AssHrjC9nUh3mkLt6eQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIEezCCA2OgAwIBAgIEP4vnLzANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJQ -TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEfMB0GA1UEAxMWQ0Mg -U2lnbmV0IC0gQ0EgS2xhc2EgMzEXMBUGA1UEBRMOTnVtZXIgd3Bpc3U6IDQwHhcN -MDMxMDE0MTIwODAwWhcNMDgwNDI4MTA1MDU1WjB3MQswCQYDVQQGEwJQTDEfMB0G -A1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBD -ZXJ0eWZpa2FjamkgU2lnbmV0MSEwHwYDVQQDExhDQyBTaWduZXQgLSBPQ1NQIEts -YXNhIDMwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM/9GwvARNuCVN+PqZmO -4FqH8vTqhenUyqRkmAVT4YhLu0a9AXeLAYVDu+NTkYzsAUMAfu55rIKHNLlm6WbF -KvLiKKz4p4pbUr+ToPcwl/TDotidloUdBAxDg0SL+PmQqACZDe3seJho2IYf2vDL -/G4TLMbKmNB0mlWFuN0f4fJNAgMBAAGjggGgMIIBnDAOBgNVHQ8BAf8EBAMCB4Aw -EwYDVR0lBAwwCgYIKwYBBQUHAwkwTwYDVR0fBEgwRjBEoEKgQIY+aHR0cDovL3d3 -dy5zaWduZXQucGwva3dhbGlmaWtvd2FuZS9yZXBvenl0b3JpdW0vY3JsL2tsYXNh -My5jcmwwgdgGA1UdIASB0DCBzTCBygYOKwYBBAG+PwKCLAoCAQAwgbcwbAYIKwYB -BQUHAgIwYBpeQ2VydHlmaWthdCB3eWRhbnkgemdvZG5pZSB6IGRva3VtZW50ZW0g -IlBvbGl0eWthIENlcnR5ZmlrYWNqaSAtIENlcnR5ZmlrYXR5IHJlc3BvbmRlcm93 -IE9DU1AiLjBHBggrBgEFBQcCARY7aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5 -dG9yaXVtL2Rva3VtZW50eS9wY19vY3NwXzFfMC5wZGYwHwYDVR0jBBgwFoAUe2PM -GZB6tM62O559bRUnUND5SbkwHQYDVR0OBBYEFG4jnCMvBALRQXtmDn9TyXQ/EKP+ -MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADggEBACXrKG5Def5lpRwmZom3UEDq -bl7y4U3qomG4B+ok2FVZGgPZti+ZgvrenPj7PtbYCUBPsCSTNrznKinoT3gD9lQQ -xkEHwdc6VD1GlFp+qI64u0+wS9Epatrdf7aBnizrOIB4LJd4E2TWQ6trspetjMIU -upyWls1BmYUxB91R7QkTiAUSNZ87s3auhZuG4f0V0JLVCcg2rn7AN1rfMkgxCbHk -GxiQbYWFljl6aatxR3odnnzVUe1I8uoY2JXpmmUcOG4dNGuQYziyKG3mtXCQWvug -5qi9Mf3KUh1oSTKx6HfLjjNl1+wMB5Mdb8LF0XyZLdJM9yIZh7SBRsYm9QiXevY= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFGjCCBAKgAwIBAgIEPL7eEDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDIwNDE4MTQ1NDA4WhcNMjYw -OTIxMTU0MjE5WjB2MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v -LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWdu -ZXQgLSBQQ0EgS2xhc2EgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM7BrBlbN5ma -M5eg0BOTqoZ+9NBDvU8Lm5rTdrMswFTCathzpVVLK/JD4K3+4oCZ9SRAspEXE4gvwb08ASY6w5s+ -HpRkeJw8YzMFR5kDZD5adgnCAy4vDfIXYZgppXPaTQ8wnfUZ7BZ7Zfa7QBemUIcJIzJBB0UqgtxW -Ceol9IekpBRVmuuSA6QG0Jkm+pGDJ05yj2eQG8jTcBENM7sVA8rGRMyFA4skSZ+D0OG6FS2xC1i9 -JyN0ag1yII/LPx8HK5J4W9MaPRNjAEeaa2qI9EpchwrOxnyVbQfSedCG1VRJfAsE/9tT9CMUPZ3x -W20QjQcSZJqVcmGW9gVsXKQOVLsCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P -AQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQEBMIHkMIGaBggrBgEFBQcC -AjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 -eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6 -IFJvb3RDQSB3IGhpZXJhcmNoaWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5z -aWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw -OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Evcm9vdGNhLmNy -bDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNVHQ4EFgQUwGxGyl2CfpYHRonE -82AVXO08kMIwDQYJKoZIhvcNAQEFBQADggEBABp1TAUsa+BeVWg4cjowc8yTJ5XN3GvN96GObMkx -UGY7U9kVrLI71xBgoNVyzXTiMNDBvjh7vdPWjpl5SDiRpnnKiOFXA43HvNWzUaOkTu1mxjJsZsan -ot1Xt6j0ZDC+03FjLHdYMyM9kSWp6afb4980EPYZCcSzgM5TOGfJmNii5Tq468VFKrX+52Aou1G2 -2Ohu+EEOlOrG7ylKv1hHUJJCjwN0ZVEIn1nDbrU9FeGCz8J9ihVUvnENEBbBkU37PWqWuHitKQDV -tcwTwJJdR8cmKq3NmkwAm9fPacidQLpaw0WkuGrS+fEDhu1Nhy9xELP6NA9GRTCNxm/dXlcwnmY= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFGjCCBAKgAwIBAgIEPV0tNDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDIwODE2MTY0OTU2WhcNMjYw -OTIxMTU0MjE5WjB2MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v -LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWdu -ZXQgLSBQQ0EgS2xhc2EgMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALN3LanJtdue -Ne6geWUTFENa+lEuzqELcoqhYB+a/tJcPEkc6TX/bYPzalRRjqs+quMP6KZTU0DixOrV+K7iWaqA -iQ913HX5IBLmKDCrTVW/ZvSDpiBKbxlHfSNuJxAuVT6HdbzK7yAW38ssX+yS2tZYHZ5FhZcfqzPE -OpO94mAKcBUhk6T/ki0evXX/ZvvktwmF3hKattzwtM4JMLurAEl8SInyEYULw5JdlfcBez2Tg6Db -w34hA1A+ckTwhxzecrB8TUe2BnQKOs9vr2cCACpFFcOmPkM0Drtjctr1QHm1tYSqRFRf9VcV5tfC -3P8QqoK4ONjtLPHc9x5NE1uK/FMCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P -AQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQECMIHkMIGaBggrBgEFBQcC -AjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 -eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6 -IFJvb3RDQSB3IGhpZXJhcmNoaWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5z -aWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw -OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Evcm9vdGNhLmNy -bDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNVHQ4EFgQUXvthcPHlH5BgGhlM -ErJNXWlhlgAwDQYJKoZIhvcNAQEFBQADggEBACIce95Mvn710KCAISA0CuHD4aznTU6pLoCDShW4 -7OR+GTpJUm1coTcUqlBHV9mra4VFrBcBuOkHZoBLq/jmE0QJWnpSEULDcH9J3mF0nqO9SM+mWyJG -dsJF/XU/7smummgjMNQXwzQTtWORF+6v5KUbWX85anO2wR+M6YTBWC55zWpWi4RG3vkHFs5Ze2oF -JTlpuxw9ZgxTnWlwI9QR2MvEhYIUMKMOWxw1nt0kKj+5TCNQQGh/VJJ1dsiroGh/io1DOcePEhKz -1Ag52y6Wf0nJJB9yk0sFakqZH18F7eQecQImgZyyeRtsG95leNugB3BXWCW+KxwiBrtQTXv4dTE= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEzzCCA7egAwIBAgIEO6ocGTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDEwOTIwMTY0MjE5WhcNMjYw -OTIxMTU0MjE5WjBxMQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v -LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWdu -ZXQgLSBSb290Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrr2vydnNpELfGW3Ks -ARiDhJvwDtUe4AbWev+OfMc3+vA29nX8ZmIwno3gmItjo5DbUCCRiCMq5c9epcGu+kg4a3BJChVX -REl8gVh0ST15rr3RKrSc4VgsvQzl0ZUraeQLl8JoRT5PLsUj3qwF78jUCQVckiiLVcnGfZtFCm+D -CJXliQBDMB9XFAUEiO/DtEBs0B7wJGx7lgJeJpQUcGiaOPjcJDYOk7rNAYmmD2gWeSlepufO8luU -YG/YDxTC4mqhRqfa4MnVO5dqy+ICj2UvUpHbZDB0KfGRibgBYeQP1kuqgIzJN4UqknVAJb0aMBSP -l+9k2fAUdchx1njlbdcbAgMBAAGjggFtMIIBaTAPBgNVHRMBAf8EBTADAQH/MIIBBAYDVR0gBIH8 -MIH5MIH2Bg0rBgEEAb4/AgEKAQEAMIHkMIGaBggrBgEFBQcCAjCBjRqBikNlcnR5ZmlrYXQgd3lz -dGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0eWthIENlcnR5ZmlrYWNqaSBkbGEg -Um9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6IFJvb3RDQSB3IGhpZXJhcmNoaWkg -Q0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5dG9yaXVt -L2Rva3VtZW50eS9wY19yb290Y2EudHh0MB0GA1UdDgQWBBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAf -BgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcN -AQEFBQADggEBAGnY5QmYqnnO9OqFOWZxxb25UHRnaRF6IV9aaGit5BZufZj2Tq3v8L3SgE34GOoI -cdRMMG5JEpEU4mN/Ef3oY6Eo+7HfqaPHI4KFmbDSPiK5s+wmf+bQSm0Yq5/h4ZOdcAESlLQeLSt1 -CQk2JoKQJ6pyAf6xJBgWEIlm4RXE4J3324PUiOp83kW6MDvaa1xY976WyInr4rwoLgxVl11LZeKW -ha0RJJxJgw/NyWpKG7LWCm1fglF8JH51vZNndGYq1iKtfnrIOvLZq6bzaCiZm1EurD8HE6P7pmAB -KK6o3C2OXlNfNIgwkDN/cDqk5TYsTkrpfriJPdxXBH8hQOkW89g= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID/TCCA2agAwIBAgIEP4/gkTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQgLSBDQSBLbGFzYSAxMB4XDTAzMTAxNzEyMjkwMloX -DTExMDkyMzExMTgxN1owdjELMAkGA1UEBhMCUEwxHzAdBgNVBAoTFlRQIEludGVybmV0IFNwLiB6 -IG8uby4xJDAiBgNVBAsTG0NlbnRydW0gQ2VydHlmaWthY2ppIFNpZ25ldDEgMB4GA1UEAxMXQ0Mg -U2lnbmV0IC0gVFNBIEtsYXNhIDEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOJYrISEtSsd -uHajROh5/n7NGrkpYTT9NEaPe9+ucuQ37KxIbfJwXJjgUc1dw4wCkcQ12FJarD1X6mSQ4cfN/60v -LfKI5ZD4nhJTMKlAj1pX9ScQ/MuyvKStCbn5WTkjPhjRAM0tdwXSnzuTEunfw0Oup559y3Iqxg1c -ExflB6cfAgMBAAGjggGXMIIBkzBBBgNVHR8EOjA4MDagNKAyhjBodHRwOi8vd3d3LnNpZ25ldC5w -bC9yZXBvenl0b3JpdW0vY3JsL2tsYXNhMS5jcmwwDgYDVR0PAQH/BAQDAgeAMBYGA1UdJQEB/wQM -MAoGCCsGAQUFBwMIMIHaBgNVHSAEgdIwgc8wgcwGDSsGAQQBvj8CZAoRAgEwgbowbwYIKwYBBQUH -AgIwYxphQ2VydHlmaWthdCB3eXN0YXdpb255IHpnb2RuaWUgeiBkb2t1bWVudGVtICJQb2xpdHlr -YSBDZXJ0eWZpa2FjamkgQ0MgU2lnbmV0IC0gWm5ha293YW5pZSBjemFzZW0iLjBHBggrBgEFBQcC -ARY7aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY190c2ExXzJf -MS5wZGYwHwYDVR0jBBgwFoAUw4Me1Vl3VPtN+1dH+cQjXNHnieMwHQYDVR0OBBYEFJdDwEqtcavO -Yd9u9tej53vWXwNBMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADgYEAnpiQkqLCJQYXUrqMHUEz -+z3rOqS0XzSFnVVLhkVssvXc8S3FkJIiQTUrkScjI4CToCzujj3EyfNxH6yiLlMbskF8I31JxIeB -vueqV+s+o76CZm3ycu9hb0I4lswuxoT+q5ZzPR8Irrb51rZXlolR+7KtwMg4sFDJZ8RNgOf7tbA= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290 -IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB -IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA -Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO -BgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEi -MCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJ -ARYSc3VwcG9ydEBjYWNlcnQub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC -CgKCAgEAziLA4kZ97DYoB1CW8qAzQIxL8TtmPzHlawI229Z89vGIj053NgVBlfkJ -8BLPRoZzYLdufujAWGSuzbCtRRcMY/pnCujW0r8+55jE8Ez64AO7NV1sId6eINm6 -zWYyN3L69wj1x81YyY7nDl7qPv4coRQKFWyGhFtkZip6qUtTefWIonvuLwphK42y -fk1WpRPs6tqSnqxEQR5YYGUFZvjARL3LlPdCfgv3ZWiYUQXw8wWRBB0bF4LsyFe7 -w2t6iPGwcswlWyCR7BYCEo8y6RcYSNDHBS4CMEK4JZwFaz+qOqfrU0j36NK2B5jc -G8Y0f3/JHIJ6BVgrCFvzOKKrF11myZjXnhCLotLddJr3cQxyYN/Nb5gznZY0dj4k -epKwDpUeb+agRThHqtdB7Uq3EvbXG4OKDy7YCbZZ16oE/9KTfWgu3YtLq1i6L43q -laegw1SJpfvbi1EinbLDvhG+LJGGi5Z4rSDTii8aP8bQUWWHIbEZAWV/RRyH9XzQ -QUxPKZgh/TMfdQwEUfoZd9vUFBzugcMd9Zi3aQaRIt0AUMyBMawSB3s42mhb5ivU -fslfrejrckzzAeVLIL+aplfKkQABi6F1ITe1Yw1nPkZPcCBnzsXWWdsC4PDSy826 -YreQQejdIOQpvGQpQsgi3Hia/0PsmBsJUUtaWsJx8cTLc6nloQsCAwEAAaOCAc4w -ggHKMB0GA1UdDgQWBBQWtTIb1Mfz4OaO873SsDrusjkY0TCBowYDVR0jBIGbMIGY -gBQWtTIb1Mfz4OaO873SsDrusjkY0aF9pHsweTEQMA4GA1UEChMHUm9vdCBDQTEe -MBwGA1UECxMVaHR0cDovL3d3dy5jYWNlcnQub3JnMSIwIAYDVQQDExlDQSBDZXJ0 -IFNpZ25pbmcgQXV0aG9yaXR5MSEwHwYJKoZIhvcNAQkBFhJzdXBwb3J0QGNhY2Vy -dC5vcmeCAQAwDwYDVR0TAQH/BAUwAwEB/zAyBgNVHR8EKzApMCegJaAjhiFodHRw -czovL3d3dy5jYWNlcnQub3JnL3Jldm9rZS5jcmwwMAYJYIZIAYb4QgEEBCMWIWh0 -dHBzOi8vd3d3LmNhY2VydC5vcmcvcmV2b2tlLmNybDA0BglghkgBhvhCAQgEJxYl -aHR0cDovL3d3dy5jYWNlcnQub3JnL2luZGV4LnBocD9pZD0xMDBWBglghkgBhvhC -AQ0ESRZHVG8gZ2V0IHlvdXIgb3duIGNlcnRpZmljYXRlIGZvciBGUkVFIGhlYWQg -b3ZlciB0byBodHRwOi8vd3d3LmNhY2VydC5vcmcwDQYJKoZIhvcNAQEEBQADggIB -ACjH7pyCArpcgBLKNQodgW+JapnM8mgPf6fhjViVPr3yBsOQWqy1YPaZQwGjiHCc -nWKdpIevZ1gNMDY75q1I08t0AoZxPuIrA2jxNGJARjtT6ij0rPtmlVOKTV39O9lg -18p5aTuxZZKmxoGCXJzN600BiqXfEVWqFcofN8CCmHBh22p8lqOOLlQ+TyGpkO/c -gr/c6EWtTZBzCDyUZbAEmXZ/4rzCahWqlwQ3JNgelE5tDlG+1sSPypZt90Pf6DBl -Jzt7u0NDY8RD97LsaMzhGY4i+5jhe1o+ATc7iwiwovOVThrLm82asduycPAtStvY -sONvRUgzEv/+PDIqVPfE94rwiCPCR/5kenHA0R6mY7AHfqQv0wGP3J8rtsYIqQ+T -SCX8Ev2fQtzzxD72V7DX3WnRBnc0CkvSyqD/HMaMyRa+xMwyN2hzXwj7UfdJUzYF -CpUCTPJ5GhD22Dp1nPMd8aINcGeGG7MW9S/lpOt5hvk9C8JzC6WZrG/8Z7jlLwum -GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk -zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW -omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGCDCCA/CgAwIBAgIBATANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290 -IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB -IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA -Y2FjZXJ0Lm9yZzAeFw0wNTEwMTQwNzM2NTVaFw0zMzAzMjgwNzM2NTVaMFQxFDAS -BgNVBAoTC0NBY2VydCBJbmMuMR4wHAYDVQQLExVodHRwOi8vd3d3LkNBY2VydC5v -cmcxHDAaBgNVBAMTE0NBY2VydCBDbGFzcyAzIFJvb3QwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCrSTURSHzSJn5TlM9Dqd0o10Iqi/OHeBlYfA+e2ol9 -4fvrcpANdKGWZKufoCSZc9riVXbHF3v1BKxGuMO+f2SNEGwk82GcwPKQ+lHm9WkB -Y8MPVuJKQs/iRIwlKKjFeQl9RrmK8+nzNCkIReQcn8uUBByBqBSzmGXEQ+xOgo0J -0b2qW42S0OzekMV/CsLj6+YxWl50PpczWejDAz1gM7/30W9HxM3uYoNSbi4ImqTZ -FRiRpoWSR7CuSOtttyHshRpocjWr//AQXcD0lKdq1TuSfkyQBX6TwSyLpI5idBVx -bgtxA+qvFTia1NIFcm+M+SvrWnIl+TlG43IbPgTDZCciECqKT1inA62+tC4T7V2q -SNfVfdQqe1z6RgRQ5MwOQluM7dvyz/yWk+DbETZUYjQ4jwxgmzuXVjit89Jbi6Bb -6k6WuHzX1aCGcEDTkSm3ojyt9Yy7zxqSiuQ0e8DYbF/pCsLDpyCaWt8sXVJcukfV -m+8kKHA4IC/VfynAskEDaJLM4JzMl0tF7zoQCqtwOpiVcK01seqFK6QcgCExqa5g -eoAmSAC4AcCTY1UikTxW56/bOiXzjzFU6iaLgVn5odFTEcV7nQP2dBHgbbEsPyyG -kZlxmqZ3izRg0RS0LKydr4wQ05/EavhvE/xzWfdmQnQeiuP43NJvmJzLR5iVQAX7 -6QIDAQABo4G/MIG8MA8GA1UdEwEB/wQFMAMBAf8wXQYIKwYBBQUHAQEEUTBPMCMG -CCsGAQUFBzABhhdodHRwOi8vb2NzcC5DQWNlcnQub3JnLzAoBggrBgEFBQcwAoYc -aHR0cDovL3d3dy5DQWNlcnQub3JnL2NhLmNydDBKBgNVHSAEQzBBMD8GCCsGAQQB -gZBKMDMwMQYIKwYBBQUHAgEWJWh0dHA6Ly93d3cuQ0FjZXJ0Lm9yZy9pbmRleC5w -aHA/aWQ9MTAwDQYJKoZIhvcNAQEEBQADggIBAH8IiKHaGlBJ2on7oQhy84r3HsQ6 -tHlbIDCxRd7CXdNlafHCXVRUPIVfuXtCkcKZ/RtRm6tGpaEQU55tiKxzbiwzpvD0 -nuB1wT6IRanhZkP+VlrRekF490DaSjrxC1uluxYG5sLnk7mFTZdPsR44Q4Dvmw2M -77inYACHV30eRBzLI++bPJmdr7UpHEV5FpZNJ23xHGzDwlVks7wU4vOkHx4y/CcV -Bc/dLq4+gmF78CEQGPZE6lM5+dzQmiDgxrvgu1pPxJnIB721vaLbLmINQjRBvP+L -ivVRIqqIMADisNS8vmW61QNXeZvo3MhN+FDtkaVSKKKs+zZYPumUK5FQhxvWXtaM -zPcPEAxSTtAWYeXlCmy/F8dyRlecmPVsYGN6b165Ti/Iubm7aoW8mA3t+T6XhDSU -rgCvoeXnkm5OvfPi2RSLXNLrAWygF6UtEOucekq9ve7O/e0iQKtwOIj1CodqwqsF -YMlIBdpTwd5Ed2qz8zw87YC8pjhKKSRf/lk7myV6VmMAZLldpGJ9VzZPrYPvH5JT -oI53V93lYRE9IwCQTDz6o2CTBKOvNfYOao9PSmCnhQVsRqGP9Md246FZV/dxssRu -FFxtbUFm3xuTsdQAw+7Lzzw9IYCpX2Nl/N3gX6T0K/CFcUHUZyX7GrGXrtaZghNB -0m6lG5kngOcLqagA +MIIFGjCCBAKgAwIBAgIEPL7eEDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQ +TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu +dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBS +b290Q0EwHhcNMDIwNDE4MTQ1NDA4WhcNMjYwOTIxMTU0MjE5WjB2MQswCQYDVQQG +EwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMb +Q2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWduZXQg +LSBQQ0EgS2xhc2EgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM7B +rBlbN5maM5eg0BOTqoZ+9NBDvU8Lm5rTdrMswFTCathzpVVLK/JD4K3+4oCZ9SRA +spEXE4gvwb08ASY6w5s+HpRkeJw8YzMFR5kDZD5adgnCAy4vDfIXYZgppXPaTQ8w +nfUZ7BZ7Zfa7QBemUIcJIzJBB0UqgtxWCeol9IekpBRVmuuSA6QG0Jkm+pGDJ05y +j2eQG8jTcBENM7sVA8rGRMyFA4skSZ+D0OG6FS2xC1i9JyN0ag1yII/LPx8HK5J4 +W9MaPRNjAEeaa2qI9EpchwrOxnyVbQfSedCG1VRJfAsE/9tT9CMUPZ3xW20QjQcS +ZJqVcmGW9gVsXKQOVLsCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQEBMIHk +MIGaBggrBgEFBQcCAjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmll +IHogZG9rdW1lbnRlbTogIlBvbGl0eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENB +Ii4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6IFJvb3RDQSB3IGhpZXJhcmNo +aWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5zaWduZXQucGwv +cmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw +OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Ev +cm9vdGNhLmNybDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNV +HQ4EFgQUwGxGyl2CfpYHRonE82AVXO08kMIwDQYJKoZIhvcNAQEFBQADggEBABp1 +TAUsa+BeVWg4cjowc8yTJ5XN3GvN96GObMkxUGY7U9kVrLI71xBgoNVyzXTiMNDB +vjh7vdPWjpl5SDiRpnnKiOFXA43HvNWzUaOkTu1mxjJsZsanot1Xt6j0ZDC+03Fj +LHdYMyM9kSWp6afb4980EPYZCcSzgM5TOGfJmNii5Tq468VFKrX+52Aou1G22Ohu ++EEOlOrG7ylKv1hHUJJCjwN0ZVEIn1nDbrU9FeGCz8J9ihVUvnENEBbBkU37PWqW +uHitKQDVtcwTwJJdR8cmKq3NmkwAm9fPacidQLpaw0WkuGrS+fEDhu1Nhy9xELP6 +NA9GRTCNxm/dXlcwnmY= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFGjCCBAKgAwIBAgIEPV0tNDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQ +TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu +dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBS +b290Q0EwHhcNMDIwODE2MTY0OTU2WhcNMjYwOTIxMTU0MjE5WjB2MQswCQYDVQQG +EwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMb +Q2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWduZXQg +LSBQQ0EgS2xhc2EgMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALN3 +LanJtdueNe6geWUTFENa+lEuzqELcoqhYB+a/tJcPEkc6TX/bYPzalRRjqs+quMP +6KZTU0DixOrV+K7iWaqAiQ913HX5IBLmKDCrTVW/ZvSDpiBKbxlHfSNuJxAuVT6H +dbzK7yAW38ssX+yS2tZYHZ5FhZcfqzPEOpO94mAKcBUhk6T/ki0evXX/ZvvktwmF +3hKattzwtM4JMLurAEl8SInyEYULw5JdlfcBez2Tg6Dbw34hA1A+ckTwhxzecrB8 +TUe2BnQKOs9vr2cCACpFFcOmPkM0Drtjctr1QHm1tYSqRFRf9VcV5tfC3P8QqoK4 +ONjtLPHc9x5NE1uK/FMCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQECMIHk +MIGaBggrBgEFBQcCAjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmll +IHogZG9rdW1lbnRlbTogIlBvbGl0eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENB +Ii4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6IFJvb3RDQSB3IGhpZXJhcmNo +aWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5zaWduZXQucGwv +cmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw +OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Ev +cm9vdGNhLmNybDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNV +HQ4EFgQUXvthcPHlH5BgGhlMErJNXWlhlgAwDQYJKoZIhvcNAQEFBQADggEBACIc +e95Mvn710KCAISA0CuHD4aznTU6pLoCDShW47OR+GTpJUm1coTcUqlBHV9mra4VF +rBcBuOkHZoBLq/jmE0QJWnpSEULDcH9J3mF0nqO9SM+mWyJGdsJF/XU/7smummgj +MNQXwzQTtWORF+6v5KUbWX85anO2wR+M6YTBWC55zWpWi4RG3vkHFs5Ze2oFJTlp +uxw9ZgxTnWlwI9QR2MvEhYIUMKMOWxw1nt0kKj+5TCNQQGh/VJJ1dsiroGh/io1D +OcePEhKz1Ag52y6Wf0nJJB9yk0sFakqZH18F7eQecQImgZyyeRtsG95leNugB3BX +WCW+KxwiBrtQTXv4dTE= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEzzCCA7egAwIBAgIEO6ocGTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQ +TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu +dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBS +b290Q0EwHhcNMDEwOTIwMTY0MjE5WhcNMjYwOTIxMTU0MjE5WjBxMQswCQYDVQQG +EwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMb +Q2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQg +LSBSb290Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrr2vydnNp +ELfGW3KsARiDhJvwDtUe4AbWev+OfMc3+vA29nX8ZmIwno3gmItjo5DbUCCRiCMq +5c9epcGu+kg4a3BJChVXREl8gVh0ST15rr3RKrSc4VgsvQzl0ZUraeQLl8JoRT5P +LsUj3qwF78jUCQVckiiLVcnGfZtFCm+DCJXliQBDMB9XFAUEiO/DtEBs0B7wJGx7 +lgJeJpQUcGiaOPjcJDYOk7rNAYmmD2gWeSlepufO8luUYG/YDxTC4mqhRqfa4MnV +O5dqy+ICj2UvUpHbZDB0KfGRibgBYeQP1kuqgIzJN4UqknVAJb0aMBSPl+9k2fAU +dchx1njlbdcbAgMBAAGjggFtMIIBaTAPBgNVHRMBAf8EBTADAQH/MIIBBAYDVR0g +BIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQEAMIHkMIGaBggrBgEFBQcCAjCBjRqBikNl +cnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 +eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdp +b255IHByemV6IFJvb3RDQSB3IGhpZXJhcmNoaWkgQ0MgU2lnbmV0LjBFBggrBgEF +BQcCARY5aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50 +eS9wY19yb290Y2EudHh0MB0GA1UdDgQWBBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAf +BgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAOBgNVHQ8BAf8EBAMCAQYw +DQYJKoZIhvcNAQEFBQADggEBAGnY5QmYqnnO9OqFOWZxxb25UHRnaRF6IV9aaGit +5BZufZj2Tq3v8L3SgE34GOoIcdRMMG5JEpEU4mN/Ef3oY6Eo+7HfqaPHI4KFmbDS +PiK5s+wmf+bQSm0Yq5/h4ZOdcAESlLQeLSt1CQk2JoKQJ6pyAf6xJBgWEIlm4RXE +4J3324PUiOp83kW6MDvaa1xY976WyInr4rwoLgxVl11LZeKWha0RJJxJgw/NyWpK +G7LWCm1fglF8JH51vZNndGYq1iKtfnrIOvLZq6bzaCiZm1EurD8HE6P7pmABKK6o +3C2OXlNfNIgwkDN/cDqk5TYsTkrpfriJPdxXBH8hQOkW89g= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID/TCCA2agAwIBAgIEP4/gkTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQ +TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu +dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQgLSBD +QSBLbGFzYSAxMB4XDTAzMTAxNzEyMjkwMloXDTExMDkyMzExMTgxN1owdjELMAkG +A1UEBhMCUEwxHzAdBgNVBAoTFlRQIEludGVybmV0IFNwLiB6IG8uby4xJDAiBgNV +BAsTG0NlbnRydW0gQ2VydHlmaWthY2ppIFNpZ25ldDEgMB4GA1UEAxMXQ0MgU2ln +bmV0IC0gVFNBIEtsYXNhIDEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOJY +rISEtSsduHajROh5/n7NGrkpYTT9NEaPe9+ucuQ37KxIbfJwXJjgUc1dw4wCkcQ1 +2FJarD1X6mSQ4cfN/60vLfKI5ZD4nhJTMKlAj1pX9ScQ/MuyvKStCbn5WTkjPhjR +AM0tdwXSnzuTEunfw0Oup559y3Iqxg1cExflB6cfAgMBAAGjggGXMIIBkzBBBgNV +HR8EOjA4MDagNKAyhjBodHRwOi8vd3d3LnNpZ25ldC5wbC9yZXBvenl0b3JpdW0v +Y3JsL2tsYXNhMS5jcmwwDgYDVR0PAQH/BAQDAgeAMBYGA1UdJQEB/wQMMAoGCCsG +AQUFBwMIMIHaBgNVHSAEgdIwgc8wgcwGDSsGAQQBvj8CZAoRAgEwgbowbwYIKwYB +BQUHAgIwYxphQ2VydHlmaWthdCB3eXN0YXdpb255IHpnb2RuaWUgeiBkb2t1bWVu +dGVtICJQb2xpdHlrYSBDZXJ0eWZpa2FjamkgQ0MgU2lnbmV0IC0gWm5ha293YW5p +ZSBjemFzZW0iLjBHBggrBgEFBQcCARY7aHR0cDovL3d3dy5zaWduZXQucGwvcmVw +b3p5dG9yaXVtL2Rva3VtZW50eS9wY190c2ExXzJfMS5wZGYwHwYDVR0jBBgwFoAU +w4Me1Vl3VPtN+1dH+cQjXNHnieMwHQYDVR0OBBYEFJdDwEqtcavOYd9u9tej53vW +XwNBMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADgYEAnpiQkqLCJQYXUrqMHUEz ++z3rOqS0XzSFnVVLhkVssvXc8S3FkJIiQTUrkScjI4CToCzujj3EyfNxH6yiLlMb +skF8I31JxIeBvueqV+s+o76CZm3ycu9hb0I4lswuxoT+q5ZzPR8Irrb51rZXlolR ++7KtwMg4sFDJZ8RNgOf7tbA= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDvjCCA3ygAwIBAgIFJQaThoEwCwYHKoZIzjgEAwUAMIGFMQswCQYDVQQGEwJG @@ -2591,1179 +2124,1087 @@ NjSaTFR+FwNIlQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R 0982gaEbeC9xs/FZTEYYKKuF0mBWWg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUF -ADCBgTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3Rl -cjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0 -ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJH -QjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxm -b3JkMRowGAYDVQQKExFDT01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09N -T0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH+7uIzg3j -Lz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/a -N5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaa -P+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC -8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+DT+nHbrTUcEL -pNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVIrLsm -9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAO -BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g -PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0 -aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5 -t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP -OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYm -uNg4ON8qa90SzMc/RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjs -LjBOlDW0JB9LeGna8gI4zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV -8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38 -NBejxiEovjBFMR7HeL5YYTisO+IBZQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJF -VTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMw -IQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZ -Q2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0z -NzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1l -cmZpcm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cu -Y2hhbWJlcnNpZ24ub3JnMSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJj -ZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVd -GDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlUxFF6tdpg -6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41 -XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxa -UWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUM -I/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyXroDclDZK9D7O -NhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1UdEwEB -/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFt -YmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p -26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQE -AwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3Jn -MCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD -VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8v -Y3BzLmNoYW1iZXJzaWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJ -KoZIhvcNAQEFBQADggEBAAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0n -bJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tG -fToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QU -u/wNUPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZB -zu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+ -S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfutGWaIZDgqtCYvDi1czyL -+Nw= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJF -VTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMw -IQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMX -R2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcw -OTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJm -aXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNo -YW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJv -b3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAwggEIAoIBAQCicKLQn0KuWxfH -2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J1tPfnZda -n5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH -+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvu -sZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8Co -X6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWhz0hQpe/SyBoT -+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/BAgw -BgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJz -aWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w -TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQD -AgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5v -cmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y -ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0 -dHA6Ly9jcHMuY2hhbWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3Qu -aHRtbDANBgkqhkiG9w0BAQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVP -MvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONG -kyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76Svpyk -BMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+ -xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLT -BQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/AYoFWpO+ocH/+OcOZ6RH -SXZddZAa9SaP8A== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEF -BQAwPTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQD -ExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2 -MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZ -BgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxv -c0NXYKwzCkTsA18cgCSR5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi -8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZVg2v7tK8R1fjeUl7NIknJITe -sezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFOYFWe2yMZ -eVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupd -M5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUC -AwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNV -HQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4QgEBBAQDAgEG -MDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29tL0NS -TC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9W -M2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 -yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzO -UrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW -2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW -//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4F -TUcY1Rbpsda2ENW7l7+ijrRU ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUF -ADBbMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUg -VHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBD -QSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNV -BAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8G -A1UECxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjAN -BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5 -WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzIDZBfZIGxqAgNTNj50wUoUrQB -JcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCapCIlF3Po -HuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKB -Xy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvb -UJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEITajV8fTXpLmaRcpPV -MibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3QuY29t -MGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRw -Oi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt -aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJ -KoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99 -Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t -Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8 -smk/f3rPanTK+gQqnExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir4 -2NInPRmJX1p7ijvMDNpRrscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvk -yCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6 -mis= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUF -ADA/MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAV -BgNVBAMTDkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkz -MDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qg -Q28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdA -wRgUi+DoM3ZJKuM/IUmTrE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJ -o6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9UL2AZd+3UWODyOKIYepLYYHs -Umu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRyxXtqqzTW -MIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX -69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/w -Al0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw -HQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqGSIb3DQEBBQUA -A4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikugdB/O -EIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHR -AosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz -R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJW -FBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06Xyx -V3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUF -ADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD -VQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1 -cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAw -WjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD -VQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1 -cmVkIElEIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWx -KISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHyUmHfnyDX -H+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNu -RMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNs -IumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcX -xH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMBAAGjYzBhMA4G -A1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF66Kv -9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd -823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC -dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthn -gYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+ -fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i -8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwz -Zr8TDRRu838fYxAe+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7m -ULKn+gpFL6Lw8g== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUF -ADBhMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD -VQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9i -YWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGEx -CzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsT -EHd3dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBS -b290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLe -qKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOnTjC3U/dDxGkAV53ijSLdhwZA -AIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5BmV/Sl0f -vBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1 -GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3O -FBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSii -cNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAOBgNVHQ8BAf8E -BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm8KPi -GxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJ -KoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV -5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBA -I+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 -UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDA -GySj4dzp30d8tbQkCAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWV -bd4= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUF -ADBsMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD -VQQLExB3d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdo -IEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTEx -MDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IElu -YzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNl -cnQgSGlnaCBBc3N1cmFuY2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAMbM5XPm+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRn -ogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMSOO7zSW1x -kX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9 -vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlK -V9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5 -OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsgEsxBu24LUTi4 -S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8w -HQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+ -w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec -nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehD -LI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VH -MWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK -mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E -1CAx2/S6cCZdkGCevEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN -7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UE -BhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5l -bnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEf -MB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50 -cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIw -MjM0MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQK -Ew1FbnRydXN0LCBJbmMuMTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BT -IGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAy -MDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZm -Lk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypo -wCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9KlmaI5UXLEWe -H25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68j6xS -lkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94Dk -Zfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB -sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAE -JDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSME -GDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH -hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0G -CSqGSIb3DQEBBQUAA4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW -+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ -47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p -8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE -2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDN -tGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/ -WrQ8 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMC -RVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNV -BAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9u -YWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9m -ZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCB -nTELMAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJj -ZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZp -cm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYX -Y2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IB -DwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8 -c9/Qit5Vj1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9Z -pTQsHVQERc1ouKDAA6XPhUJHlShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx -/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf3H5idPayBQC6haD9HThu -y1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8NeTv -tjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMB -AAGjgZ8wgZwwKgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lv -bmFsLmNvbTASBgNVHRMBAf8ECDAGAQH/AgEBMCsGA1UdEAQkMCKADzIwMDEx -MDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1UdDwEB/wQEAwIBBjAd -BgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD -ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/Gz -R0iLjJcG1+p+o1wqu00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvX -wOaD7FnMP97/T2u3Z36mhoEyIwOdyPdfwUpgpZKpsaSgYMN4h7Mi8yrrW6nt -Bas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm7YjHX1BiAuiZ -dBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/g -e9YGVM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJV -UzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg -R2xvYmFsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBE -MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UE -AxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IB -DwAwggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6Csgncbz -YEbYwbLVjDHZ3CB5JIG/NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96x -PqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1kLUCgsBDTOEhGiKEMuzozKmKY -+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFAVvqgx306 -E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdL -Fnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMB -AAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266 -ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUapEBVYIAUJMA4G -A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7srJe -rJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/Ngd -RN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN -A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/q -kZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa -4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF -H4z1Ir+rzoPz4iIprn2DQKi6bA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUF -ADBYMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8G -A1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYT -AlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVz -dCBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHW -AVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9ju -apYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9nceJSOC7 -KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5 -X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7W -inXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s -0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE -AwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZIhvcN -AQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CeP -bJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl -4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aV -Il6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJly -c1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG -1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJV -UzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3Qg -VW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFow -RTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNV -BAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckU -HUWCq8YdgNY96xCcOq9tJPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430 -SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw -8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs7tqqhZJm -r/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD -/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBO -U5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xdVHppCZbW2xHBjXWo -tM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCXteGYO8A3ZNY9 -lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hBZ3Ki -KN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9F -i1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ -nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1Ud -EwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8G -A1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB -hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIaw -C/yOsjmPRFWrZIRcaanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv -9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7 -/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDV -nVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG -8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxr -u18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2Hr -rDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKWkoRepqO1pD4r2czYG0eq -8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslKxfMnZmaG -rGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9 -fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6 -ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJV -UzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3Qg -VW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAw -WjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4G -A1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6Gq -dHtXr0om/Nj1XqduGdt0DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQw -Ax5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC -5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8QJqVJwy7X -QYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw7 -6L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC -9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IEr -KIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73y/Zl92zxlfgC -OzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAnZqzw -cEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgf -ksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 -Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAP -BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQ -KzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E -BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7 -WJtAJDday6sWSf+zdXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4s -NcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjg -AA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo -4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEn -cKpqA1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2R -LrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8 -mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m1wk8OhwRDqZsN/etRIcs -KMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7dFGdTbHFc -JoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9 -VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSL -akhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEg -MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkds -b2JhbFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAw -WhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3Qg -Q0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs -U2lnbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8o -mUVCxKs+IVSbC9N/hHD6ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe -+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1 -AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjNS7SgfQx5 -TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo -4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99y -qWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IHV2ccHsBqBt5Z -tJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9iYWxz -aWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0 -mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs -J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4 -h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRD -LenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 -9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmg -QWpzU/qlULRuJQ/7TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq -/H5COEBkEveegeGTLg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJV -UzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQL -EyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X -DTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMx -ITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMo -R28gRGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAw -DQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d -/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9 -S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32qRe3H3I2 -TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVl -OARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFA -pMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44 -dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLEsNKR1EwRcbNh -yz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2oatTj -oWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdy -b3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEF -BQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYX -MP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt -I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheab -IZ0KbIIOqPjCDPoQHmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzr -Tia2cyvk0/ZM/iZx4mERdEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBD -pqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/bvZ8= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMC -SFUxETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96 -YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9r -MTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZh -bnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQsw -CQYDVQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExv -Y2sgSGFsb3phdGJpenRvbnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZh -bnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sgVXpsZXRpIChDbGFzcyBCKSBU -YW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCx -6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp -2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5 -sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4IC -nzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8EBAMCAAYwEQYJ -YIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZRUxF -TSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3Mg -U3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh -bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5l -dExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGku -IEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg -YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBl -bGphcmFzIGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIElu -dGVybmV0IGhvbmxhcGphbiBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2Rv -Y3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5u -ZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQg -dGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhl -IE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2Nr -Lm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0G -CSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM43WIEJes -sDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w -2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgB -azMpUIaD8QFI ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMC -SFUxETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96 -YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9r -MTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0 -dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsx -CzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0 -TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0 -dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9jayBFeHByZXNzeiAoQ2xhc3Mg -QykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC -gYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qd -QPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64 -gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEA -AaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0PAQH/BAQDAgAG -MBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJNRklH -WUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxh -bm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz -b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQg -YSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2 -ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0 -ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4g -QXogZWxqYXJhcyBsZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0 -LiBJbnRlcm5ldCBob25sYXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5l -dC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxv -Y2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2Ug -YW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRv -IHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0 -bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQgY3BzQG5ldGxvY2submV0 -LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2xJZIwVzN -mtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5N -NwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeA -yNDYpQcCNJgEjTME1A== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYT -AkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUG -A1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQL -ExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5 -em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0 -N1oXDTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdI -dW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBI -YWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtp -YWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFzcyBBKSBU -YW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAvHSMD7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbb -O51qTGL3cfNk1mE7PetzozfZz+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QV -Or/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC/tmwqcm8WgD/qaiYdPv2 -LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7tqyF -/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCub -MvJIH5+hCoR64sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCC -ApswDgYDVR0PAQH/BAQDAgAGMBIGA1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZI -AYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZRUxFTSEg -RXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv -bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFw -amFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv -Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEg -ZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXog -ZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGph -cmFzIGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVy -bmV0IGhvbmxhcGphbiBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3Mg -Y2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQg -ZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl -IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5l -dExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5l -dC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqG -SIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5ayZrU3/b39/zcT0mwBQO -xmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjPytoU -MaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJ -MSEN1rUQQeJBCWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+u -xdAu6tYPVuxkf1qbFFgBJ34TUMdrKuZoPL9coAob4Q566eKAw+np9v1sEZ7Q -5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM8CgHrTwXZoi1/baI ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMC -SFUxETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96 -YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9r -MUIwQAYDVQQDEzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVneXpvaSAoQ2xh -c3MgUUEpIFRhbnVzaXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9A -bmV0bG9jay5odTAeFw0wMzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJ -MQswCQYDVQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5l -dExvY2sgSGFsb3phdGJpenRvbnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNp -dHZhbnlraWFkb2sxQjBABgNVBAMTOU5ldExvY2sgTWlub3NpdGV0dCBLb3pq -ZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZhbnlraWFkbzEeMBwGCSqGSIb3 -DQEJARYPaW5mb0BuZXRsb2NrLmh1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAx1Ilstg91IRVCacbvWy5FPSKAtt2/GoqeKvld/Bu4IwjZ9ul -ZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e8ia6AFQer7C8HORSjKAy -r7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO53Lhbm+1b -OdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWdvLrq -OU+L73Sa58XQ0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0l -mT+1fMptsK6ZmfoIYOcZwvK9UdPM0wKswREMgM6r3JSda6M5UzrWhQIDAMV9 -o4ICwDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8EBAMCAQYw -ggJ1BglghkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2 -YW55IGEgTmV0TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBT -emFiYWx5emF0YWJhbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0 -LiBBIG1pbm9zaXRldHQgZWxla3Ryb25pa3VzIGFsYWlyYXMgam9naGF0YXMg -ZXJ2ZW55ZXN1bGVzZW5laywgdmFsYW1pbnQgZWxmb2dhZGFzYW5hayBmZWx0 -ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6b2xnYWx0YXRhc2kgU3phYmFseXphdGJh -biwgYXogQWx0YWxhbm9zIFN6ZXJ6b2Rlc2kgRmVsdGV0ZWxla2JlbiBlbG9p -cnQgZWxsZW5vcnplc2kgZWxqYXJhcyBtZWd0ZXRlbGUuIEEgZG9rdW1lbnR1 -bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczovL3d3dy5uZXRsb2NrLmh1L2Rv -Y3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0BuZXRsb2NrLm5ldCBl -LW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVz -ZSBvZiB0aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRoZSBOZXRM -b2NrIFF1YWxpZmllZCBDUFMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3Lm5l -dGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0IGluZm9AbmV0bG9jay5u -ZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3DQEB -BQUAA4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufA -QTPGtpvQMznNwNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68 -d4bDBsxafEp+NFAwLvt/MpqNPfMgW/hqyobzMUwsWYACff44yTB1HLdV47yf -uqhthCgFdbOLDcCRVCHnpgu0mfVRQdzNo0ci2ccBgcTcR08m6h/t280NmPSj -nLRzMkqWmf68f8glWPhY83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR -5qq5aKrN9p2QdRLqOBrKROi3macqaJVmlaut74nLYKkGEsaUR+ko ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMC -Qk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1Zh -ZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNa -MEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRsw -GQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4Gt -Mh6QRr+jhiYaHv5+HBg6XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst -/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yklvc/ulsrHHo1wtZn/qtmUItt -KGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbBlDePSHFj -IuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRc -AitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJl -cZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2 -BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIizPtGo/KPaHbDR -sSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOhD7os -FRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR -7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI -yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8G -A1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwz -JQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU -a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0 -ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcN -AQEFBQADggIBAD4KFk2fBluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJ -RqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQty -U/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgt -JodmVjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUs -fU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1 -O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozchLsib9D45MY56QSIPMO6 -61V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1WVaj+ahJ -efivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1 -B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6y -hhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOT -HcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp ++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +ZQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn +MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL +ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg +b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa +MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB +ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw +IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B +AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb +unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d +BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq +7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3 +0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX +roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG +A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j +aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p +26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA +BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud +EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN +BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz +aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB +AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd +p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi +1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc +XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0 +eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu +tGWaIZDgqtCYvDi1czyL+Nw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn +MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL +ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo +YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9 +MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy +NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G +A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA +A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0 +Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s +QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV +eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795 +B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh +z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T +AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i +ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w +TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH +MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD +VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE +VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh +bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B +AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM +bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi +ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG +VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c +ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/ +AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw +PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz +cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 +MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz +IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ +ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR +VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL +kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd +EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas +H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 +HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud +DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 +QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu +Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ +AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 +yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR +FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA +ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB +kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx +ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w +MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD +VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx +FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu +ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7 +gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH +fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a +ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT +ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF +MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk +c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto +dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt +aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI +hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk +QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/ +h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq +nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR +rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2 +9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ +MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT +DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow +PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD +Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O +rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq +OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b +xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw +7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD +aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG +SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 +ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr +AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz +R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 +JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo +Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw +NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw +NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy +ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV +BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo +Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 +4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 +KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI +rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi +94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB +sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi +gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo +kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE +vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t +O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua +AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP +9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ +eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m +0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMx +IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1 +dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w +HhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTELMAkGA1UEBhMCRVMx +IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1 +dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5u +Cp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5Vj1H5WuretXDE7aTt/6MNbg9kUDGvASdY +rv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJHlShbz++AbOCQl4oBPB3z +hxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf3H5idPay +BQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcL +iam8NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcb +AgMBAAGjgZ8wgZwwKgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lv +bmFsLmNvbTASBgNVHRMBAf8ECDAGAQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0 +MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E +FgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQADggEBAEdz/o0n +VPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq +u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36m +hoEyIwOdyPdfwUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzfl +ZKG+TQyTmAyX9odtsz/ny4Cm7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBp +QWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YGVM+h4k0460tQtcsm9MracEpqoeJ5 +quGnM/b9Sh/22WA= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs +IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg +R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A +PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8 +Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL +TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL +5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7 +S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe +2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap +EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td +EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv +/NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN +A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0 +abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF +I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz +4iIprn2DQKi6bA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY +MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo +R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx +MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 +AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA +ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 +7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W +kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI +mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ +KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 +6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl +4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K +oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj +UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU +AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy +c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 +IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV +VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 +cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT +QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh +F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v +c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w +mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd +VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX +teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ +f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe +Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ +nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB +/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY +MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG +9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX +IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn +ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z +uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN +Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja +QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW +koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 +ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt +DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm +bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy +c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD +VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 +c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 +WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG +FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq +XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL +se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb +KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd +IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 +y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt +hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc +QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 +Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV +HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ +KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ +L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr +Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo +ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY +T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz +GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m +1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV +OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH +6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX +QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 +MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL +v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 +eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq +tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd +C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa +zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB +mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH +V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n +bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG +3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs +J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO +291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS +ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd +AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD +EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05 +OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G +A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh +Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l +dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG +SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK +gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX +iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc +Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E +BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G +SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu +b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh +bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv +Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln +aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0 +IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh +c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph +biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo +ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP +UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj +YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo +dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA +bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06 +sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa +n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS +NitjrFgBazMpUIaD8QFI +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD +EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X +DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw +DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u +c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr +TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN +BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA +OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC +2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW +RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P +AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW +ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0 +YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz +b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO +ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB +IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs +b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs +ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s +YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg +a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g +SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0 +aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg +YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg +Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY +ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g +pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4 +Fp1hBWeAyNDYpQcCNJgEjTME1A== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhV +MRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMe +TmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0 +dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFzcyBB +KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oXDTE5MDIxOTIzMTQ0 +N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhC +dWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQu +MRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBL +b3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSMD7tM9DceqQWC2ObhbHDqeLVu0ThEDaiD +zl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZz+qMkjvN9wfcZnSX9EUi +3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC/tmwqcm8 +WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LY +Oph7tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2Esi +NCubMvJIH5+hCoR64sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCC +ApswDgYDVR0PAQH/BAQDAgAGMBIGA1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4 +QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZRUxFTSEgRXplbiB0 +YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRhdGFz +aSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu +IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtm +ZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMg +ZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVs +amFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJhc2EgbWVndGFsYWxoYXRv +IGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBzOi8vd3d3 +Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6 +ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1 +YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3Qg +dG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRs +b2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0G +CSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5ayZrU3/b39/zcT0mwBQO +xmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjPytoUMaFP +0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQ +QeJBCWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxk +f1qbFFgBJ34TUMdrKuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK +8CtmdWOMovsEPoMOmzbwGOQmIMOM8CgHrTwXZoi1/baI +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQD +EzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVneXpvaSAoQ2xhc3MgUUEpIFRhbnVz +aXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0bG9jay5odTAeFw0w +MzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTERMA8G +A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh +Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5l +dExvY2sgTWlub3NpdGV0dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZh +bnlraWFkbzEeMBwGCSqGSIb3DQEJARYPaW5mb0BuZXRsb2NrLmh1MIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRVCacbvWy5FPSKAtt2/Goq +eKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e8ia6AFQe +r7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO5 +3Lhbm+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWd +vLrqOU+L73Sa58XQ0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0l +mT+1fMptsK6ZmfoIYOcZwvK9UdPM0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4IC +wDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8EBAMCAQYwggJ1Bglg +hkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2YW55IGEgTmV0 +TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh +biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQg +ZWxla3Ryb25pa3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywg +dmFsYW1pbnQgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6 +b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwgYXogQWx0YWxhbm9zIFN6ZXJ6b2Rl +c2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kgZWxqYXJhcyBtZWd0 +ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczovL3d3 +dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0Bu +ZXRsb2NrLm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBh +bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRo +ZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3 +Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0IGluZm9AbmV0bG9jay5u +ZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3DQEBBQUA +A4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQ +MznNwNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+ +NFAwLvt/MpqNPfMgW/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCR +VCHnpgu0mfVRQdzNo0ci2ccBgcTcR08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY +83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR5qq5aKrN9p2QdRLqOBrKROi3 +macqaJVmlaut74nLYKkGEsaUR+ko +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa +GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg +Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J +WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB +rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp ++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 +ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i +Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz +PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og +/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH +oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI +yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud +EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 +A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL +MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f +BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn +g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl +fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K +WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha +B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc +hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR +TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD +mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z +ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y +4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza 8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMC -Qk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1Zh -ZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRa -MEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRsw -GQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTP -krgEQK0CSzGrvI2RaNggDhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9 -cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOijKTVopAFPD6QuN+8bv+OPEKhy -q1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79KDDRMpsMh -vVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRl -lDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+ -pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJ -k8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjcT5EOE7zelaTf -i5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEXMJPp -Govgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6ts -gLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A -4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEw -DwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMw -gcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj -YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJv -b3QgQ0EgMyBDZXJ0aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFBy -YWN0aWNlIFN0YXRlbWVudC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVv -dmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLA -E+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1 -XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMg -TGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkq -hkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM07ucp2sNbtrCD2dDQ4iH7 -82CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+shvzuXYO8 -BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM -3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hR -OJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54C -rnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x -DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPs -MZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmi -oHfRMJ6szHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRe -cCocIdiP4b0jWy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEo -kt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ -ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUF -ADBIMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9y -YXRpb24xFzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzEx -OFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1Nl -Y3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBD -QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7C -T8rU4niVWJxB4Q2ZQCQXOZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/je -p4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9tDWccV9cGrcrI9f4Or2YlSASW -C12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uHGFaAJsTQ -3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobv -omuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcW -NFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIE -Bh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYjaHR0 -cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUB -BAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 -6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s -7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cp -rp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ -nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZG -BlSm8jIKYyYwa5vR3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShL -HZ4swrhovO0C7jE= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUF -ADBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9y -YXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0 -MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMX -U2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9i -YWwgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxV -aQZx5RNoJLNP2MwhR/jxYDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7H -fAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQbqR8JNGuQsiWUGMu4P51/pin -X0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g8NEXLJXr -9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz -+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvU -d+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGC -NxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYD -VR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAnoCWG -I2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQB -gjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L -URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X -+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895 -P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 -3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNsp -nWzFacxHVaIw98xcf8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJP -Ix/abKwfROHdI3hRW8cW ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJV -UzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG -A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQG -EwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEy -MDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRo -b3JpdHkwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGm -BIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1 -KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZJRRU6ybH -838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4Q -yDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmC -uDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W -93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0GA1UdDgQWBBS/ -X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0fhvRb -Vazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJm -aWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD -bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMB -Af8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1ep -oXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM -PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L -7ShZ3U0WixeDyLJlxy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMt -lb71cZBDzI0fmgAKhynpVSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl9 -0TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/ -D5fs4C8fF5Q= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJ -TDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERp -Z2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20g -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYw -OTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20g -THRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2ln -bmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDBiNsJvGxGfHif -lXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1yo4UcodM9 -tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1 -YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srh -JosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d -5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNiHzvEvqBTViVs -UQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z6+hs -TXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2Oq -qGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ -Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3v -wmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOz -EmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT -37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMC -Aa4wHQYDVR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFsw -LKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3Js -MCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3Js -MIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYB -BQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUG -CCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRp -YXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3RhcnQgQ29tbWVyY2lhbCAo -U3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5LCByZWFk -IHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0 -Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUg -YXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZI -AYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT -TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEA -FmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArex -mvclmAk8jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPle -WKYK34wGmkUWFjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8 -rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNm -ezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 -fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZ -tWgo+2EuvoSoOMCZEoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0 -yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+PwqyvqCUqDvr0tVk+vBtfAii6w0TiYi -BKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl1njFmUNj403g -dy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/ -7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/Fl -UQqmMGqz9IgcgA38corog14= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFFjCCBH+gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBsDELMAkGA1UEBhMC -SUwxDzANBgNVBAgTBklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoT -DVN0YXJ0Q29tIEx0ZC4xGjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkw -JwYDVQQDEyBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8G -CSqGSIb3DQEJARYSYWRtaW5Ac3RhcnRjb20ub3JnMB4XDTA1MDMxNzE3Mzc0 -OFoXDTM1MDMxMDE3Mzc0OFowgbAxCzAJBgNVBAYTAklMMQ8wDQYDVQQIEwZJ -c3JhZWwxDjAMBgNVBAcTBUVpbGF0MRYwFAYDVQQKEw1TdGFydENvbSBMdGQu -MRowGAYDVQQLExFDQSBBdXRob3JpdHkgRGVwLjEpMCcGA1UEAxMgRnJlZSBT -U0wgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEmFk -bWluQHN0YXJ0Y29tLm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA -7YRgACOeyEpRKSfeOqE5tWmrCbIvNP1h3D3TsM+x18LEwrHkllbEvqoUDufM -OlDIOmKdw6OsWXuO7lUaHEe+o5c5s7XvIywI6Nivcy+5yYPo7QAPyHWlLzRM -GOh2iCNJitu27Wjaw7ViKUylS7eYtAkUEKD4/mJ2IhULpNYILzUCAwEAAaOC -AjwwggI4MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgHmMB0GA1UdDgQW -BBQcicOWzL3+MtUNjIExtpidjShkjTCB3QYDVR0jBIHVMIHSgBQcicOWzL3+ -MtUNjIExtpidjShkjaGBtqSBszCBsDELMAkGA1UEBhMCSUwxDzANBgNVBAgT -BklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0 -ZC4xGjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBGcmVl -IFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYS -YWRtaW5Ac3RhcnRjb20ub3JnggEAMB0GA1UdEQQWMBSBEmFkbWluQHN0YXJ0 -Y29tLm9yZzAdBgNVHRIEFjAUgRJhZG1pbkBzdGFydGNvbS5vcmcwEQYJYIZI -AYb4QgEBBAQDAgAHMC8GCWCGSAGG+EIBDQQiFiBGcmVlIFNTTCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eTAyBglghkgBhvhCAQQEJRYjaHR0cDovL2NlcnQu -c3RhcnRjb20ub3JnL2NhLWNybC5jcmwwKAYJYIZIAYb4QgECBBsWGWh0dHA6 -Ly9jZXJ0LnN0YXJ0Y29tLm9yZy8wOQYJYIZIAYb4QgEIBCwWKmh0dHA6Ly9j -ZXJ0LnN0YXJ0Y29tLm9yZy9pbmRleC5waHA/YXBwPTExMTANBgkqhkiG9w0B -AQQFAAOBgQBscSXhnjSRIe/bbL0BCFaPiNhBOlP1ct8nV0t2hPdopP7rPwl+ -KLhX6h/BquL/lp9JmeaylXOWxkjHXo0Hclb4g4+fd68p00UOpO6wNnQt8M2Y -I3s3S9r+UZjEHjQ8iP2ZO1CnwYszx8JSFhKVU2Ui77qLzmLbcCOxgN8aIDjn -fg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJ -BgNVBAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3 -aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1 -MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFH -MR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG -9w0BAQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJC -Eyq8ZVeCQD5XJM1QiyUqt2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9 -lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5CjCA12UNNhPqE21Is8w4ndwtr -vxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpgvd21mWRT -uKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbL -tK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpK -xVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdV -xVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02yMszYF9rNt85m -ndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkOpeUD -DniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59 -je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM -gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOB -rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64 -OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEF -BQcCARYgaHR0cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZI -hvcNAQEFBQADggIBACe645R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhW -fvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g -7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8 -AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS -2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5 -JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a77KwPJ+HbBIrZXAVUjEa -JM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJkvC24JdVU -orgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7X -dVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG -2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEB -nunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM +V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB +4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr +H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd +8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv +vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT +mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe +btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc +T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt +WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ +c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A +4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD +VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG +CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 +aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw +czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G +A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg +Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 +7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem +d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd ++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B +4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN +t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x +DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 +k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s +zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j +Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT +mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK +4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz +MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv +cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz +Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO +0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao +wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj +7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS +8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT +BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg +JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 +6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ +3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm +D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS +CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx +MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg +Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ +iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa +/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ +jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI +HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 +sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w +gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw +KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG +AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L +URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO +H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm +I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY +iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl +MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp +U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw +NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE +ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp +ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 +DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf +8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN ++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 +X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa +K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA +1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G +A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR +zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 +YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD +bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w +DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 +L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D +eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp +VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY +WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg +Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9 +MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi +U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh +cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk +pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf +OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C +Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT +Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi +HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM +Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w ++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ +Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 +Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B +26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID +AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE +FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j +ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js +LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM +BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0 +Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy +dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh +cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh +YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg +dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp +bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ +YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT +TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ +9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8 +jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW +FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz +ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1 +ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L +EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu +L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq +yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC +O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V +um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh +NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFFjCCBH+gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBsDELMAkGA1UEBhMCSUwx +DzANBgNVBAgTBklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0 +Q29tIEx0ZC4xGjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBG +cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYS +YWRtaW5Ac3RhcnRjb20ub3JnMB4XDTA1MDMxNzE3Mzc0OFoXDTM1MDMxMDE3Mzc0 +OFowgbAxCzAJBgNVBAYTAklMMQ8wDQYDVQQIEwZJc3JhZWwxDjAMBgNVBAcTBUVp +bGF0MRYwFAYDVQQKEw1TdGFydENvbSBMdGQuMRowGAYDVQQLExFDQSBBdXRob3Jp +dHkgRGVwLjEpMCcGA1UEAxMgRnJlZSBTU0wgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkxITAfBgkqhkiG9w0BCQEWEmFkbWluQHN0YXJ0Y29tLm9yZzCBnzANBgkqhkiG +9w0BAQEFAAOBjQAwgYkCgYEA7YRgACOeyEpRKSfeOqE5tWmrCbIvNP1h3D3TsM+x +18LEwrHkllbEvqoUDufMOlDIOmKdw6OsWXuO7lUaHEe+o5c5s7XvIywI6Nivcy+5 +yYPo7QAPyHWlLzRMGOh2iCNJitu27Wjaw7ViKUylS7eYtAkUEKD4/mJ2IhULpNYI +LzUCAwEAAaOCAjwwggI4MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgHmMB0G +A1UdDgQWBBQcicOWzL3+MtUNjIExtpidjShkjTCB3QYDVR0jBIHVMIHSgBQcicOW +zL3+MtUNjIExtpidjShkjaGBtqSBszCBsDELMAkGA1UEBhMCSUwxDzANBgNVBAgT +BklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4x +GjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBGcmVlIFNTTCBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYSYWRtaW5Ac3Rh +cnRjb20ub3JnggEAMB0GA1UdEQQWMBSBEmFkbWluQHN0YXJ0Y29tLm9yZzAdBgNV +HRIEFjAUgRJhZG1pbkBzdGFydGNvbS5vcmcwEQYJYIZIAYb4QgEBBAQDAgAHMC8G +CWCGSAGG+EIBDQQiFiBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAy +BglghkgBhvhCAQQEJRYjaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL2NhLWNybC5j +cmwwKAYJYIZIAYb4QgECBBsWGWh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy8wOQYJ +YIZIAYb4QgEIBCwWKmh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9pbmRleC5waHA/ +YXBwPTExMTANBgkqhkiG9w0BAQQFAAOBgQBscSXhnjSRIe/bbL0BCFaPiNhBOlP1 +ct8nV0t2hPdopP7rPwl+KLhX6h/BquL/lp9JmeaylXOWxkjHXo0Hclb4g4+fd68p +00UOpO6wNnQt8M2YI3s3S9r+UZjEHjQ8iP2ZO1CnwYszx8JSFhKVU2Ui77qLzmLb +cCOxgN8aIDjnfg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV +BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln +biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF +MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT +d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 +76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ +bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c +6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE +emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd +MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt +MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y +MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y +FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi +aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM +gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB +qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 +lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn +8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov +L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 +45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO +UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 +O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC +bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv +GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a +77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC +hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 +92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp +Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w +ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkG -A1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dp -c3NTaWduIFBsYXRpbnVtIENBIC0gRzIwHhcNMDYxMDI1MDgzNjAwWhcNMzYx -MDI1MDgzNjAwWjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWdu -IEFHMSMwIQYDVQQDExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZc -ZB/HL37PZ/pEQtZ2Y5Wu669yIIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeT -IsBQnIJ71NUERFzLtMKfkr4k2HtnIuJpX+UFeNSH2XFwMyVTtIc7KZAoNppV -RDBopIOXfw0enHb/FZ1glwCNioUD7IC+6ixuEFGSzH7VozPY1kneWCqv9hbr -S3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5objM89o03Oy3z2u5yg+gnOI2Ky -6Q0f4nIoj5+saCB9bzuohTEJfwvH6GXp43gOCWcwizSC+13gzJ2BbWLuCB4E -LE6b7P6pT1/9aXjvCR+htL/68++QHkwFix7qepF6w9fl+zC8bBsQWJj3Gl/Q -KTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34TaNhxKFrYzt3oEBSa/m0j -h26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaPpZjydomy -ExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtFKwH3 -HBqi7Ri6Cr2D+m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuW -ae5ogObnmLo2t/5u7Su9IPhlGdpVCX4l3P5hYnL5fhgC72O00Puv5TtjjGeP -AgMBAAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w -HQYDVR0OBBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCv -zAeHFUdvOMW0ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4w -LAYIKwYBBQUHAgEWIGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20v -MA0GCSqGSIb3DQEBBQUAA4ICAQAIhab1Fgz8RBrBY+D5VUYI/HAcQiiWjrfF -wUF1TglxeeVtlspLpYhg0DB0uMoI3LQwnkAHFmtllXcBrqS3NQuB2nEVqXQX -OHtYyvkv+8Bldo1bAbl93oI9ZLi+FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vl -pqD4U99REJNi54Av4tHgvI42Rncz7Lj7jposiU0xEQ8mngS7twSNC/K5/Fqd -Oxa3L8iYq/6KUFkuozv8KV2LwUvJ4ooTHbG/u0IdUt1O2BReEMYxB+9xJ/cb -OQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl9x8DYSjFyMsSoEJL+WuICI20 -MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1puEa+S1BaYEUtLS1 -7Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXaicYwu+uPyyII -oK6q8QNsOktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbGDI8Zf0Ne -bvRbFS/bYV3mZy8/CJT5YLSYMdp08YSTcU1f+2BY0fvEwW2JorsgH51xkcsy -mxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAciIfNAChs0B0QTwoRqjt8Z +MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE +BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWdu +IFBsYXRpbnVtIENBIC0gRzIwHhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAw +WjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMSMwIQYDVQQD +ExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu669y +IIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2Htn +IuJpX+UFeNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+ +6ixuEFGSzH7VozPY1kneWCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5ob +jM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIoj5+saCB9bzuohTEJfwvH6GXp43gOCWcw +izSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/68++QHkwFix7qepF6w9fl ++zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34TaNhxKFrY +zt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaP +pZjydomyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtF +KwH3HBqi7Ri6Cr2D+m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuW +ae5ogObnmLo2t/5u7Su9IPhlGdpVCX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMB +AAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCvzAeHFUdvOMW0 +ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW +IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUA +A4ICAQAIhab1Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0 +uMoI3LQwnkAHFmtllXcBrqS3NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+ +FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4U99REJNi54Av4tHgvI42Rncz7Lj7 +jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8KV2LwUvJ4ooTHbG/ +u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl9x8D +YSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1 +puEa+S1BaYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXa +icYwu+uPyyIIoK6q8QNsOktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbG +DI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSYMdp08YSTcU1f+2BY0fvEwW2JorsgH51x +kcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAciIfNAChs0B0QTwoRqjt8Z Wr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkG -A1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dp -c3NTaWduIFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAy -NTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBB -RzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkq -hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dO -cbpLj6VzHVxumK4DV644N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gRE -pzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm+/pe7R20nqA1W6GSy/BJkv6F -CgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH6INaUFjp -iou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2 -kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aD -Cyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jM -qDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJMoBgs5PAKrYY -C51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBsROop -N4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFu -sB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6 -5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEA -AaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB -tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggr -BgEFBQcCARYgaHR0cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJ -KoZIhvcNAQEFBQADggIBAHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ -1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEG -DyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcS -H9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpH -kXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE -790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8aRl5xB9+lwW/xekkUV7U -1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqPe97Dh4kQ -mUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNV -V4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29 -MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm -0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy +MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE +BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu +IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow +RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY +U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv +Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br +YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF +nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH +6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt +eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/ +c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ +MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH +HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf +jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6 +5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB +rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU +F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c +wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 +cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB +AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp +WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9 +xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ +2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ +IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8 +aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X +em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR +dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/ +OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+ +hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUF -ADBkMQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsT -HERpZ2l0YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNz -Y29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4MTgyMjA2MjBa -MGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMc -RGlnaXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Nj -b20gUm9vdCBDQSAxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA -0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiMMW8Xw/qabFbtPMWRV8PNq5ZJ -kCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyFNDhhSbEA -n9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj -/x2lzZAeAR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxz -h+XTF3xmUHJd1BpYwdnP2IkCb6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJ -vbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn7uHbHaBuHYwadzVcFh4r -Ux80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbNcA78 -yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AO -eCMgkckkKmUpWyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjC -L3UcPX7ape8eYIVpQtPM+GP+HkM5haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoI -lmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNYMUJDLXT5xp6mig/p -/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw -HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYB -Af8CAQcwHwYDVR0jBBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0O -BBYEFAMlL95vggE6XCzcK6FptWfUjNP9MA0GCSqGSIb3DQEBBQUAA4ICAQA1 -EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMnjgM+pN0S734e -dAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzn -eAXQMbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXb -D8BJZLsuUBlL0iT43R4HVtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrE -qdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtlvrsRls/bxig5OgjOR1tTWsWZ -/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascClOS5cfGni -LLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFb -jCYDcKF31QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBa -ZmBwXarNeNQk7shBoJMBkpxqnvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZh -vnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCyx/yP2FS1k2Kdzs9Z+z0Y -zirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMWNY6E -0F/6MBr1mmz0DlP5OlvRHA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2 -VMOcUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xh -ecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEPMA0GA1UEBwwGQU5LQVJBMVYwVAYD -VQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg -QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1 -MTMxMDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RS -VVNUIEVsZWt0cm9uaWsgU2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFz -xLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZBTktBUkExVjBUBgNVBAoMTShj -KSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBCaWxpxZ9p -bSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9 -InTojAPBxhEqPZW8qZSwu5GXyGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1 -cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8iSi9BB35JYbOG7E6mQW6E -vAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ8y1U -iBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm -5Rh8i27fbMx4W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51 -b0dewQIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IB -AQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46sWrv7/hg0Uw2ZkUd -82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE -q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oS -N7wBGjSFvW5P55FyB0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8 -KsF8kOipKMDTkcatKIdAaLX/7KfS0zgYnNN9aV3wxqUeJBujR/xpB2jn5Jq0 -7Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2 -VMOcUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xh -ecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYD -VQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0g -R8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUw -HhcNMDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2 -VMOcUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xh -ecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYD -VQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0g -R8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjH -WHtPFoylzkkBH3MOrHUTpvqeLCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9 -irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKIx+XlZEdhR3n9wFHxwZnn -3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2gQrSd -iVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHps -mxcPbe9TmJEr5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1p -zpwACPI2/z7woQ8arBT9pmAPAgMBAAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Z -z58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8GA1UdEwEB/wQFMAMB -Af8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt -Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWo -lKMiVW4XSf/SKfE4Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbc -oCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+hGIAF728JRhX8tepb1mIvDS3LoV4 -nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P9Qk3iCQOLGsg -OqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9R -nuk5UrbnBEI= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUF -ADA/MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIw -NTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQg -Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN8 -6aXfTEc2pBsBHH8eV4qNw8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UK -IXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/ -cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O1RGvqa/l -mr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq -16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdL -iYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUq -dULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FCVGqY8A2tl+lS -XunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1tB6iE -fC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKX -TiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN -Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0G -A1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkG -BGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 -09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2 -WPWus4MzeKR6dBcZTulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2Jyf -tB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3gh -qMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKb -xkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1 -AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephg -IqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7m -XQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6MmnD+iMsJKxYEYMRBWqoTv -LQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk7tfGOB5j -GxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJI -oRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v -3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYs -fPQS ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUF -ADCByjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8w -HQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykg -MjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 -MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENl -cnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcN -MzYwNzE2MjM1OTU5WjCByjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlT -aWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTow -OAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp -emVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1Ymxp -YyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8 -RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbext0uz/o9+B1fs -70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhDY2pS -S9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+Q -ueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ -rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMK -z10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv -Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0 -cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/T -ZafC3ey78DAJ80M5+gKvMzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP -2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGq -CBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU -7qKEKQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqV -ir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4o -tp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8NhnacRHr2lVz2XTIIM6RU -thg/aFzyQkqFOFSDX9HoLPKsEdao7WNq ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE -BhMCVVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBG -YXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0GA1UEAxMmV2VsbHMg -RmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDAxMDExMTY0 -MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoT -C1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0 -aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mXx3Oqfz1c -QJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93O -vRw6esP3E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjB -qAr5dE8Hq6T54oN+J3N0Prj5OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43 -YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4jsNtlAHCEAQgAFG5Uhpq6 -zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGjYTBf -MA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAy -MDAGCCsGAQUFBwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRw -b2xpY3kwDQYJKoZIhvcNAQEFBQADggEBANIn3ZwKdyu7IvICtUpKkfnRLb7k -uxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrvm+0fazbuSCUlFLZW -ohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R -OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zk -r8QA1dhYJPz1j+zxx32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01 -QIroTmMatukgalHizqSQ33ZwmVxwQ023tqcZZE6St8WRPH9IFmV7Fv3L/PvZ -1dZPIWU7Sn9Ho/s= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUF -ADCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5 -LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0w -KwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkw -HhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMC -VVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMb -WFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBH -bG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwuIR1cRN8h -XX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9K -mHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavn -HTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3 -hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRaJSKNNCyy9mgd -Em3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvryxS3T -/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQD -AgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs -jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1 -cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcN -AQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc -/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYS -Nrsf16GBBEYgoyxtqZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT -5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGP -urt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd -50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUF -ADCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYG -A1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UE -CxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYx -MTE3MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTAT -BgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT -ZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0 -ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQ -LZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29 -dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk6KHYcWUNo1F7 -7rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/KaAcd -HJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR3 -2HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7 -W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7OR -tvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE -uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQ -aEfZYGDm/Ac9IiAXxPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqd -E8hhuvU5HIe6uL17In/2/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+ -MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+ -fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEFTCCA36gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBvjELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UE -ChMfU29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9z -dG1hc3RlcjEgMB4GA1UEAxMXQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxJTAjBgkq -hkiG9w0BCQEWFmhvc3RtYXN0ZXJAc3BpLWluYy5vcmcwHhcNMDMwMTE1MTYyOTE3 -WhcNMDcwMTE0MTYyOTE3WjCBvjELMAkGA1UEBhMCVVMxEDAOBgNVBAgTB0luZGlh -bmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMfU29mdHdhcmUgaW4g -dGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1hc3RlcjEgMB4GA1UE -AxMXQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxJTAjBgkqhkiG9w0BCQEWFmhvc3Rt -YXN0ZXJAc3BpLWluYy5vcmcwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAPB6 -rdoiLR3RodtM22LMcfwfqb5OrJNl7fwmvskgF7yP6sdD2bOfDIXhg9852jhY8/kL -VOFe1ELAL2OyN4RAxk0rliZQVgeTgqvgkOVIBbNwgnjN6mqtuWzFiPL+NXQExq40 -I3whM+4lEiwSHaV+MYxWanMdhc+kImT50LKfkxcdAgMBAAGjggEfMIIBGzAdBgNV -HQ4EFgQUB63oQR1/vda/G4F6P4xLiN4E0vowgesGA1UdIwSB4zCB4IAUB63oQR1/ -vda/G4F6P4xLiN4E0vqhgcSkgcEwgb4xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdJ -bmRpYW5hMRUwEwYDVQQHEwxJbmRpYW5hcG9saXMxKDAmBgNVBAoTH1NvZnR3YXJl -IGluIHRoZSBQdWJsaWMgSW50ZXJlc3QxEzARBgNVBAsTCmhvc3RtYXN0ZXIxIDAe -BgNVBAMTF0NlcnRpZmljYXRpb24gQXV0aG9yaXR5MSUwIwYJKoZIhvcNAQkBFhZo -b3N0bWFzdGVyQHNwaS1pbmMub3JnggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcN -AQEEBQADgYEAm/Abn8c2y1nO3fgpAIslxvi9iNBZDhQtJ0VQZY6wgSfANyDOR4DW -iexO/AlorB49KnkFS7TjCAoLOZhcg5FaNiKnlstMI5krQmau1Qnb/vGSNsE/UGms -1ts+QYPUs0KmGEAFUri2XzLy+aQo9Kw74VBvqnxvaaMeY5yMcKNOieY= +MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBk +MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0 +YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg +Q0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4MTgyMjA2MjBaMGQxCzAJBgNVBAYT +AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp +Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9 +m2BtRsiMMW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdih +FvkcxC7mlSpnzNApbjyFNDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/ +TilftKaNXXsLmREDA/7n29uj/x2lzZAeAR81sH8A25Bvxn570e56eqeqDFdvpG3F +EzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkCb6dJtDZd0KTeByy2dbco +kdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn7uHbHaBu +HYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNF +vJbNcA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo +19AOeCMgkckkKmUpWyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjC +L3UcPX7ape8eYIVpQtPM+GP+HkM5haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJW +bjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNYMUJDLXT5xp6mig/p/r+D5kNX +JLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw +FDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j +BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzc +K6FptWfUjNP9MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzf +ky9NfEBWMXrrpA9gzXrzvsMnjgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7Ik +Vh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQMbFamIp1TpBcahQq4FJHgmDmHtqB +sfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4HVtA4oJVwIHaM190e +3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtlvrsR +ls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ip +mXeascClOS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HH +b6D0jqTsNFFbjCYDcKF31QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksf +rK/7DZBaZmBwXarNeNQk7shBoJMBkpxqnvy5JMWzFYJ+vq6VK+uxwNrjAWALXmms +hFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCyx/yP2FS1k2Kdzs9Z+z0Y +zirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMWNY6E0F/6 +MBr1mmz0DlP5OlvRHA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOc +UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMQswCQYDVQQGDAJUUjEPMA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykg +MjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 +dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMxMDI3MTdaFw0xNTAz +MjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2Vy +dGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYD +VQQHDAZBTktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kg +xLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEu +xZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7 +XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GXyGl8hMW0kWxsE2qkVa2k +heiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8iSi9BB35J +YbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5C +urKZ8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1 +JuTm5Rh8i27fbMx4W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51 +b0dewQIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV +9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46sWrv7/hg0Uw2ZkUd82YCdAR7 +kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxEq8Sn5RTOPEFh +fEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy +B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdA +aLX/7KfS0zgYnNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKS +RGQDJereW26fyfJOrN3H +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOc +UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xS +S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg +SGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcNMDUxMTA3MTAwNzU3 +WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVrdHJv +bmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJU +UjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSw +bGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWe +LiAoYykgS2FzxLFtIDIwMDUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqeLCDe2JAOCtFp0if7qnef +J1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKIx+XlZEdh +R3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJ +Qv2gQrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGX +JHpsmxcPbe9TmJEr5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1p +zpwACPI2/z7woQ8arBT9pmAPAgMBAAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58S +Fq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8GA1UdEwEB/wQFMAMBAf8wDQYJ +KoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/nttRbj2hWyfIvwq +ECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 +Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFz +gw2lGh1uEpJ+hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotH +uFEJjOp9zYhys2AzsfAKRO8P9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LS +y3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5UrbnBEI= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ +MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow +PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR +IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q +gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy +yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts +F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 +jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx +ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC +VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK +YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH +EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN +Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud +DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE +MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK +UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf +qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK +ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE +JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 +hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 +EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm +nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX +udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz +ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe +LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl +pYYsfPQS +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW +ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 +nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex +t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz +SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG +BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ +rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ +NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E +BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH +BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv +MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE +p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y +5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK +WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ +4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N +hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9v +dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDAxMDExMTY0MTI4WhcNMjEwMTE0 +MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSww +KgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0G +A1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n13 +5zHCLielTWi5MbqNQ1mXx3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHE +SxP9cMIlrCL1dQu3U+SlK93OvRw6esP3E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4O +JgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5OEL8pahbSCOz6+MlsoCu +ltQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4jsNtlAHCE +AQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMB +AAGjYTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcB +CzAyMDAGCCsGAQUFBwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRw +b2xpY3kwDQYJKoZIhvcNAQEFBQADggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo +7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrvm+0fazbuSCUlFLZWohDo7qd/ +0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0ROhPs7fpvcmR7 +nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx +x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ +33ZwmVxwQ023tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB +gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk +MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY +UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx +NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 +dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy +dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 +38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP +KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q +DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 +qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa +JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi +PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P +BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs +jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 +eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR +vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa +IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy +i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ +O+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB +qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV +BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw +NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j +LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG +A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs +W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta +3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk +6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 +Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J +NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP +r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU +DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz +YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 +/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ +LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 +jVaMaA== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIIDjCCBfagAwIBAgIJAOiOtsn4KhQoMA0GCSqGSIb3DQEBBQUAMIG8MQswCQYD @@ -3833,7 +3274,6 @@ IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU Cm26OWMohpLzGITY+9HPBVZkVw== -----END CERTIFICATE----- - -----BEGIN CERTIFICATE----- MIIGJDCCBY2gAwIBAgIEQoaroDANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u @@ -3895,22 +3335,3 @@ xA39CIJ65Zozs28Eg1aV9/Y+Of7TnWhW+U3J3/wD/GghaAGiKK6vMn9gJBIdBX/9 e6ef37VGyiOEFFjnUIbuk0RWty0orN76q/lI/xjCi15XSA/VSq2j4vmnwfZcPTDu glmQ1A== -----END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV -UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy -dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 -MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx -dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f -BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A -cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC -AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ -MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm -aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw -ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj -IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF -MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA -A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y -7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh -1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 ------END CERTIFICATE----- -- cgit v1.2.3 From 983b49c31652b00f0659ef1a5a5d189681b1a826 Mon Sep 17 00:00:00 2001 From: Aaron Stone <stone@lindenlab.com> Date: Fri, 1 Apr 2011 16:10:35 -0700 Subject: Attempt at fixing build.sh and improving readability. --- build.sh | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/build.sh b/build.sh index cb5f74fb3c..6677958716 100755 --- a/build.sh +++ b/build.sh @@ -51,12 +51,20 @@ pre_build() { local variant="$1" begin_section "Pre$variant" - "$AUTOBUILD" configure -c $variant -- -DPACKAGE:BOOL=ON -DRELEASE_CRASH_REPORTING:BOOL=ON -DUSE_PRECOMPILED_HEADERS=FALSE "-DVIEWER_CHANNEL:STRING=\"$viewer_channel\"" "-DVIEWER_LOGIN_CHANNEL:STRING=\"$viewer_login_channel\"" - [ -n "$master_message_template_checkout" ] && [ -r "$master_message_template_checkout/message_template.msg" ]\ - && template_verifier_master_url="-DTEMPLATE_VERIFIER_MASTER_URL=file://$master_message_template_checkout/message_template.msg" - -DLL_TESTS:BOOL="$run_tests" \ - -DTEMPLATE_VERIFIER_OPTIONS:STRING="$template_verifier_options" $template_verifier_master_url - end_section "Pre$variant" + [ -n "$master_message_template_checkout" ] \ + && [ -r "$master_message_template_checkout/message_template.msg" ] \ + && template_verifier_master_url="-DTEMPLATE_VERIFIER_MASTER_URL=file://$master_message_template_checkout/message_template.msg" + + "$AUTOBUILD" configure -c $variant -- \ + -DPACKAGE:BOOL=ON \ + -DRELEASE_CRASH_REPORTING:BOOL=ON \ + -DUSE_PRECOMPILED_HEADERS=FALSE \ + -DVIEWER_CHANNEL:STRING="\"$viewer_channel\"" \ + -DVIEWER_LOGIN_CHANNEL:STRING="\"$viewer_login_channel\"" \ + -DGRID:STRING="\"$viewer_grid\"" \ + -DLL_TESTS:BOOL="$run_tests" \ + -DTEMPLATE_VERIFIER_OPTIONS:STRING="$template_verifier_options" $template_verifier_master_url + end_section "Pre$variant" } build() -- cgit v1.2.3 From e6c0615b97019cf9c8aee267513757c0c2510420 Mon Sep 17 00:00:00 2001 From: Aaron Stone <stone@lindenlab.com> Date: Fri, 1 Apr 2011 16:36:00 -0700 Subject: VWR-25376 Enable compression for GET and POST for Inventory and other capabilities. --- indra/llmessage/llurlrequest.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/indra/llmessage/llurlrequest.cpp b/indra/llmessage/llurlrequest.cpp index cb9d1c3731..28bd09fc4c 100644 --- a/indra/llmessage/llurlrequest.cpp +++ b/indra/llmessage/llurlrequest.cpp @@ -440,6 +440,9 @@ bool LLURLRequest::configure() case HTTP_GET: mDetail->mCurlRequest->setopt(CURLOPT_HTTPGET, 1); mDetail->mCurlRequest->setopt(CURLOPT_FOLLOWLOCATION, 1); + + // Set Accept-Encoding to allow response compression + mDetail->mCurlRequest->setoptString(CURLOPT_ENCODING, ""); rv = true; break; @@ -464,6 +467,9 @@ bool LLURLRequest::configure() // Set the handle for an http post mDetail->mCurlRequest->setPost(NULL, bytes); + + // Set Accept-Encoding to allow response compression + mDetail->mCurlRequest->setoptString(CURLOPT_ENCODING, ""); rv = true; break; -- cgit v1.2.3 From 453b0c700a8712f7ff79434772296a487d38184a Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Fri, 1 Apr 2011 16:42:30 -0700 Subject: SOCIAL-822 FIX UI and Sizing issues with hints in Basic and Advanced modes fixed crash for advanced mode --- indra/newview/llhints.cpp | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/indra/newview/llhints.cpp b/indra/newview/llhints.cpp index 722d67caf9..b5e676e626 100644 --- a/indra/newview/llhints.cpp +++ b/indra/newview/llhints.cpp @@ -213,19 +213,22 @@ void LLHintPopup::draw() alpha = clamp_rescale(mFadeTimer.getElapsedTimeF32(), 0.f, mFadeInTime, 0.f, 1.f); } - LLIconCtrl& hint_icon = getChildRef<LLIconCtrl>("hint_image"); + LLIconCtrl* hint_icon = findChild<LLIconCtrl>("hint_image"); - LLUIImagePtr hint_image = hint_icon.getImage(); - S32 image_height = hint_image.isNull() ? 0 : hint_image->getHeight(); - S32 image_width = hint_image.isNull() ? 0 : hint_image->getWidth(); + if (hint_icon) + { + LLUIImagePtr hint_image = hint_icon.getImage(); + S32 image_height = hint_image.isNull() ? 0 : hint_image->getHeight(); + S32 image_width = hint_image.isNull() ? 0 : hint_image->getWidth(); - S32 delta_height = image_height - hint_icon.getParent()->getParent()->getRect().getHeight(); - hint_icon.getParent()->reshape(image_width, hint_icon.getParent()->getRect().getHeight()); - hint_icon.getParent()->getParent()->reshape(hint_icon.getParent()->getParent()->getRect().getWidth(), image_height); - hint_icon.getParent()->getParent()->translate(0, -delta_height); + S32 delta_height = image_height - hint_icon.getParent()->getParent()->getRect().getHeight(); + hint_icon.getParent()->reshape(image_width, hint_icon.getParent()->getRect().getHeight()); + hint_icon.getParent()->getParent()->reshape(hint_icon.getParent()->getParent()->getRect().getWidth(), image_height); + hint_icon.getParent()->getParent()->translate(0, -delta_height); - LLRect hint_rect = getLocalRect(); - reshape(hint_rect.getWidth(), hint_rect.getHeight() + delta_height); + LLRect hint_rect = getLocalRect(); + reshape(hint_rect.getWidth(), hint_rect.getHeight() + delta_height); + } { LLViewDrawContext context(alpha); -- cgit v1.2.3 From 81ae3c5fc984a5175f1bd0fc277f8493dc895d94 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Fri, 1 Apr 2011 18:15:07 -0700 Subject: SOCIAL-822 FIX UI and Sizing issues with hints in Basic and Advanced modes fixed crash for advanced mode --- indra/newview/llhints.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/indra/newview/llhints.cpp b/indra/newview/llhints.cpp index b5e676e626..e15862e2a4 100644 --- a/indra/newview/llhints.cpp +++ b/indra/newview/llhints.cpp @@ -217,14 +217,15 @@ void LLHintPopup::draw() if (hint_icon) { - LLUIImagePtr hint_image = hint_icon.getImage(); + LLUIImagePtr hint_image = hint_icon->getImage(); S32 image_height = hint_image.isNull() ? 0 : hint_image->getHeight(); S32 image_width = hint_image.isNull() ? 0 : hint_image->getWidth(); - S32 delta_height = image_height - hint_icon.getParent()->getParent()->getRect().getHeight(); - hint_icon.getParent()->reshape(image_width, hint_icon.getParent()->getRect().getHeight()); - hint_icon.getParent()->getParent()->reshape(hint_icon.getParent()->getParent()->getRect().getWidth(), image_height); - hint_icon.getParent()->getParent()->translate(0, -delta_height); + LLView* layout_stack = hint_icon->getParent()->getParent(); + S32 delta_height = image_height - layout_stack->getRect().getHeight(); + hint_icon->getParent()->reshape(image_width, hint_icon->getParent()->getRect().getHeight()); + layout_stack->reshape(layout_stack->getRect().getWidth(), image_height); + layout_stack->translate(0, -delta_height); LLRect hint_rect = getLocalRect(); reshape(hint_rect.getWidth(), hint_rect.getHeight() + delta_height); -- cgit v1.2.3 From 8288c3c24ab96bf697e21813693492c79e49e918 Mon Sep 17 00:00:00 2001 From: Seraph Linden <none@none> Date: Sat, 2 Apr 2011 16:42:21 -0400 Subject: Fix for avatar_lad physics using duplicate ID. Added missing skirt physics param for belly. --- indra/newview/character/avatar_lad.xml | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index 4585ba658c..64142f38a1 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -5246,6 +5246,24 @@ value_max="1"> <param_morph /> </param> + + <!-- + ############# + # physics morphs (not user controlled) + ############# + --> + <param + id="1203" + group="1" + name="Belly_Physics_Skirt_UpDown_Driven" + wearable="physics" + edit_group="driven" + value_default="0" + value_min="-1" + value_max="1"> + <param_morph /> + </param> + </mesh> <mesh @@ -11720,7 +11738,7 @@ render_pass="bump"> </param> <param - id="1120" + id="1102" group="1" wearable="physics" name="Belly_Physics_UpDown_Controller" -- cgit v1.2.3 From 1b56f3c605053d609280bb9933ed0722094f3b5e Mon Sep 17 00:00:00 2001 From: Seraph Linden <none@none> Date: Sat, 2 Apr 2011 17:08:09 -0400 Subject: Fix for edit physics panel tab names. --- indra/newview/llpaneleditwearable.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp index 4db9a154ea..a2510a10c1 100644 --- a/indra/newview/llpaneleditwearable.cpp +++ b/indra/newview/llpaneleditwearable.cpp @@ -310,12 +310,12 @@ LLEditWearableDictionary::Subparts::Subparts() addEntry(SUBPART_UNDERPANTS, new SubpartEntry(SUBPART_UNDERPANTS, "mPelvis", "underpants", "underpants_main_param_list", "underpants_main_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH)); addEntry(SUBPART_ALPHA, new SubpartEntry(SUBPART_ALPHA, "mPelvis", "alpha", "alpha_main_param_list", "alpha_main_tab", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f),SEX_BOTH)); addEntry(SUBPART_TATTOO, new SubpartEntry(SUBPART_TATTOO, "mPelvis", "tattoo", "tattoo_main_param_list", "tattoo_main_tab", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f),SEX_BOTH)); - addEntry(SUBPART_PHYSICS_BREASTS_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BREASTS_UPDOWN, "mTorso", "physics_breasts_updown", "physics_breasts_updown_param_list", "physics_breasts_updown_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_FEMALE)); - addEntry(SUBPART_PHYSICS_BREASTS_INOUT, new SubpartEntry(SUBPART_PHYSICS_BREASTS_INOUT, "mTorso", "physics_breasts_inout", "physics_breasts_inout_param_list", "physics_breasts_inout_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_FEMALE)); - addEntry(SUBPART_PHYSICS_BELLY_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BELLY_UPDOWN, "mTorso", "physics_belly_updown", "physics_belly_updown_param_list", "physics_belly_updown_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH)); - addEntry(SUBPART_PHYSICS_BUTT_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BUTT_UPDOWN, "mTorso", "physics_butt_updown", "physics_butt_updown_param_list", "physics_butt_updown_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH)); - addEntry(SUBPART_PHYSICS_BUTT_LEFTRIGHT, new SubpartEntry(SUBPART_PHYSICS_BUTT_LEFTRIGHT, "mTorso", "physics_butt_leftright", "physics_butt_leftright_param_list", "physics_butt_leftright_tab", LLVector3d(0.f, 0.f, 0.f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH)); - addEntry(SUBPART_PHYSICS_ADVANCED, new SubpartEntry(SUBPART_PHYSICS_ADVANCED, "mTorso", "physics_advanced", "physics_advanced_param_list", "physics_advanced_tab", LLVector3d(0.f, 0.f, 0.f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH)); + addEntry(SUBPART_PHYSICS_BREASTS_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BREASTS_UPDOWN, "mTorso", "physics_breasts_updown_tab", "physics_breasts_updown_param_list", "physics_breasts_updown_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_FEMALE)); + addEntry(SUBPART_PHYSICS_BREASTS_INOUT, new SubpartEntry(SUBPART_PHYSICS_BREASTS_INOUT, "mTorso", "physics_breasts_inout_tab", "physics_breasts_inout_param_list", "physics_breasts_inout_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_FEMALE)); + addEntry(SUBPART_PHYSICS_BELLY_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BELLY_UPDOWN, "mTorso", "physics_belly_updown_tab", "physics_belly_updown_param_list", "physics_belly_updown_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH)); + addEntry(SUBPART_PHYSICS_BUTT_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BUTT_UPDOWN, "mTorso", "physics_butt_updown_tab", "physics_butt_updown_param_list", "physics_butt_updown_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH)); + addEntry(SUBPART_PHYSICS_BUTT_LEFTRIGHT, new SubpartEntry(SUBPART_PHYSICS_BUTT_LEFTRIGHT, "mTorso", "physics_butt_leftright_tab", "physics_butt_leftright_param_list", "physics_butt_leftright_tab", LLVector3d(0.f, 0.f, 0.f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH)); + addEntry(SUBPART_PHYSICS_ADVANCED, new SubpartEntry(SUBPART_PHYSICS_ADVANCED, "mTorso", "physics_advanced_tab", "physics_advanced_param_list", "physics_advanced_tab", LLVector3d(0.f, 0.f, 0.f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH)); } LLEditWearableDictionary::SubpartEntry::SubpartEntry(ESubpart part, -- cgit v1.2.3 From a92614a09ce31c96a9aad55ba55da6c238892463 Mon Sep 17 00:00:00 2001 From: Seraph Linden <none@none> Date: Sat, 2 Apr 2011 17:39:28 -0400 Subject: Renumbering for avatar physics parameters --- indra/newview/character/avatar_lad.xml | 73 +++++++++++++++++----------------- 1 file changed, 36 insertions(+), 37 deletions(-) diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index 64142f38a1..765d016888 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -11757,7 +11757,7 @@ render_pass="bump"> </param> <param - id="1100" + id="1103" group="1" wearable="shape" name="Butt_Physics_UpDown_Controller" @@ -11772,7 +11772,7 @@ render_pass="bump"> </param> <param - id="1101" + id="1104" group="1" wearable="shape" name="Butt_Physics_LeftRight_Controller" @@ -11787,7 +11787,7 @@ render_pass="bump"> </param> <param - id="1110" + id="10000" group="0" sex="female" name="Breast_Physics_Mass" @@ -11800,7 +11800,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="1111" + id="10001" group="0" sex="female" name="Breast_Physics_Smoothing" @@ -11813,7 +11813,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="1112" + id="10002" group="0" sex="female" name="Breast_Physics_Gravity" @@ -11827,7 +11827,7 @@ render_pass="bump"> </param> <param - id="1113" + id="10003" group="0" sex="female" name="Breast_Physics_UpDown_Max_Velocity" @@ -11840,7 +11840,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="1114" + id="10004" group="0" sex="female" name="Breast_Physics_UpDown_Spring" @@ -11853,7 +11853,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="1115" + id="10005" group="0" sex="female" name="Breast_Physics_UpDown_Gain" @@ -11866,7 +11866,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="1116" + id="10006" group="0" sex="female" name="Breast_Physics_UpDown_Damping" @@ -11881,7 +11881,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="1117" + id="10007" group="0" sex="female" name="Breast_Physics_UpDown_Drag" @@ -11895,7 +11895,7 @@ render_pass="bump"> </param> <param - id="1118" + id="10008" group="0" sex="female" name="Breast_Physics_InOut_Max_Velocity" @@ -11908,7 +11908,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="1119" + id="10009" group="0" sex="female" name="Breast_Physics_InOut_Spring" @@ -11921,7 +11921,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="1120" + id="10010" group="0" sex="female" name="Breast_Physics_InOut_Gain" @@ -11934,7 +11934,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="1121" + id="10011" group="0" sex="female" name="Breast_Physics_InOut_Damping" @@ -11947,7 +11947,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="1122" + id="10012" group="0" sex="female" name="Breast_Physics_InOut_Drag" @@ -11961,7 +11961,7 @@ render_pass="bump"> </param> <param - id="1130" + id="10013" group="0" name="Belly_Physics_Mass" label="Belly Physics Mass" @@ -11973,7 +11973,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="1131" + id="10014" group="0" name="Belly_Physics_Smoothing" label="Belly Physics Smoothing" @@ -11985,7 +11985,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="1132" + id="10015" group="0" name="Belly_Physics_Gravity" label="Belly Physics Gravity" @@ -11997,7 +11997,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="1133" + id="10016" group="0" name="Belly_Physics_UpDown_Max_Velocity" label="Belly Physics UpDown Max Speed" @@ -12009,7 +12009,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="1134" + id="10017" group="0" name="Belly_Physics_UpDown_Spring" label="Belly Physics UpDown Spring" @@ -12021,7 +12021,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="1135" + id="10018" group="0" name="Belly_Physics_UpDown_Gain" label="Belly Physics UpDown Gain" @@ -12033,7 +12033,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="1136" + id="10019" group="0" name="Belly_Physics_UpDown_Damping" label="Belly Physics UpDown Damping" @@ -12045,7 +12045,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="1137" + id="10020" group="0" name="Belly_Physics_UpDown_Drag" label="Belly Physics UpDown Drag" @@ -12058,7 +12058,7 @@ render_pass="bump"> </param> <param - id="1140" + id="10021" group="0" name="Butt_Physics_Mass" label="Butt Physics Mass" @@ -12070,7 +12070,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="1141" + id="10022" group="0" name="Butt_Physics_Smoothing" label="Butt Physics Smoothing" @@ -12082,7 +12082,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="1142" + id="10023" group="0" name="Butt_Physics_Gravity" label="Butt Physics Gravity" @@ -12094,7 +12094,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="1143" + id="10024" group="0" name="Butt_Physics_UpDown_Max_Velocity" label="Butt Physics UpDown Max Speed" @@ -12106,7 +12106,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="1144" + id="10025" group="0" name="Butt_Physics_UpDown_Spring" label="Butt Physics UpDown Spring" @@ -12118,7 +12118,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="1145" + id="10026" group="0" name="Butt_Physics_UpDown_Gain" label="Butt Physics UpDown Gain" @@ -12130,7 +12130,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="1146" + id="10027" group="0" name="Butt_Physics_UpDown_Damping" label="Butt Physics UpDown Damping" @@ -12142,7 +12142,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="1147" + id="10028" group="0" name="Butt_Physics_UpDown_Drag" label="Butt Physics UpDown Drag" @@ -12155,7 +12155,7 @@ render_pass="bump"> </param> <param - id="1148" + id="10029" group="0" name="Butt_Physics_LeftRight_Max_Velocity" label="Butt Physics LeftRight Max Speed" @@ -12167,7 +12167,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="1149" + id="10030" group="0" name="Butt_Physics_LeftRight_Spring" label="Butt Physics LeftRight Spring" @@ -12179,7 +12179,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="1150" + id="10031" group="0" name="Butt_Physics_LeftRight_Gain" label="Butt Physics LeftRight Gain" @@ -12191,7 +12191,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="1151" + id="10032" group="0" name="Butt_Physics_LeftRight_Damping" label="Butt Physics LeftRight Damping" @@ -12203,7 +12203,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="1152" + id="10033" group="0" name="Butt_Physics_LeftRight_Drag" label="Butt Physics LeftRight Drag" @@ -12215,7 +12215,6 @@ render_pass="bump"> <param_driver /> </param> - </driver_parameters> <morph_masks> -- cgit v1.2.3 From cc2a813ce40a09bab230a62809f5ff21083a81f2 Mon Sep 17 00:00:00 2001 From: Seraph Linden <none@none> Date: Sat, 2 Apr 2011 18:36:49 -0400 Subject: Moved Drag to be a general shape physics param, to save on number of transmitted params. --- indra/newview/character/avatar_lad.xml | 127 +- indra/newview/llpaneleditwearable.cpp | 2310 ++++++++++++------------ indra/newview/llphysicsmotion.cpp | 1114 ++++++------ indra/newview/skins/default/xui/en/strings.xml | 8 +- 4 files changed, 1767 insertions(+), 1792 deletions(-) diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index 765d016888..fa286e99ef 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -11830,6 +11830,20 @@ render_pass="bump"> id="10003" group="0" sex="female" + name="Breast_Physics_Drag" + label="Breast Physics Drag" + wearable="physics" + edit_group="physics_advanced" + value_default=".15" + value_min="0" + value_max=".5"> + <param_driver /> + </param> + + <param + id="10004" + group="0" + sex="female" name="Breast_Physics_UpDown_Max_Velocity" label="Breast Physics UpDown Max Speed" wearable="physics" @@ -11840,7 +11854,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="10004" + id="10005" group="0" sex="female" name="Breast_Physics_UpDown_Spring" @@ -11853,7 +11867,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="10005" + id="10006" group="0" sex="female" name="Breast_Physics_UpDown_Gain" @@ -11866,7 +11880,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="10006" + id="10007" group="0" sex="female" name="Breast_Physics_UpDown_Damping" @@ -11880,19 +11894,6 @@ render_pass="bump"> camera_distance=".8"> <param_driver /> </param> - <param - id="10007" - group="0" - sex="female" - name="Breast_Physics_UpDown_Drag" - label="Breast Physics UpDown Drag" - wearable="physics" - edit_group="physics_advanced" - value_default=".15" - value_min="0" - value_max=".5"> - <param_driver /> - </param> <param id="10008" @@ -11946,22 +11947,9 @@ render_pass="bump"> value_max=".1"> <param_driver /> </param> - <param - id="10012" - group="0" - sex="female" - name="Breast_Physics_InOut_Drag" - label="Breast Physics InOut Drag" - wearable="physics" - edit_group="physics_advanced" - value_default=".15" - value_min="0" - value_max=".5"> - <param_driver /> - </param> <param - id="10013" + id="10012" group="0" name="Belly_Physics_Mass" label="Belly Physics Mass" @@ -11973,7 +11961,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="10014" + id="10013" group="0" name="Belly_Physics_Smoothing" label="Belly Physics Smoothing" @@ -11985,7 +11973,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="10015" + id="10014" group="0" name="Belly_Physics_Gravity" label="Belly Physics Gravity" @@ -11996,6 +11984,18 @@ render_pass="bump"> value_max=".1"> <param_driver /> </param> + <param + id="10015" + group="0" + name="Belly_Physics_Drag" + label="Belly Physics Drag" + wearable="physics" + edit_group="physics_advanced" + value_default=".15" + value_min="0" + value_max=".5"> + <param_driver /> + </param> <param id="10016" group="0" @@ -12044,21 +12044,9 @@ render_pass="bump"> value_max=".1"> <param_driver /> </param> - <param - id="10020" - group="0" - name="Belly_Physics_UpDown_Drag" - label="Belly Physics UpDown Drag" - wearable="physics" - edit_group="physics_advanced" - value_default=".15" - value_min="0" - value_max=".5"> - <param_driver /> - </param> <param - id="10021" + id="10020" group="0" name="Butt_Physics_Mass" label="Butt Physics Mass" @@ -12070,7 +12058,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="10022" + id="10021" group="0" name="Butt_Physics_Smoothing" label="Butt Physics Smoothing" @@ -12082,7 +12070,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="10023" + id="10022" group="0" name="Butt_Physics_Gravity" label="Butt Physics Gravity" @@ -12093,6 +12081,19 @@ render_pass="bump"> value_max=".1"> <param_driver /> </param> + <param + id="10023" + group="0" + name="Butt_Physics_Drag" + label="Butt Physics Drag" + wearable="physics" + edit_group="physics_advanced" + value_default=".15" + value_min="0" + value_max=".5"> + <param_driver /> + </param> + <param id="10024" group="0" @@ -12141,21 +12142,9 @@ render_pass="bump"> value_max=".1"> <param_driver /> </param> - <param - id="10028" - group="0" - name="Butt_Physics_UpDown_Drag" - label="Butt Physics UpDown Drag" - wearable="physics" - edit_group="physics_advanced" - value_default=".15" - value_min="0" - value_max=".5"> - <param_driver /> - </param> <param - id="10029" + id="10028" group="0" name="Butt_Physics_LeftRight_Max_Velocity" label="Butt Physics LeftRight Max Speed" @@ -12167,7 +12156,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="10030" + id="10029" group="0" name="Butt_Physics_LeftRight_Spring" label="Butt Physics LeftRight Spring" @@ -12179,7 +12168,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="10031" + id="10030" group="0" name="Butt_Physics_LeftRight_Gain" label="Butt Physics LeftRight Gain" @@ -12191,7 +12180,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="10032" + id="10031" group="0" name="Butt_Physics_LeftRight_Damping" label="Butt Physics LeftRight Damping" @@ -12202,18 +12191,6 @@ render_pass="bump"> value_max=".1"> <param_driver /> </param> - <param - id="10033" - group="0" - name="Butt_Physics_LeftRight_Drag" - label="Butt Physics LeftRight Drag" - wearable="physics" - edit_group="physics_advanced" - value_default=".15" - value_min="0" - value_max=".5"> - <param_driver /> - </param> </driver_parameters> diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp index a2510a10c1..d0ce765a69 100644 --- a/indra/newview/llpaneleditwearable.cpp +++ b/indra/newview/llpaneleditwearable.cpp @@ -51,7 +51,7 @@ #include "llcolorswatch.h" #include "lltexturectrl.h" #include "lltextureentry.h" -#include "llviewercontrol.h" // gSavedSettings +#include "llviewercontrol.h" // gSavedSettings #include "llviewertexturelist.h" #include "llagentcamera.h" #include "llmorphview.h" @@ -65,42 +65,42 @@ static LLRegisterPanelClassWrapper<LLPanelEditWearable> t_edit_wearable("panel_e // subparts of the UI for focus, camera position, etc. enum ESubpart { - SUBPART_SHAPE_HEAD = 1, // avoid 0 - SUBPART_SHAPE_EYES, - SUBPART_SHAPE_EARS, - SUBPART_SHAPE_NOSE, - SUBPART_SHAPE_MOUTH, - SUBPART_SHAPE_CHIN, - SUBPART_SHAPE_TORSO, - SUBPART_SHAPE_LEGS, - SUBPART_SHAPE_WHOLE, - SUBPART_SHAPE_DETAIL, - SUBPART_SKIN_COLOR, - SUBPART_SKIN_FACEDETAIL, - SUBPART_SKIN_MAKEUP, - SUBPART_SKIN_BODYDETAIL, - SUBPART_HAIR_COLOR, - SUBPART_HAIR_STYLE, - SUBPART_HAIR_EYEBROWS, - SUBPART_HAIR_FACIAL, - SUBPART_EYES, - SUBPART_SHIRT, - SUBPART_PANTS, - SUBPART_SHOES, - SUBPART_SOCKS, - SUBPART_JACKET, - SUBPART_GLOVES, - SUBPART_UNDERSHIRT, - SUBPART_UNDERPANTS, - SUBPART_SKIRT, - SUBPART_ALPHA, - SUBPART_TATTOO, - SUBPART_PHYSICS_BREASTS_UPDOWN, - SUBPART_PHYSICS_BREASTS_INOUT, - SUBPART_PHYSICS_BELLY_UPDOWN, - SUBPART_PHYSICS_BUTT_UPDOWN, - SUBPART_PHYSICS_BUTT_LEFTRIGHT, - SUBPART_PHYSICS_ADVANCED, + SUBPART_SHAPE_HEAD = 1, // avoid 0 + SUBPART_SHAPE_EYES, + SUBPART_SHAPE_EARS, + SUBPART_SHAPE_NOSE, + SUBPART_SHAPE_MOUTH, + SUBPART_SHAPE_CHIN, + SUBPART_SHAPE_TORSO, + SUBPART_SHAPE_LEGS, + SUBPART_SHAPE_WHOLE, + SUBPART_SHAPE_DETAIL, + SUBPART_SKIN_COLOR, + SUBPART_SKIN_FACEDETAIL, + SUBPART_SKIN_MAKEUP, + SUBPART_SKIN_BODYDETAIL, + SUBPART_HAIR_COLOR, + SUBPART_HAIR_STYLE, + SUBPART_HAIR_EYEBROWS, + SUBPART_HAIR_FACIAL, + SUBPART_EYES, + SUBPART_SHIRT, + SUBPART_PANTS, + SUBPART_SHOES, + SUBPART_SOCKS, + SUBPART_JACKET, + SUBPART_GLOVES, + SUBPART_UNDERSHIRT, + SUBPART_UNDERPANTS, + SUBPART_SKIRT, + SUBPART_ALPHA, + SUBPART_TATTOO, + SUBPART_PHYSICS_BREASTS_UPDOWN, + SUBPART_PHYSICS_BREASTS_INOUT, + SUBPART_PHYSICS_BELLY_UPDOWN, + SUBPART_PHYSICS_BUTT_UPDOWN, + SUBPART_PHYSICS_BUTT_LEFTRIGHT, + SUBPART_PHYSICS_ADVANCED, }; using namespace LLVOAvatarDefines; @@ -111,102 +111,102 @@ typedef std::vector<ESubpart> subpart_vec_t; class LLEditWearableDictionary : public LLSingleton<LLEditWearableDictionary> { - //-------------------------------------------------------------------- - // Constructors and Destructors - //-------------------------------------------------------------------- + //-------------------------------------------------------------------- + // Constructors and Destructors + //-------------------------------------------------------------------- public: - LLEditWearableDictionary(); - virtual ~LLEditWearableDictionary(); - - //-------------------------------------------------------------------- - // Wearable Types - //-------------------------------------------------------------------- + LLEditWearableDictionary(); + virtual ~LLEditWearableDictionary(); + + //-------------------------------------------------------------------- + // Wearable Types + //-------------------------------------------------------------------- public: - struct WearableEntry : public LLDictionaryEntry - { - WearableEntry(LLWearableType::EType type, - const std::string &title, - const std::string &desc_title, - U8 num_color_swatches, // number of 'color_swatches' - U8 num_texture_pickers, // number of 'texture_pickers' - U8 num_subparts, ... ); // number of subparts followed by a list of ETextureIndex and ESubparts - - - const LLWearableType::EType mWearableType; - const std::string mTitle; - const std::string mDescTitle; - subpart_vec_t mSubparts; - texture_vec_t mColorSwatchCtrls; - texture_vec_t mTextureCtrls; - }; - - struct Wearables : public LLDictionary<LLWearableType::EType, WearableEntry> - { - Wearables(); - } mWearables; - - const WearableEntry* getWearable(LLWearableType::EType type) const { return mWearables.lookup(type); } - - //-------------------------------------------------------------------- - // Subparts - //-------------------------------------------------------------------- + struct WearableEntry : public LLDictionaryEntry + { + WearableEntry(LLWearableType::EType type, + const std::string &title, + const std::string &desc_title, + U8 num_color_swatches, // number of 'color_swatches' + U8 num_texture_pickers, // number of 'texture_pickers' + U8 num_subparts, ... ); // number of subparts followed by a list of ETextureIndex and ESubparts + + + const LLWearableType::EType mWearableType; + const std::string mTitle; + const std::string mDescTitle; + subpart_vec_t mSubparts; + texture_vec_t mColorSwatchCtrls; + texture_vec_t mTextureCtrls; + }; + + struct Wearables : public LLDictionary<LLWearableType::EType, WearableEntry> + { + Wearables(); + } mWearables; + + const WearableEntry* getWearable(LLWearableType::EType type) const { return mWearables.lookup(type); } + + //-------------------------------------------------------------------- + // Subparts + //-------------------------------------------------------------------- public: - struct SubpartEntry : public LLDictionaryEntry - { - SubpartEntry(ESubpart part, - const std::string &joint, - const std::string &edit_group, - const std::string ¶m_list, - const std::string &accordion_tab, - const LLVector3d &target_offset, - const LLVector3d &camera_offset, - const ESex &sex); - - ESubpart mSubpart; - std::string mTargetJoint; - std::string mEditGroup; - std::string mParamList; - std::string mAccordionTab; - LLVector3d mTargetOffset; - LLVector3d mCameraOffset; - ESex mSex; - }; - - struct Subparts : public LLDictionary<ESubpart, SubpartEntry> - { - Subparts(); - } mSubparts; - - const SubpartEntry* getSubpart(ESubpart subpart) const { return mSubparts.lookup(subpart); } - - //-------------------------------------------------------------------- - // Picker Control Entries - //-------------------------------------------------------------------- + struct SubpartEntry : public LLDictionaryEntry + { + SubpartEntry(ESubpart part, + const std::string &joint, + const std::string &edit_group, + const std::string ¶m_list, + const std::string &accordion_tab, + const LLVector3d &target_offset, + const LLVector3d &camera_offset, + const ESex &sex); + + ESubpart mSubpart; + std::string mTargetJoint; + std::string mEditGroup; + std::string mParamList; + std::string mAccordionTab; + LLVector3d mTargetOffset; + LLVector3d mCameraOffset; + ESex mSex; + }; + + struct Subparts : public LLDictionary<ESubpart, SubpartEntry> + { + Subparts(); + } mSubparts; + + const SubpartEntry* getSubpart(ESubpart subpart) const { return mSubparts.lookup(subpart); } + + //-------------------------------------------------------------------- + // Picker Control Entries + //-------------------------------------------------------------------- public: - struct PickerControlEntry : public LLDictionaryEntry - { - PickerControlEntry(ETextureIndex tex_index, - const std::string name, - const LLUUID default_image_id = LLUUID::null, - const bool allow_no_texture = false); - ETextureIndex mTextureIndex; - const std::string mControlName; - const LLUUID mDefaultImageId; - const bool mAllowNoTexture; - }; - - struct ColorSwatchCtrls : public LLDictionary<ETextureIndex, PickerControlEntry> - { - ColorSwatchCtrls(); - } mColorSwatchCtrls; - - struct TextureCtrls : public LLDictionary<ETextureIndex, PickerControlEntry> - { - TextureCtrls(); - } mTextureCtrls; - - const PickerControlEntry* getTexturePicker(ETextureIndex index) const { return mTextureCtrls.lookup(index); } - const PickerControlEntry* getColorSwatch(ETextureIndex index) const { return mColorSwatchCtrls.lookup(index); } + struct PickerControlEntry : public LLDictionaryEntry + { + PickerControlEntry(ETextureIndex tex_index, + const std::string name, + const LLUUID default_image_id = LLUUID::null, + const bool allow_no_texture = false); + ETextureIndex mTextureIndex; + const std::string mControlName; + const LLUUID mDefaultImageId; + const bool mAllowNoTexture; + }; + + struct ColorSwatchCtrls : public LLDictionary<ETextureIndex, PickerControlEntry> + { + ColorSwatchCtrls(); + } mColorSwatchCtrls; + + struct TextureCtrls : public LLDictionary<ETextureIndex, PickerControlEntry> + { + TextureCtrls(); + } mTextureCtrls; + + const PickerControlEntry* getTexturePicker(ETextureIndex index) const { return mTextureCtrls.lookup(index); } + const PickerControlEntry* getColorSwatch(ETextureIndex index) const { return mColorSwatchCtrls.lookup(index); } }; LLEditWearableDictionary::LLEditWearableDictionary() @@ -221,173 +221,173 @@ LLEditWearableDictionary::~LLEditWearableDictionary() LLEditWearableDictionary::Wearables::Wearables() { - // note the subpart that is listed first is treated as "default", regardless of what order is in enum. - // Please match the order presented in XUI. -Nyx - // this will affect what camera angle is shown when first editing a wearable - addEntry(LLWearableType::WT_SHAPE, new WearableEntry(LLWearableType::WT_SHAPE,"edit_shape_title","shape_desc_text",0,0,9, SUBPART_SHAPE_WHOLE, SUBPART_SHAPE_HEAD, SUBPART_SHAPE_EYES, SUBPART_SHAPE_EARS, SUBPART_SHAPE_NOSE, SUBPART_SHAPE_MOUTH, SUBPART_SHAPE_CHIN, SUBPART_SHAPE_TORSO, SUBPART_SHAPE_LEGS)); - addEntry(LLWearableType::WT_SKIN, new WearableEntry(LLWearableType::WT_SKIN,"edit_skin_title","skin_desc_text",0,3,4, TEX_HEAD_BODYPAINT, TEX_UPPER_BODYPAINT, TEX_LOWER_BODYPAINT, SUBPART_SKIN_COLOR, SUBPART_SKIN_FACEDETAIL, SUBPART_SKIN_MAKEUP, SUBPART_SKIN_BODYDETAIL)); - addEntry(LLWearableType::WT_HAIR, new WearableEntry(LLWearableType::WT_HAIR,"edit_hair_title","hair_desc_text",0,1,4, TEX_HAIR, SUBPART_HAIR_COLOR, SUBPART_HAIR_STYLE, SUBPART_HAIR_EYEBROWS, SUBPART_HAIR_FACIAL)); - addEntry(LLWearableType::WT_EYES, new WearableEntry(LLWearableType::WT_EYES,"edit_eyes_title","eyes_desc_text",0,1,1, TEX_EYES_IRIS, SUBPART_EYES)); - addEntry(LLWearableType::WT_SHIRT, new WearableEntry(LLWearableType::WT_SHIRT,"edit_shirt_title","shirt_desc_text",1,1,1, TEX_UPPER_SHIRT, TEX_UPPER_SHIRT, SUBPART_SHIRT)); - addEntry(LLWearableType::WT_PANTS, new WearableEntry(LLWearableType::WT_PANTS,"edit_pants_title","pants_desc_text",1,1,1, TEX_LOWER_PANTS, TEX_LOWER_PANTS, SUBPART_PANTS)); - addEntry(LLWearableType::WT_SHOES, new WearableEntry(LLWearableType::WT_SHOES,"edit_shoes_title","shoes_desc_text",1,1,1, TEX_LOWER_SHOES, TEX_LOWER_SHOES, SUBPART_SHOES)); - addEntry(LLWearableType::WT_SOCKS, new WearableEntry(LLWearableType::WT_SOCKS,"edit_socks_title","socks_desc_text",1,1,1, TEX_LOWER_SOCKS, TEX_LOWER_SOCKS, SUBPART_SOCKS)); - addEntry(LLWearableType::WT_JACKET, new WearableEntry(LLWearableType::WT_JACKET,"edit_jacket_title","jacket_desc_text",1,2,1, TEX_UPPER_JACKET, TEX_UPPER_JACKET, TEX_LOWER_JACKET, SUBPART_JACKET)); - addEntry(LLWearableType::WT_GLOVES, new WearableEntry(LLWearableType::WT_GLOVES,"edit_gloves_title","gloves_desc_text",1,1,1, TEX_UPPER_GLOVES, TEX_UPPER_GLOVES, SUBPART_GLOVES)); - addEntry(LLWearableType::WT_UNDERSHIRT, new WearableEntry(LLWearableType::WT_UNDERSHIRT,"edit_undershirt_title","undershirt_desc_text",1,1,1, TEX_UPPER_UNDERSHIRT, TEX_UPPER_UNDERSHIRT, SUBPART_UNDERSHIRT)); - addEntry(LLWearableType::WT_UNDERPANTS, new WearableEntry(LLWearableType::WT_UNDERPANTS,"edit_underpants_title","underpants_desc_text",1,1,1, TEX_LOWER_UNDERPANTS, TEX_LOWER_UNDERPANTS, SUBPART_UNDERPANTS)); - addEntry(LLWearableType::WT_SKIRT, new WearableEntry(LLWearableType::WT_SKIRT,"edit_skirt_title","skirt_desc_text",1,1,1, TEX_SKIRT, TEX_SKIRT, SUBPART_SKIRT)); - addEntry(LLWearableType::WT_ALPHA, new WearableEntry(LLWearableType::WT_ALPHA,"edit_alpha_title","alpha_desc_text",0,5,1, TEX_LOWER_ALPHA, TEX_UPPER_ALPHA, TEX_HEAD_ALPHA, TEX_EYES_ALPHA, TEX_HAIR_ALPHA, SUBPART_ALPHA)); - addEntry(LLWearableType::WT_TATTOO, new WearableEntry(LLWearableType::WT_TATTOO,"edit_tattoo_title","tattoo_desc_text",1,3,1, TEX_HEAD_TATTOO, TEX_LOWER_TATTOO, TEX_UPPER_TATTOO, TEX_HEAD_TATTOO, SUBPART_TATTOO)); - addEntry(LLWearableType::WT_PHYSICS, new WearableEntry(LLWearableType::WT_PHYSICS,"edit_physics_title","physics_desc_text",0,0,6, SUBPART_PHYSICS_BREASTS_UPDOWN, SUBPART_PHYSICS_BREASTS_INOUT, SUBPART_PHYSICS_BELLY_UPDOWN, SUBPART_PHYSICS_BUTT_UPDOWN, SUBPART_PHYSICS_BUTT_LEFTRIGHT, SUBPART_PHYSICS_ADVANCED)); + // note the subpart that is listed first is treated as "default", regardless of what order is in enum. + // Please match the order presented in XUI. -Nyx + // this will affect what camera angle is shown when first editing a wearable + addEntry(LLWearableType::WT_SHAPE, new WearableEntry(LLWearableType::WT_SHAPE,"edit_shape_title","shape_desc_text",0,0,9, SUBPART_SHAPE_WHOLE, SUBPART_SHAPE_HEAD, SUBPART_SHAPE_EYES, SUBPART_SHAPE_EARS, SUBPART_SHAPE_NOSE, SUBPART_SHAPE_MOUTH, SUBPART_SHAPE_CHIN, SUBPART_SHAPE_TORSO, SUBPART_SHAPE_LEGS)); + addEntry(LLWearableType::WT_SKIN, new WearableEntry(LLWearableType::WT_SKIN,"edit_skin_title","skin_desc_text",0,3,4, TEX_HEAD_BODYPAINT, TEX_UPPER_BODYPAINT, TEX_LOWER_BODYPAINT, SUBPART_SKIN_COLOR, SUBPART_SKIN_FACEDETAIL, SUBPART_SKIN_MAKEUP, SUBPART_SKIN_BODYDETAIL)); + addEntry(LLWearableType::WT_HAIR, new WearableEntry(LLWearableType::WT_HAIR,"edit_hair_title","hair_desc_text",0,1,4, TEX_HAIR, SUBPART_HAIR_COLOR, SUBPART_HAIR_STYLE, SUBPART_HAIR_EYEBROWS, SUBPART_HAIR_FACIAL)); + addEntry(LLWearableType::WT_EYES, new WearableEntry(LLWearableType::WT_EYES,"edit_eyes_title","eyes_desc_text",0,1,1, TEX_EYES_IRIS, SUBPART_EYES)); + addEntry(LLWearableType::WT_SHIRT, new WearableEntry(LLWearableType::WT_SHIRT,"edit_shirt_title","shirt_desc_text",1,1,1, TEX_UPPER_SHIRT, TEX_UPPER_SHIRT, SUBPART_SHIRT)); + addEntry(LLWearableType::WT_PANTS, new WearableEntry(LLWearableType::WT_PANTS,"edit_pants_title","pants_desc_text",1,1,1, TEX_LOWER_PANTS, TEX_LOWER_PANTS, SUBPART_PANTS)); + addEntry(LLWearableType::WT_SHOES, new WearableEntry(LLWearableType::WT_SHOES,"edit_shoes_title","shoes_desc_text",1,1,1, TEX_LOWER_SHOES, TEX_LOWER_SHOES, SUBPART_SHOES)); + addEntry(LLWearableType::WT_SOCKS, new WearableEntry(LLWearableType::WT_SOCKS,"edit_socks_title","socks_desc_text",1,1,1, TEX_LOWER_SOCKS, TEX_LOWER_SOCKS, SUBPART_SOCKS)); + addEntry(LLWearableType::WT_JACKET, new WearableEntry(LLWearableType::WT_JACKET,"edit_jacket_title","jacket_desc_text",1,2,1, TEX_UPPER_JACKET, TEX_UPPER_JACKET, TEX_LOWER_JACKET, SUBPART_JACKET)); + addEntry(LLWearableType::WT_GLOVES, new WearableEntry(LLWearableType::WT_GLOVES,"edit_gloves_title","gloves_desc_text",1,1,1, TEX_UPPER_GLOVES, TEX_UPPER_GLOVES, SUBPART_GLOVES)); + addEntry(LLWearableType::WT_UNDERSHIRT, new WearableEntry(LLWearableType::WT_UNDERSHIRT,"edit_undershirt_title","undershirt_desc_text",1,1,1, TEX_UPPER_UNDERSHIRT, TEX_UPPER_UNDERSHIRT, SUBPART_UNDERSHIRT)); + addEntry(LLWearableType::WT_UNDERPANTS, new WearableEntry(LLWearableType::WT_UNDERPANTS,"edit_underpants_title","underpants_desc_text",1,1,1, TEX_LOWER_UNDERPANTS, TEX_LOWER_UNDERPANTS, SUBPART_UNDERPANTS)); + addEntry(LLWearableType::WT_SKIRT, new WearableEntry(LLWearableType::WT_SKIRT,"edit_skirt_title","skirt_desc_text",1,1,1, TEX_SKIRT, TEX_SKIRT, SUBPART_SKIRT)); + addEntry(LLWearableType::WT_ALPHA, new WearableEntry(LLWearableType::WT_ALPHA,"edit_alpha_title","alpha_desc_text",0,5,1, TEX_LOWER_ALPHA, TEX_UPPER_ALPHA, TEX_HEAD_ALPHA, TEX_EYES_ALPHA, TEX_HAIR_ALPHA, SUBPART_ALPHA)); + addEntry(LLWearableType::WT_TATTOO, new WearableEntry(LLWearableType::WT_TATTOO,"edit_tattoo_title","tattoo_desc_text",1,3,1, TEX_HEAD_TATTOO, TEX_LOWER_TATTOO, TEX_UPPER_TATTOO, TEX_HEAD_TATTOO, SUBPART_TATTOO)); + addEntry(LLWearableType::WT_PHYSICS, new WearableEntry(LLWearableType::WT_PHYSICS,"edit_physics_title","physics_desc_text",0,0,6, SUBPART_PHYSICS_BREASTS_UPDOWN, SUBPART_PHYSICS_BREASTS_INOUT, SUBPART_PHYSICS_BELLY_UPDOWN, SUBPART_PHYSICS_BUTT_UPDOWN, SUBPART_PHYSICS_BUTT_LEFTRIGHT, SUBPART_PHYSICS_ADVANCED)); } LLEditWearableDictionary::WearableEntry::WearableEntry(LLWearableType::EType type, - const std::string &title, - const std::string &desc_title, - U8 num_color_swatches, - U8 num_texture_pickers, - U8 num_subparts, ... ) : - LLDictionaryEntry(title), - mWearableType(type), - mTitle(title), - mDescTitle(desc_title) -{ - va_list argp; - va_start(argp, num_subparts); - - for (U8 i = 0; i < num_color_swatches; ++i) - { - ETextureIndex index = (ETextureIndex)va_arg(argp,int); - mColorSwatchCtrls.push_back(index); - } - - for (U8 i = 0; i < num_texture_pickers; ++i) - { - ETextureIndex index = (ETextureIndex)va_arg(argp,int); - mTextureCtrls.push_back(index); - } - - for (U8 i = 0; i < num_subparts; ++i) - { - ESubpart part = (ESubpart)va_arg(argp,int); - mSubparts.push_back(part); - } + const std::string &title, + const std::string &desc_title, + U8 num_color_swatches, + U8 num_texture_pickers, + U8 num_subparts, ... ) : + LLDictionaryEntry(title), + mWearableType(type), + mTitle(title), + mDescTitle(desc_title) +{ + va_list argp; + va_start(argp, num_subparts); + + for (U8 i = 0; i < num_color_swatches; ++i) + { + ETextureIndex index = (ETextureIndex)va_arg(argp,int); + mColorSwatchCtrls.push_back(index); + } + + for (U8 i = 0; i < num_texture_pickers; ++i) + { + ETextureIndex index = (ETextureIndex)va_arg(argp,int); + mTextureCtrls.push_back(index); + } + + for (U8 i = 0; i < num_subparts; ++i) + { + ESubpart part = (ESubpart)va_arg(argp,int); + mSubparts.push_back(part); + } } LLEditWearableDictionary::Subparts::Subparts() { - addEntry(SUBPART_SHAPE_WHOLE, new SubpartEntry(SUBPART_SHAPE_WHOLE, "mPelvis", "shape_body","shape_body_param_list", "shape_body_tab", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f),SEX_BOTH)); - addEntry(SUBPART_SHAPE_HEAD, new SubpartEntry(SUBPART_SHAPE_HEAD, "mHead", "shape_head", "shape_head_param_list", "shape_head_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH)); - addEntry(SUBPART_SHAPE_EYES, new SubpartEntry(SUBPART_SHAPE_EYES, "mHead", "shape_eyes", "shape_eyes_param_list", "shape_eyes_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH)); - addEntry(SUBPART_SHAPE_EARS, new SubpartEntry(SUBPART_SHAPE_EARS, "mHead", "shape_ears", "shape_ears_param_list", "shape_ears_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH)); - addEntry(SUBPART_SHAPE_NOSE, new SubpartEntry(SUBPART_SHAPE_NOSE, "mHead", "shape_nose", "shape_nose_param_list", "shape_nose_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH)); - addEntry(SUBPART_SHAPE_MOUTH, new SubpartEntry(SUBPART_SHAPE_MOUTH, "mHead", "shape_mouth", "shape_mouth_param_list", "shape_mouth_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH)); - addEntry(SUBPART_SHAPE_CHIN, new SubpartEntry(SUBPART_SHAPE_CHIN, "mHead", "shape_chin", "shape_chin_param_list", "shape_chin_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH)); - addEntry(SUBPART_SHAPE_TORSO, new SubpartEntry(SUBPART_SHAPE_TORSO, "mTorso", "shape_torso", "shape_torso_param_list", "shape_torso_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(-1.f, 0.15f, 0.3f),SEX_BOTH)); - addEntry(SUBPART_SHAPE_LEGS, new SubpartEntry(SUBPART_SHAPE_LEGS, "mPelvis", "shape_legs", "shape_legs_param_list", "shape_legs_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH)); - - addEntry(SUBPART_SKIN_COLOR, new SubpartEntry(SUBPART_SKIN_COLOR, "mHead", "skin_color", "skin_color_param_list", "skin_color_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH)); - addEntry(SUBPART_SKIN_FACEDETAIL, new SubpartEntry(SUBPART_SKIN_FACEDETAIL, "mHead", "skin_facedetail", "skin_face_param_list", "skin_face_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH)); - addEntry(SUBPART_SKIN_MAKEUP, new SubpartEntry(SUBPART_SKIN_MAKEUP, "mHead", "skin_makeup", "skin_makeup_param_list", "skin_makeup_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH)); - addEntry(SUBPART_SKIN_BODYDETAIL, new SubpartEntry(SUBPART_SKIN_BODYDETAIL, "mPelvis", "skin_bodydetail", "skin_body_param_list", "skin_body_tab", LLVector3d(0.f, 0.f, -0.2f), LLVector3d(-2.5f, 0.5f, 0.5f),SEX_BOTH)); - - addEntry(SUBPART_HAIR_COLOR, new SubpartEntry(SUBPART_HAIR_COLOR, "mHead", "hair_color", "hair_color_param_list", "hair_color_tab", LLVector3d(0.f, 0.f, 0.10f), LLVector3d(-0.4f, 0.05f, 0.10f),SEX_BOTH)); - addEntry(SUBPART_HAIR_STYLE, new SubpartEntry(SUBPART_HAIR_STYLE, "mHead", "hair_style", "hair_style_param_list", "hair_style_tab", LLVector3d(0.f, 0.f, 0.10f), LLVector3d(-0.4f, 0.05f, 0.10f),SEX_BOTH)); - addEntry(SUBPART_HAIR_EYEBROWS, new SubpartEntry(SUBPART_HAIR_EYEBROWS, "mHead", "hair_eyebrows", "hair_eyebrows_param_list", "hair_eyebrows_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH)); - addEntry(SUBPART_HAIR_FACIAL, new SubpartEntry(SUBPART_HAIR_FACIAL, "mHead", "hair_facial", "hair_facial_param_list", "hair_facial_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_MALE)); - - addEntry(SUBPART_EYES, new SubpartEntry(SUBPART_EYES, "mHead", "eyes", "eyes_main_param_list", "eyes_main_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH)); - - addEntry(SUBPART_SHIRT, new SubpartEntry(SUBPART_SHIRT, "mTorso", "shirt", "shirt_main_param_list", "shirt_main_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(-1.f, 0.15f, 0.3f),SEX_BOTH)); - addEntry(SUBPART_PANTS, new SubpartEntry(SUBPART_PANTS, "mPelvis", "pants", "pants_main_param_list", "pants_main_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH)); - addEntry(SUBPART_SHOES, new SubpartEntry(SUBPART_SHOES, "mPelvis", "shoes", "shoes_main_param_list", "shoes_main_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH)); - addEntry(SUBPART_SOCKS, new SubpartEntry(SUBPART_SOCKS, "mPelvis", "socks", "socks_main_param_list", "socks_main_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH)); - addEntry(SUBPART_JACKET, new SubpartEntry(SUBPART_JACKET, "mTorso", "jacket", "jacket_main_param_list", "jacket_main_tab", LLVector3d(0.f, 0.f, 0.f), LLVector3d(-2.f, 0.1f, 0.3f),SEX_BOTH)); - addEntry(SUBPART_SKIRT, new SubpartEntry(SUBPART_SKIRT, "mPelvis", "skirt", "skirt_main_param_list", "skirt_main_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH)); - addEntry(SUBPART_GLOVES, new SubpartEntry(SUBPART_GLOVES, "mTorso", "gloves", "gloves_main_param_list", "gloves_main_tab", LLVector3d(0.f, 0.f, 0.f), LLVector3d(-1.f, 0.15f, 0.f),SEX_BOTH)); - addEntry(SUBPART_UNDERSHIRT, new SubpartEntry(SUBPART_UNDERSHIRT, "mTorso", "undershirt", "undershirt_main_param_list", "undershirt_main_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(-1.f, 0.15f, 0.3f),SEX_BOTH)); - addEntry(SUBPART_UNDERPANTS, new SubpartEntry(SUBPART_UNDERPANTS, "mPelvis", "underpants", "underpants_main_param_list", "underpants_main_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH)); - addEntry(SUBPART_ALPHA, new SubpartEntry(SUBPART_ALPHA, "mPelvis", "alpha", "alpha_main_param_list", "alpha_main_tab", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f),SEX_BOTH)); - addEntry(SUBPART_TATTOO, new SubpartEntry(SUBPART_TATTOO, "mPelvis", "tattoo", "tattoo_main_param_list", "tattoo_main_tab", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f),SEX_BOTH)); - addEntry(SUBPART_PHYSICS_BREASTS_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BREASTS_UPDOWN, "mTorso", "physics_breasts_updown_tab", "physics_breasts_updown_param_list", "physics_breasts_updown_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_FEMALE)); - addEntry(SUBPART_PHYSICS_BREASTS_INOUT, new SubpartEntry(SUBPART_PHYSICS_BREASTS_INOUT, "mTorso", "physics_breasts_inout_tab", "physics_breasts_inout_param_list", "physics_breasts_inout_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_FEMALE)); - addEntry(SUBPART_PHYSICS_BELLY_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BELLY_UPDOWN, "mTorso", "physics_belly_updown_tab", "physics_belly_updown_param_list", "physics_belly_updown_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH)); - addEntry(SUBPART_PHYSICS_BUTT_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BUTT_UPDOWN, "mTorso", "physics_butt_updown_tab", "physics_butt_updown_param_list", "physics_butt_updown_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH)); - addEntry(SUBPART_PHYSICS_BUTT_LEFTRIGHT, new SubpartEntry(SUBPART_PHYSICS_BUTT_LEFTRIGHT, "mTorso", "physics_butt_leftright_tab", "physics_butt_leftright_param_list", "physics_butt_leftright_tab", LLVector3d(0.f, 0.f, 0.f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH)); - addEntry(SUBPART_PHYSICS_ADVANCED, new SubpartEntry(SUBPART_PHYSICS_ADVANCED, "mTorso", "physics_advanced_tab", "physics_advanced_param_list", "physics_advanced_tab", LLVector3d(0.f, 0.f, 0.f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH)); + addEntry(SUBPART_SHAPE_WHOLE, new SubpartEntry(SUBPART_SHAPE_WHOLE, "mPelvis", "shape_body","shape_body_param_list", "shape_body_tab", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f),SEX_BOTH)); + addEntry(SUBPART_SHAPE_HEAD, new SubpartEntry(SUBPART_SHAPE_HEAD, "mHead", "shape_head", "shape_head_param_list", "shape_head_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH)); + addEntry(SUBPART_SHAPE_EYES, new SubpartEntry(SUBPART_SHAPE_EYES, "mHead", "shape_eyes", "shape_eyes_param_list", "shape_eyes_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH)); + addEntry(SUBPART_SHAPE_EARS, new SubpartEntry(SUBPART_SHAPE_EARS, "mHead", "shape_ears", "shape_ears_param_list", "shape_ears_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH)); + addEntry(SUBPART_SHAPE_NOSE, new SubpartEntry(SUBPART_SHAPE_NOSE, "mHead", "shape_nose", "shape_nose_param_list", "shape_nose_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH)); + addEntry(SUBPART_SHAPE_MOUTH, new SubpartEntry(SUBPART_SHAPE_MOUTH, "mHead", "shape_mouth", "shape_mouth_param_list", "shape_mouth_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH)); + addEntry(SUBPART_SHAPE_CHIN, new SubpartEntry(SUBPART_SHAPE_CHIN, "mHead", "shape_chin", "shape_chin_param_list", "shape_chin_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH)); + addEntry(SUBPART_SHAPE_TORSO, new SubpartEntry(SUBPART_SHAPE_TORSO, "mTorso", "shape_torso", "shape_torso_param_list", "shape_torso_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(-1.f, 0.15f, 0.3f),SEX_BOTH)); + addEntry(SUBPART_SHAPE_LEGS, new SubpartEntry(SUBPART_SHAPE_LEGS, "mPelvis", "shape_legs", "shape_legs_param_list", "shape_legs_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH)); + + addEntry(SUBPART_SKIN_COLOR, new SubpartEntry(SUBPART_SKIN_COLOR, "mHead", "skin_color", "skin_color_param_list", "skin_color_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH)); + addEntry(SUBPART_SKIN_FACEDETAIL, new SubpartEntry(SUBPART_SKIN_FACEDETAIL, "mHead", "skin_facedetail", "skin_face_param_list", "skin_face_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH)); + addEntry(SUBPART_SKIN_MAKEUP, new SubpartEntry(SUBPART_SKIN_MAKEUP, "mHead", "skin_makeup", "skin_makeup_param_list", "skin_makeup_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH)); + addEntry(SUBPART_SKIN_BODYDETAIL, new SubpartEntry(SUBPART_SKIN_BODYDETAIL, "mPelvis", "skin_bodydetail", "skin_body_param_list", "skin_body_tab", LLVector3d(0.f, 0.f, -0.2f), LLVector3d(-2.5f, 0.5f, 0.5f),SEX_BOTH)); + + addEntry(SUBPART_HAIR_COLOR, new SubpartEntry(SUBPART_HAIR_COLOR, "mHead", "hair_color", "hair_color_param_list", "hair_color_tab", LLVector3d(0.f, 0.f, 0.10f), LLVector3d(-0.4f, 0.05f, 0.10f),SEX_BOTH)); + addEntry(SUBPART_HAIR_STYLE, new SubpartEntry(SUBPART_HAIR_STYLE, "mHead", "hair_style", "hair_style_param_list", "hair_style_tab", LLVector3d(0.f, 0.f, 0.10f), LLVector3d(-0.4f, 0.05f, 0.10f),SEX_BOTH)); + addEntry(SUBPART_HAIR_EYEBROWS, new SubpartEntry(SUBPART_HAIR_EYEBROWS, "mHead", "hair_eyebrows", "hair_eyebrows_param_list", "hair_eyebrows_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH)); + addEntry(SUBPART_HAIR_FACIAL, new SubpartEntry(SUBPART_HAIR_FACIAL, "mHead", "hair_facial", "hair_facial_param_list", "hair_facial_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_MALE)); + + addEntry(SUBPART_EYES, new SubpartEntry(SUBPART_EYES, "mHead", "eyes", "eyes_main_param_list", "eyes_main_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH)); + + addEntry(SUBPART_SHIRT, new SubpartEntry(SUBPART_SHIRT, "mTorso", "shirt", "shirt_main_param_list", "shirt_main_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(-1.f, 0.15f, 0.3f),SEX_BOTH)); + addEntry(SUBPART_PANTS, new SubpartEntry(SUBPART_PANTS, "mPelvis", "pants", "pants_main_param_list", "pants_main_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH)); + addEntry(SUBPART_SHOES, new SubpartEntry(SUBPART_SHOES, "mPelvis", "shoes", "shoes_main_param_list", "shoes_main_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH)); + addEntry(SUBPART_SOCKS, new SubpartEntry(SUBPART_SOCKS, "mPelvis", "socks", "socks_main_param_list", "socks_main_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH)); + addEntry(SUBPART_JACKET, new SubpartEntry(SUBPART_JACKET, "mTorso", "jacket", "jacket_main_param_list", "jacket_main_tab", LLVector3d(0.f, 0.f, 0.f), LLVector3d(-2.f, 0.1f, 0.3f),SEX_BOTH)); + addEntry(SUBPART_SKIRT, new SubpartEntry(SUBPART_SKIRT, "mPelvis", "skirt", "skirt_main_param_list", "skirt_main_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH)); + addEntry(SUBPART_GLOVES, new SubpartEntry(SUBPART_GLOVES, "mTorso", "gloves", "gloves_main_param_list", "gloves_main_tab", LLVector3d(0.f, 0.f, 0.f), LLVector3d(-1.f, 0.15f, 0.f),SEX_BOTH)); + addEntry(SUBPART_UNDERSHIRT, new SubpartEntry(SUBPART_UNDERSHIRT, "mTorso", "undershirt", "undershirt_main_param_list", "undershirt_main_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(-1.f, 0.15f, 0.3f),SEX_BOTH)); + addEntry(SUBPART_UNDERPANTS, new SubpartEntry(SUBPART_UNDERPANTS, "mPelvis", "underpants", "underpants_main_param_list", "underpants_main_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH)); + addEntry(SUBPART_ALPHA, new SubpartEntry(SUBPART_ALPHA, "mPelvis", "alpha", "alpha_main_param_list", "alpha_main_tab", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f),SEX_BOTH)); + addEntry(SUBPART_TATTOO, new SubpartEntry(SUBPART_TATTOO, "mPelvis", "tattoo", "tattoo_main_param_list", "tattoo_main_tab", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f),SEX_BOTH)); + addEntry(SUBPART_PHYSICS_BREASTS_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BREASTS_UPDOWN, "mTorso", "physics_breasts_updown", "physics_breasts_updown_param_list", "physics_breasts_updown_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_FEMALE)); + addEntry(SUBPART_PHYSICS_BREASTS_INOUT, new SubpartEntry(SUBPART_PHYSICS_BREASTS_INOUT, "mTorso", "physics_breasts_inout", "physics_breasts_inout_param_list", "physics_breasts_inout_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_FEMALE)); + addEntry(SUBPART_PHYSICS_BELLY_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BELLY_UPDOWN, "mTorso", "physics_belly_updown", "physics_belly_updown_param_list", "physics_belly_updown_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH)); + addEntry(SUBPART_PHYSICS_BUTT_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BUTT_UPDOWN, "mTorso", "physics_butt_updown", "physics_butt_updown_param_list", "physics_butt_updown_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH)); + addEntry(SUBPART_PHYSICS_BUTT_LEFTRIGHT, new SubpartEntry(SUBPART_PHYSICS_BUTT_LEFTRIGHT, "mTorso", "physics_butt_leftright", "physics_butt_leftright_param_list", "physics_butt_leftright_tab", LLVector3d(0.f, 0.f, 0.f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH)); + addEntry(SUBPART_PHYSICS_ADVANCED, new SubpartEntry(SUBPART_PHYSICS_ADVANCED, "mTorso", "physics_advanced", "physics_advanced_param_list", "physics_advanced_tab", LLVector3d(0.f, 0.f, 0.f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH)); } LLEditWearableDictionary::SubpartEntry::SubpartEntry(ESubpart part, - const std::string &joint, - const std::string &edit_group, - const std::string ¶m_list, - const std::string &accordion_tab, - const LLVector3d &target_offset, - const LLVector3d &camera_offset, - const ESex &sex) : - LLDictionaryEntry(edit_group), - mSubpart(part), - mTargetJoint(joint), - mEditGroup(edit_group), - mParamList(param_list), - mAccordionTab(accordion_tab), - mTargetOffset(target_offset), - mCameraOffset(camera_offset), - mSex(sex) + const std::string &joint, + const std::string &edit_group, + const std::string ¶m_list, + const std::string &accordion_tab, + const LLVector3d &target_offset, + const LLVector3d &camera_offset, + const ESex &sex) : + LLDictionaryEntry(edit_group), + mSubpart(part), + mTargetJoint(joint), + mEditGroup(edit_group), + mParamList(param_list), + mAccordionTab(accordion_tab), + mTargetOffset(target_offset), + mCameraOffset(camera_offset), + mSex(sex) { } LLEditWearableDictionary::ColorSwatchCtrls::ColorSwatchCtrls() { - addEntry ( TEX_UPPER_SHIRT, new PickerControlEntry (TEX_UPPER_SHIRT, "Color/Tint" )); - addEntry ( TEX_LOWER_PANTS, new PickerControlEntry (TEX_LOWER_PANTS, "Color/Tint" )); - addEntry ( TEX_LOWER_SHOES, new PickerControlEntry (TEX_LOWER_SHOES, "Color/Tint" )); - addEntry ( TEX_LOWER_SOCKS, new PickerControlEntry (TEX_LOWER_SOCKS, "Color/Tint" )); - addEntry ( TEX_UPPER_JACKET, new PickerControlEntry (TEX_UPPER_JACKET, "Color/Tint" )); - addEntry ( TEX_SKIRT, new PickerControlEntry (TEX_SKIRT, "Color/Tint" )); - addEntry ( TEX_UPPER_GLOVES, new PickerControlEntry (TEX_UPPER_GLOVES, "Color/Tint" )); - addEntry ( TEX_UPPER_UNDERSHIRT, new PickerControlEntry (TEX_UPPER_UNDERSHIRT, "Color/Tint" )); - addEntry ( TEX_LOWER_UNDERPANTS, new PickerControlEntry (TEX_LOWER_UNDERPANTS, "Color/Tint" )); - addEntry ( TEX_HEAD_TATTOO, new PickerControlEntry(TEX_HEAD_TATTOO, "Color/Tint" )); + addEntry ( TEX_UPPER_SHIRT, new PickerControlEntry (TEX_UPPER_SHIRT, "Color/Tint" )); + addEntry ( TEX_LOWER_PANTS, new PickerControlEntry (TEX_LOWER_PANTS, "Color/Tint" )); + addEntry ( TEX_LOWER_SHOES, new PickerControlEntry (TEX_LOWER_SHOES, "Color/Tint" )); + addEntry ( TEX_LOWER_SOCKS, new PickerControlEntry (TEX_LOWER_SOCKS, "Color/Tint" )); + addEntry ( TEX_UPPER_JACKET, new PickerControlEntry (TEX_UPPER_JACKET, "Color/Tint" )); + addEntry ( TEX_SKIRT, new PickerControlEntry (TEX_SKIRT, "Color/Tint" )); + addEntry ( TEX_UPPER_GLOVES, new PickerControlEntry (TEX_UPPER_GLOVES, "Color/Tint" )); + addEntry ( TEX_UPPER_UNDERSHIRT, new PickerControlEntry (TEX_UPPER_UNDERSHIRT, "Color/Tint" )); + addEntry ( TEX_LOWER_UNDERPANTS, new PickerControlEntry (TEX_LOWER_UNDERPANTS, "Color/Tint" )); + addEntry ( TEX_HEAD_TATTOO, new PickerControlEntry(TEX_HEAD_TATTOO, "Color/Tint" )); } LLEditWearableDictionary::TextureCtrls::TextureCtrls() { - addEntry ( TEX_HEAD_BODYPAINT, new PickerControlEntry (TEX_HEAD_BODYPAINT, "Head Tattoos", LLUUID::null, TRUE )); - addEntry ( TEX_UPPER_BODYPAINT, new PickerControlEntry (TEX_UPPER_BODYPAINT, "Upper Tattoos", LLUUID::null, TRUE )); - addEntry ( TEX_LOWER_BODYPAINT, new PickerControlEntry (TEX_LOWER_BODYPAINT, "Lower Tattoos", LLUUID::null, TRUE )); - addEntry ( TEX_HAIR, new PickerControlEntry (TEX_HAIR, "Texture", LLUUID( gSavedSettings.getString( "UIImgDefaultHairUUID" ) ), FALSE )); - addEntry ( TEX_EYES_IRIS, new PickerControlEntry (TEX_EYES_IRIS, "Iris", LLUUID( gSavedSettings.getString( "UIImgDefaultEyesUUID" ) ), FALSE )); - addEntry ( TEX_UPPER_SHIRT, new PickerControlEntry (TEX_UPPER_SHIRT, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultShirtUUID" ) ), FALSE )); - addEntry ( TEX_LOWER_PANTS, new PickerControlEntry (TEX_LOWER_PANTS, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultPantsUUID" ) ), FALSE )); - addEntry ( TEX_LOWER_SHOES, new PickerControlEntry (TEX_LOWER_SHOES, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultShoesUUID" ) ), FALSE )); - addEntry ( TEX_LOWER_SOCKS, new PickerControlEntry (TEX_LOWER_SOCKS, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultSocksUUID" ) ), FALSE )); - addEntry ( TEX_UPPER_JACKET, new PickerControlEntry (TEX_UPPER_JACKET, "Upper Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultJacketUUID" ) ), FALSE )); - addEntry ( TEX_LOWER_JACKET, new PickerControlEntry (TEX_LOWER_JACKET, "Lower Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultJacketUUID" ) ), FALSE )); - addEntry ( TEX_SKIRT, new PickerControlEntry (TEX_SKIRT, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultSkirtUUID" ) ), FALSE )); - addEntry ( TEX_UPPER_GLOVES, new PickerControlEntry (TEX_UPPER_GLOVES, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultGlovesUUID" ) ), FALSE )); - addEntry ( TEX_UPPER_UNDERSHIRT, new PickerControlEntry (TEX_UPPER_UNDERSHIRT, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultUnderwearUUID" ) ), FALSE )); - addEntry ( TEX_LOWER_UNDERPANTS, new PickerControlEntry (TEX_LOWER_UNDERPANTS, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultUnderwearUUID" ) ), FALSE )); - addEntry ( TEX_LOWER_ALPHA, new PickerControlEntry (TEX_LOWER_ALPHA, "Lower Alpha", LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ), TRUE )); - addEntry ( TEX_UPPER_ALPHA, new PickerControlEntry (TEX_UPPER_ALPHA, "Upper Alpha", LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ), TRUE )); - addEntry ( TEX_HEAD_ALPHA, new PickerControlEntry (TEX_HEAD_ALPHA, "Head Alpha", LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ), TRUE )); - addEntry ( TEX_EYES_ALPHA, new PickerControlEntry (TEX_EYES_ALPHA, "Eye Alpha", LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ), TRUE )); - addEntry ( TEX_HAIR_ALPHA, new PickerControlEntry (TEX_HAIR_ALPHA, "Hair Alpha", LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ), TRUE )); - addEntry ( TEX_LOWER_TATTOO, new PickerControlEntry (TEX_LOWER_TATTOO, "Lower Tattoo", LLUUID::null, TRUE )); - addEntry ( TEX_UPPER_TATTOO, new PickerControlEntry (TEX_UPPER_TATTOO, "Upper Tattoo", LLUUID::null, TRUE )); - addEntry ( TEX_HEAD_TATTOO, new PickerControlEntry (TEX_HEAD_TATTOO, "Head Tattoo", LLUUID::null, TRUE )); + addEntry ( TEX_HEAD_BODYPAINT, new PickerControlEntry (TEX_HEAD_BODYPAINT, "Head Tattoos", LLUUID::null, TRUE )); + addEntry ( TEX_UPPER_BODYPAINT, new PickerControlEntry (TEX_UPPER_BODYPAINT, "Upper Tattoos", LLUUID::null, TRUE )); + addEntry ( TEX_LOWER_BODYPAINT, new PickerControlEntry (TEX_LOWER_BODYPAINT, "Lower Tattoos", LLUUID::null, TRUE )); + addEntry ( TEX_HAIR, new PickerControlEntry (TEX_HAIR, "Texture", LLUUID( gSavedSettings.getString( "UIImgDefaultHairUUID" ) ), FALSE )); + addEntry ( TEX_EYES_IRIS, new PickerControlEntry (TEX_EYES_IRIS, "Iris", LLUUID( gSavedSettings.getString( "UIImgDefaultEyesUUID" ) ), FALSE )); + addEntry ( TEX_UPPER_SHIRT, new PickerControlEntry (TEX_UPPER_SHIRT, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultShirtUUID" ) ), FALSE )); + addEntry ( TEX_LOWER_PANTS, new PickerControlEntry (TEX_LOWER_PANTS, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultPantsUUID" ) ), FALSE )); + addEntry ( TEX_LOWER_SHOES, new PickerControlEntry (TEX_LOWER_SHOES, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultShoesUUID" ) ), FALSE )); + addEntry ( TEX_LOWER_SOCKS, new PickerControlEntry (TEX_LOWER_SOCKS, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultSocksUUID" ) ), FALSE )); + addEntry ( TEX_UPPER_JACKET, new PickerControlEntry (TEX_UPPER_JACKET, "Upper Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultJacketUUID" ) ), FALSE )); + addEntry ( TEX_LOWER_JACKET, new PickerControlEntry (TEX_LOWER_JACKET, "Lower Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultJacketUUID" ) ), FALSE )); + addEntry ( TEX_SKIRT, new PickerControlEntry (TEX_SKIRT, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultSkirtUUID" ) ), FALSE )); + addEntry ( TEX_UPPER_GLOVES, new PickerControlEntry (TEX_UPPER_GLOVES, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultGlovesUUID" ) ), FALSE )); + addEntry ( TEX_UPPER_UNDERSHIRT, new PickerControlEntry (TEX_UPPER_UNDERSHIRT, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultUnderwearUUID" ) ), FALSE )); + addEntry ( TEX_LOWER_UNDERPANTS, new PickerControlEntry (TEX_LOWER_UNDERPANTS, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultUnderwearUUID" ) ), FALSE )); + addEntry ( TEX_LOWER_ALPHA, new PickerControlEntry (TEX_LOWER_ALPHA, "Lower Alpha", LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ), TRUE )); + addEntry ( TEX_UPPER_ALPHA, new PickerControlEntry (TEX_UPPER_ALPHA, "Upper Alpha", LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ), TRUE )); + addEntry ( TEX_HEAD_ALPHA, new PickerControlEntry (TEX_HEAD_ALPHA, "Head Alpha", LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ), TRUE )); + addEntry ( TEX_EYES_ALPHA, new PickerControlEntry (TEX_EYES_ALPHA, "Eye Alpha", LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ), TRUE )); + addEntry ( TEX_HAIR_ALPHA, new PickerControlEntry (TEX_HAIR_ALPHA, "Hair Alpha", LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ), TRUE )); + addEntry ( TEX_LOWER_TATTOO, new PickerControlEntry (TEX_LOWER_TATTOO, "Lower Tattoo", LLUUID::null, TRUE )); + addEntry ( TEX_UPPER_TATTOO, new PickerControlEntry (TEX_UPPER_TATTOO, "Upper Tattoo", LLUUID::null, TRUE )); + addEntry ( TEX_HEAD_TATTOO, new PickerControlEntry (TEX_HEAD_TATTOO, "Head Tattoo", LLUUID::null, TRUE )); } LLEditWearableDictionary::PickerControlEntry::PickerControlEntry(ETextureIndex tex_index, - const std::string name, - const LLUUID default_image_id, - const bool allow_no_texture) : - LLDictionaryEntry(name), - mTextureIndex(tex_index), - mControlName(name), - mDefaultImageId(default_image_id), - mAllowNoTexture(allow_no_texture) + const std::string name, + const LLUUID default_image_id, + const bool allow_no_texture) : + LLDictionaryEntry(name), + mTextureIndex(tex_index), + mControlName(name), + mDefaultImageId(default_image_id), + mAllowNoTexture(allow_no_texture) { } @@ -397,13 +397,13 @@ LLEditWearableDictionary::PickerControlEntry::PickerControlEntry(ETextureIndex t class LLLabledBackButton : public LLButton { public: - struct Params : public LLInitParam::Block<Params, LLButton::Params> - { - Params() {} - }; + struct Params : public LLInitParam::Block<Params, LLButton::Params> + { + Params() {} + }; protected: - friend class LLUICtrlFactory; - LLLabledBackButton(const Params&); + friend class LLUICtrlFactory; + LLLabledBackButton(const Params&); }; static LLDefaultChildRegistry::Register<LLLabledBackButton> labeled_back_btn("labeled_back_button"); @@ -411,9 +411,9 @@ static LLDefaultChildRegistry::Register<LLLabledBackButton> labeled_back_btn("la LLLabledBackButton::LLLabledBackButton(const Params& params) : LLButton(params) { - // override hack in LLButton's constructor to use paddings have been set in xml - setLeftHPad(params.pad_left); - setRightHPad(params.pad_right); + // override hack in LLButton's constructor to use paddings have been set in xml + setLeftHPad(params.pad_left); + setRightHPad(params.pad_right); } // Helper functions. @@ -434,13 +434,13 @@ typedef boost::function<void(LLPanel* panel, const LLEditWearableDictionary::Pic typedef struct PickerControlEntryNamePredicate { - PickerControlEntryNamePredicate(const std::string name) : mName (name) {}; - bool operator()(const LLEditWearableDictionary::PickerControlEntry* entry) const - { - return (entry && entry->mName == mName); - } + PickerControlEntryNamePredicate(const std::string name) : mName (name) {}; + bool operator()(const LLEditWearableDictionary::PickerControlEntry* entry) const + { + return (entry && entry->mName == mName); + } private: - const std::string mName; + const std::string mName; } PickerControlEntryNamePredicate; // A full specialization of get_pickers_indexes for LLColorSwatchCtrl @@ -448,12 +448,12 @@ template <> const texture_vec_t& get_pickers_indexes<LLColorSwatchCtrl> (const LLEditWearableDictionary::WearableEntry *wearable_entry) { - if (!wearable_entry) - { - llwarns << "could not get LLColorSwatchCtrl indexes for null wearable entry." << llendl; - return null_texture_vec; - } - return wearable_entry->mColorSwatchCtrls; + if (!wearable_entry) + { + llwarns << "could not get LLColorSwatchCtrl indexes for null wearable entry." << llendl; + return null_texture_vec; + } + return wearable_entry->mColorSwatchCtrls; } // A full specialization of get_pickers_indexes for LLTextureCtrl @@ -461,12 +461,12 @@ template <> const texture_vec_t& get_pickers_indexes<LLTextureCtrl> (const LLEditWearableDictionary::WearableEntry *wearable_entry) { - if (!wearable_entry) - { - llwarns << "could not get LLTextureCtrl indexes for null wearable entry." << llendl; - return null_texture_vec; - } - return wearable_entry->mTextureCtrls; + if (!wearable_entry) + { + llwarns << "could not get LLTextureCtrl indexes for null wearable entry." << llendl; + return null_texture_vec; + } + return wearable_entry->mTextureCtrls; } // A full specialization of get_picker_entry for LLColorSwatchCtrl @@ -474,7 +474,7 @@ template <> const LLEditWearableDictionary::PickerControlEntry* get_picker_entry<LLColorSwatchCtrl> (const ETextureIndex index) { - return LLEditWearableDictionary::getInstance()->getColorSwatch(index); + return LLEditWearableDictionary::getInstance()->getColorSwatch(index); } // A full specialization of get_picker_entry for LLTextureCtrl @@ -482,162 +482,162 @@ template <> const LLEditWearableDictionary::PickerControlEntry* get_picker_entry<LLTextureCtrl> (const ETextureIndex index) { - return LLEditWearableDictionary::getInstance()->getTexturePicker(index); + return LLEditWearableDictionary::getInstance()->getTexturePicker(index); } template <typename CtrlType, class Predicate> const LLEditWearableDictionary::PickerControlEntry* find_picker_ctrl_entry_if(LLWearableType::EType type, const Predicate pred) { - const LLEditWearableDictionary::WearableEntry *wearable_entry - = LLEditWearableDictionary::getInstance()->getWearable(type); - if (!wearable_entry) - { - llwarns << "could not get wearable dictionary entry for wearable of type: " << type << llendl; - return NULL; - } - const texture_vec_t& indexes = get_pickers_indexes<CtrlType>(wearable_entry); - for (texture_vec_t::const_iterator - iter = indexes.begin(), - iter_end = indexes.end(); - iter != iter_end; ++iter) - { - const ETextureIndex te = *iter; - const LLEditWearableDictionary::PickerControlEntry* entry - = get_picker_entry<CtrlType>(te); - if (!entry) - { - llwarns << "could not get picker dictionary entry (" << te << ") for wearable of type: " << type << llendl; - continue; - } - if (pred(entry)) - { - return entry; - } - } - return NULL; + const LLEditWearableDictionary::WearableEntry *wearable_entry + = LLEditWearableDictionary::getInstance()->getWearable(type); + if (!wearable_entry) + { + llwarns << "could not get wearable dictionary entry for wearable of type: " << type << llendl; + return NULL; + } + const texture_vec_t& indexes = get_pickers_indexes<CtrlType>(wearable_entry); + for (texture_vec_t::const_iterator + iter = indexes.begin(), + iter_end = indexes.end(); + iter != iter_end; ++iter) + { + const ETextureIndex te = *iter; + const LLEditWearableDictionary::PickerControlEntry* entry + = get_picker_entry<CtrlType>(te); + if (!entry) + { + llwarns << "could not get picker dictionary entry (" << te << ") for wearable of type: " << type << llendl; + continue; + } + if (pred(entry)) + { + return entry; + } + } + return NULL; } template <typename CtrlType> void for_each_picker_ctrl_entry(LLPanel* panel, LLWearableType::EType type, function_t fun) { - if (!panel) - { - llwarns << "the panel wasn't passed for wearable of type: " << type << llendl; - return; - } - const LLEditWearableDictionary::WearableEntry *wearable_entry - = LLEditWearableDictionary::getInstance()->getWearable(type); - if (!wearable_entry) - { - llwarns << "could not get wearable dictionary entry for wearable of type: " << type << llendl; - return; - } - const texture_vec_t& indexes = get_pickers_indexes<CtrlType>(wearable_entry); - for (texture_vec_t::const_iterator - iter = indexes.begin(), - iter_end = indexes.end(); - iter != iter_end; ++iter) - { - const ETextureIndex te = *iter; - const LLEditWearableDictionary::PickerControlEntry* entry - = get_picker_entry<CtrlType>(te); - if (!entry) - { - llwarns << "could not get picker dictionary entry (" << te << ") for wearable of type: " << type << llendl; - continue; - } - fun (panel, entry); - } + if (!panel) + { + llwarns << "the panel wasn't passed for wearable of type: " << type << llendl; + return; + } + const LLEditWearableDictionary::WearableEntry *wearable_entry + = LLEditWearableDictionary::getInstance()->getWearable(type); + if (!wearable_entry) + { + llwarns << "could not get wearable dictionary entry for wearable of type: " << type << llendl; + return; + } + const texture_vec_t& indexes = get_pickers_indexes<CtrlType>(wearable_entry); + for (texture_vec_t::const_iterator + iter = indexes.begin(), + iter_end = indexes.end(); + iter != iter_end; ++iter) + { + const ETextureIndex te = *iter; + const LLEditWearableDictionary::PickerControlEntry* entry + = get_picker_entry<CtrlType>(te); + if (!entry) + { + llwarns << "could not get picker dictionary entry (" << te << ") for wearable of type: " << type << llendl; + continue; + } + fun (panel, entry); + } } // The helper functions for pickers management static void init_color_swatch_ctrl(LLPanelEditWearable* self, LLPanel* panel, const LLEditWearableDictionary::PickerControlEntry* entry) { - LLColorSwatchCtrl* color_swatch_ctrl = panel->getChild<LLColorSwatchCtrl>(entry->mControlName); - if (color_swatch_ctrl) - { - // Can't get the color from the wearable here, since the wearable may not be set when this is called. - color_swatch_ctrl->setOriginal(LLColor4::white); - } + LLColorSwatchCtrl* color_swatch_ctrl = panel->getChild<LLColorSwatchCtrl>(entry->mControlName); + if (color_swatch_ctrl) + { + // Can't get the color from the wearable here, since the wearable may not be set when this is called. + color_swatch_ctrl->setOriginal(LLColor4::white); + } } static void init_texture_ctrl(LLPanelEditWearable* self, LLPanel* panel, const LLEditWearableDictionary::PickerControlEntry* entry) { - LLTextureCtrl* texture_ctrl = panel->getChild<LLTextureCtrl>(entry->mControlName); - if (texture_ctrl) - { - texture_ctrl->setDefaultImageAssetID(entry->mDefaultImageId); - texture_ctrl->setAllowNoTexture(entry->mAllowNoTexture); - // Don't allow (no copy) or (notransfer) textures to be selected. - texture_ctrl->setImmediateFilterPermMask(PERM_NONE); - texture_ctrl->setNonImmediateFilterPermMask(PERM_NONE); - } + LLTextureCtrl* texture_ctrl = panel->getChild<LLTextureCtrl>(entry->mControlName); + if (texture_ctrl) + { + texture_ctrl->setDefaultImageAssetID(entry->mDefaultImageId); + texture_ctrl->setAllowNoTexture(entry->mAllowNoTexture); + // Don't allow (no copy) or (notransfer) textures to be selected. + texture_ctrl->setImmediateFilterPermMask(PERM_NONE); + texture_ctrl->setNonImmediateFilterPermMask(PERM_NONE); + } } static void update_color_swatch_ctrl(LLPanelEditWearable* self, LLPanel* panel, const LLEditWearableDictionary::PickerControlEntry* entry) { - LLColorSwatchCtrl* color_swatch_ctrl = panel->getChild<LLColorSwatchCtrl>(entry->mControlName); - if (color_swatch_ctrl) - { - color_swatch_ctrl->set(self->getWearable()->getClothesColor(entry->mTextureIndex)); - color_swatch_ctrl->closeFloaterColorPicker(); - } + LLColorSwatchCtrl* color_swatch_ctrl = panel->getChild<LLColorSwatchCtrl>(entry->mControlName); + if (color_swatch_ctrl) + { + color_swatch_ctrl->set(self->getWearable()->getClothesColor(entry->mTextureIndex)); + color_swatch_ctrl->closeFloaterColorPicker(); + } } static void update_texture_ctrl(LLPanelEditWearable* self, LLPanel* panel, const LLEditWearableDictionary::PickerControlEntry* entry) { - LLTextureCtrl* texture_ctrl = panel->getChild<LLTextureCtrl>(entry->mControlName); - if (texture_ctrl) - { - LLUUID new_id; - LLLocalTextureObject *lto = self->getWearable()->getLocalTextureObject(entry->mTextureIndex); - if( lto && (lto->getID() != IMG_DEFAULT_AVATAR) ) - { - new_id = lto->getID(); - } - else - { - new_id = LLUUID::null; - } - LLUUID old_id = texture_ctrl->getImageAssetID(); - if (old_id != new_id) - { - // texture has changed, close the floater to avoid DEV-22461 - texture_ctrl->closeDependentFloater(); - } - texture_ctrl->setImageAssetID(new_id); - } + LLTextureCtrl* texture_ctrl = panel->getChild<LLTextureCtrl>(entry->mControlName); + if (texture_ctrl) + { + LLUUID new_id; + LLLocalTextureObject *lto = self->getWearable()->getLocalTextureObject(entry->mTextureIndex); + if( lto && (lto->getID() != IMG_DEFAULT_AVATAR) ) + { + new_id = lto->getID(); + } + else + { + new_id = LLUUID::null; + } + LLUUID old_id = texture_ctrl->getImageAssetID(); + if (old_id != new_id) + { + // texture has changed, close the floater to avoid DEV-22461 + texture_ctrl->closeDependentFloater(); + } + texture_ctrl->setImageAssetID(new_id); + } } static void set_enabled_color_swatch_ctrl(bool enabled, LLPanel* panel, const LLEditWearableDictionary::PickerControlEntry* entry) { - LLColorSwatchCtrl* color_swatch_ctrl = panel->getChild<LLColorSwatchCtrl>(entry->mControlName); - if (color_swatch_ctrl) - { - color_swatch_ctrl->setEnabled(enabled); - } + LLColorSwatchCtrl* color_swatch_ctrl = panel->getChild<LLColorSwatchCtrl>(entry->mControlName); + if (color_swatch_ctrl) + { + color_swatch_ctrl->setEnabled(enabled); + } } static void set_enabled_texture_ctrl(bool enabled, LLPanel* panel, const LLEditWearableDictionary::PickerControlEntry* entry) { - LLTextureCtrl* texture_ctrl = panel->getChild<LLTextureCtrl>(entry->mControlName); - if (texture_ctrl) - { - texture_ctrl->setEnabled(enabled); - } + LLTextureCtrl* texture_ctrl = panel->getChild<LLTextureCtrl>(entry->mControlName); + if (texture_ctrl) + { + texture_ctrl->setEnabled(enabled); + } } // LLPanelEditWearable LLPanelEditWearable::LLPanelEditWearable() - : LLPanel() - , mWearablePtr(NULL) - , mWearableItem(NULL) + : LLPanel() + , mWearablePtr(NULL) + , mWearableItem(NULL) { - mCommitCallbackRegistrar.add("ColorSwatch.Commit", boost::bind(&LLPanelEditWearable::onColorSwatchCommit, this, _1)); - mCommitCallbackRegistrar.add("TexturePicker.Commit", boost::bind(&LLPanelEditWearable::onTexturePickerCommit, this, _1)); + mCommitCallbackRegistrar.add("ColorSwatch.Commit", boost::bind(&LLPanelEditWearable::onColorSwatchCommit, this, _1)); + mCommitCallbackRegistrar.add("TexturePicker.Commit", boost::bind(&LLPanelEditWearable::onTexturePickerCommit, this, _1)); } //virtual @@ -648,935 +648,935 @@ LLPanelEditWearable::~LLPanelEditWearable() bool LLPanelEditWearable::changeHeightUnits(const LLSD& new_value) { - updateMetricLayout( new_value.asBoolean() ); - updateTypeSpecificControls(LLWearableType::WT_SHAPE); - return true; + updateMetricLayout( new_value.asBoolean() ); + updateTypeSpecificControls(LLWearableType::WT_SHAPE); + return true; } void LLPanelEditWearable::updateMetricLayout(BOOL new_value) { - LLUIString current_metric, replacment_metric; - current_metric = new_value ? mMeters : mFeet; - replacment_metric = new_value ? mFeet : mMeters; - mHeigthValue.setArg( "[METRIC1]", current_metric.getString() ); - mReplacementMetricUrl.setArg( "[URL_METRIC2]", std::string("[secondlife:///app/metricsystem ") + replacment_metric.getString() + std::string("]")); + LLUIString current_metric, replacment_metric; + current_metric = new_value ? mMeters : mFeet; + replacment_metric = new_value ? mFeet : mMeters; + mHeigthValue.setArg( "[METRIC1]", current_metric.getString() ); + mReplacementMetricUrl.setArg( "[URL_METRIC2]", std::string("[secondlife:///app/metricsystem ") + replacment_metric.getString() + std::string("]")); } void LLPanelEditWearable::updateAvatarHeightLabel() { - mTxtAvatarHeight->setText(LLStringUtil::null); - LLStyle::Params param; - param.color = mAvatarHeigthLabelColor; - mTxtAvatarHeight->appendText(mHeigth, false, param); - param.color = mAvatarHeigthValueLabelColor; - mTxtAvatarHeight->appendText(mHeigthValue, false, param); - param.color = mAvatarHeigthLabelColor; // using mAvatarHeigthLabelColor for '/' separator - mTxtAvatarHeight->appendText(" / ", false, param); - mTxtAvatarHeight->appendText(this->mReplacementMetricUrl, false, param); + mTxtAvatarHeight->setText(LLStringUtil::null); + LLStyle::Params param; + param.color = mAvatarHeigthLabelColor; + mTxtAvatarHeight->appendText(mHeigth, false, param); + param.color = mAvatarHeigthValueLabelColor; + mTxtAvatarHeight->appendText(mHeigthValue, false, param); + param.color = mAvatarHeigthLabelColor; // using mAvatarHeigthLabelColor for '/' separator + mTxtAvatarHeight->appendText(" / ", false, param); + mTxtAvatarHeight->appendText(this->mReplacementMetricUrl, false, param); } void LLPanelEditWearable::onWearablePanelVisibilityChange(const LLSD &in_visible_chain, LLAccordionCtrl* accordion_ctrl) { - if (in_visible_chain.asBoolean() && accordion_ctrl != NULL) - { - accordion_ctrl->expandDefaultTab(); - } + if (in_visible_chain.asBoolean() && accordion_ctrl != NULL) + { + accordion_ctrl->expandDefaultTab(); + } } void LLPanelEditWearable::setWearablePanelVisibilityChangeCallback(LLPanel* bodypart_panel) { - if (bodypart_panel != NULL) - { - LLAccordionCtrl* accordion_ctrl = bodypart_panel->getChild<LLAccordionCtrl>("wearable_accordion"); - - if (accordion_ctrl != NULL) - { - bodypart_panel->setVisibleCallback( - boost::bind(&LLPanelEditWearable::onWearablePanelVisibilityChange, this, _2, accordion_ctrl)); - } - else - { - llwarns << "accordion_ctrl is NULL" << llendl; - } - } - else - { - llwarns << "bodypart_panel is NULL" << llendl; - } + if (bodypart_panel != NULL) + { + LLAccordionCtrl* accordion_ctrl = bodypart_panel->getChild<LLAccordionCtrl>("wearable_accordion"); + + if (accordion_ctrl != NULL) + { + bodypart_panel->setVisibleCallback( + boost::bind(&LLPanelEditWearable::onWearablePanelVisibilityChange, this, _2, accordion_ctrl)); + } + else + { + llwarns << "accordion_ctrl is NULL" << llendl; + } + } + else + { + llwarns << "bodypart_panel is NULL" << llendl; + } } // virtual BOOL LLPanelEditWearable::postBuild() { - // buttons - mBtnRevert = getChild<LLButton>("revert_button"); - mBtnRevert->setClickedCallback(boost::bind(&LLPanelEditWearable::onRevertButtonClicked, this)); - - mBtnBack = getChild<LLButton>("back_btn"); - mBackBtnLabel = mBtnBack->getLabelUnselected(); - mBtnBack->setLabel(LLStringUtil::null); - // handled at appearance panel level? - //mBtnBack->setClickedCallback(boost::bind(&LLPanelEditWearable::onBackButtonClicked, this)); - - mNameEditor = getChild<LLLineEditor>("description"); - - mPanelTitle = getChild<LLTextBox>("edit_wearable_title"); - mDescTitle = getChild<LLTextBox>("description_text"); - - getChild<LLRadioGroup>("sex_radio")->setCommitCallback(boost::bind(&LLPanelEditWearable::onCommitSexChange, this)); - getChild<LLButton>("save_as_button")->setCommitCallback(boost::bind(&LLPanelEditWearable::onSaveAsButtonClicked, this)); - - // The following panels will be shown/hidden based on what wearable we're editing - // body parts - mPanelShape = getChild<LLPanel>("edit_shape_panel"); - mPanelSkin = getChild<LLPanel>("edit_skin_panel"); - mPanelEyes = getChild<LLPanel>("edit_eyes_panel"); - mPanelHair = getChild<LLPanel>("edit_hair_panel"); - - // Setting the visibility callback is applied only to the bodyparts panel - // because currently they are the only ones whose 'wearable_accordion' has - // multiple accordion tabs (see EXT-8164 for details). - setWearablePanelVisibilityChangeCallback(mPanelShape); - setWearablePanelVisibilityChangeCallback(mPanelSkin); - setWearablePanelVisibilityChangeCallback(mPanelEyes); - setWearablePanelVisibilityChangeCallback(mPanelHair); - - //clothes - mPanelShirt = getChild<LLPanel>("edit_shirt_panel"); - mPanelPants = getChild<LLPanel>("edit_pants_panel"); - mPanelShoes = getChild<LLPanel>("edit_shoes_panel"); - mPanelSocks = getChild<LLPanel>("edit_socks_panel"); - mPanelJacket = getChild<LLPanel>("edit_jacket_panel"); - mPanelGloves = getChild<LLPanel>("edit_gloves_panel"); - mPanelUndershirt = getChild<LLPanel>("edit_undershirt_panel"); - mPanelUnderpants = getChild<LLPanel>("edit_underpants_panel"); - mPanelSkirt = getChild<LLPanel>("edit_skirt_panel"); - mPanelAlpha = getChild<LLPanel>("edit_alpha_panel"); - mPanelTattoo = getChild<LLPanel>("edit_tattoo_panel"); - mPanelPhysics = getChild<LLPanel>("edit_physics_panel"); - - mTxtAvatarHeight = mPanelShape->getChild<LLTextBox>("avatar_height"); - - mWearablePtr = NULL; - - configureAlphaCheckbox(LLVOAvatarDefines::TEX_LOWER_ALPHA, "lower alpha texture invisible"); - configureAlphaCheckbox(LLVOAvatarDefines::TEX_UPPER_ALPHA, "upper alpha texture invisible"); - configureAlphaCheckbox(LLVOAvatarDefines::TEX_HEAD_ALPHA, "head alpha texture invisible"); - configureAlphaCheckbox(LLVOAvatarDefines::TEX_EYES_ALPHA, "eye alpha texture invisible"); - configureAlphaCheckbox(LLVOAvatarDefines::TEX_HAIR_ALPHA, "hair alpha texture invisible"); - - // configure tab expanded callbacks - for (U32 type_index = 0; type_index < (U32)LLWearableType::WT_COUNT; ++type_index) - { - LLWearableType::EType type = (LLWearableType::EType) type_index; - const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(type); - if (!wearable_entry) - { - llwarns << "could not get wearable dictionary entry for wearable of type: " << type << llendl; - continue; - } - U8 num_subparts = wearable_entry->mSubparts.size(); - - for (U8 index = 0; index < num_subparts; ++index) - { - // dive into data structures to get the panel we need - ESubpart subpart_e = wearable_entry->mSubparts[index]; - const LLEditWearableDictionary::SubpartEntry *subpart_entry = LLEditWearableDictionary::getInstance()->getSubpart(subpart_e); - - if (!subpart_entry) - { - llwarns << "could not get wearable subpart dictionary entry for subpart: " << subpart_e << llendl; - continue; - } - - const std::string accordion_tab = subpart_entry->mAccordionTab; - - LLAccordionCtrlTab *tab = getChild<LLAccordionCtrlTab>(accordion_tab); - - if (!tab) - { - llwarns << "could not get llaccordionctrltab from UI with name: " << accordion_tab << llendl; - continue; - } - - // initialize callback to ensure camera view changes appropriately. - tab->setDropDownStateChangedCallback(boost::bind(&LLPanelEditWearable::onTabExpandedCollapsed,this,_2,index)); - } - - // initialize texture and color picker controls - for_each_picker_ctrl_entry <LLColorSwatchCtrl> (getPanel(type), type, boost::bind(init_color_swatch_ctrl, this, _1, _2)); - for_each_picker_ctrl_entry <LLTextureCtrl> (getPanel(type), type, boost::bind(init_texture_ctrl, this, _1, _2)); - } - - // init all strings - mMeters = mPanelShape->getString("meters"); - mFeet = mPanelShape->getString("feet"); - mHeigth = mPanelShape->getString("height") + " "; - mHeigthValue = "[HEIGHT] [METRIC1]"; - mReplacementMetricUrl = "[URL_METRIC2]"; - - std::string color = mPanelShape->getString("heigth_label_color"); - mAvatarHeigthLabelColor = LLUIColorTable::instance().getColor(color, LLColor4::green); - color = mPanelShape->getString("heigth_value_label_color"); - mAvatarHeigthValueLabelColor = LLUIColorTable::instance().getColor(color, LLColor4::green); - gSavedSettings.getControl("HeightUnits")->getSignal()->connect(boost::bind(&LLPanelEditWearable::changeHeightUnits, this, _2)); - updateMetricLayout(gSavedSettings.getBOOL("HeightUnits")); - - return TRUE; + // buttons + mBtnRevert = getChild<LLButton>("revert_button"); + mBtnRevert->setClickedCallback(boost::bind(&LLPanelEditWearable::onRevertButtonClicked, this)); + + mBtnBack = getChild<LLButton>("back_btn"); + mBackBtnLabel = mBtnBack->getLabelUnselected(); + mBtnBack->setLabel(LLStringUtil::null); + // handled at appearance panel level? + //mBtnBack->setClickedCallback(boost::bind(&LLPanelEditWearable::onBackButtonClicked, this)); + + mNameEditor = getChild<LLLineEditor>("description"); + + mPanelTitle = getChild<LLTextBox>("edit_wearable_title"); + mDescTitle = getChild<LLTextBox>("description_text"); + + getChild<LLRadioGroup>("sex_radio")->setCommitCallback(boost::bind(&LLPanelEditWearable::onCommitSexChange, this)); + getChild<LLButton>("save_as_button")->setCommitCallback(boost::bind(&LLPanelEditWearable::onSaveAsButtonClicked, this)); + + // The following panels will be shown/hidden based on what wearable we're editing + // body parts + mPanelShape = getChild<LLPanel>("edit_shape_panel"); + mPanelSkin = getChild<LLPanel>("edit_skin_panel"); + mPanelEyes = getChild<LLPanel>("edit_eyes_panel"); + mPanelHair = getChild<LLPanel>("edit_hair_panel"); + + // Setting the visibility callback is applied only to the bodyparts panel + // because currently they are the only ones whose 'wearable_accordion' has + // multiple accordion tabs (see EXT-8164 for details). + setWearablePanelVisibilityChangeCallback(mPanelShape); + setWearablePanelVisibilityChangeCallback(mPanelSkin); + setWearablePanelVisibilityChangeCallback(mPanelEyes); + setWearablePanelVisibilityChangeCallback(mPanelHair); + + //clothes + mPanelShirt = getChild<LLPanel>("edit_shirt_panel"); + mPanelPants = getChild<LLPanel>("edit_pants_panel"); + mPanelShoes = getChild<LLPanel>("edit_shoes_panel"); + mPanelSocks = getChild<LLPanel>("edit_socks_panel"); + mPanelJacket = getChild<LLPanel>("edit_jacket_panel"); + mPanelGloves = getChild<LLPanel>("edit_gloves_panel"); + mPanelUndershirt = getChild<LLPanel>("edit_undershirt_panel"); + mPanelUnderpants = getChild<LLPanel>("edit_underpants_panel"); + mPanelSkirt = getChild<LLPanel>("edit_skirt_panel"); + mPanelAlpha = getChild<LLPanel>("edit_alpha_panel"); + mPanelTattoo = getChild<LLPanel>("edit_tattoo_panel"); + mPanelPhysics = getChild<LLPanel>("edit_physics_panel"); + + mTxtAvatarHeight = mPanelShape->getChild<LLTextBox>("avatar_height"); + + mWearablePtr = NULL; + + configureAlphaCheckbox(LLVOAvatarDefines::TEX_LOWER_ALPHA, "lower alpha texture invisible"); + configureAlphaCheckbox(LLVOAvatarDefines::TEX_UPPER_ALPHA, "upper alpha texture invisible"); + configureAlphaCheckbox(LLVOAvatarDefines::TEX_HEAD_ALPHA, "head alpha texture invisible"); + configureAlphaCheckbox(LLVOAvatarDefines::TEX_EYES_ALPHA, "eye alpha texture invisible"); + configureAlphaCheckbox(LLVOAvatarDefines::TEX_HAIR_ALPHA, "hair alpha texture invisible"); + + // configure tab expanded callbacks + for (U32 type_index = 0; type_index < (U32)LLWearableType::WT_COUNT; ++type_index) + { + LLWearableType::EType type = (LLWearableType::EType) type_index; + const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(type); + if (!wearable_entry) + { + llwarns << "could not get wearable dictionary entry for wearable of type: " << type << llendl; + continue; + } + U8 num_subparts = wearable_entry->mSubparts.size(); + + for (U8 index = 0; index < num_subparts; ++index) + { + // dive into data structures to get the panel we need + ESubpart subpart_e = wearable_entry->mSubparts[index]; + const LLEditWearableDictionary::SubpartEntry *subpart_entry = LLEditWearableDictionary::getInstance()->getSubpart(subpart_e); + + if (!subpart_entry) + { + llwarns << "could not get wearable subpart dictionary entry for subpart: " << subpart_e << llendl; + continue; + } + + const std::string accordion_tab = subpart_entry->mAccordionTab; + + LLAccordionCtrlTab *tab = getChild<LLAccordionCtrlTab>(accordion_tab); + + if (!tab) + { + llwarns << "could not get llaccordionctrltab from UI with name: " << accordion_tab << llendl; + continue; + } + + // initialize callback to ensure camera view changes appropriately. + tab->setDropDownStateChangedCallback(boost::bind(&LLPanelEditWearable::onTabExpandedCollapsed,this,_2,index)); + } + + // initialize texture and color picker controls + for_each_picker_ctrl_entry <LLColorSwatchCtrl> (getPanel(type), type, boost::bind(init_color_swatch_ctrl, this, _1, _2)); + for_each_picker_ctrl_entry <LLTextureCtrl> (getPanel(type), type, boost::bind(init_texture_ctrl, this, _1, _2)); + } + + // init all strings + mMeters = mPanelShape->getString("meters"); + mFeet = mPanelShape->getString("feet"); + mHeigth = mPanelShape->getString("height") + " "; + mHeigthValue = "[HEIGHT] [METRIC1]"; + mReplacementMetricUrl = "[URL_METRIC2]"; + + std::string color = mPanelShape->getString("heigth_label_color"); + mAvatarHeigthLabelColor = LLUIColorTable::instance().getColor(color, LLColor4::green); + color = mPanelShape->getString("heigth_value_label_color"); + mAvatarHeigthValueLabelColor = LLUIColorTable::instance().getColor(color, LLColor4::green); + gSavedSettings.getControl("HeightUnits")->getSignal()->connect(boost::bind(&LLPanelEditWearable::changeHeightUnits, this, _2)); + updateMetricLayout(gSavedSettings.getBOOL("HeightUnits")); + + return TRUE; } // virtual // LLUICtrl BOOL LLPanelEditWearable::isDirty() const { - BOOL isDirty = FALSE; - if (mWearablePtr) - { - if (mWearablePtr->isDirty() || - mWearableItem->getName().compare(mNameEditor->getText()) != 0) - { - isDirty = TRUE; - } - } - return isDirty; + BOOL isDirty = FALSE; + if (mWearablePtr) + { + if (mWearablePtr->isDirty() || + mWearableItem->getName().compare(mNameEditor->getText()) != 0) + { + isDirty = TRUE; + } + } + return isDirty; } //virtual void LLPanelEditWearable::draw() { - updateVerbs(); - if (getWearable() && getWearable()->getType() == LLWearableType::WT_SHAPE) - { - //updating avatar height - updateTypeSpecificControls(LLWearableType::WT_SHAPE); - } + updateVerbs(); + if (getWearable() && getWearable()->getType() == LLWearableType::WT_SHAPE) + { + //updating avatar height + updateTypeSpecificControls(LLWearableType::WT_SHAPE); + } - LLPanel::draw(); + LLPanel::draw(); } void LLPanelEditWearable::setVisible(BOOL visible) { - if (!visible) - { - showWearable(mWearablePtr, FALSE); - } - LLPanel::setVisible(visible); + if (!visible) + { + showWearable(mWearablePtr, FALSE); + } + LLPanel::setVisible(visible); } void LLPanelEditWearable::setWearable(LLWearable *wearable, BOOL disable_camera_switch) { - showWearable(mWearablePtr, FALSE, disable_camera_switch); - mWearablePtr = wearable; - showWearable(mWearablePtr, TRUE, disable_camera_switch); + showWearable(mWearablePtr, FALSE, disable_camera_switch); + mWearablePtr = wearable; + showWearable(mWearablePtr, TRUE, disable_camera_switch); } //static void LLPanelEditWearable::onRevertButtonClicked(void* userdata) { - LLPanelEditWearable *panel = (LLPanelEditWearable*) userdata; - panel->revertChanges(); + LLPanelEditWearable *panel = (LLPanelEditWearable*) userdata; + panel->revertChanges(); } void LLPanelEditWearable::onSaveAsButtonClicked() { - LLSD args; - args["DESC"] = mNameEditor->getText(); + LLSD args; + args["DESC"] = mNameEditor->getText(); - LLNotificationsUtil::add("SaveWearableAs", args, LLSD(), boost::bind(&LLPanelEditWearable::saveAsCallback, this, _1, _2)); + LLNotificationsUtil::add("SaveWearableAs", args, LLSD(), boost::bind(&LLPanelEditWearable::saveAsCallback, this, _1, _2)); } void LLPanelEditWearable::saveAsCallback(const LLSD& notification, const LLSD& response) { - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - if (0 == option) - { - std::string wearable_name = response["message"].asString(); - LLStringUtil::trim(wearable_name); - if( !wearable_name.empty() ) - { - mNameEditor->setText(wearable_name); - saveChanges(true); - } - } + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + if (0 == option) + { + std::string wearable_name = response["message"].asString(); + LLStringUtil::trim(wearable_name); + if( !wearable_name.empty() ) + { + mNameEditor->setText(wearable_name); + saveChanges(true); + } + } } void LLPanelEditWearable::onCommitSexChange() { - if (!isAgentAvatarValid()) return; + if (!isAgentAvatarValid()) return; - LLWearableType::EType type = mWearablePtr->getType(); - U32 index = gAgentWearables.getWearableIndex(mWearablePtr); + LLWearableType::EType type = mWearablePtr->getType(); + U32 index = gAgentWearables.getWearableIndex(mWearablePtr); - if( !gAgentWearables.isWearableModifiable(type, index)) - { - return; - } + if( !gAgentWearables.isWearableModifiable(type, index)) + { + return; + } - LLViewerVisualParam* param = static_cast<LLViewerVisualParam*>(gAgentAvatarp->getVisualParam( "male" )); - if( !param ) - { - return; - } + LLViewerVisualParam* param = static_cast<LLViewerVisualParam*>(gAgentAvatarp->getVisualParam( "male" )); + if( !param ) + { + return; + } - bool is_new_sex_male = (gSavedSettings.getU32("AvatarSex") ? SEX_MALE : SEX_FEMALE) == SEX_MALE; - LLWearable* wearable = gAgentWearables.getWearable(type, index); - if (wearable) - { - wearable->setVisualParamWeight(param->getID(), is_new_sex_male, FALSE); - } - param->setWeight( is_new_sex_male, FALSE ); + bool is_new_sex_male = (gSavedSettings.getU32("AvatarSex") ? SEX_MALE : SEX_FEMALE) == SEX_MALE; + LLWearable* wearable = gAgentWearables.getWearable(type, index); + if (wearable) + { + wearable->setVisualParamWeight(param->getID(), is_new_sex_male, FALSE); + } + param->setWeight( is_new_sex_male, FALSE ); - gAgentAvatarp->updateSexDependentLayerSets( FALSE ); + gAgentAvatarp->updateSexDependentLayerSets( FALSE ); - gAgentAvatarp->updateVisualParams(); + gAgentAvatarp->updateVisualParams(); - updateScrollingPanelUI(); + updateScrollingPanelUI(); } void LLPanelEditWearable::onTexturePickerCommit(const LLUICtrl* ctrl) { - const LLTextureCtrl* texture_ctrl = dynamic_cast<const LLTextureCtrl*>(ctrl); - if (!texture_ctrl) - { - llwarns << "got commit signal from not LLTextureCtrl." << llendl; - return; - } - - if (getWearable()) - { - LLWearableType::EType type = getWearable()->getType(); - const PickerControlEntryNamePredicate name_pred(texture_ctrl->getName()); - const LLEditWearableDictionary::PickerControlEntry* entry - = find_picker_ctrl_entry_if<LLTextureCtrl, PickerControlEntryNamePredicate>(type, name_pred); - if (entry) - { - // Set the new version - LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture(texture_ctrl->getImageAssetID()); - if( image->getID() == IMG_DEFAULT ) - { - image = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT_AVATAR); - } - if (getWearable()) - { - U32 index = gAgentWearables.getWearableIndex(getWearable()); - gAgentAvatarp->setLocalTexture(entry->mTextureIndex, image, FALSE, index); - LLVisualParamHint::requestHintUpdates(); - gAgentAvatarp->wearableUpdated(type, FALSE); - } - } - else - { - llwarns << "could not get texture picker dictionary entry for wearable of type: " << type << llendl; - } - } + const LLTextureCtrl* texture_ctrl = dynamic_cast<const LLTextureCtrl*>(ctrl); + if (!texture_ctrl) + { + llwarns << "got commit signal from not LLTextureCtrl." << llendl; + return; + } + + if (getWearable()) + { + LLWearableType::EType type = getWearable()->getType(); + const PickerControlEntryNamePredicate name_pred(texture_ctrl->getName()); + const LLEditWearableDictionary::PickerControlEntry* entry + = find_picker_ctrl_entry_if<LLTextureCtrl, PickerControlEntryNamePredicate>(type, name_pred); + if (entry) + { + // Set the new version + LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture(texture_ctrl->getImageAssetID()); + if( image->getID() == IMG_DEFAULT ) + { + image = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT_AVATAR); + } + if (getWearable()) + { + U32 index = gAgentWearables.getWearableIndex(getWearable()); + gAgentAvatarp->setLocalTexture(entry->mTextureIndex, image, FALSE, index); + LLVisualParamHint::requestHintUpdates(); + gAgentAvatarp->wearableUpdated(type, FALSE); + } + } + else + { + llwarns << "could not get texture picker dictionary entry for wearable of type: " << type << llendl; + } + } } void LLPanelEditWearable::onColorSwatchCommit(const LLUICtrl* ctrl) { - if (getWearable()) - { - LLWearableType::EType type = getWearable()->getType(); - const PickerControlEntryNamePredicate name_pred(ctrl->getName()); - const LLEditWearableDictionary::PickerControlEntry* entry - = find_picker_ctrl_entry_if<LLColorSwatchCtrl, PickerControlEntryNamePredicate>(type, name_pred); - if (entry) - { - const LLColor4& old_color = getWearable()->getClothesColor(entry->mTextureIndex); - const LLColor4& new_color = LLColor4(ctrl->getValue()); - if( old_color != new_color ) - { - getWearable()->setClothesColor(entry->mTextureIndex, new_color, TRUE); - LLVisualParamHint::requestHintUpdates(); - gAgentAvatarp->wearableUpdated(getWearable()->getType(), FALSE); - } - } - else - { - llwarns << "could not get color swatch dictionary entry for wearable of type: " << type << llendl; - } - } + if (getWearable()) + { + LLWearableType::EType type = getWearable()->getType(); + const PickerControlEntryNamePredicate name_pred(ctrl->getName()); + const LLEditWearableDictionary::PickerControlEntry* entry + = find_picker_ctrl_entry_if<LLColorSwatchCtrl, PickerControlEntryNamePredicate>(type, name_pred); + if (entry) + { + const LLColor4& old_color = getWearable()->getClothesColor(entry->mTextureIndex); + const LLColor4& new_color = LLColor4(ctrl->getValue()); + if( old_color != new_color ) + { + getWearable()->setClothesColor(entry->mTextureIndex, new_color, TRUE); + LLVisualParamHint::requestHintUpdates(); + gAgentAvatarp->wearableUpdated(getWearable()->getType(), FALSE); + } + } + else + { + llwarns << "could not get color swatch dictionary entry for wearable of type: " << type << llendl; + } + } } void LLPanelEditWearable::updatePanelPickerControls(LLWearableType::EType type) { - LLPanel* panel = getPanel(type); - if (!panel) - return; - - bool is_modifiable = false; - bool is_copyable = false; - - if(mWearableItem) - { - const LLPermissions& perm = mWearableItem->getPermissions(); - is_modifiable = perm.allowModifyBy(gAgent.getID(), gAgent.getGroupID()); - is_copyable = perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID()); - } - - if (is_modifiable) - { - // Update picker controls - for_each_picker_ctrl_entry <LLColorSwatchCtrl> (panel, type, boost::bind(update_color_swatch_ctrl, this, _1, _2)); - for_each_picker_ctrl_entry <LLTextureCtrl> (panel, type, boost::bind(update_texture_ctrl, this, _1, _2)); - } - else - { - // Disable controls - for_each_picker_ctrl_entry <LLColorSwatchCtrl> (panel, type, boost::bind(set_enabled_color_swatch_ctrl, false, _1, _2)); - for_each_picker_ctrl_entry <LLTextureCtrl> (panel, type, boost::bind(set_enabled_texture_ctrl, false, _1, _2)); - } + LLPanel* panel = getPanel(type); + if (!panel) + return; + + bool is_modifiable = false; + bool is_copyable = false; + + if(mWearableItem) + { + const LLPermissions& perm = mWearableItem->getPermissions(); + is_modifiable = perm.allowModifyBy(gAgent.getID(), gAgent.getGroupID()); + is_copyable = perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID()); + } + + if (is_modifiable) + { + // Update picker controls + for_each_picker_ctrl_entry <LLColorSwatchCtrl> (panel, type, boost::bind(update_color_swatch_ctrl, this, _1, _2)); + for_each_picker_ctrl_entry <LLTextureCtrl> (panel, type, boost::bind(update_texture_ctrl, this, _1, _2)); + } + else + { + // Disable controls + for_each_picker_ctrl_entry <LLColorSwatchCtrl> (panel, type, boost::bind(set_enabled_color_swatch_ctrl, false, _1, _2)); + for_each_picker_ctrl_entry <LLTextureCtrl> (panel, type, boost::bind(set_enabled_texture_ctrl, false, _1, _2)); + } } void LLPanelEditWearable::saveChanges(bool force_save_as) { - if (!mWearablePtr || !isDirty()) - { - // do nothing if no unsaved changes - return; - } - - U32 index = gAgentWearables.getWearableIndex(mWearablePtr); - - std::string new_name = mNameEditor->getText(); - if (force_save_as) - { - // the name of the wearable has changed, re-save wearable with new name - LLAppearanceMgr::instance().removeCOFItemLinks(mWearablePtr->getItemID(),false); - gAgentWearables.saveWearableAs(mWearablePtr->getType(), index, new_name, FALSE); - mNameEditor->setText(mWearableItem->getName()); - } - else - { - gAgentWearables.saveWearable(mWearablePtr->getType(), index, TRUE, new_name); - } + if (!mWearablePtr || !isDirty()) + { + // do nothing if no unsaved changes + return; + } + + U32 index = gAgentWearables.getWearableIndex(mWearablePtr); + + std::string new_name = mNameEditor->getText(); + if (force_save_as) + { + // the name of the wearable has changed, re-save wearable with new name + LLAppearanceMgr::instance().removeCOFItemLinks(mWearablePtr->getItemID(),false); + gAgentWearables.saveWearableAs(mWearablePtr->getType(), index, new_name, FALSE); + mNameEditor->setText(mWearableItem->getName()); + } + else + { + gAgentWearables.saveWearable(mWearablePtr->getType(), index, TRUE, new_name); + } } void LLPanelEditWearable::revertChanges() { - if (!mWearablePtr || !isDirty()) - { - // no unsaved changes to revert - return; - } - - mWearablePtr->revertValues(); - mNameEditor->setText(mWearableItem->getName()); - updatePanelPickerControls(mWearablePtr->getType()); - updateTypeSpecificControls(mWearablePtr->getType()); - gAgentAvatarp->wearableUpdated(mWearablePtr->getType(), FALSE); + if (!mWearablePtr || !isDirty()) + { + // no unsaved changes to revert + return; + } + + mWearablePtr->revertValues(); + mNameEditor->setText(mWearableItem->getName()); + updatePanelPickerControls(mWearablePtr->getType()); + updateTypeSpecificControls(mWearablePtr->getType()); + gAgentAvatarp->wearableUpdated(mWearablePtr->getType(), FALSE); } void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show, BOOL disable_camera_switch) { - if (!wearable) - { - return; - } - - mWearableItem = gInventory.getItem(mWearablePtr->getItemID()); - llassert(mWearableItem); - - LLWearableType::EType type = wearable->getType(); - LLPanel *targetPanel = NULL; - std::string title; - std::string description_title; - - const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(type); - if (!wearable_entry) - { - llwarns << "called LLPanelEditWearable::showWearable with an invalid wearable type! (" << type << ")" << llendl; - return; - } - - targetPanel = getPanel(type); - title = getString(wearable_entry->mTitle); - description_title = getString(wearable_entry->mDescTitle); - - // Update picker controls state - for_each_picker_ctrl_entry <LLColorSwatchCtrl> (targetPanel, type, boost::bind(set_enabled_color_swatch_ctrl, show, _1, _2)); - for_each_picker_ctrl_entry <LLTextureCtrl> (targetPanel, type, boost::bind(set_enabled_texture_ctrl, show, _1, _2)); - - targetPanel->setVisible(show); - toggleTypeSpecificControls(type); - - if (show) - { - mPanelTitle->setText(title); - mPanelTitle->setToolTip(title); - mDescTitle->setText(description_title); - - // set name - mNameEditor->setText(mWearableItem->getName()); - - updatePanelPickerControls(type); - updateTypeSpecificControls(type); - - // clear and rebuild visual param list - U8 num_subparts = wearable_entry->mSubparts.size(); - - for (U8 index = 0; index < num_subparts; ++index) - { - // dive into data structures to get the panel we need - ESubpart subpart_e = wearable_entry->mSubparts[index]; - const LLEditWearableDictionary::SubpartEntry *subpart_entry = LLEditWearableDictionary::getInstance()->getSubpart(subpart_e); - - if (!subpart_entry) - { - llwarns << "could not get wearable subpart dictionary entry for subpart: " << subpart_e << llendl; - continue; - } - - const std::string scrolling_panel = subpart_entry->mParamList; - const std::string accordion_tab = subpart_entry->mAccordionTab; - - LLScrollingPanelList *panel_list = getChild<LLScrollingPanelList>(scrolling_panel); - LLAccordionCtrlTab *tab = getChild<LLAccordionCtrlTab>(accordion_tab); - - if (!panel_list) - { - llwarns << "could not get scrolling panel list: " << scrolling_panel << llendl; - continue; - } - - if (!tab) - { - llwarns << "could not get llaccordionctrltab from UI with name: " << accordion_tab << llendl; - continue; - } - - // what edit group do we want to extract params for? - const std::string edit_group = subpart_entry->mEditGroup; - - // storage for ordered list of visual params - value_map_t sorted_params; - getSortedParams(sorted_params, edit_group); - - LLJoint* jointp = gAgentAvatarp->getJoint( subpart_entry->mTargetJoint ); - if (!jointp) - { - jointp = gAgentAvatarp->getJoint("mHead"); - } - - buildParamList(panel_list, sorted_params, tab, jointp); - - updateScrollingPanelUI(); - } - if (!disable_camera_switch) - { - showDefaultSubpart(); - } - - updateVerbs(); - } + if (!wearable) + { + return; + } + + mWearableItem = gInventory.getItem(mWearablePtr->getItemID()); + llassert(mWearableItem); + + LLWearableType::EType type = wearable->getType(); + LLPanel *targetPanel = NULL; + std::string title; + std::string description_title; + + const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(type); + if (!wearable_entry) + { + llwarns << "called LLPanelEditWearable::showWearable with an invalid wearable type! (" << type << ")" << llendl; + return; + } + + targetPanel = getPanel(type); + title = getString(wearable_entry->mTitle); + description_title = getString(wearable_entry->mDescTitle); + + // Update picker controls state + for_each_picker_ctrl_entry <LLColorSwatchCtrl> (targetPanel, type, boost::bind(set_enabled_color_swatch_ctrl, show, _1, _2)); + for_each_picker_ctrl_entry <LLTextureCtrl> (targetPanel, type, boost::bind(set_enabled_texture_ctrl, show, _1, _2)); + + targetPanel->setVisible(show); + toggleTypeSpecificControls(type); + + if (show) + { + mPanelTitle->setText(title); + mPanelTitle->setToolTip(title); + mDescTitle->setText(description_title); + + // set name + mNameEditor->setText(mWearableItem->getName()); + + updatePanelPickerControls(type); + updateTypeSpecificControls(type); + + // clear and rebuild visual param list + U8 num_subparts = wearable_entry->mSubparts.size(); + + for (U8 index = 0; index < num_subparts; ++index) + { + // dive into data structures to get the panel we need + ESubpart subpart_e = wearable_entry->mSubparts[index]; + const LLEditWearableDictionary::SubpartEntry *subpart_entry = LLEditWearableDictionary::getInstance()->getSubpart(subpart_e); + + if (!subpart_entry) + { + llwarns << "could not get wearable subpart dictionary entry for subpart: " << subpart_e << llendl; + continue; + } + + const std::string scrolling_panel = subpart_entry->mParamList; + const std::string accordion_tab = subpart_entry->mAccordionTab; + + LLScrollingPanelList *panel_list = getChild<LLScrollingPanelList>(scrolling_panel); + LLAccordionCtrlTab *tab = getChild<LLAccordionCtrlTab>(accordion_tab); + + if (!panel_list) + { + llwarns << "could not get scrolling panel list: " << scrolling_panel << llendl; + continue; + } + + if (!tab) + { + llwarns << "could not get llaccordionctrltab from UI with name: " << accordion_tab << llendl; + continue; + } + + // what edit group do we want to extract params for? + const std::string edit_group = subpart_entry->mEditGroup; + + // storage for ordered list of visual params + value_map_t sorted_params; + getSortedParams(sorted_params, edit_group); + + LLJoint* jointp = gAgentAvatarp->getJoint( subpart_entry->mTargetJoint ); + if (!jointp) + { + jointp = gAgentAvatarp->getJoint("mHead"); + } + + buildParamList(panel_list, sorted_params, tab, jointp); + + updateScrollingPanelUI(); + } + if (!disable_camera_switch) + { + showDefaultSubpart(); + } + + updateVerbs(); + } } void LLPanelEditWearable::showDefaultSubpart() { - changeCamera(3); + changeCamera(3); } void LLPanelEditWearable::onTabExpandedCollapsed(const LLSD& param, U8 index) { - bool expanded = param.asBoolean(); + bool expanded = param.asBoolean(); - if (!mWearablePtr || !gAgentCamera.cameraCustomizeAvatar()) - { - // we don't have a valid wearable we're editing, or we've left the wearable editor - return; - } + if (!mWearablePtr || !gAgentCamera.cameraCustomizeAvatar()) + { + // we don't have a valid wearable we're editing, or we've left the wearable editor + return; + } - if (expanded) - { - changeCamera(index); - } + if (expanded) + { + changeCamera(index); + } } void LLPanelEditWearable::changeCamera(U8 subpart) { - const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(mWearablePtr->getType()); - if (!wearable_entry) - { - llinfos << "could not get wearable dictionary entry for wearable type: " << mWearablePtr->getType() << llendl; - return; - } - - if (subpart >= wearable_entry->mSubparts.size()) - { - llinfos << "accordion tab expanded for invalid subpart. Wearable type: " << mWearablePtr->getType() << " subpart num: " << subpart << llendl; - return; - } - - ESubpart subpart_e = wearable_entry->mSubparts[subpart]; - const LLEditWearableDictionary::SubpartEntry *subpart_entry = LLEditWearableDictionary::getInstance()->getSubpart(subpart_e); - - if (!subpart_entry) - { - llwarns << "could not get wearable subpart dictionary entry for subpart: " << subpart_e << llendl; - return; - } - - // Update the camera - gMorphView->setCameraTargetJoint( gAgentAvatarp->getJoint( subpart_entry->mTargetJoint ) ); - gMorphView->setCameraTargetOffset( subpart_entry->mTargetOffset ); - gMorphView->setCameraOffset( subpart_entry->mCameraOffset ); - if (gSavedSettings.getBOOL("AppearanceCameraMovement")) - { - gMorphView->updateCamera(); - } + const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(mWearablePtr->getType()); + if (!wearable_entry) + { + llinfos << "could not get wearable dictionary entry for wearable type: " << mWearablePtr->getType() << llendl; + return; + } + + if (subpart >= wearable_entry->mSubparts.size()) + { + llinfos << "accordion tab expanded for invalid subpart. Wearable type: " << mWearablePtr->getType() << " subpart num: " << subpart << llendl; + return; + } + + ESubpart subpart_e = wearable_entry->mSubparts[subpart]; + const LLEditWearableDictionary::SubpartEntry *subpart_entry = LLEditWearableDictionary::getInstance()->getSubpart(subpart_e); + + if (!subpart_entry) + { + llwarns << "could not get wearable subpart dictionary entry for subpart: " << subpart_e << llendl; + return; + } + + // Update the camera + gMorphView->setCameraTargetJoint( gAgentAvatarp->getJoint( subpart_entry->mTargetJoint ) ); + gMorphView->setCameraTargetOffset( subpart_entry->mTargetOffset ); + gMorphView->setCameraOffset( subpart_entry->mCameraOffset ); + if (gSavedSettings.getBOOL("AppearanceCameraMovement")) + { + gMorphView->updateCamera(); + } } void LLPanelEditWearable::updateScrollingPanelList() { - updateScrollingPanelUI(); + updateScrollingPanelUI(); } void LLPanelEditWearable::toggleTypeSpecificControls(LLWearableType::EType type) { - // Toggle controls specific to shape editing panel. - { - bool is_shape = (type == LLWearableType::WT_SHAPE); - getChildView("sex_radio")->setVisible( is_shape); - getChildView("female_icon")->setVisible( is_shape); - getChildView("male_icon")->setVisible( is_shape); - } + // Toggle controls specific to shape editing panel. + { + bool is_shape = (type == LLWearableType::WT_SHAPE); + getChildView("sex_radio")->setVisible( is_shape); + getChildView("female_icon")->setVisible( is_shape); + getChildView("male_icon")->setVisible( is_shape); + } } void LLPanelEditWearable::updateTypeSpecificControls(LLWearableType::EType type) { - const F32 ONE_METER = 1.0; - const F32 ONE_FOOT = 0.3048 * ONE_METER; // in meters - // Update controls specific to shape editing panel. - if (type == LLWearableType::WT_SHAPE) - { - // Update avatar height - F32 new_size = gAgentAvatarp->mBodySize.mV[VZ]; - if (gSavedSettings.getBOOL("HeightUnits") == FALSE) - { - // convert meters to feet - new_size = new_size / ONE_FOOT; - } - - std::string avatar_height_str = llformat("%.2f", new_size); - mHeigthValue.setArg("[HEIGHT]", avatar_height_str); - updateAvatarHeightLabel(); - } - - if (LLWearableType::WT_ALPHA == type) - { - updateAlphaCheckboxes(); - - initPreviousAlphaTextures(); - } + const F32 ONE_METER = 1.0; + const F32 ONE_FOOT = 0.3048 * ONE_METER; // in meters + // Update controls specific to shape editing panel. + if (type == LLWearableType::WT_SHAPE) + { + // Update avatar height + F32 new_size = gAgentAvatarp->mBodySize.mV[VZ]; + if (gSavedSettings.getBOOL("HeightUnits") == FALSE) + { + // convert meters to feet + new_size = new_size / ONE_FOOT; + } + + std::string avatar_height_str = llformat("%.2f", new_size); + mHeigthValue.setArg("[HEIGHT]", avatar_height_str); + updateAvatarHeightLabel(); + } + + if (LLWearableType::WT_ALPHA == type) + { + updateAlphaCheckboxes(); + + initPreviousAlphaTextures(); + } } void LLPanelEditWearable::updateScrollingPanelUI() { - // do nothing if we don't have a valid wearable we're editing - if (mWearablePtr == NULL) - { - return; - } - - LLWearableType::EType type = mWearablePtr->getType(); - LLPanel *panel = getPanel(type); - - if(panel && (mWearablePtr->getItemID().notNull())) - { - const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(type); - llassert(wearable_entry); - if (!wearable_entry) return; - U8 num_subparts = wearable_entry->mSubparts.size(); - - LLScrollingPanelParam::sUpdateDelayFrames = 0; - for (U8 index = 0; index < num_subparts; ++index) - { - // dive into data structures to get the panel we need - ESubpart subpart_e = wearable_entry->mSubparts[index]; - const LLEditWearableDictionary::SubpartEntry *subpart_entry = LLEditWearableDictionary::getInstance()->getSubpart(subpart_e); - - const std::string scrolling_panel = subpart_entry->mParamList; - - LLScrollingPanelList *panel_list = getChild<LLScrollingPanelList>(scrolling_panel); - - if (!panel_list) - { - llwarns << "could not get scrolling panel list: " << scrolling_panel << llendl; - continue; - } - - panel_list->updatePanels(TRUE); - } - } + // do nothing if we don't have a valid wearable we're editing + if (mWearablePtr == NULL) + { + return; + } + + LLWearableType::EType type = mWearablePtr->getType(); + LLPanel *panel = getPanel(type); + + if(panel && (mWearablePtr->getItemID().notNull())) + { + const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(type); + llassert(wearable_entry); + if (!wearable_entry) return; + U8 num_subparts = wearable_entry->mSubparts.size(); + + LLScrollingPanelParam::sUpdateDelayFrames = 0; + for (U8 index = 0; index < num_subparts; ++index) + { + // dive into data structures to get the panel we need + ESubpart subpart_e = wearable_entry->mSubparts[index]; + const LLEditWearableDictionary::SubpartEntry *subpart_entry = LLEditWearableDictionary::getInstance()->getSubpart(subpart_e); + + const std::string scrolling_panel = subpart_entry->mParamList; + + LLScrollingPanelList *panel_list = getChild<LLScrollingPanelList>(scrolling_panel); + + if (!panel_list) + { + llwarns << "could not get scrolling panel list: " << scrolling_panel << llendl; + continue; + } + + panel_list->updatePanels(TRUE); + } + } } LLPanel* LLPanelEditWearable::getPanel(LLWearableType::EType type) { - switch (type) - { - case LLWearableType::WT_SHAPE: - return mPanelShape; - break; + switch (type) + { + case LLWearableType::WT_SHAPE: + return mPanelShape; + break; - case LLWearableType::WT_SKIN: - return mPanelSkin; - break; + case LLWearableType::WT_SKIN: + return mPanelSkin; + break; - case LLWearableType::WT_HAIR: - return mPanelHair; - break; + case LLWearableType::WT_HAIR: + return mPanelHair; + break; - case LLWearableType::WT_EYES: - return mPanelEyes; - break; + case LLWearableType::WT_EYES: + return mPanelEyes; + break; - case LLWearableType::WT_SHIRT: - return mPanelShirt; - break; + case LLWearableType::WT_SHIRT: + return mPanelShirt; + break; - case LLWearableType::WT_PANTS: - return mPanelPants; - break; + case LLWearableType::WT_PANTS: + return mPanelPants; + break; - case LLWearableType::WT_SHOES: - return mPanelShoes; - break; + case LLWearableType::WT_SHOES: + return mPanelShoes; + break; - case LLWearableType::WT_SOCKS: - return mPanelSocks; - break; + case LLWearableType::WT_SOCKS: + return mPanelSocks; + break; - case LLWearableType::WT_JACKET: - return mPanelJacket; - break; + case LLWearableType::WT_JACKET: + return mPanelJacket; + break; - case LLWearableType::WT_GLOVES: - return mPanelGloves; - break; + case LLWearableType::WT_GLOVES: + return mPanelGloves; + break; - case LLWearableType::WT_UNDERSHIRT: - return mPanelUndershirt; - break; + case LLWearableType::WT_UNDERSHIRT: + return mPanelUndershirt; + break; - case LLWearableType::WT_UNDERPANTS: - return mPanelUnderpants; - break; + case LLWearableType::WT_UNDERPANTS: + return mPanelUnderpants; + break; - case LLWearableType::WT_SKIRT: - return mPanelSkirt; - break; + case LLWearableType::WT_SKIRT: + return mPanelSkirt; + break; - case LLWearableType::WT_ALPHA: - return mPanelAlpha; - break; + case LLWearableType::WT_ALPHA: + return mPanelAlpha; + break; - case LLWearableType::WT_TATTOO: - return mPanelTattoo; - break; + case LLWearableType::WT_TATTOO: + return mPanelTattoo; + break; - case LLWearableType::WT_PHYSICS: - return mPanelPhysics; - break; + case LLWearableType::WT_PHYSICS: + return mPanelPhysics; + break; - default: - break; - } - return NULL; + default: + break; + } + return NULL; } void LLPanelEditWearable::getSortedParams(value_map_t &sorted_params, const std::string &edit_group) { - LLWearable::visual_param_vec_t param_list; - ESex avatar_sex = gAgentAvatarp->getSex(); - - mWearablePtr->getVisualParams(param_list); - - for (LLWearable::visual_param_vec_t::iterator iter = param_list.begin(); - iter != param_list.end(); - ++iter) - { - LLViewerVisualParam *param = (LLViewerVisualParam*) *iter; - - if (param->getID() == -1 - || !param->isTweakable() - || param->getEditGroup() != edit_group - || !(param->getSex() & avatar_sex)) - { - continue; - } - - value_map_t::value_type vt(-param->getDisplayOrder(), param); - llassert( sorted_params.find(-param->getDisplayOrder()) == sorted_params.end() ); //check for duplicates - sorted_params.insert(vt); - } + LLWearable::visual_param_vec_t param_list; + ESex avatar_sex = gAgentAvatarp->getSex(); + + mWearablePtr->getVisualParams(param_list); + + for (LLWearable::visual_param_vec_t::iterator iter = param_list.begin(); + iter != param_list.end(); + ++iter) + { + LLViewerVisualParam *param = (LLViewerVisualParam*) *iter; + + if (param->getID() == -1 + || !param->isTweakable() + || param->getEditGroup() != edit_group + || !(param->getSex() & avatar_sex)) + { + continue; + } + + value_map_t::value_type vt(-param->getDisplayOrder(), param); + llassert( sorted_params.find(-param->getDisplayOrder()) == sorted_params.end() ); //check for duplicates + sorted_params.insert(vt); + } } void LLPanelEditWearable::buildParamList(LLScrollingPanelList *panel_list, value_map_t &sorted_params, LLAccordionCtrlTab *tab, LLJoint* jointp) { - // sorted_params is sorted according to magnitude of effect from - // least to greatest. Adding to the front of the child list - // reverses that order. - if( panel_list ) - { - panel_list->clearPanels(); - value_map_t::iterator end = sorted_params.end(); - S32 height = 0; - for(value_map_t::iterator it = sorted_params.begin(); it != end; ++it) - { - LLPanel::Params p; - p.name("LLScrollingPanelParam"); - LLWearable *wearable = this->getWearable(); - LLScrollingPanelParamBase *panel_param = NULL; - if (wearable && wearable->getType() == LLWearableType::WT_PHYSICS) // Hack to show a different panel for physics. Should generalize this later. - { - panel_param = new LLScrollingPanelParamBase( p, NULL, (*it).second, TRUE, this->getWearable(), jointp); - } - else - { - panel_param = new LLScrollingPanelParam( p, NULL, (*it).second, TRUE, this->getWearable(), jointp); - } - height = panel_list->addPanel( panel_param ); - } - } + // sorted_params is sorted according to magnitude of effect from + // least to greatest. Adding to the front of the child list + // reverses that order. + if( panel_list ) + { + panel_list->clearPanels(); + value_map_t::iterator end = sorted_params.end(); + S32 height = 0; + for(value_map_t::iterator it = sorted_params.begin(); it != end; ++it) + { + LLPanel::Params p; + p.name("LLScrollingPanelParam"); + LLWearable *wearable = this->getWearable(); + LLScrollingPanelParamBase *panel_param = NULL; + if (wearable && wearable->getType() == LLWearableType::WT_PHYSICS) // Hack to show a different panel for physics. Should generalize this later. + { + panel_param = new LLScrollingPanelParamBase( p, NULL, (*it).second, TRUE, this->getWearable(), jointp); + } + else + { + panel_param = new LLScrollingPanelParam( p, NULL, (*it).second, TRUE, this->getWearable(), jointp); + } + height = panel_list->addPanel( panel_param ); + } + } } void LLPanelEditWearable::updateVerbs() { - bool can_copy = false; + bool can_copy = false; - if(mWearableItem) - { - can_copy = mWearableItem->getPermissions().allowCopyBy(gAgentID); - } + if(mWearableItem) + { + can_copy = mWearableItem->getPermissions().allowCopyBy(gAgentID); + } - BOOL is_dirty = isDirty(); + BOOL is_dirty = isDirty(); - mBtnRevert->setEnabled(is_dirty); - getChildView("save_as_button")->setEnabled(is_dirty && can_copy); + mBtnRevert->setEnabled(is_dirty); + getChildView("save_as_button")->setEnabled(is_dirty && can_copy); - if(isAgentAvatarValid()) - { - // Update viewer's radio buttons (of RadioGroup with control_name="AvatarSex") of Avatar's gender - // with value from "AvatarSex" setting - gSavedSettings.setU32("AvatarSex", (gAgentAvatarp->getSex() == SEX_MALE) ); - } + if(isAgentAvatarValid()) + { + // Update viewer's radio buttons (of RadioGroup with control_name="AvatarSex") of Avatar's gender + // with value from "AvatarSex" setting + gSavedSettings.setU32("AvatarSex", (gAgentAvatarp->getSex() == SEX_MALE) ); + } - // update back button and title according to dirty state. - static BOOL was_dirty = FALSE; - if (was_dirty != is_dirty) // to avoid redundant changes because this method is called from draw - { - static S32 label_width = mBtnBack->getFont()->getWidth(mBackBtnLabel); - const std::string& label = is_dirty ? mBackBtnLabel : LLStringUtil::null; - const S32 delta_width = is_dirty ? label_width : -label_width; + // update back button and title according to dirty state. + static BOOL was_dirty = FALSE; + if (was_dirty != is_dirty) // to avoid redundant changes because this method is called from draw + { + static S32 label_width = mBtnBack->getFont()->getWidth(mBackBtnLabel); + const std::string& label = is_dirty ? mBackBtnLabel : LLStringUtil::null; + const S32 delta_width = is_dirty ? label_width : -label_width; - mBtnBack->setLabel(label); + mBtnBack->setLabel(label); - // update rect according to label width - LLRect rect = mBtnBack->getRect(); - rect.mRight += delta_width; - mBtnBack->setShape(rect); + // update rect according to label width + LLRect rect = mBtnBack->getRect(); + rect.mRight += delta_width; + mBtnBack->setShape(rect); - // update title rect according to back button width - rect = mPanelTitle->getRect(); - rect.mLeft += delta_width; - mPanelTitle->setShape(rect); + // update title rect according to back button width + rect = mPanelTitle->getRect(); + rect.mLeft += delta_width; + mPanelTitle->setShape(rect); - was_dirty = is_dirty; - } + was_dirty = is_dirty; + } } void LLPanelEditWearable::configureAlphaCheckbox(LLVOAvatarDefines::ETextureIndex te, const std::string& name) { - LLCheckBoxCtrl* checkbox = mPanelAlpha->getChild<LLCheckBoxCtrl>(name); - checkbox->setCommitCallback(boost::bind(&LLPanelEditWearable::onInvisibilityCommit, this, checkbox, te)); + LLCheckBoxCtrl* checkbox = mPanelAlpha->getChild<LLCheckBoxCtrl>(name); + checkbox->setCommitCallback(boost::bind(&LLPanelEditWearable::onInvisibilityCommit, this, checkbox, te)); - mAlphaCheckbox2Index[name] = te; + mAlphaCheckbox2Index[name] = te; } void LLPanelEditWearable::onInvisibilityCommit(LLCheckBoxCtrl* checkbox_ctrl, LLVOAvatarDefines::ETextureIndex te) { - if (!checkbox_ctrl) return; - if (!getWearable()) return; - - llinfos << "onInvisibilityCommit, self " << this << " checkbox_ctrl " << checkbox_ctrl << llendl; - - bool new_invis_state = checkbox_ctrl->get(); - if (new_invis_state) - { - LLLocalTextureObject *lto = getWearable()->getLocalTextureObject(te); - mPreviousAlphaTexture[te] = lto->getID(); - - LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture( IMG_INVISIBLE ); - U32 index = gAgentWearables.getWearableIndex(getWearable()); - gAgentAvatarp->setLocalTexture(te, image, FALSE, index); - gAgentAvatarp->wearableUpdated(getWearable()->getType(), FALSE); - } - else - { - // Try to restore previous texture, if any. - LLUUID prev_id = mPreviousAlphaTexture[te]; - if (prev_id.isNull() || (prev_id == IMG_INVISIBLE)) - { - prev_id = LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ); - } - if (prev_id.isNull()) return; - - LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture(prev_id); - if (!image) return; - - U32 index = gAgentWearables.getWearableIndex(getWearable()); - gAgentAvatarp->setLocalTexture(te, image, FALSE, index); - gAgentAvatarp->wearableUpdated(getWearable()->getType(), FALSE); - } - - updatePanelPickerControls(getWearable()->getType()); + if (!checkbox_ctrl) return; + if (!getWearable()) return; + + llinfos << "onInvisibilityCommit, self " << this << " checkbox_ctrl " << checkbox_ctrl << llendl; + + bool new_invis_state = checkbox_ctrl->get(); + if (new_invis_state) + { + LLLocalTextureObject *lto = getWearable()->getLocalTextureObject(te); + mPreviousAlphaTexture[te] = lto->getID(); + + LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture( IMG_INVISIBLE ); + U32 index = gAgentWearables.getWearableIndex(getWearable()); + gAgentAvatarp->setLocalTexture(te, image, FALSE, index); + gAgentAvatarp->wearableUpdated(getWearable()->getType(), FALSE); + } + else + { + // Try to restore previous texture, if any. + LLUUID prev_id = mPreviousAlphaTexture[te]; + if (prev_id.isNull() || (prev_id == IMG_INVISIBLE)) + { + prev_id = LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ); + } + if (prev_id.isNull()) return; + + LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture(prev_id); + if (!image) return; + + U32 index = gAgentWearables.getWearableIndex(getWearable()); + gAgentAvatarp->setLocalTexture(te, image, FALSE, index); + gAgentAvatarp->wearableUpdated(getWearable()->getType(), FALSE); + } + + updatePanelPickerControls(getWearable()->getType()); } void LLPanelEditWearable::updateAlphaCheckboxes() { - for(string_texture_index_map_t::iterator iter = mAlphaCheckbox2Index.begin(); - iter != mAlphaCheckbox2Index.end(); ++iter ) - { - LLVOAvatarDefines::ETextureIndex te = (LLVOAvatarDefines::ETextureIndex)iter->second; - LLCheckBoxCtrl* ctrl = mPanelAlpha->getChild<LLCheckBoxCtrl>(iter->first); - if (ctrl) - { - ctrl->set(!gAgentAvatarp->isTextureVisible(te, mWearablePtr)); - } - } + for(string_texture_index_map_t::iterator iter = mAlphaCheckbox2Index.begin(); + iter != mAlphaCheckbox2Index.end(); ++iter ) + { + LLVOAvatarDefines::ETextureIndex te = (LLVOAvatarDefines::ETextureIndex)iter->second; + LLCheckBoxCtrl* ctrl = mPanelAlpha->getChild<LLCheckBoxCtrl>(iter->first); + if (ctrl) + { + ctrl->set(!gAgentAvatarp->isTextureVisible(te, mWearablePtr)); + } + } } void LLPanelEditWearable::initPreviousAlphaTextures() { - initPreviousAlphaTextureEntry(TEX_LOWER_ALPHA); - initPreviousAlphaTextureEntry(TEX_UPPER_ALPHA); - initPreviousAlphaTextureEntry(TEX_HEAD_ALPHA); - initPreviousAlphaTextureEntry(TEX_EYES_ALPHA); - initPreviousAlphaTextureEntry(TEX_LOWER_ALPHA); + initPreviousAlphaTextureEntry(TEX_LOWER_ALPHA); + initPreviousAlphaTextureEntry(TEX_UPPER_ALPHA); + initPreviousAlphaTextureEntry(TEX_HEAD_ALPHA); + initPreviousAlphaTextureEntry(TEX_EYES_ALPHA); + initPreviousAlphaTextureEntry(TEX_LOWER_ALPHA); } void LLPanelEditWearable::initPreviousAlphaTextureEntry(LLVOAvatarDefines::ETextureIndex te) { - LLLocalTextureObject *lto = getWearable()->getLocalTextureObject(te); - if (lto) - { - mPreviousAlphaTexture[te] = lto->getID(); - } + LLLocalTextureObject *lto = getWearable()->getLocalTextureObject(te); + if (lto) + { + mPreviousAlphaTexture[te] = lto->getID(); + } } // handle secondlife:///app/metricsystem class LLMetricSystemHandler : public LLCommandHandler { public: - LLMetricSystemHandler() : LLCommandHandler("metricsystem", UNTRUSTED_THROTTLE) { } - - bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web) - { - // change height units TRUE for meters and FALSE for feet - BOOL new_value = (gSavedSettings.getBOOL("HeightUnits") == FALSE) ? TRUE : FALSE; - gSavedSettings.setBOOL("HeightUnits", new_value); - return true; - } + LLMetricSystemHandler() : LLCommandHandler("metricsystem", UNTRUSTED_THROTTLE) { } + + bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web) + { + // change height units TRUE for meters and FALSE for feet + BOOL new_value = (gSavedSettings.getBOOL("HeightUnits") == FALSE) ? TRUE : FALSE; + gSavedSettings.setBOOL("HeightUnits", new_value); + return true; + } }; LLMetricSystemHandler gMetricSystemHandler; diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 73de1cef3f..53809b4d19 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -52,9 +52,9 @@ typedef std::map<std::string, F32> default_controller_map_t; inline F64 llsgn(const F64 a) { - if (a >= 0) - return 1; - return -1; + if (a >= 0) + return 1; + return -1; } /* @@ -71,161 +71,161 @@ inline F64 llsgn(const F64 a) class LLPhysicsMotion { public: - /* - param_user_name: The param (if any) that the user sees and controls. This is what - the particular property would look like without physics. For example, it may be - the breast gravity. This param's value should will not be altered, and is only - used as a reference point for the rest position of the body party. This is usually - a driver param and the param(s) that physics is altering are the driven params. - - param_driven_name: The param whose value is actually set by the physics. If you - leave this blank (which should suffice normally), the physics will assume that - param_user_name is a driver param and will set the params that the driver is - in charge of (i.e. the "driven" params). - - joint_name: The joint that the body part is attached to. The joint is - used to determine the orientation (rotation) of the body part. - - character: The avatar that this physics affects. - - motion_direction_vec: The direction (in world coordinates) that determines the - motion. For example, (0,0,1) is up-down, and means that up-down motion is what - determines how this joint moves. - - controllers: The various settings (e.g. spring force, mass) that determine how - the body part behaves. - */ - LLPhysicsMotion(const std::string ¶m_user_name, - const std::string ¶m_driven_name, - const std::string &joint_name, - LLCharacter *character, - const LLVector3 &motion_direction_vec, - const controller_map_t &controllers) : - mParamUserName(param_user_name), - mParamDrivenName(param_driven_name), - mJointName(joint_name), - mMotionDirectionVec(motion_direction_vec), - mParamUser(NULL), - mParamDriven(NULL), - - mParamControllers(controllers), - mCharacter(character), - mLastTime(0), - mPosition_local(0), - mVelocityJoint_local(0), - mPositionLastUpdate_local(0) - { - mJointState = new LLJointState; - } - - BOOL initialize(); - - ~LLPhysicsMotion() {} - - BOOL onUpdate(F32 time); - - LLPointer<LLJointState> getJointState() - { - return mJointState; - } + /* + param_user_name: The param (if any) that the user sees and controls. This is what + the particular property would look like without physics. For example, it may be + the breast gravity. This param's value should will not be altered, and is only + used as a reference point for the rest position of the body party. This is usually + a driver param and the param(s) that physics is altering are the driven params. + + param_driven_name: The param whose value is actually set by the physics. If you + leave this blank (which should suffice normally), the physics will assume that + param_user_name is a driver param and will set the params that the driver is + in charge of (i.e. the "driven" params). + + joint_name: The joint that the body part is attached to. The joint is + used to determine the orientation (rotation) of the body part. + + character: The avatar that this physics affects. + + motion_direction_vec: The direction (in world coordinates) that determines the + motion. For example, (0,0,1) is up-down, and means that up-down motion is what + determines how this joint moves. + + controllers: The various settings (e.g. spring force, mass) that determine how + the body part behaves. + */ + LLPhysicsMotion(const std::string ¶m_user_name, + const std::string ¶m_driven_name, + const std::string &joint_name, + LLCharacter *character, + const LLVector3 &motion_direction_vec, + const controller_map_t &controllers) : + mParamUserName(param_user_name), + mParamDrivenName(param_driven_name), + mJointName(joint_name), + mMotionDirectionVec(motion_direction_vec), + mParamUser(NULL), + mParamDriven(NULL), + + mParamControllers(controllers), + mCharacter(character), + mLastTime(0), + mPosition_local(0), + mVelocityJoint_local(0), + mPositionLastUpdate_local(0) + { + mJointState = new LLJointState; + } + + BOOL initialize(); + + ~LLPhysicsMotion() {} + + BOOL onUpdate(F32 time); + + LLPointer<LLJointState> getJointState() + { + return mJointState; + } protected: - F32 getParamValue(const std::string& controller_key) - { - const controller_map_t::const_iterator& entry = mParamControllers.find(controller_key); - if (entry == mParamControllers.end()) - { - return sDefaultController[controller_key]; - } - const std::string& param_name = (*entry).second.c_str(); - return mCharacter->getVisualParamWeight(param_name.c_str()); - } - void setParamValue(LLViewerVisualParam *param, - const F32 new_value_local); - - F32 toLocal(const LLVector3 &world); - F32 calculateVelocity_local(const F32 time_delta); - F32 calculateAcceleration_local(F32 velocity_local, - const F32 time_delta); + F32 getParamValue(const std::string& controller_key) + { + const controller_map_t::const_iterator& entry = mParamControllers.find(controller_key); + if (entry == mParamControllers.end()) + { + return sDefaultController[controller_key]; + } + const std::string& param_name = (*entry).second.c_str(); + return mCharacter->getVisualParamWeight(param_name.c_str()); + } + void setParamValue(LLViewerVisualParam *param, + const F32 new_value_local); + + F32 toLocal(const LLVector3 &world); + F32 calculateVelocity_local(const F32 time_delta); + F32 calculateAcceleration_local(F32 velocity_local, + const F32 time_delta); private: - const std::string mParamDrivenName; - const std::string mParamUserName; - const LLVector3 mMotionDirectionVec; - const std::string mJointName; - - F32 mPosition_local; - F32 mVelocityJoint_local; // How fast the joint is moving - F32 mAccelerationJoint_local; // Acceleration on the joint - - F32 mVelocity_local; // How fast the param is moving - F32 mPositionLastUpdate_local; - LLVector3 mPosition_world; - - LLViewerVisualParam *mParamUser; - LLViewerVisualParam *mParamDriven; - const controller_map_t mParamControllers; - - LLPointer<LLJointState> mJointState; - LLCharacter *mCharacter; - - F32 mLastTime; - - static default_controller_map_t sDefaultController; + const std::string mParamDrivenName; + const std::string mParamUserName; + const LLVector3 mMotionDirectionVec; + const std::string mJointName; + + F32 mPosition_local; + F32 mVelocityJoint_local; // How fast the joint is moving + F32 mAccelerationJoint_local; // Acceleration on the joint + + F32 mVelocity_local; // How fast the param is moving + F32 mPositionLastUpdate_local; + LLVector3 mPosition_world; + + LLViewerVisualParam *mParamUser; + LLViewerVisualParam *mParamDriven; + const controller_map_t mParamControllers; + + LLPointer<LLJointState> mJointState; + LLCharacter *mCharacter; + + F32 mLastTime; + + static default_controller_map_t sDefaultController; }; default_controller_map_t initDefaultController() { - default_controller_map_t controller; - controller["Mass"] = 0.2f; - controller["Smoothing"] = 2.0f; - controller["Gravity"] = 0.0f; - controller["Damping"] = .05f; - controller["Drag"] = 0.15f; - controller["MaxSpeed"] = 0.1f; - controller["Spring"] = 0.1f; - controller["Gain"] = 10.0f; - return controller; + default_controller_map_t controller; + controller["Mass"] = 0.2f; + controller["Smoothing"] = 2.0f; + controller["Gravity"] = 0.0f; + controller["Damping"] = .05f; + controller["Drag"] = 0.15f; + controller["MaxSpeed"] = 0.1f; + controller["Spring"] = 0.1f; + controller["Gain"] = 10.0f; + return controller; } default_controller_map_t LLPhysicsMotion::sDefaultController = initDefaultController(); BOOL LLPhysicsMotion::initialize() { - if (!mJointState->setJoint(mCharacter->getJoint(mJointName.c_str()))) - return FALSE; - mJointState->setUsage(LLJointState::ROT); - - mParamUser = (LLViewerVisualParam*)mCharacter->getVisualParam(mParamUserName.c_str()); - if (mParamDrivenName != "") - mParamDriven = (LLViewerVisualParam*)mCharacter->getVisualParam(mParamDrivenName.c_str()); - if (mParamUser == NULL) - { - llinfos << "Failure reading in [ " << mParamUserName << " ]" << llendl; - return FALSE; - } - - return TRUE; + if (!mJointState->setJoint(mCharacter->getJoint(mJointName.c_str()))) + return FALSE; + mJointState->setUsage(LLJointState::ROT); + + mParamUser = (LLViewerVisualParam*)mCharacter->getVisualParam(mParamUserName.c_str()); + if (mParamDrivenName != "") + mParamDriven = (LLViewerVisualParam*)mCharacter->getVisualParam(mParamDrivenName.c_str()); + if (mParamUser == NULL) + { + llinfos << "Failure reading in [ " << mParamUserName << " ]" << llendl; + return FALSE; + } + + return TRUE; } LLPhysicsMotionController::LLPhysicsMotionController(const LLUUID &id) : - LLMotion(id), - mCharacter(NULL) + LLMotion(id), + mCharacter(NULL) { - mName = "breast_motion"; + mName = "breast_motion"; } LLPhysicsMotionController::~LLPhysicsMotionController() { - for (motion_vec_t::iterator iter = mMotions.begin(); - iter != mMotions.end(); - ++iter) - { - delete (*iter); - } + for (motion_vec_t::iterator iter = mMotions.begin(); + iter != mMotions.end(); + ++iter) + { + delete (*iter); + } } BOOL LLPhysicsMotionController::onActivate() { - return TRUE; + return TRUE; } void LLPhysicsMotionController::onDeactivate() @@ -234,465 +234,465 @@ void LLPhysicsMotionController::onDeactivate() LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter *character) { - mCharacter = character; - - mMotions.clear(); - - // Breast Cleavage - { - controller_map_t controller; - controller["Mass"] = "Breast_Physics_Mass"; - controller["Smoothing"] = "Breast_Physics_Smoothing"; - controller["Gravity"] = "Breast_Physics_Gravity"; - controller["Damping"] = "Breast_Physics_InOut_Damping"; - controller["Drag"] = "Breast_Physics_InOut_Drag"; - controller["MaxSpeed"] = "Breast_Physics_InOut_Max_Velocity"; - controller["Spring"] = "Breast_Physics_InOut_Spring"; - controller["Gain"] = "Breast_Physics_InOut_Gain"; - LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_InOut_Controller", - "", - "mChest", - character, - LLVector3(-1,0,0), - controller); - if (!motion->initialize()) - { - llassert_always(FALSE); - return STATUS_FAILURE; - } - addMotion(motion); - } - - // Breast Bounce - { - controller_map_t controller; - controller["Mass"] = "Breast_Physics_Mass"; - controller["Smoothing"] = "Breast_Physics_Smoothing"; - controller["Gravity"] = "Breast_Physics_Gravity"; - controller["Damping"] = "Breast_Physics_UpDown_Damping"; - controller["Drag"] = "Breast_Physics_UpDown_Drag"; - controller["MaxSpeed"] = "Breast_Physics_UpDown_Max_Velocity"; - controller["Spring"] = "Breast_Physics_UpDown_Spring"; - controller["Gain"] = "Breast_Physics_UpDown_Gain"; - LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_UpDown_Controller", - "", - "mChest", - character, - LLVector3(0,0,1), - controller); - if (!motion->initialize()) - { - llassert_always(FALSE); - return STATUS_FAILURE; - } - addMotion(motion); - } - - // Butt Bounce - { - controller_map_t controller; - controller["Mass"] = "Butt_Physics_Mass"; - controller["Smoothing"] = "Butt_Physics_Smoothing"; - controller["Gravity"] = "Butt_Physics_Gravity"; - controller["Damping"] = "Butt_Physics_UpDown_Damping"; - controller["Drag"] = "Butt_Physics_UpDown_Drag"; - controller["MaxSpeed"] = "Butt_Physics_UpDown_Max_Velocity"; - controller["Spring"] = "Butt_Physics_UpDown_Spring"; - controller["Gain"] = "Butt_Physics_UpDown_Gain"; - LLPhysicsMotion *motion = new LLPhysicsMotion("Butt_Physics_UpDown_Controller", - "", - "mPelvis", - character, - LLVector3(0,0,1), - controller); - if (!motion->initialize()) - { - llassert_always(FALSE); - return STATUS_FAILURE; - } - addMotion(motion); - } - - // Butt LeftRight - { - controller_map_t controller; - controller["Mass"] = "Butt_Physics_Mass"; - controller["Smoothing"] = "Butt_Physics_Smoothing"; - controller["Gravity"] = "Butt_Physics_Gravity"; - controller["Damping"] = "Butt_Physics_LeftRight_Damping"; - controller["Drag"] = "Butt_Physics_LeftRight_Drag"; - controller["MaxSpeed"] = "Butt_Physics_LeftRight_Max_Velocity"; - controller["Spring"] = "Butt_Physics_LeftRight_Spring"; - controller["Gain"] = "Butt_Physics_LeftRight_Gain"; - LLPhysicsMotion *motion = new LLPhysicsMotion("Butt_Physics_LeftRight_Controller", - "", - "mPelvis", - character, - LLVector3(0,1,0), - controller); - if (!motion->initialize()) - { - llassert_always(FALSE); - return STATUS_FAILURE; - } - addMotion(motion); - } - - // Belly Bounce - { - controller_map_t controller; - controller["Mass"] = "Belly_Physics_Mass"; - controller["Smoothing"] = "Belly_Physics_Smoothing"; - controller["Gravity"] = "Belly_Physics_Gravity"; - controller["Damping"] = "Belly_Physics_UpDown_Damping"; - controller["Drag"] = "Belly_Physics_UpDown_Drag"; - controller["MaxSpeed"] = "Belly_Physics_UpDown_Max_Velocity"; - controller["Spring"] = "Belly_Physics_UpDown_Spring"; - controller["Gain"] = "Belly_Physics_UpDown_Gain"; - LLPhysicsMotion *motion = new LLPhysicsMotion("Belly_Physics_UpDown_Controller", - "", - "mPelvis", - character, - LLVector3(0,0,-1), - controller); - if (!motion->initialize()) - { - llassert_always(FALSE); - return STATUS_FAILURE; - } - addMotion(motion); - } - - return STATUS_SUCCESS; + mCharacter = character; + + mMotions.clear(); + + // Breast Cleavage + { + controller_map_t controller; + controller["Mass"] = "Breast_Physics_Mass"; + controller["Smoothing"] = "Breast_Physics_Smoothing"; + controller["Gravity"] = "Breast_Physics_Gravity"; + controller["Drag"] = "Breast_Physics_Drag"; + controller["Damping"] = "Breast_Physics_InOut_Damping"; + controller["MaxSpeed"] = "Breast_Physics_InOut_Max_Velocity"; + controller["Spring"] = "Breast_Physics_InOut_Spring"; + controller["Gain"] = "Breast_Physics_InOut_Gain"; + LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_InOut_Controller", + "", + "mChest", + character, + LLVector3(-1,0,0), + controller); + if (!motion->initialize()) + { + llassert_always(FALSE); + return STATUS_FAILURE; + } + addMotion(motion); + } + + // Breast Bounce + { + controller_map_t controller; + controller["Mass"] = "Breast_Physics_Mass"; + controller["Smoothing"] = "Breast_Physics_Smoothing"; + controller["Gravity"] = "Breast_Physics_Gravity"; + controller["Drag"] = "Breast_Physics_Drag"; + controller["Damping"] = "Breast_Physics_UpDown_Damping"; + controller["MaxSpeed"] = "Breast_Physics_UpDown_Max_Velocity"; + controller["Spring"] = "Breast_Physics_UpDown_Spring"; + controller["Gain"] = "Breast_Physics_UpDown_Gain"; + LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_UpDown_Controller", + "", + "mChest", + character, + LLVector3(0,0,1), + controller); + if (!motion->initialize()) + { + llassert_always(FALSE); + return STATUS_FAILURE; + } + addMotion(motion); + } + + // Butt Bounce + { + controller_map_t controller; + controller["Mass"] = "Butt_Physics_Mass"; + controller["Smoothing"] = "Butt_Physics_Smoothing"; + controller["Gravity"] = "Butt_Physics_Gravity"; + controller["Drag"] = "Butt_Physics_Drag"; + controller["Damping"] = "Butt_Physics_UpDown_Damping"; + controller["MaxSpeed"] = "Butt_Physics_UpDown_Max_Velocity"; + controller["Spring"] = "Butt_Physics_UpDown_Spring"; + controller["Gain"] = "Butt_Physics_UpDown_Gain"; + LLPhysicsMotion *motion = new LLPhysicsMotion("Butt_Physics_UpDown_Controller", + "", + "mPelvis", + character, + LLVector3(0,0,1), + controller); + if (!motion->initialize()) + { + llassert_always(FALSE); + return STATUS_FAILURE; + } + addMotion(motion); + } + + // Butt LeftRight + { + controller_map_t controller; + controller["Mass"] = "Butt_Physics_Mass"; + controller["Smoothing"] = "Butt_Physics_Smoothing"; + controller["Gravity"] = "Butt_Physics_Gravity"; + controller["Drag"] = "Butt_Physics_Drag"; + controller["Damping"] = "Butt_Physics_LeftRight_Damping"; + controller["MaxSpeed"] = "Butt_Physics_LeftRight_Max_Velocity"; + controller["Spring"] = "Butt_Physics_LeftRight_Spring"; + controller["Gain"] = "Butt_Physics_LeftRight_Gain"; + LLPhysicsMotion *motion = new LLPhysicsMotion("Butt_Physics_LeftRight_Controller", + "", + "mPelvis", + character, + LLVector3(0,1,0), + controller); + if (!motion->initialize()) + { + llassert_always(FALSE); + return STATUS_FAILURE; + } + addMotion(motion); + } + + // Belly Bounce + { + controller_map_t controller; + controller["Mass"] = "Belly_Physics_Mass"; + controller["Smoothing"] = "Belly_Physics_Smoothing"; + controller["Gravity"] = "Belly_Physics_Gravity"; + controller["Drag"] = "Belly_Physics_Drag"; + controller["Damping"] = "Belly_Physics_UpDown_Damping"; + controller["MaxSpeed"] = "Belly_Physics_UpDown_Max_Velocity"; + controller["Spring"] = "Belly_Physics_UpDown_Spring"; + controller["Gain"] = "Belly_Physics_UpDown_Gain"; + LLPhysicsMotion *motion = new LLPhysicsMotion("Belly_Physics_UpDown_Controller", + "", + "mPelvis", + character, + LLVector3(0,0,-1), + controller); + if (!motion->initialize()) + { + llassert_always(FALSE); + return STATUS_FAILURE; + } + addMotion(motion); + } + + return STATUS_SUCCESS; } void LLPhysicsMotionController::addMotion(LLPhysicsMotion *motion) { - addJointState(motion->getJointState()); - mMotions.push_back(motion); + addJointState(motion->getJointState()); + mMotions.push_back(motion); } F32 LLPhysicsMotionController::getMinPixelArea() { - return MIN_REQUIRED_PIXEL_AREA_BREAST_MOTION; + return MIN_REQUIRED_PIXEL_AREA_BREAST_MOTION; } // Local space means "parameter space". F32 LLPhysicsMotion::toLocal(const LLVector3 &world) { - LLJoint *joint = mJointState->getJoint(); - const LLQuaternion rotation_world = joint->getWorldRotation(); - - LLVector3 dir_world = mMotionDirectionVec * rotation_world; - dir_world.normalize(); - return world * dir_world; + LLJoint *joint = mJointState->getJoint(); + const LLQuaternion rotation_world = joint->getWorldRotation(); + + LLVector3 dir_world = mMotionDirectionVec * rotation_world; + dir_world.normalize(); + return world * dir_world; } F32 LLPhysicsMotion::calculateVelocity_local(const F32 time_delta) { - LLJoint *joint = mJointState->getJoint(); - const LLVector3 position_world = joint->getWorldPosition(); - const LLQuaternion rotation_world = joint->getWorldRotation(); - const LLVector3 last_position_world = mPosition_world; - const LLVector3 velocity_world = (position_world-last_position_world) / time_delta; - const F32 velocity_local = toLocal(velocity_world); - return velocity_local; + LLJoint *joint = mJointState->getJoint(); + const LLVector3 position_world = joint->getWorldPosition(); + const LLQuaternion rotation_world = joint->getWorldRotation(); + const LLVector3 last_position_world = mPosition_world; + const LLVector3 velocity_world = (position_world-last_position_world) / time_delta; + const F32 velocity_local = toLocal(velocity_world); + return velocity_local; } F32 LLPhysicsMotion::calculateAcceleration_local(const F32 velocity_local, - const F32 time_delta) + const F32 time_delta) { - const F32 smoothing = getParamValue("Smoothing"); - const F32 acceleration_local = velocity_local - mVelocityJoint_local; - - const F32 smoothed_acceleration_local = - acceleration_local * 1.0/smoothing + - mAccelerationJoint_local * (smoothing-1.0)/smoothing; - - return smoothed_acceleration_local; + const F32 smoothing = getParamValue("Smoothing"); + const F32 acceleration_local = velocity_local - mVelocityJoint_local; + + const F32 smoothed_acceleration_local = + acceleration_local * 1.0/smoothing + + mAccelerationJoint_local * (smoothing-1.0)/smoothing; + + return smoothed_acceleration_local; } BOOL LLPhysicsMotionController::onUpdate(F32 time, U8* joint_mask) { - // Skip if disabled globally. - if (!gSavedSettings.getBOOL("AvatarPhysics")) - { - return TRUE; - } - - BOOL update_visuals = FALSE; - for (motion_vec_t::iterator iter = mMotions.begin(); - iter != mMotions.end(); - ++iter) - { - LLPhysicsMotion *motion = (*iter); - update_visuals |= motion->onUpdate(time); - } - - if (update_visuals) - mCharacter->updateVisualParams(); - - return TRUE; + // Skip if disabled globally. + if (!gSavedSettings.getBOOL("AvatarPhysics")) + { + return TRUE; + } + + BOOL update_visuals = FALSE; + for (motion_vec_t::iterator iter = mMotions.begin(); + iter != mMotions.end(); + ++iter) + { + LLPhysicsMotion *motion = (*iter); + update_visuals |= motion->onUpdate(time); + } + + if (update_visuals) + mCharacter->updateVisualParams(); + + return TRUE; } // Return TRUE if character has to update visual params. BOOL LLPhysicsMotion::onUpdate(F32 time) { - // static FILE *mFileWrite = fopen("c:\\temp\\avatar_data.txt","w"); - - if (!mParamUser) - return FALSE; - - if (!mLastTime) - { - mLastTime = time; - return FALSE; - } - - //////////////////////////////////////////////////////////////////////////////// - // Get all parameters and settings - // - - const F32 time_delta = time - mLastTime; - if (time_delta > 3.0 || time_delta <= 0.01) - { - mLastTime = time; - return FALSE; - } - - // Higher LOD is better. This controls the granularity - // and frequency of updates for the motions. - const F32 lod_factor = LLVOAvatar::sPhysicsLODFactor; - if (lod_factor == 0) - { - return TRUE; - } - - LLJoint *joint = mJointState->getJoint(); - - const F32 behavior_mass = getParamValue("Mass"); - const F32 behavior_gravity = getParamValue("Gravity"); - const F32 behavior_spring = getParamValue("Spring"); - const F32 behavior_gain = getParamValue("Gain"); - const F32 behavior_damping = getParamValue("Damping"); - const F32 behavior_drag = getParamValue("Drag"); - const BOOL physics_test = gSavedSettings.getBOOL("AvatarPhysicsTest"); - - F32 behavior_maxspeed = getParamValue("MaxSpeed"); - if (physics_test) - behavior_maxspeed = 100.0f; - - if (behavior_maxspeed == 0) - return FALSE; - - F32 position_current_local = llclamp(mPosition_local, - 0.0f, - 1.0f); // Normalized [0,1] range - - // Normalize the param position to be from [0,1]. - // We have to use normalized values because there may be more than one driven param, - // and each of these driven params may have its own range. - // This means we'll do all our calculations in normalized [0,1] local coordinates. - F32 position_user_local = mParamUser->getWeight(); - position_user_local = (position_user_local - mParamUser->getMinWeight()) / (mParamUser->getMaxWeight() - mParamUser->getMinWeight()); - - // - // End parameters and settings - //////////////////////////////////////////////////////////////////////////////// - - - //////////////////////////////////////////////////////////////////////////////// - // Calculate velocity and acceleration in parameter space. - // - - const F32 velocity_joint_local = calculateVelocity_local(time_delta); - const F32 acceleration_joint_local = calculateAcceleration_local(velocity_joint_local, time_delta); - - // - // End velocity and acceleration - //////////////////////////////////////////////////////////////////////////////// - - - //////////////////////////////////////////////////////////////////////////////// - // Calculate the total force - // - - // Spring force is a restoring force towards the original user-set breast position. - // F = kx - const F32 spring_length = position_current_local - position_user_local; - const F32 force_spring = -spring_length * behavior_spring; - - // Acceleration is the force that comes from the change in velocity of the torso. - // F = ma - const F32 force_accel = behavior_gain * (acceleration_joint_local * behavior_mass); - - // Gravity always points downward in world space. - // F = mg - const LLVector3 gravity_world(0,0,1); - const F32 force_gravity = behavior_gain * (toLocal(gravity_world) * behavior_gravity * behavior_mass); - - // Damping is a restoring force that opposes the current velocity. - // F = -kv - const F32 force_damping = -behavior_damping * mVelocity_local; - - // Drag is a force imparted by velocity (intuitively it is similar to wind resistance) - // F = .5kv^2 - const F32 force_drag = .5*behavior_drag*velocity_joint_local*velocity_joint_local*llsgn(velocity_joint_local); - - const F32 force_net = (force_accel + - force_gravity + - force_spring + - force_damping + - force_drag); - - // - // End total force - //////////////////////////////////////////////////////////////////////////////// - - - //////////////////////////////////////////////////////////////////////////////// - // Calculate new params - // - - // Calculate the new acceleration based on the net force. - // a = F/m - const F32 acceleration_new_local = force_net / behavior_mass; - F32 velocity_new_local = mVelocity_local + acceleration_new_local; - velocity_new_local = llclamp(velocity_new_local, - -behavior_maxspeed, behavior_maxspeed); - - // Temporary debugging setting to cause all avatars to move, for profiling purposes. - if (physics_test) - { - velocity_new_local = sin(time*4.0); - } - // Calculate the new parameters, or remain unchanged if max speed is 0. - const F32 position_new_local = (behavior_maxspeed != 0) ? - (position_current_local + velocity_new_local*time_delta) : - position_user_local; - - // Zero out the velocity if the param is being pushed beyond its limits. - if (position_new_local < 0 || position_new_local > 1) - { - velocity_new_local = 0; - } - - const F32 position_new_local_clamped = llclamp(position_new_local, - 0.0f, - 1.0f); - - // Set the new param. - // If a specific param has been declared, then set that one. - // Otherwise, assume that the param is a driver param, and - // set the params that it drives. - if (mParamDriven) - { - setParamValue(mParamDriven,position_new_local_clamped); - } - else - { - LLDriverParam *driver_param = dynamic_cast<LLDriverParam *>(mParamUser); - llassert_always(driver_param); - if (driver_param) - { - for (LLDriverParam::entry_list_t::iterator iter = driver_param->mDriven.begin(); - iter != driver_param->mDriven.end(); - ++iter) - { - LLDrivenEntry &entry = (*iter); - LLViewerVisualParam *driven_param = entry.mParam; - setParamValue(driven_param,position_new_local_clamped); - } - } - } - - // - // End calculate new params - //////////////////////////////////////////////////////////////////////////////// - - //////////////////////////////////////////////////////////////////////////////// - // Conditionally update the visual params - // - - // Updating the visual params (i.e. what the user sees) is fairly expensive. - // So only update if the params have changed enough, and also take into account - // the graphics LOD settings. - - BOOL update_visuals = FALSE; - - // For non-self, if the avatar is small enough visually, then don't update. - const F32 area_for_max_settings = 0.0; - const F32 area_for_min_settings = 1400.0; - const F32 area_for_this_setting = area_for_max_settings + (area_for_min_settings-area_for_max_settings)*(1.0-lod_factor); - const F32 pixel_area = fsqrtf(mCharacter->getPixelArea()); - - const BOOL is_self = (dynamic_cast<LLVOAvatarSelf *>(mCharacter) != NULL); - if ((pixel_area > area_for_this_setting) || is_self) - { - const F32 position_diff_local = llabs(mPositionLastUpdate_local-position_new_local_clamped); - const F32 min_delta = (1.01f-lod_factor)*0.4f; - if (llabs(position_diff_local) > min_delta) - { - update_visuals = TRUE; - mPositionLastUpdate_local = position_new_local; - } - } - - // - // End update visual params - //////////////////////////////////////////////////////////////////////////////// - - mVelocityJoint_local = velocity_joint_local; - - mVelocity_local = velocity_new_local; - mAccelerationJoint_local = acceleration_joint_local; - mPosition_local = position_new_local; - - mPosition_world = joint->getWorldPosition(); - mLastTime = time; - - /* - // Write out debugging info into a spreadsheet. - if (mFileWrite != NULL && is_self) - { - fprintf(mFileWrite,"%f\t%f\t%f \t\t%f \t\t%f\t%f\t%f\t \t\t%f\t%f\t%f\t%f\t%f \t\t%f\t%f\t%f\n", - position_new_local, - velocity_new_local, - acceleration_new_local, - - time_delta, - - mPosition_world[0], - mPosition_world[1], - mPosition_world[2], - - force_net, - force_spring, - force_accel, - force_damping, - force_drag, - - spring_length, - velocity_joint_local, - acceleration_joint_local - ); - } - */ - - return update_visuals; + // static FILE *mFileWrite = fopen("c:\\temp\\avatar_data.txt","w"); + + if (!mParamUser) + return FALSE; + + if (!mLastTime) + { + mLastTime = time; + return FALSE; + } + + //////////////////////////////////////////////////////////////////////////////// + // Get all parameters and settings + // + + const F32 time_delta = time - mLastTime; + if (time_delta > 3.0 || time_delta <= 0.01) + { + mLastTime = time; + return FALSE; + } + + // Higher LOD is better. This controls the granularity + // and frequency of updates for the motions. + const F32 lod_factor = LLVOAvatar::sPhysicsLODFactor; + if (lod_factor == 0) + { + return TRUE; + } + + LLJoint *joint = mJointState->getJoint(); + + const F32 behavior_mass = getParamValue("Mass"); + const F32 behavior_gravity = getParamValue("Gravity"); + const F32 behavior_spring = getParamValue("Spring"); + const F32 behavior_gain = getParamValue("Gain"); + const F32 behavior_damping = getParamValue("Damping"); + const F32 behavior_drag = getParamValue("Drag"); + const BOOL physics_test = gSavedSettings.getBOOL("AvatarPhysicsTest"); + + F32 behavior_maxspeed = getParamValue("MaxSpeed"); + if (physics_test) + behavior_maxspeed = 100.0f; + + if (behavior_maxspeed == 0) + return FALSE; + + F32 position_current_local = llclamp(mPosition_local, + 0.0f, + 1.0f); // Normalized [0,1] range + + // Normalize the param position to be from [0,1]. + // We have to use normalized values because there may be more than one driven param, + // and each of these driven params may have its own range. + // This means we'll do all our calculations in normalized [0,1] local coordinates. + F32 position_user_local = mParamUser->getWeight(); + position_user_local = (position_user_local - mParamUser->getMinWeight()) / (mParamUser->getMaxWeight() - mParamUser->getMinWeight()); + + // + // End parameters and settings + //////////////////////////////////////////////////////////////////////////////// + + + //////////////////////////////////////////////////////////////////////////////// + // Calculate velocity and acceleration in parameter space. + // + + const F32 velocity_joint_local = calculateVelocity_local(time_delta); + const F32 acceleration_joint_local = calculateAcceleration_local(velocity_joint_local, time_delta); + + // + // End velocity and acceleration + //////////////////////////////////////////////////////////////////////////////// + + + //////////////////////////////////////////////////////////////////////////////// + // Calculate the total force + // + + // Spring force is a restoring force towards the original user-set breast position. + // F = kx + const F32 spring_length = position_current_local - position_user_local; + const F32 force_spring = -spring_length * behavior_spring; + + // Acceleration is the force that comes from the change in velocity of the torso. + // F = ma + const F32 force_accel = behavior_gain * (acceleration_joint_local * behavior_mass); + + // Gravity always points downward in world space. + // F = mg + const LLVector3 gravity_world(0,0,1); + const F32 force_gravity = behavior_gain * (toLocal(gravity_world) * behavior_gravity * behavior_mass); + + // Damping is a restoring force that opposes the current velocity. + // F = -kv + const F32 force_damping = -behavior_damping * mVelocity_local; + + // Drag is a force imparted by velocity (intuitively it is similar to wind resistance) + // F = .5kv^2 + const F32 force_drag = .5*behavior_drag*velocity_joint_local*velocity_joint_local*llsgn(velocity_joint_local); + + const F32 force_net = (force_accel + + force_gravity + + force_spring + + force_damping + + force_drag); + + // + // End total force + //////////////////////////////////////////////////////////////////////////////// + + + //////////////////////////////////////////////////////////////////////////////// + // Calculate new params + // + + // Calculate the new acceleration based on the net force. + // a = F/m + const F32 acceleration_new_local = force_net / behavior_mass; + F32 velocity_new_local = mVelocity_local + acceleration_new_local; + velocity_new_local = llclamp(velocity_new_local, + -behavior_maxspeed, behavior_maxspeed); + + // Temporary debugging setting to cause all avatars to move, for profiling purposes. + if (physics_test) + { + velocity_new_local = sin(time*4.0); + } + // Calculate the new parameters, or remain unchanged if max speed is 0. + const F32 position_new_local = (behavior_maxspeed != 0) ? + (position_current_local + velocity_new_local*time_delta) : + position_user_local; + + // Zero out the velocity if the param is being pushed beyond its limits. + if (position_new_local < 0 || position_new_local > 1) + { + velocity_new_local = 0; + } + + const F32 position_new_local_clamped = llclamp(position_new_local, + 0.0f, + 1.0f); + + // Set the new param. + // If a specific param has been declared, then set that one. + // Otherwise, assume that the param is a driver param, and + // set the params that it drives. + if (mParamDriven) + { + setParamValue(mParamDriven,position_new_local_clamped); + } + else + { + LLDriverParam *driver_param = dynamic_cast<LLDriverParam *>(mParamUser); + llassert_always(driver_param); + if (driver_param) + { + for (LLDriverParam::entry_list_t::iterator iter = driver_param->mDriven.begin(); + iter != driver_param->mDriven.end(); + ++iter) + { + LLDrivenEntry &entry = (*iter); + LLViewerVisualParam *driven_param = entry.mParam; + setParamValue(driven_param,position_new_local_clamped); + } + } + } + + // + // End calculate new params + //////////////////////////////////////////////////////////////////////////////// + + //////////////////////////////////////////////////////////////////////////////// + // Conditionally update the visual params + // + + // Updating the visual params (i.e. what the user sees) is fairly expensive. + // So only update if the params have changed enough, and also take into account + // the graphics LOD settings. + + BOOL update_visuals = FALSE; + + // For non-self, if the avatar is small enough visually, then don't update. + const F32 area_for_max_settings = 0.0; + const F32 area_for_min_settings = 1400.0; + const F32 area_for_this_setting = area_for_max_settings + (area_for_min_settings-area_for_max_settings)*(1.0-lod_factor); + const F32 pixel_area = fsqrtf(mCharacter->getPixelArea()); + + const BOOL is_self = (dynamic_cast<LLVOAvatarSelf *>(mCharacter) != NULL); + if ((pixel_area > area_for_this_setting) || is_self) + { + const F32 position_diff_local = llabs(mPositionLastUpdate_local-position_new_local_clamped); + const F32 min_delta = (1.01f-lod_factor)*0.4f; + if (llabs(position_diff_local) > min_delta) + { + update_visuals = TRUE; + mPositionLastUpdate_local = position_new_local; + } + } + + // + // End update visual params + //////////////////////////////////////////////////////////////////////////////// + + mVelocityJoint_local = velocity_joint_local; + + mVelocity_local = velocity_new_local; + mAccelerationJoint_local = acceleration_joint_local; + mPosition_local = position_new_local; + + mPosition_world = joint->getWorldPosition(); + mLastTime = time; + + /* + // Write out debugging info into a spreadsheet. + if (mFileWrite != NULL && is_self) + { + fprintf(mFileWrite,"%f\t%f\t%f \t\t%f \t\t%f\t%f\t%f\t \t\t%f\t%f\t%f\t%f\t%f \t\t%f\t%f\t%f\n", + position_new_local, + velocity_new_local, + acceleration_new_local, + + time_delta, + + mPosition_world[0], + mPosition_world[1], + mPosition_world[2], + + force_net, + force_spring, + force_accel, + force_damping, + force_drag, + + spring_length, + velocity_joint_local, + acceleration_joint_local + ); + } + */ + + return update_visuals; } // Range of new_value_local is assumed to be [0 , 1] normalized. void LLPhysicsMotion::setParamValue(LLViewerVisualParam *param, - F32 new_value_normalized) + F32 new_value_normalized) { - const F32 value_min_local = param->getMinWeight(); - const F32 value_max_local = param->getMaxWeight(); + const F32 value_min_local = param->getMinWeight(); + const F32 value_max_local = param->getMaxWeight(); - const F32 new_value_local = value_min_local + (value_max_local-value_min_local) * new_value_normalized; + const F32 new_value_local = value_min_local + (value_max_local-value_min_local) * new_value_normalized; - mCharacter->setVisualParamWeight(param, - new_value_local, - FALSE); + mCharacter->setVisualParamWeight(param, + new_value_local, + FALSE); } diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 6f03606869..879ed2b505 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2514,44 +2514,42 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="Breast Physics Mass">Breast Mass</string> <string name="Breast Physics Smoothing">Breast Smoothing</string> <string name="Breast Physics Gravity">Breast Gravity</string> +<string name="Breast Physics Drag">Breast Drag</string> <string name="Breast Physics InOut Max Speed">Max Effect</string> <string name="Breast Physics InOut Spring">Spring</string> <string name="Breast Physics InOut Gain">Gain</string> <string name="Breast Physics InOut Damping">Damping</string> -<string name="Breast Physics InOut Drag">Breast Cleavage Drag</string> <string name="Breast Physics UpDown Max Speed">Max Effect</string> <string name="Breast Physics UpDown Spring">Spring</string> <string name="Breast Physics UpDown Gain">Gain</string> <string name="Breast Physics UpDown Damping">Damping</string> -<string name="Breast Physics UpDown Drag">Breast Bounce Drag</string> <string name="Belly Physics Mass">Belly Mass</string> <string name="Belly Physics Smoothing">Belly Smoothing</string> <string name="Belly Physics Gravity">Belly Gravity</string> +<string name="Belly Physics Drag">Belly Drag</string> <string name="Belly Physics UpDown Max Speed">Max Effect</string> <string name="Belly Physics UpDown Spring">Spring</string> <string name="Belly Physics UpDown Gain">Gain</string> <string name="Belly Physics UpDown Damping">Damping</string> -<string name="Belly Physics UpDown Drag">Belly Bounce Drag</string> <string name="Butt Physics Mass">Butt Mass</string> <string name="Butt Physics Smoothing">Butt Smoothing</string> <string name="Butt Physics Gravity">Butt Gravity</string> +<string name="Butt Physics Drag">Butt Drag</string> <string name="Butt Physics UpDown Max Speed">Max Effect</string> <string name="Butt Physics UpDown Spring">Spring</string> <string name="Butt Physics UpDown Gain">Gain</string> <string name="Butt Physics UpDown Damping">Damping</string> -<string name="Butt Physics UpDown Drag">Butt Bounce Drag</string> <string name="Butt Physics LeftRight Max Speed">Max Effect</string> <string name="Butt Physics LeftRight Spring">Spring</string> <string name="Butt Physics LeftRight Gain">Gain</string> <string name="Butt Physics LeftRight Damping">Damping</string> -<string name="Butt Physics LeftRight Drag">Butt Sway Drag</string> <string name="Bushy Eyebrows">Bushy Eyebrows</string> <string name="Bushy Hair">Bushy Hair</string> -- cgit v1.2.3 From a47ea6c619d1b689478f9e41c87cb89c010273de Mon Sep 17 00:00:00 2001 From: Seraph Linden <none@none> Date: Sun, 3 Apr 2011 13:56:55 -0400 Subject: Added breast sway (left-right). --- indra/newview/character/avatar_lad.xml | 77 +++++++++++++++++++++- indra/newview/llpaneleditwearable.cpp | 4 +- indra/newview/llphysicsmotion.cpp | 25 +++++++ indra/newview/llpolymesh.cpp | 31 +++++++++ .../skins/default/xui/en/panel_edit_physics.xml | 14 ++++ indra/newview/skins/default/xui/en/strings.xml | 5 ++ 6 files changed, 154 insertions(+), 2 deletions(-) diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index fa286e99ef..c63701cea5 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -4331,6 +4331,18 @@ <param_morph /> </param> + <param + id="1207" + group="1" + name="Breast_Physics_LeftRight_Driven" + wearable="physics" + edit_group="driven" + value_default="0" + value_min="-2" + value_max="2"> + <param_morph /> + </param> + <!-- #end morph targets --> @@ -4873,7 +4885,6 @@ <param_morph /> </param> - <!-- #end morph targets --> @@ -11786,6 +11797,21 @@ render_pass="bump"> </param_driver> </param> + <param + id="1105" + group="1" + wearable="shape" + name="Breast_Physics_LeftRight_Controller" + label="Breast Physics LeftRight Controller" + value_min="-1" + value_max="1" + value_default="0"> + <param_driver> + <driven + id="1207" /> + </param_driver> + </param> + <param id="10000" group="0" @@ -12192,6 +12218,55 @@ render_pass="bump"> <param_driver /> </param> + <param + id="10032" + group="0" + name="Breast_Physics_LeftRight_Max_Velocity" + label="Breast Physics LeftRight Max Speed" + wearable="physics" + edit_group="physics_breasts_leftright" + value_default="0" + value_min="0" + value_max="10"> + <param_driver /> + </param> + <param + id="10033" + group="0" + name="Breast_Physics_LeftRight_Spring" + label="Breast Physics LeftRight Spring" + wearable="physics" + edit_group="physics_breasts_leftright" + value_default=".1" + value_min="0" + value_max="1"> + <param_driver /> + </param> + <param + id="10034" + group="0" + name="Breast_Physics_LeftRight_Gain" + label="Breast Physics LeftRight Gain" + wearable="physics" + edit_group="physics_breasts_leftright" + value_default="10" + value_min="1" + value_max="100"> + <param_driver /> + </param> + <param + id="10035" + group="0" + name="Breast_Physics_LeftRight_Damping" + label="Breast Physics LeftRight Damping" + wearable="physics" + edit_group="physics_breasts_leftright" + value_default=".05" + value_min="0" + value_max=".1"> + <param_driver /> + </param> + </driver_parameters> <morph_masks> diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp index d0ce765a69..8bd2d5ad6a 100644 --- a/indra/newview/llpaneleditwearable.cpp +++ b/indra/newview/llpaneleditwearable.cpp @@ -97,6 +97,7 @@ enum ESubpart { SUBPART_TATTOO, SUBPART_PHYSICS_BREASTS_UPDOWN, SUBPART_PHYSICS_BREASTS_INOUT, + SUBPART_PHYSICS_BREASTS_LEFTRIGHT, SUBPART_PHYSICS_BELLY_UPDOWN, SUBPART_PHYSICS_BUTT_UPDOWN, SUBPART_PHYSICS_BUTT_LEFTRIGHT, @@ -239,7 +240,7 @@ LLEditWearableDictionary::Wearables::Wearables() addEntry(LLWearableType::WT_SKIRT, new WearableEntry(LLWearableType::WT_SKIRT,"edit_skirt_title","skirt_desc_text",1,1,1, TEX_SKIRT, TEX_SKIRT, SUBPART_SKIRT)); addEntry(LLWearableType::WT_ALPHA, new WearableEntry(LLWearableType::WT_ALPHA,"edit_alpha_title","alpha_desc_text",0,5,1, TEX_LOWER_ALPHA, TEX_UPPER_ALPHA, TEX_HEAD_ALPHA, TEX_EYES_ALPHA, TEX_HAIR_ALPHA, SUBPART_ALPHA)); addEntry(LLWearableType::WT_TATTOO, new WearableEntry(LLWearableType::WT_TATTOO,"edit_tattoo_title","tattoo_desc_text",1,3,1, TEX_HEAD_TATTOO, TEX_LOWER_TATTOO, TEX_UPPER_TATTOO, TEX_HEAD_TATTOO, SUBPART_TATTOO)); - addEntry(LLWearableType::WT_PHYSICS, new WearableEntry(LLWearableType::WT_PHYSICS,"edit_physics_title","physics_desc_text",0,0,6, SUBPART_PHYSICS_BREASTS_UPDOWN, SUBPART_PHYSICS_BREASTS_INOUT, SUBPART_PHYSICS_BELLY_UPDOWN, SUBPART_PHYSICS_BUTT_UPDOWN, SUBPART_PHYSICS_BUTT_LEFTRIGHT, SUBPART_PHYSICS_ADVANCED)); + addEntry(LLWearableType::WT_PHYSICS, new WearableEntry(LLWearableType::WT_PHYSICS,"edit_physics_title","physics_desc_text",0,0,7, SUBPART_PHYSICS_BREASTS_UPDOWN, SUBPART_PHYSICS_BREASTS_INOUT, SUBPART_PHYSICS_BREASTS_LEFTRIGHT, SUBPART_PHYSICS_BELLY_UPDOWN, SUBPART_PHYSICS_BUTT_UPDOWN, SUBPART_PHYSICS_BUTT_LEFTRIGHT, SUBPART_PHYSICS_ADVANCED)); } LLEditWearableDictionary::WearableEntry::WearableEntry(LLWearableType::EType type, @@ -312,6 +313,7 @@ LLEditWearableDictionary::Subparts::Subparts() addEntry(SUBPART_TATTOO, new SubpartEntry(SUBPART_TATTOO, "mPelvis", "tattoo", "tattoo_main_param_list", "tattoo_main_tab", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f),SEX_BOTH)); addEntry(SUBPART_PHYSICS_BREASTS_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BREASTS_UPDOWN, "mTorso", "physics_breasts_updown", "physics_breasts_updown_param_list", "physics_breasts_updown_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_FEMALE)); addEntry(SUBPART_PHYSICS_BREASTS_INOUT, new SubpartEntry(SUBPART_PHYSICS_BREASTS_INOUT, "mTorso", "physics_breasts_inout", "physics_breasts_inout_param_list", "physics_breasts_inout_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_FEMALE)); + addEntry(SUBPART_PHYSICS_BREASTS_LEFTRIGHT, new SubpartEntry(SUBPART_PHYSICS_BREASTS_LEFTRIGHT, "mTorso", "physics_breasts_leftright", "physics_breasts_leftright_param_list", "physics_breasts_leftright_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_FEMALE)); addEntry(SUBPART_PHYSICS_BELLY_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BELLY_UPDOWN, "mTorso", "physics_belly_updown", "physics_belly_updown_param_list", "physics_belly_updown_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH)); addEntry(SUBPART_PHYSICS_BUTT_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BUTT_UPDOWN, "mTorso", "physics_butt_updown", "physics_butt_updown_param_list", "physics_butt_updown_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH)); addEntry(SUBPART_PHYSICS_BUTT_LEFTRIGHT, new SubpartEntry(SUBPART_PHYSICS_BUTT_LEFTRIGHT, "mTorso", "physics_butt_leftright", "physics_butt_leftright_param_list", "physics_butt_leftright_tab", LLVector3d(0.f, 0.f, 0.f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH)); diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 53809b4d19..43044e20ea 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -287,6 +287,31 @@ LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter } addMotion(motion); } + + // Breast Sway + { + controller_map_t controller; + controller["Mass"] = "Breast_Physics_Mass"; + controller["Smoothing"] = "Breast_Physics_Smoothing"; + controller["Gravity"] = "Breast_Physics_Gravity"; + controller["Drag"] = "Breast_Physics_Drag"; + controller["Damping"] = "Breast_Physics_LeftRight_Damping"; + controller["MaxSpeed"] = "Breast_Physics_LeftRight_Max_Velocity"; + controller["Spring"] = "Breast_Physics_LeftRight_Spring"; + controller["Gain"] = "Breast_Physics_LeftRight_Gain"; + LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_LeftRight_Controller", + "", + "mChest", + character, + LLVector3(0,-1,0), + controller); + if (!motion->initialize()) + { + llassert_always(FALSE); + return STATUS_FAILURE; + } + addMotion(motion); + } // Butt Bounce { diff --git a/indra/newview/llpolymesh.cpp b/indra/newview/llpolymesh.cpp index 6d6fb2fa0e..c1144958eb 100644 --- a/indra/newview/llpolymesh.cpp +++ b/indra/newview/llpolymesh.cpp @@ -49,6 +49,9 @@ extern LLControlGroup gSavedSettings; // read only LLPolyMorphData *clone_morph_param(const LLPolyMorphData *src_data, const LLVector3 &direction, const std::string &name); +LLPolyMorphData *clone_morph_param_cleavage(const LLPolyMorphData *src_data, + F32 scale, + const std::string &name); //----------------------------------------------------------------------------- // Global table of loaded LLPolyMeshes @@ -607,6 +610,13 @@ BOOL LLPolyMeshSharedData::loadMesh( const std::string& fileName ) mMorphData.insert(morph_data); + if (!strcmp(morphName, "Breast_Female_Cleavage")) + { + mMorphData.insert(clone_morph_param_cleavage(morph_data, + 0.5f, + "Breast_Physics_LeftRight_Driven")); + } + if (!strcmp(morphName, "Big_Belly_Torso")) { mMorphData.insert(clone_morph_param(morph_data, @@ -1212,4 +1222,25 @@ LLPolyMorphData *clone_morph_param(const LLPolyMorphData *src_data, return cloned_morph_data; } +LLPolyMorphData *clone_morph_param_cleavage(const LLPolyMorphData *src_data, + F32 scale, + const std::string &name) +{ + LLPolyMorphData* cloned_morph_data = new LLPolyMorphData(*src_data); + cloned_morph_data->mName = name; + for (U32 v=0; v < cloned_morph_data->mNumIndices; v++) + { + cloned_morph_data->mCoords[v] = src_data->mCoords[v]*scale; + cloned_morph_data->mNormals[v] = src_data->mNormals[v]*scale; + cloned_morph_data->mBinormals[v] = src_data->mBinormals[v]*scale; + if (cloned_morph_data->mCoords[v][1] < 0) + { + cloned_morph_data->mCoords[v][1] *= -1; + cloned_morph_data->mNormals[v][1] *= -1; + cloned_morph_data->mBinormals[v][1] *= -1; + } + } + return cloned_morph_data; +} + // End diff --git a/indra/newview/skins/default/xui/en/panel_edit_physics.xml b/indra/newview/skins/default/xui/en/panel_edit_physics.xml index c6f974f4f1..0092ceb0dd 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_physics.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_physics.xml @@ -60,6 +60,20 @@ top_pad="50" width="303" /> </accordion_tab> + <accordion_tab + layout="topleft" + fit_panel="false" + min_height="50" + name="physics_breasts_leftright_tab" + title="Breasts Sway"> + <scrolling_panel_list + follows="all" + layout="topleft" + left="0" + name="physics_breasts_leftright_param_list" + top_pad="50" + width="303" /> + </accordion_tab> <accordion_tab layout="topleft" fit_panel="false" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 879ed2b505..b4c3ab3817 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2526,6 +2526,11 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="Breast Physics UpDown Gain">Gain</string> <string name="Breast Physics UpDown Damping">Damping</string> +<string name="Breast Physics LeftRight Max Speed">Max Effect</string> +<string name="Breast Physics LeftRight Spring">Spring</string> +<string name="Breast Physics LeftRight Gain">Gain</string> +<string name="Breast Physics LeftRight Damping">Damping</string> + <string name="Belly Physics Mass">Belly Mass</string> <string name="Belly Physics Smoothing">Belly Smoothing</string> <string name="Belly Physics Gravity">Belly Gravity</string> -- cgit v1.2.3 From e8f2380489b9ce58f7a7bb047231256ae7833309 Mon Sep 17 00:00:00 2001 From: Seraph Linden <none@none> Date: Sun, 3 Apr 2011 13:59:19 -0400 Subject: Changed Max Velocity param name to Max Effect --- indra/newview/character/avatar_lad.xml | 24 ++++++++++++------------ indra/newview/llphysicsmotion.cpp | 12 ++++++------ indra/newview/skins/default/xui/en/strings.xml | 12 ++++++------ 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index c63701cea5..35f88a7a5c 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -11870,8 +11870,8 @@ render_pass="bump"> id="10004" group="0" sex="female" - name="Breast_Physics_UpDown_Max_Velocity" - label="Breast Physics UpDown Max Speed" + name="Breast_Physics_UpDown_Max_Effect" + label="Breast Physics UpDown Max Effect" wearable="physics" edit_group="physics_breasts_updown" value_default="0" @@ -11925,8 +11925,8 @@ render_pass="bump"> id="10008" group="0" sex="female" - name="Breast_Physics_InOut_Max_Velocity" - label="Breast Physics InOut Max Speed" + name="Breast_Physics_InOut_Max_Effect" + label="Breast Physics InOut Max Effect" wearable="physics" edit_group="physics_breasts_inout" value_default="0" @@ -12025,8 +12025,8 @@ render_pass="bump"> <param id="10016" group="0" - name="Belly_Physics_UpDown_Max_Velocity" - label="Belly Physics UpDown Max Speed" + name="Belly_Physics_UpDown_Max_Effect" + label="Belly Physics UpDown Max Effect" wearable="physics" edit_group="physics_belly_updown" value_default="0" @@ -12123,8 +12123,8 @@ render_pass="bump"> <param id="10024" group="0" - name="Butt_Physics_UpDown_Max_Velocity" - label="Butt Physics UpDown Max Speed" + name="Butt_Physics_UpDown_Max_Effect" + label="Butt Physics UpDown Max Effect" wearable="physics" edit_group="physics_butt_updown" value_default="0" @@ -12172,8 +12172,8 @@ render_pass="bump"> <param id="10028" group="0" - name="Butt_Physics_LeftRight_Max_Velocity" - label="Butt Physics LeftRight Max Speed" + name="Butt_Physics_LeftRight_Max_Effect" + label="Butt Physics LeftRight Max Effect" wearable="physics" edit_group="physics_butt_leftright" value_default="0" @@ -12221,8 +12221,8 @@ render_pass="bump"> <param id="10032" group="0" - name="Breast_Physics_LeftRight_Max_Velocity" - label="Breast Physics LeftRight Max Speed" + name="Breast_Physics_LeftRight_Max_Effect" + label="Breast Physics LeftRight Max Effect" wearable="physics" edit_group="physics_breasts_leftright" value_default="0" diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 43044e20ea..7b5ae0199a 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -246,7 +246,7 @@ LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter controller["Gravity"] = "Breast_Physics_Gravity"; controller["Drag"] = "Breast_Physics_Drag"; controller["Damping"] = "Breast_Physics_InOut_Damping"; - controller["MaxSpeed"] = "Breast_Physics_InOut_Max_Velocity"; + controller["MaxSpeed"] = "Breast_Physics_InOut_Max_Effect"; controller["Spring"] = "Breast_Physics_InOut_Spring"; controller["Gain"] = "Breast_Physics_InOut_Gain"; LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_InOut_Controller", @@ -271,7 +271,7 @@ LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter controller["Gravity"] = "Breast_Physics_Gravity"; controller["Drag"] = "Breast_Physics_Drag"; controller["Damping"] = "Breast_Physics_UpDown_Damping"; - controller["MaxSpeed"] = "Breast_Physics_UpDown_Max_Velocity"; + controller["MaxSpeed"] = "Breast_Physics_UpDown_Max_Effect"; controller["Spring"] = "Breast_Physics_UpDown_Spring"; controller["Gain"] = "Breast_Physics_UpDown_Gain"; LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_UpDown_Controller", @@ -296,7 +296,7 @@ LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter controller["Gravity"] = "Breast_Physics_Gravity"; controller["Drag"] = "Breast_Physics_Drag"; controller["Damping"] = "Breast_Physics_LeftRight_Damping"; - controller["MaxSpeed"] = "Breast_Physics_LeftRight_Max_Velocity"; + controller["MaxSpeed"] = "Breast_Physics_LeftRight_Max_Effect"; controller["Spring"] = "Breast_Physics_LeftRight_Spring"; controller["Gain"] = "Breast_Physics_LeftRight_Gain"; LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_LeftRight_Controller", @@ -321,7 +321,7 @@ LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter controller["Gravity"] = "Butt_Physics_Gravity"; controller["Drag"] = "Butt_Physics_Drag"; controller["Damping"] = "Butt_Physics_UpDown_Damping"; - controller["MaxSpeed"] = "Butt_Physics_UpDown_Max_Velocity"; + controller["MaxSpeed"] = "Butt_Physics_UpDown_Max_Effect"; controller["Spring"] = "Butt_Physics_UpDown_Spring"; controller["Gain"] = "Butt_Physics_UpDown_Gain"; LLPhysicsMotion *motion = new LLPhysicsMotion("Butt_Physics_UpDown_Controller", @@ -346,7 +346,7 @@ LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter controller["Gravity"] = "Butt_Physics_Gravity"; controller["Drag"] = "Butt_Physics_Drag"; controller["Damping"] = "Butt_Physics_LeftRight_Damping"; - controller["MaxSpeed"] = "Butt_Physics_LeftRight_Max_Velocity"; + controller["MaxSpeed"] = "Butt_Physics_LeftRight_Max_Effect"; controller["Spring"] = "Butt_Physics_LeftRight_Spring"; controller["Gain"] = "Butt_Physics_LeftRight_Gain"; LLPhysicsMotion *motion = new LLPhysicsMotion("Butt_Physics_LeftRight_Controller", @@ -371,7 +371,7 @@ LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter controller["Gravity"] = "Belly_Physics_Gravity"; controller["Drag"] = "Belly_Physics_Drag"; controller["Damping"] = "Belly_Physics_UpDown_Damping"; - controller["MaxSpeed"] = "Belly_Physics_UpDown_Max_Velocity"; + controller["MaxSpeed"] = "Belly_Physics_UpDown_Max_Effect"; controller["Spring"] = "Belly_Physics_UpDown_Spring"; controller["Gain"] = "Belly_Physics_UpDown_Gain"; LLPhysicsMotion *motion = new LLPhysicsMotion("Belly_Physics_UpDown_Controller", diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index b4c3ab3817..548d49308f 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2516,17 +2516,17 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="Breast Physics Gravity">Breast Gravity</string> <string name="Breast Physics Drag">Breast Drag</string> -<string name="Breast Physics InOut Max Speed">Max Effect</string> +<string name="Breast Physics InOut Max Effect">Max Effect</string> <string name="Breast Physics InOut Spring">Spring</string> <string name="Breast Physics InOut Gain">Gain</string> <string name="Breast Physics InOut Damping">Damping</string> -<string name="Breast Physics UpDown Max Speed">Max Effect</string> +<string name="Breast Physics UpDown Max Effect">Max Effect</string> <string name="Breast Physics UpDown Spring">Spring</string> <string name="Breast Physics UpDown Gain">Gain</string> <string name="Breast Physics UpDown Damping">Damping</string> -<string name="Breast Physics LeftRight Max Speed">Max Effect</string> +<string name="Breast Physics LeftRight Max Effect">Max Effect</string> <string name="Breast Physics LeftRight Spring">Spring</string> <string name="Breast Physics LeftRight Gain">Gain</string> <string name="Breast Physics LeftRight Damping">Damping</string> @@ -2536,7 +2536,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="Belly Physics Gravity">Belly Gravity</string> <string name="Belly Physics Drag">Belly Drag</string> -<string name="Belly Physics UpDown Max Speed">Max Effect</string> +<string name="Belly Physics UpDown Max Effect">Max Effect</string> <string name="Belly Physics UpDown Spring">Spring</string> <string name="Belly Physics UpDown Gain">Gain</string> <string name="Belly Physics UpDown Damping">Damping</string> @@ -2546,12 +2546,12 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="Butt Physics Gravity">Butt Gravity</string> <string name="Butt Physics Drag">Butt Drag</string> -<string name="Butt Physics UpDown Max Speed">Max Effect</string> +<string name="Butt Physics UpDown Max Effect">Max Effect</string> <string name="Butt Physics UpDown Spring">Spring</string> <string name="Butt Physics UpDown Gain">Gain</string> <string name="Butt Physics UpDown Damping">Damping</string> -<string name="Butt Physics LeftRight Max Speed">Max Effect</string> +<string name="Butt Physics LeftRight Max Effect">Max Effect</string> <string name="Butt Physics LeftRight Spring">Spring</string> <string name="Butt Physics LeftRight Gain">Gain</string> <string name="Butt Physics LeftRight Damping">Damping</string> -- cgit v1.2.3 From f433ad353131cc1df581be11a9ff6184767a0ed6 Mon Sep 17 00:00:00 2001 From: Seraph Linden <none@none> Date: Sun, 3 Apr 2011 17:25:17 -0400 Subject: Changed _driven params to cross wearables; major fix so they wouldn't keep getting reset to default values from wearable. Took out smoothing param. Redefined maxeffect param to affect range of motion. --- indra/newview/character/avatar_lad.xml | 127 +-- indra/newview/llphysicsmotion.cpp | 73 +- indra/newview/llpolymesh.cpp | 1812 ++++++++++++++++---------------- 3 files changed, 998 insertions(+), 1014 deletions(-) diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index 35f88a7a5c..f8229ec465 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -4324,6 +4324,7 @@ group="1" name="Belly_Physics_Torso_UpDown_Driven" wearable="physics" + cross_wearable="true" edit_group="driven" value_default="0" value_min="-1" @@ -4336,6 +4337,7 @@ group="1" name="Breast_Physics_LeftRight_Driven" wearable="physics" + cross_wearable="true" edit_group="driven" value_default="0" value_min="-2" @@ -4856,20 +4858,24 @@ group="1" name="Belly_Physics_Legs_UpDown_Driven" wearable="physics" + cross_wearable="true" edit_group="driven" value_min="-1" value_max="1"> <param_morph /> </param> - + <param id="1205" group="1" name="Butt_Physics_UpDown_Driven" wearable="physics" + cross_wearable="true" edit_group="driven" - value_default="0"> + value_default="0" + value_min="-1" + value_max="1"> <param_morph /> </param> @@ -4878,10 +4884,11 @@ group="1" name="Butt_Physics_LeftRight_Driven" wearable="physics" + cross_wearable="true" edit_group="driven" value_default="0" - value_min="-2" - value_max="2"> + value_min="-1" + value_max="1"> <param_morph /> </param> @@ -5268,6 +5275,7 @@ group="1" name="Belly_Physics_Skirt_UpDown_Driven" wearable="physics" + cross_wearable="true" edit_group="driven" value_default="0" value_min="-1" @@ -11829,19 +11837,6 @@ render_pass="bump"> id="10001" group="0" sex="female" - name="Breast_Physics_Smoothing" - label="Breast Physics Smoothing" - wearable="physics" - edit_group="physics_advanced" - value_default="2" - value_min="1" - value_max="10"> - <param_driver /> - </param> - <param - id="10002" - group="0" - sex="female" name="Breast_Physics_Gravity" label="Breast Physics Gravity" wearable="physics" @@ -11853,7 +11848,7 @@ render_pass="bump"> </param> <param - id="10003" + id="10002" group="0" sex="female" name="Breast_Physics_Drag" @@ -11867,7 +11862,7 @@ render_pass="bump"> </param> <param - id="10004" + id="10003" group="0" sex="female" name="Breast_Physics_UpDown_Max_Effect" @@ -11876,11 +11871,11 @@ render_pass="bump"> edit_group="physics_breasts_updown" value_default="0" value_min="0" - value_max="10"> + value_max="1"> <param_driver /> </param> <param - id="10005" + id="10004" group="0" sex="female" name="Breast_Physics_UpDown_Spring" @@ -11893,7 +11888,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="10006" + id="10005" group="0" sex="female" name="Breast_Physics_UpDown_Gain" @@ -11906,7 +11901,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="10007" + id="10006" group="0" sex="female" name="Breast_Physics_UpDown_Damping" @@ -11922,7 +11917,7 @@ render_pass="bump"> </param> <param - id="10008" + id="10007" group="0" sex="female" name="Breast_Physics_InOut_Max_Effect" @@ -11931,11 +11926,11 @@ render_pass="bump"> edit_group="physics_breasts_inout" value_default="0" value_min="0" - value_max="10"> + value_max="1"> <param_driver /> </param> <param - id="10009" + id="10008" group="0" sex="female" name="Breast_Physics_InOut_Spring" @@ -11948,7 +11943,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="10010" + id="10009" group="0" sex="female" name="Breast_Physics_InOut_Gain" @@ -11961,7 +11956,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="10011" + id="10010" group="0" sex="female" name="Breast_Physics_InOut_Damping" @@ -11975,7 +11970,7 @@ render_pass="bump"> </param> <param - id="10012" + id="10011" group="0" name="Belly_Physics_Mass" label="Belly Physics Mass" @@ -11987,19 +11982,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="10013" - group="0" - name="Belly_Physics_Smoothing" - label="Belly Physics Smoothing" - wearable="physics" - edit_group="physics_advanced" - value_default="2" - value_min="1" - value_max="10"> - <param_driver /> - </param> - <param - id="10014" + id="10012" group="0" name="Belly_Physics_Gravity" label="Belly Physics Gravity" @@ -12011,7 +11994,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="10015" + id="10013" group="0" name="Belly_Physics_Drag" label="Belly Physics Drag" @@ -12023,7 +12006,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="10016" + id="10014" group="0" name="Belly_Physics_UpDown_Max_Effect" label="Belly Physics UpDown Max Effect" @@ -12031,11 +12014,11 @@ render_pass="bump"> edit_group="physics_belly_updown" value_default="0" value_min="0" - value_max="10"> + value_max="1"> <param_driver /> </param> <param - id="10017" + id="10015" group="0" name="Belly_Physics_UpDown_Spring" label="Belly Physics UpDown Spring" @@ -12047,7 +12030,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="10018" + id="10016" group="0" name="Belly_Physics_UpDown_Gain" label="Belly Physics UpDown Gain" @@ -12059,7 +12042,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="10019" + id="10017" group="0" name="Belly_Physics_UpDown_Damping" label="Belly Physics UpDown Damping" @@ -12072,7 +12055,7 @@ render_pass="bump"> </param> <param - id="10020" + id="10018" group="0" name="Butt_Physics_Mass" label="Butt Physics Mass" @@ -12084,19 +12067,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="10021" - group="0" - name="Butt_Physics_Smoothing" - label="Butt Physics Smoothing" - wearable="physics" - edit_group="physics_advanced" - value_default="2" - value_min="1" - value_max="10"> - <param_driver /> - </param> - <param - id="10022" + id="10019" group="0" name="Butt_Physics_Gravity" label="Butt Physics Gravity" @@ -12108,7 +12079,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="10023" + id="10020" group="0" name="Butt_Physics_Drag" label="Butt Physics Drag" @@ -12121,7 +12092,7 @@ render_pass="bump"> </param> <param - id="10024" + id="10021" group="0" name="Butt_Physics_UpDown_Max_Effect" label="Butt Physics UpDown Max Effect" @@ -12129,11 +12100,11 @@ render_pass="bump"> edit_group="physics_butt_updown" value_default="0" value_min="0" - value_max="10"> + value_max="1"> <param_driver /> </param> <param - id="10025" + id="10022" group="0" name="Butt_Physics_UpDown_Spring" label="Butt Physics UpDown Spring" @@ -12145,7 +12116,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="10026" + id="10023" group="0" name="Butt_Physics_UpDown_Gain" label="Butt Physics UpDown Gain" @@ -12157,7 +12128,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="10027" + id="10024" group="0" name="Butt_Physics_UpDown_Damping" label="Butt Physics UpDown Damping" @@ -12170,7 +12141,7 @@ render_pass="bump"> </param> <param - id="10028" + id="10025" group="0" name="Butt_Physics_LeftRight_Max_Effect" label="Butt Physics LeftRight Max Effect" @@ -12178,11 +12149,11 @@ render_pass="bump"> edit_group="physics_butt_leftright" value_default="0" value_min="0" - value_max="10"> + value_max="1"> <param_driver /> </param> <param - id="10029" + id="10026" group="0" name="Butt_Physics_LeftRight_Spring" label="Butt Physics LeftRight Spring" @@ -12194,7 +12165,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="10030" + id="10027" group="0" name="Butt_Physics_LeftRight_Gain" label="Butt Physics LeftRight Gain" @@ -12206,7 +12177,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="10031" + id="10028" group="0" name="Butt_Physics_LeftRight_Damping" label="Butt Physics LeftRight Damping" @@ -12219,7 +12190,7 @@ render_pass="bump"> </param> <param - id="10032" + id="10029" group="0" name="Breast_Physics_LeftRight_Max_Effect" label="Breast Physics LeftRight Max Effect" @@ -12227,11 +12198,11 @@ render_pass="bump"> edit_group="physics_breasts_leftright" value_default="0" value_min="0" - value_max="10"> + value_max="1"> <param_driver /> </param> <param - id="10033" + id="10030" group="0" name="Breast_Physics_LeftRight_Spring" label="Breast Physics LeftRight Spring" @@ -12243,7 +12214,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="10034" + id="10031" group="0" name="Breast_Physics_LeftRight_Gain" label="Breast Physics LeftRight Gain" @@ -12255,7 +12226,7 @@ render_pass="bump"> <param_driver /> </param> <param - id="10035" + id="10032" group="0" name="Breast_Physics_LeftRight_Damping" label="Breast Physics LeftRight Damping" diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 7b5ae0199a..57ba76cf6d 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -176,11 +176,10 @@ default_controller_map_t initDefaultController() { default_controller_map_t controller; controller["Mass"] = 0.2f; - controller["Smoothing"] = 2.0f; controller["Gravity"] = 0.0f; controller["Damping"] = .05f; controller["Drag"] = 0.15f; - controller["MaxSpeed"] = 0.1f; + controller["MaxEffect"] = 0.1f; controller["Spring"] = 0.1f; controller["Gain"] = 10.0f; return controller; @@ -242,11 +241,10 @@ LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter { controller_map_t controller; controller["Mass"] = "Breast_Physics_Mass"; - controller["Smoothing"] = "Breast_Physics_Smoothing"; controller["Gravity"] = "Breast_Physics_Gravity"; controller["Drag"] = "Breast_Physics_Drag"; controller["Damping"] = "Breast_Physics_InOut_Damping"; - controller["MaxSpeed"] = "Breast_Physics_InOut_Max_Effect"; + controller["MaxEffect"] = "Breast_Physics_InOut_Max_Effect"; controller["Spring"] = "Breast_Physics_InOut_Spring"; controller["Gain"] = "Breast_Physics_InOut_Gain"; LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_InOut_Controller", @@ -267,11 +265,10 @@ LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter { controller_map_t controller; controller["Mass"] = "Breast_Physics_Mass"; - controller["Smoothing"] = "Breast_Physics_Smoothing"; controller["Gravity"] = "Breast_Physics_Gravity"; controller["Drag"] = "Breast_Physics_Drag"; controller["Damping"] = "Breast_Physics_UpDown_Damping"; - controller["MaxSpeed"] = "Breast_Physics_UpDown_Max_Effect"; + controller["MaxEffect"] = "Breast_Physics_UpDown_Max_Effect"; controller["Spring"] = "Breast_Physics_UpDown_Spring"; controller["Gain"] = "Breast_Physics_UpDown_Gain"; LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_UpDown_Controller", @@ -292,11 +289,10 @@ LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter { controller_map_t controller; controller["Mass"] = "Breast_Physics_Mass"; - controller["Smoothing"] = "Breast_Physics_Smoothing"; controller["Gravity"] = "Breast_Physics_Gravity"; controller["Drag"] = "Breast_Physics_Drag"; controller["Damping"] = "Breast_Physics_LeftRight_Damping"; - controller["MaxSpeed"] = "Breast_Physics_LeftRight_Max_Effect"; + controller["MaxEffect"] = "Breast_Physics_LeftRight_Max_Effect"; controller["Spring"] = "Breast_Physics_LeftRight_Spring"; controller["Gain"] = "Breast_Physics_LeftRight_Gain"; LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_LeftRight_Controller", @@ -312,23 +308,21 @@ LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter } addMotion(motion); } - // Butt Bounce { controller_map_t controller; controller["Mass"] = "Butt_Physics_Mass"; - controller["Smoothing"] = "Butt_Physics_Smoothing"; controller["Gravity"] = "Butt_Physics_Gravity"; controller["Drag"] = "Butt_Physics_Drag"; controller["Damping"] = "Butt_Physics_UpDown_Damping"; - controller["MaxSpeed"] = "Butt_Physics_UpDown_Max_Effect"; + controller["MaxEffect"] = "Butt_Physics_UpDown_Max_Effect"; controller["Spring"] = "Butt_Physics_UpDown_Spring"; controller["Gain"] = "Butt_Physics_UpDown_Gain"; LLPhysicsMotion *motion = new LLPhysicsMotion("Butt_Physics_UpDown_Controller", "", "mPelvis", character, - LLVector3(0,0,1), + LLVector3(0,0,-1), controller); if (!motion->initialize()) { @@ -342,11 +336,10 @@ LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter { controller_map_t controller; controller["Mass"] = "Butt_Physics_Mass"; - controller["Smoothing"] = "Butt_Physics_Smoothing"; controller["Gravity"] = "Butt_Physics_Gravity"; controller["Drag"] = "Butt_Physics_Drag"; controller["Damping"] = "Butt_Physics_LeftRight_Damping"; - controller["MaxSpeed"] = "Butt_Physics_LeftRight_Max_Effect"; + controller["MaxEffect"] = "Butt_Physics_LeftRight_Max_Effect"; controller["Spring"] = "Butt_Physics_LeftRight_Spring"; controller["Gain"] = "Butt_Physics_LeftRight_Gain"; LLPhysicsMotion *motion = new LLPhysicsMotion("Butt_Physics_LeftRight_Controller", @@ -367,11 +360,10 @@ LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter { controller_map_t controller; controller["Mass"] = "Belly_Physics_Mass"; - controller["Smoothing"] = "Belly_Physics_Smoothing"; controller["Gravity"] = "Belly_Physics_Gravity"; controller["Drag"] = "Belly_Physics_Drag"; controller["Damping"] = "Belly_Physics_UpDown_Damping"; - controller["MaxSpeed"] = "Belly_Physics_UpDown_Max_Effect"; + controller["MaxEffect"] = "Belly_Physics_UpDown_Max_Effect"; controller["Spring"] = "Belly_Physics_UpDown_Spring"; controller["Gain"] = "Belly_Physics_UpDown_Gain"; LLPhysicsMotion *motion = new LLPhysicsMotion("Belly_Physics_UpDown_Controller", @@ -427,7 +419,8 @@ F32 LLPhysicsMotion::calculateVelocity_local(const F32 time_delta) F32 LLPhysicsMotion::calculateAcceleration_local(const F32 velocity_local, const F32 time_delta) { - const F32 smoothing = getParamValue("Smoothing"); +// const F32 smoothing = getParamValue("Smoothing"); + static const F32 smoothing = 3.0f; // Removed smoothing param since it's probably not necessary const F32 acceleration_local = velocity_local - mVelocityJoint_local; const F32 smoothed_acceleration_local = @@ -504,16 +497,17 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) const F32 behavior_drag = getParamValue("Drag"); const BOOL physics_test = gSavedSettings.getBOOL("AvatarPhysicsTest"); - F32 behavior_maxspeed = getParamValue("MaxSpeed"); + F32 behavior_maxeffect = getParamValue("MaxEffect"); if (physics_test) - behavior_maxspeed = 100.0f; - - if (behavior_maxspeed == 0) - return FALSE; + behavior_maxeffect = 1.0f; + // Maximum effect is [0,1] range. + const F32 min_val = 0.5f-behavior_maxeffect/2.0; + const F32 max_val = 0.5f+behavior_maxeffect/2.0; + // mPositon_local should be in normalized 0,1 range already. Just making sure... F32 position_current_local = llclamp(mPosition_local, 0.0f, - 1.0f); // Normalized [0,1] range + 1.0f); // Normalize the param position to be from [0,1]. // We have to use normalized values because there may be more than one driven param, @@ -522,6 +516,13 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) F32 position_user_local = mParamUser->getWeight(); position_user_local = (position_user_local - mParamUser->getMinWeight()) / (mParamUser->getMaxWeight() - mParamUser->getMinWeight()); + // If the effect is turned off then don't process unless we need one more update + // to set the position to the default (i.e. user) position. + if ((behavior_maxeffect == 0) && (position_current_local == position_user_local)) + { + return FALSE; + } + // // End parameters and settings //////////////////////////////////////////////////////////////////////////////// @@ -583,9 +584,10 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) // Calculate the new acceleration based on the net force. // a = F/m const F32 acceleration_new_local = force_net / behavior_mass; + const F32 max_acceleration = 10.0f; // magic number, used to be customizable. F32 velocity_new_local = mVelocity_local + acceleration_new_local; velocity_new_local = llclamp(velocity_new_local, - -behavior_maxspeed, behavior_maxspeed); + -max_acceleration, max_acceleration); // Temporary debugging setting to cause all avatars to move, for profiling purposes. if (physics_test) @@ -593,19 +595,20 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) velocity_new_local = sin(time*4.0); } // Calculate the new parameters, or remain unchanged if max speed is 0. - const F32 position_new_local = (behavior_maxspeed != 0) ? - (position_current_local + velocity_new_local*time_delta) : - position_user_local; + F32 position_new_local = position_current_local + velocity_new_local*time_delta; + if (behavior_maxeffect == 0) + position_new_local = position_user_local; // Zero out the velocity if the param is being pushed beyond its limits. - if (position_new_local < 0 || position_new_local > 1) + if ((position_new_local < min_val && velocity_new_local < 0) || + (position_new_local > max_val && velocity_new_local > 0)) { velocity_new_local = 0; } const F32 position_new_local_clamped = llclamp(position_new_local, - 0.0f, - 1.0f); + min_val, + max_val); // Set the new param. // If a specific param has been declared, then set that one. @@ -621,6 +624,16 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) llassert_always(driver_param); if (driver_param) { + // If this is one of our "hidden" driver params, then make sure it's + // the default value. + if ((driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) && + (driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT) && + (driver_param->getVisualParamWeight() != 0)) + { + mCharacter->setVisualParamWeight(driver_param, + 0, + FALSE); + } for (LLDriverParam::entry_list_t::iterator iter = driver_param->mDriven.begin(); iter != driver_param->mDriven.end(); ++iter) diff --git a/indra/newview/llpolymesh.cpp b/indra/newview/llpolymesh.cpp index c1144958eb..7a2ecffb34 100644 --- a/indra/newview/llpolymesh.cpp +++ b/indra/newview/llpolymesh.cpp @@ -44,11 +44,11 @@ #define HEADER_ASCII "Linden Mesh 1.0" #define HEADER_BINARY "Linden Binary Mesh 1.0" -extern LLControlGroup gSavedSettings; // read only +extern LLControlGroup gSavedSettings; // read only LLPolyMorphData *clone_morph_param(const LLPolyMorphData *src_data, - const LLVector3 &direction, - const std::string &name); + const LLVector3 &direction, + const std::string &name); LLPolyMorphData *clone_morph_param_cleavage(const LLPolyMorphData *src_data, F32 scale, const std::string &name); @@ -63,28 +63,28 @@ LLPolyMesh::LLPolyMeshSharedDataTable LLPolyMesh::sGlobalSharedMeshList; //----------------------------------------------------------------------------- LLPolyMeshSharedData::LLPolyMeshSharedData() { - mNumVertices = 0; - mBaseCoords = NULL; - mBaseNormals = NULL; - mBaseBinormals = NULL; - mTexCoords = NULL; - mDetailTexCoords = NULL; - mWeights = NULL; - mHasWeights = FALSE; - mHasDetailTexCoords = FALSE; + mNumVertices = 0; + mBaseCoords = NULL; + mBaseNormals = NULL; + mBaseBinormals = NULL; + mTexCoords = NULL; + mDetailTexCoords = NULL; + mWeights = NULL; + mHasWeights = FALSE; + mHasDetailTexCoords = FALSE; - mNumFaces = 0; - mFaces = NULL; + mNumFaces = 0; + mFaces = NULL; - mNumJointNames = 0; - mJointNames = NULL; + mNumJointNames = 0; + mJointNames = NULL; - mTriangleIndices = NULL; - mNumTriangleIndices = 0; + mTriangleIndices = NULL; + mNumTriangleIndices = 0; - mReferenceData = NULL; + mReferenceData = NULL; - mLastIndexOffset = -1; + mLastIndexOffset = -1; } //----------------------------------------------------------------------------- @@ -92,9 +92,9 @@ LLPolyMeshSharedData::LLPolyMeshSharedData() //----------------------------------------------------------------------------- LLPolyMeshSharedData::~LLPolyMeshSharedData() { - freeMeshData(); - for_each(mMorphData.begin(), mMorphData.end(), DeletePointer()); - mMorphData.clear(); + freeMeshData(); + for_each(mMorphData.begin(), mMorphData.end(), DeletePointer()); + mMorphData.clear(); } //----------------------------------------------------------------------------- @@ -102,19 +102,19 @@ LLPolyMeshSharedData::~LLPolyMeshSharedData() //----------------------------------------------------------------------------- void LLPolyMeshSharedData::setupLOD(LLPolyMeshSharedData* reference_data) { - mReferenceData = reference_data; - - if (reference_data) - { - mBaseCoords = reference_data->mBaseCoords; - mBaseNormals = reference_data->mBaseNormals; - mBaseBinormals = reference_data->mBaseBinormals; - mTexCoords = reference_data->mTexCoords; - mDetailTexCoords = reference_data->mDetailTexCoords; - mWeights = reference_data->mWeights; - mHasWeights = reference_data->mHasWeights; - mHasDetailTexCoords = reference_data->mHasDetailTexCoords; - } + mReferenceData = reference_data; + + if (reference_data) + { + mBaseCoords = reference_data->mBaseCoords; + mBaseNormals = reference_data->mBaseNormals; + mBaseBinormals = reference_data->mBaseBinormals; + mTexCoords = reference_data->mTexCoords; + mDetailTexCoords = reference_data->mDetailTexCoords; + mWeights = reference_data->mWeights; + mHasWeights = reference_data->mHasWeights; + mHasDetailTexCoords = reference_data->mHasDetailTexCoords; + } } //----------------------------------------------------------------------------- @@ -122,41 +122,41 @@ void LLPolyMeshSharedData::setupLOD(LLPolyMeshSharedData* reference_data) //----------------------------------------------------------------------------- void LLPolyMeshSharedData::freeMeshData() { - if (!mReferenceData) - { - mNumVertices = 0; + if (!mReferenceData) + { + mNumVertices = 0; - delete [] mBaseCoords; - mBaseCoords = NULL; + delete [] mBaseCoords; + mBaseCoords = NULL; - delete [] mBaseNormals; - mBaseNormals = NULL; + delete [] mBaseNormals; + mBaseNormals = NULL; - delete [] mBaseBinormals; - mBaseBinormals = NULL; + delete [] mBaseBinormals; + mBaseBinormals = NULL; - delete [] mTexCoords; - mTexCoords = NULL; + delete [] mTexCoords; + mTexCoords = NULL; - delete [] mDetailTexCoords; - mDetailTexCoords = NULL; + delete [] mDetailTexCoords; + mDetailTexCoords = NULL; - delete [] mWeights; - mWeights = NULL; - } + delete [] mWeights; + mWeights = NULL; + } - mNumFaces = 0; - delete [] mFaces; - mFaces = NULL; + mNumFaces = 0; + delete [] mFaces; + mFaces = NULL; - mNumJointNames = 0; - delete [] mJointNames; - mJointNames = NULL; + mNumJointNames = 0; + delete [] mJointNames; + mJointNames = NULL; - delete [] mTriangleIndices; - mTriangleIndices = NULL; + delete [] mTriangleIndices; + mTriangleIndices = NULL; -// mVertFaceMap.deleteAllData(); +// mVertFaceMap.deleteAllData(); } // compate_int is used by the qsort function to sort the index array @@ -167,26 +167,26 @@ int compare_int(const void *a, const void *b); //----------------------------------------------------------------------------- void LLPolyMeshSharedData::genIndices(S32 index_offset) { - if (index_offset == mLastIndexOffset) - { - return; - } - - delete []mTriangleIndices; - mTriangleIndices = new U32[mNumTriangleIndices]; - - S32 cur_index = 0; - for (S32 i = 0; i < mNumFaces; i++) - { - mTriangleIndices[cur_index] = mFaces[i][0] + index_offset; - cur_index++; - mTriangleIndices[cur_index] = mFaces[i][1] + index_offset; - cur_index++; - mTriangleIndices[cur_index] = mFaces[i][2] + index_offset; - cur_index++; - } - - mLastIndexOffset = index_offset; + if (index_offset == mLastIndexOffset) + { + return; + } + + delete []mTriangleIndices; + mTriangleIndices = new U32[mNumTriangleIndices]; + + S32 cur_index = 0; + for (S32 i = 0; i < mNumFaces; i++) + { + mTriangleIndices[cur_index] = mFaces[i][0] + index_offset; + cur_index++; + mTriangleIndices[cur_index] = mFaces[i][1] + index_offset; + cur_index++; + mTriangleIndices[cur_index] = mFaces[i][2] + index_offset; + cur_index++; + } + + mLastIndexOffset = index_offset; } //-------------------------------------------------------------------- @@ -194,30 +194,30 @@ void LLPolyMeshSharedData::genIndices(S32 index_offset) //-------------------------------------------------------------------- U32 LLPolyMeshSharedData::getNumKB() { - U32 num_kb = sizeof(LLPolyMesh); - - if (!isLOD()) - { - num_kb += mNumVertices * - ( sizeof(LLVector3) + // coords - sizeof(LLVector3) + // normals - sizeof(LLVector2) ); // texCoords - } - - if (mHasDetailTexCoords && !isLOD()) - { - num_kb += mNumVertices * sizeof(LLVector2); // detailTexCoords - } - - if (mHasWeights && !isLOD()) - { - num_kb += mNumVertices * sizeof(float); // weights - } - - num_kb += mNumFaces * sizeof(LLPolyFace); // faces - - num_kb /= 1024; - return num_kb; + U32 num_kb = sizeof(LLPolyMesh); + + if (!isLOD()) + { + num_kb += mNumVertices * + ( sizeof(LLVector3) + // coords + sizeof(LLVector3) + // normals + sizeof(LLVector2) ); // texCoords + } + + if (mHasDetailTexCoords && !isLOD()) + { + num_kb += mNumVertices * sizeof(LLVector2); // detailTexCoords + } + + if (mHasWeights && !isLOD()) + { + num_kb += mNumVertices * sizeof(float); // weights + } + + num_kb += mNumFaces * sizeof(LLPolyFace); // faces + + num_kb /= 1024; + return num_kb; } //----------------------------------------------------------------------------- @@ -225,19 +225,19 @@ U32 LLPolyMeshSharedData::getNumKB() //----------------------------------------------------------------------------- BOOL LLPolyMeshSharedData::allocateVertexData( U32 numVertices ) { - U32 i; - mBaseCoords = new LLVector3[ numVertices ]; - mBaseNormals = new LLVector3[ numVertices ]; - mBaseBinormals = new LLVector3[ numVertices ]; - mTexCoords = new LLVector2[ numVertices ]; - mDetailTexCoords = new LLVector2[ numVertices ]; - mWeights = new F32[ numVertices ]; - for (i = 0; i < numVertices; i++) - { - mWeights[i] = 0.f; - } - mNumVertices = numVertices; - return TRUE; + U32 i; + mBaseCoords = new LLVector3[ numVertices ]; + mBaseNormals = new LLVector3[ numVertices ]; + mBaseBinormals = new LLVector3[ numVertices ]; + mTexCoords = new LLVector2[ numVertices ]; + mDetailTexCoords = new LLVector2[ numVertices ]; + mWeights = new F32[ numVertices ]; + for (i = 0; i < numVertices; i++) + { + mWeights[i] = 0.f; + } + mNumVertices = numVertices; + return TRUE; } //----------------------------------------------------------------------------- @@ -245,10 +245,10 @@ BOOL LLPolyMeshSharedData::allocateVertexData( U32 numVertices ) //----------------------------------------------------------------------------- BOOL LLPolyMeshSharedData::allocateFaceData( U32 numFaces ) { - mFaces = new LLPolyFace[ numFaces ]; - mNumFaces = numFaces; - mNumTriangleIndices = mNumFaces * 3; - return TRUE; + mFaces = new LLPolyFace[ numFaces ]; + mNumFaces = numFaces; + mNumTriangleIndices = mNumFaces * 3; + return TRUE; } //----------------------------------------------------------------------------- @@ -256,9 +256,9 @@ BOOL LLPolyMeshSharedData::allocateFaceData( U32 numFaces ) //----------------------------------------------------------------------------- BOOL LLPolyMeshSharedData::allocateJointNames( U32 numJointNames ) { - mJointNames = new std::string[ numJointNames ]; - mNumJointNames = numJointNames; - return TRUE; + mJointNames = new std::string[ numJointNames ]; + mNumJointNames = numJointNames; + return TRUE; } //-------------------------------------------------------------------- @@ -266,434 +266,434 @@ BOOL LLPolyMeshSharedData::allocateJointNames( U32 numJointNames ) //-------------------------------------------------------------------- BOOL LLPolyMeshSharedData::loadMesh( const std::string& fileName ) { - //------------------------------------------------------------------------- - // Open the file - //------------------------------------------------------------------------- - if(fileName.empty()) - { - llerrs << "Filename is Empty!" << llendl; - return FALSE; - } - LLFILE* fp = LLFile::fopen(fileName, "rb"); /*Flawfinder: ignore*/ - if (!fp) - { - llerrs << "can't open: " << fileName << llendl; - return FALSE; - } - - //------------------------------------------------------------------------- - // Read a chunk - //------------------------------------------------------------------------- - char header[128]; /*Flawfinder: ignore*/ - if (fread(header, sizeof(char), 128, fp) != 128) - { - llwarns << "Short read" << llendl; - } - - //------------------------------------------------------------------------- - // Check for proper binary header - //------------------------------------------------------------------------- - BOOL status = FALSE; - if ( strncmp(header, HEADER_BINARY, strlen(HEADER_BINARY)) == 0 ) /*Flawfinder: ignore*/ - { - lldebugs << "Loading " << fileName << llendl; - - //---------------------------------------------------------------- - // File Header (seek past it) - //---------------------------------------------------------------- - fseek(fp, 24, SEEK_SET); - - //---------------------------------------------------------------- - // HasWeights - //---------------------------------------------------------------- - U8 hasWeights; - size_t numRead = fread(&hasWeights, sizeof(U8), 1, fp); - if (numRead != 1) - { - llerrs << "can't read HasWeights flag from " << fileName << llendl; - return FALSE; - } - if (!isLOD()) - { - mHasWeights = (hasWeights==0) ? FALSE : TRUE; - } - - //---------------------------------------------------------------- - // HasDetailTexCoords - //---------------------------------------------------------------- - U8 hasDetailTexCoords; - numRead = fread(&hasDetailTexCoords, sizeof(U8), 1, fp); - if (numRead != 1) - { - llerrs << "can't read HasDetailTexCoords flag from " << fileName << llendl; - return FALSE; - } - - //---------------------------------------------------------------- - // Position - //---------------------------------------------------------------- - LLVector3 position; - numRead = fread(position.mV, sizeof(float), 3, fp); - llendianswizzle(position.mV, sizeof(float), 3); - if (numRead != 3) - { - llerrs << "can't read Position from " << fileName << llendl; - return FALSE; - } - setPosition( position ); - - //---------------------------------------------------------------- - // Rotation - //---------------------------------------------------------------- - LLVector3 rotationAngles; - numRead = fread(rotationAngles.mV, sizeof(float), 3, fp); - llendianswizzle(rotationAngles.mV, sizeof(float), 3); - if (numRead != 3) - { - llerrs << "can't read RotationAngles from " << fileName << llendl; - return FALSE; - } - - U8 rotationOrder; - numRead = fread(&rotationOrder, sizeof(U8), 1, fp); - - if (numRead != 1) - { - llerrs << "can't read RotationOrder from " << fileName << llendl; - return FALSE; - } - - rotationOrder = 0; - - setRotation( mayaQ( rotationAngles.mV[0], - rotationAngles.mV[1], - rotationAngles.mV[2], - (LLQuaternion::Order)rotationOrder ) ); - - //---------------------------------------------------------------- - // Scale - //---------------------------------------------------------------- - LLVector3 scale; - numRead = fread(scale.mV, sizeof(float), 3, fp); - llendianswizzle(scale.mV, sizeof(float), 3); - if (numRead != 3) - { - llerrs << "can't read Scale from " << fileName << llendl; - return FALSE; - } - setScale( scale ); - - //------------------------------------------------------------------------- - // Release any existing mesh geometry - //------------------------------------------------------------------------- - freeMeshData(); - - U16 numVertices = 0; - - //---------------------------------------------------------------- - // NumVertices - //---------------------------------------------------------------- - if (!isLOD()) - { - numRead = fread(&numVertices, sizeof(U16), 1, fp); - llendianswizzle(&numVertices, sizeof(U16), 1); - if (numRead != 1) - { - llerrs << "can't read NumVertices from " << fileName << llendl; - return FALSE; - } - - allocateVertexData( numVertices ); - - //---------------------------------------------------------------- - // Coords - //---------------------------------------------------------------- - numRead = fread(mBaseCoords, 3*sizeof(float), numVertices, fp); - llendianswizzle(mBaseCoords, sizeof(float), 3*numVertices); - if (numRead != numVertices) - { - llerrs << "can't read Coordinates from " << fileName << llendl; - return FALSE; - } - - //---------------------------------------------------------------- - // Normals - //---------------------------------------------------------------- - numRead = fread(mBaseNormals, 3*sizeof(float), numVertices, fp); - llendianswizzle(mBaseNormals, sizeof(float), 3*numVertices); - if (numRead != numVertices) - { - llerrs << " can't read Normals from " << fileName << llendl; - return FALSE; - } - - //---------------------------------------------------------------- - // Binormals - //---------------------------------------------------------------- - numRead = fread(mBaseBinormals, 3*sizeof(float), numVertices, fp); - llendianswizzle(mBaseBinormals, sizeof(float), 3*numVertices); - if (numRead != numVertices) - { - llerrs << " can't read Binormals from " << fileName << llendl; - return FALSE; - } - - - //---------------------------------------------------------------- - // TexCoords - //---------------------------------------------------------------- - numRead = fread(mTexCoords, 2*sizeof(float), numVertices, fp); - llendianswizzle(mTexCoords, sizeof(float), 2*numVertices); - if (numRead != numVertices) - { - llerrs << "can't read TexCoords from " << fileName << llendl; - return FALSE; - } - - //---------------------------------------------------------------- - // DetailTexCoords - //---------------------------------------------------------------- - if (mHasDetailTexCoords) - { - numRead = fread(mDetailTexCoords, 2*sizeof(float), numVertices, fp); - llendianswizzle(mDetailTexCoords, sizeof(float), 2*numVertices); - if (numRead != numVertices) - { - llerrs << "can't read DetailTexCoords from " << fileName << llendl; - return FALSE; - } - } - - //---------------------------------------------------------------- - // Weights - //---------------------------------------------------------------- - if (mHasWeights) - { - numRead = fread(mWeights, sizeof(float), numVertices, fp); - llendianswizzle(mWeights, sizeof(float), numVertices); - if (numRead != numVertices) - { - llerrs << "can't read Weights from " << fileName << llendl; - return FALSE; - } - } - } - - //---------------------------------------------------------------- - // NumFaces - //---------------------------------------------------------------- - U16 numFaces; - numRead = fread(&numFaces, sizeof(U16), 1, fp); - llendianswizzle(&numFaces, sizeof(U16), 1); - if (numRead != 1) - { - llerrs << "can't read NumFaces from " << fileName << llendl; - return FALSE; - } - allocateFaceData( numFaces ); - - - //---------------------------------------------------------------- - // Faces - //---------------------------------------------------------------- - U32 i; - U32 numTris = 0; - for (i = 0; i < numFaces; i++) - { - S16 face[3]; - numRead = fread(face, sizeof(U16), 3, fp); - llendianswizzle(face, sizeof(U16), 3); - if (numRead != 3) - { - llerrs << "can't read Face[" << i << "] from " << fileName << llendl; - return FALSE; - } - if (mReferenceData) - { - llassert(face[0] < mReferenceData->mNumVertices); - llassert(face[1] < mReferenceData->mNumVertices); - llassert(face[2] < mReferenceData->mNumVertices); - } - - if (isLOD()) - { - // store largest index in case of LODs - for (S32 j = 0; j < 3; j++) - { - if (face[j] > mNumVertices - 1) - { - mNumVertices = face[j] + 1; - } - } - } - mFaces[i][0] = face[0]; - mFaces[i][1] = face[1]; - mFaces[i][2] = face[2]; - -// S32 j; -// for(j = 0; j < 3; j++) -// { -// LLDynamicArray<S32> *face_list = mVertFaceMap.getIfThere(face[j]); -// if (!face_list) -// { -// face_list = new LLDynamicArray<S32>; -// mVertFaceMap.addData(face[j], face_list); -// } -// face_list->put(i); -// } - - numTris++; - } - - lldebugs << "verts: " << numVertices - << ", faces: " << numFaces - << ", tris: " << numTris - << llendl; - - //---------------------------------------------------------------- - // NumSkinJoints - //---------------------------------------------------------------- - if (!isLOD()) - { - U16 numSkinJoints = 0; - if ( mHasWeights ) - { - numRead = fread(&numSkinJoints, sizeof(U16), 1, fp); - llendianswizzle(&numSkinJoints, sizeof(U16), 1); - if (numRead != 1) - { - llerrs << "can't read NumSkinJoints from " << fileName << llendl; - return FALSE; - } - allocateJointNames( numSkinJoints ); - } - - //---------------------------------------------------------------- - // SkinJoints - //---------------------------------------------------------------- - for (i=0; i < numSkinJoints; i++) - { - char jointName[64+1]; - numRead = fread(jointName, sizeof(jointName)-1, 1, fp); - jointName[sizeof(jointName)-1] = '\0'; // ensure nul-termination - if (numRead != 1) - { - llerrs << "can't read Skin[" << i << "].Name from " << fileName << llendl; - return FALSE; - } - - std::string *jn = &mJointNames[i]; - *jn = jointName; - } - - //------------------------------------------------------------------------- - // look for morph section - //------------------------------------------------------------------------- - char morphName[64+1]; - morphName[sizeof(morphName)-1] = '\0'; // ensure nul-termination - while(fread(&morphName, sizeof(char), 64, fp) == 64) - { - if (!strcmp(morphName, "End Morphs")) - { - // we reached the end of the morphs - break; - } - LLPolyMorphData* morph_data = new LLPolyMorphData(std::string(morphName)); - - BOOL result = morph_data->loadBinary(fp, this); - - if (!result) - { - delete morph_data; - continue; - } - - mMorphData.insert(morph_data); - - if (!strcmp(morphName, "Breast_Female_Cleavage")) - { - mMorphData.insert(clone_morph_param_cleavage(morph_data, - 0.5f, - "Breast_Physics_LeftRight_Driven")); - } - - if (!strcmp(morphName, "Big_Belly_Torso")) - { - mMorphData.insert(clone_morph_param(morph_data, - LLVector3(0,0,0.03f), - "Belly_Physics_Torso_UpDown_Driven")); - } - - if (!strcmp(morphName, "Big_Belly_Legs")) - { - mMorphData.insert(clone_morph_param(morph_data, - LLVector3(0,0,0.03f), - "Belly_Physics_Legs_UpDown_Driven")); - } - - if (!strcmp(morphName, "skirt_belly")) - { - mMorphData.insert(clone_morph_param(morph_data, - LLVector3(0,0,0.03f), - "Belly_Physics_Skirt_UpDown_Driven")); - } - - if (!strcmp(morphName, "Small_Butt")) - { - mMorphData.insert(clone_morph_param(morph_data, - LLVector3(0,0,0.015f), - "Butt_Physics_UpDown_Driven")); - } - if (!strcmp(morphName, "Small_Butt")) - { - mMorphData.insert(clone_morph_param(morph_data, - LLVector3(0,0.015f,0), - "Butt_Physics_LeftRight_Driven")); - } - } - - S32 numRemaps; - if (fread(&numRemaps, sizeof(S32), 1, fp) == 1) - { - llendianswizzle(&numRemaps, sizeof(S32), 1); - for (S32 i = 0; i < numRemaps; i++) - { - S32 remapSrc; - S32 remapDst; - if (fread(&remapSrc, sizeof(S32), 1, fp) != 1) - { - llerrs << "can't read source vertex in vertex remap data" << llendl; - break; - } - if (fread(&remapDst, sizeof(S32), 1, fp) != 1) - { - llerrs << "can't read destination vertex in vertex remap data" << llendl; - break; - } - llendianswizzle(&remapSrc, sizeof(S32), 1); - llendianswizzle(&remapDst, sizeof(S32), 1); - - mSharedVerts[remapSrc] = remapDst; - } - } - } - - status = TRUE; - } - else - { - llerrs << "invalid mesh file header: " << fileName << llendl; - status = FALSE; - } - - if (0 == mNumJointNames) - { - allocateJointNames(1); - } - - fclose( fp ); - - return status; + //------------------------------------------------------------------------- + // Open the file + //------------------------------------------------------------------------- + if(fileName.empty()) + { + llerrs << "Filename is Empty!" << llendl; + return FALSE; + } + LLFILE* fp = LLFile::fopen(fileName, "rb"); /*Flawfinder: ignore*/ + if (!fp) + { + llerrs << "can't open: " << fileName << llendl; + return FALSE; + } + + //------------------------------------------------------------------------- + // Read a chunk + //------------------------------------------------------------------------- + char header[128]; /*Flawfinder: ignore*/ + if (fread(header, sizeof(char), 128, fp) != 128) + { + llwarns << "Short read" << llendl; + } + + //------------------------------------------------------------------------- + // Check for proper binary header + //------------------------------------------------------------------------- + BOOL status = FALSE; + if ( strncmp(header, HEADER_BINARY, strlen(HEADER_BINARY)) == 0 ) /*Flawfinder: ignore*/ + { + lldebugs << "Loading " << fileName << llendl; + + //---------------------------------------------------------------- + // File Header (seek past it) + //---------------------------------------------------------------- + fseek(fp, 24, SEEK_SET); + + //---------------------------------------------------------------- + // HasWeights + //---------------------------------------------------------------- + U8 hasWeights; + size_t numRead = fread(&hasWeights, sizeof(U8), 1, fp); + if (numRead != 1) + { + llerrs << "can't read HasWeights flag from " << fileName << llendl; + return FALSE; + } + if (!isLOD()) + { + mHasWeights = (hasWeights==0) ? FALSE : TRUE; + } + + //---------------------------------------------------------------- + // HasDetailTexCoords + //---------------------------------------------------------------- + U8 hasDetailTexCoords; + numRead = fread(&hasDetailTexCoords, sizeof(U8), 1, fp); + if (numRead != 1) + { + llerrs << "can't read HasDetailTexCoords flag from " << fileName << llendl; + return FALSE; + } + + //---------------------------------------------------------------- + // Position + //---------------------------------------------------------------- + LLVector3 position; + numRead = fread(position.mV, sizeof(float), 3, fp); + llendianswizzle(position.mV, sizeof(float), 3); + if (numRead != 3) + { + llerrs << "can't read Position from " << fileName << llendl; + return FALSE; + } + setPosition( position ); + + //---------------------------------------------------------------- + // Rotation + //---------------------------------------------------------------- + LLVector3 rotationAngles; + numRead = fread(rotationAngles.mV, sizeof(float), 3, fp); + llendianswizzle(rotationAngles.mV, sizeof(float), 3); + if (numRead != 3) + { + llerrs << "can't read RotationAngles from " << fileName << llendl; + return FALSE; + } + + U8 rotationOrder; + numRead = fread(&rotationOrder, sizeof(U8), 1, fp); + + if (numRead != 1) + { + llerrs << "can't read RotationOrder from " << fileName << llendl; + return FALSE; + } + + rotationOrder = 0; + + setRotation( mayaQ( rotationAngles.mV[0], + rotationAngles.mV[1], + rotationAngles.mV[2], + (LLQuaternion::Order)rotationOrder ) ); + + //---------------------------------------------------------------- + // Scale + //---------------------------------------------------------------- + LLVector3 scale; + numRead = fread(scale.mV, sizeof(float), 3, fp); + llendianswizzle(scale.mV, sizeof(float), 3); + if (numRead != 3) + { + llerrs << "can't read Scale from " << fileName << llendl; + return FALSE; + } + setScale( scale ); + + //------------------------------------------------------------------------- + // Release any existing mesh geometry + //------------------------------------------------------------------------- + freeMeshData(); + + U16 numVertices = 0; + + //---------------------------------------------------------------- + // NumVertices + //---------------------------------------------------------------- + if (!isLOD()) + { + numRead = fread(&numVertices, sizeof(U16), 1, fp); + llendianswizzle(&numVertices, sizeof(U16), 1); + if (numRead != 1) + { + llerrs << "can't read NumVertices from " << fileName << llendl; + return FALSE; + } + + allocateVertexData( numVertices ); + + //---------------------------------------------------------------- + // Coords + //---------------------------------------------------------------- + numRead = fread(mBaseCoords, 3*sizeof(float), numVertices, fp); + llendianswizzle(mBaseCoords, sizeof(float), 3*numVertices); + if (numRead != numVertices) + { + llerrs << "can't read Coordinates from " << fileName << llendl; + return FALSE; + } + + //---------------------------------------------------------------- + // Normals + //---------------------------------------------------------------- + numRead = fread(mBaseNormals, 3*sizeof(float), numVertices, fp); + llendianswizzle(mBaseNormals, sizeof(float), 3*numVertices); + if (numRead != numVertices) + { + llerrs << " can't read Normals from " << fileName << llendl; + return FALSE; + } + + //---------------------------------------------------------------- + // Binormals + //---------------------------------------------------------------- + numRead = fread(mBaseBinormals, 3*sizeof(float), numVertices, fp); + llendianswizzle(mBaseBinormals, sizeof(float), 3*numVertices); + if (numRead != numVertices) + { + llerrs << " can't read Binormals from " << fileName << llendl; + return FALSE; + } + + + //---------------------------------------------------------------- + // TexCoords + //---------------------------------------------------------------- + numRead = fread(mTexCoords, 2*sizeof(float), numVertices, fp); + llendianswizzle(mTexCoords, sizeof(float), 2*numVertices); + if (numRead != numVertices) + { + llerrs << "can't read TexCoords from " << fileName << llendl; + return FALSE; + } + + //---------------------------------------------------------------- + // DetailTexCoords + //---------------------------------------------------------------- + if (mHasDetailTexCoords) + { + numRead = fread(mDetailTexCoords, 2*sizeof(float), numVertices, fp); + llendianswizzle(mDetailTexCoords, sizeof(float), 2*numVertices); + if (numRead != numVertices) + { + llerrs << "can't read DetailTexCoords from " << fileName << llendl; + return FALSE; + } + } + + //---------------------------------------------------------------- + // Weights + //---------------------------------------------------------------- + if (mHasWeights) + { + numRead = fread(mWeights, sizeof(float), numVertices, fp); + llendianswizzle(mWeights, sizeof(float), numVertices); + if (numRead != numVertices) + { + llerrs << "can't read Weights from " << fileName << llendl; + return FALSE; + } + } + } + + //---------------------------------------------------------------- + // NumFaces + //---------------------------------------------------------------- + U16 numFaces; + numRead = fread(&numFaces, sizeof(U16), 1, fp); + llendianswizzle(&numFaces, sizeof(U16), 1); + if (numRead != 1) + { + llerrs << "can't read NumFaces from " << fileName << llendl; + return FALSE; + } + allocateFaceData( numFaces ); + + + //---------------------------------------------------------------- + // Faces + //---------------------------------------------------------------- + U32 i; + U32 numTris = 0; + for (i = 0; i < numFaces; i++) + { + S16 face[3]; + numRead = fread(face, sizeof(U16), 3, fp); + llendianswizzle(face, sizeof(U16), 3); + if (numRead != 3) + { + llerrs << "can't read Face[" << i << "] from " << fileName << llendl; + return FALSE; + } + if (mReferenceData) + { + llassert(face[0] < mReferenceData->mNumVertices); + llassert(face[1] < mReferenceData->mNumVertices); + llassert(face[2] < mReferenceData->mNumVertices); + } + + if (isLOD()) + { + // store largest index in case of LODs + for (S32 j = 0; j < 3; j++) + { + if (face[j] > mNumVertices - 1) + { + mNumVertices = face[j] + 1; + } + } + } + mFaces[i][0] = face[0]; + mFaces[i][1] = face[1]; + mFaces[i][2] = face[2]; + +// S32 j; +// for(j = 0; j < 3; j++) +// { +// LLDynamicArray<S32> *face_list = mVertFaceMap.getIfThere(face[j]); +// if (!face_list) +// { +// face_list = new LLDynamicArray<S32>; +// mVertFaceMap.addData(face[j], face_list); +// } +// face_list->put(i); +// } + + numTris++; + } + + lldebugs << "verts: " << numVertices + << ", faces: " << numFaces + << ", tris: " << numTris + << llendl; + + //---------------------------------------------------------------- + // NumSkinJoints + //---------------------------------------------------------------- + if (!isLOD()) + { + U16 numSkinJoints = 0; + if ( mHasWeights ) + { + numRead = fread(&numSkinJoints, sizeof(U16), 1, fp); + llendianswizzle(&numSkinJoints, sizeof(U16), 1); + if (numRead != 1) + { + llerrs << "can't read NumSkinJoints from " << fileName << llendl; + return FALSE; + } + allocateJointNames( numSkinJoints ); + } + + //---------------------------------------------------------------- + // SkinJoints + //---------------------------------------------------------------- + for (i=0; i < numSkinJoints; i++) + { + char jointName[64+1]; + numRead = fread(jointName, sizeof(jointName)-1, 1, fp); + jointName[sizeof(jointName)-1] = '\0'; // ensure nul-termination + if (numRead != 1) + { + llerrs << "can't read Skin[" << i << "].Name from " << fileName << llendl; + return FALSE; + } + + std::string *jn = &mJointNames[i]; + *jn = jointName; + } + + //------------------------------------------------------------------------- + // look for morph section + //------------------------------------------------------------------------- + char morphName[64+1]; + morphName[sizeof(morphName)-1] = '\0'; // ensure nul-termination + while(fread(&morphName, sizeof(char), 64, fp) == 64) + { + if (!strcmp(morphName, "End Morphs")) + { + // we reached the end of the morphs + break; + } + LLPolyMorphData* morph_data = new LLPolyMorphData(std::string(morphName)); + + BOOL result = morph_data->loadBinary(fp, this); + + if (!result) + { + delete morph_data; + continue; + } + + mMorphData.insert(morph_data); + + if (!strcmp(morphName, "Breast_Female_Cleavage")) + { + mMorphData.insert(clone_morph_param_cleavage(morph_data, + .75f, + "Breast_Physics_LeftRight_Driven")); + } + + if (!strcmp(morphName, "Big_Belly_Torso")) + { + mMorphData.insert(clone_morph_param(morph_data, + LLVector3(0,0,0.05f), + "Belly_Physics_Torso_UpDown_Driven")); + } + + if (!strcmp(morphName, "Big_Belly_Legs")) + { + mMorphData.insert(clone_morph_param(morph_data, + LLVector3(0,0,0.05f), + "Belly_Physics_Legs_UpDown_Driven")); + } + + if (!strcmp(morphName, "skirt_belly")) + { + mMorphData.insert(clone_morph_param(morph_data, + LLVector3(0,0,0.05f), + "Belly_Physics_Skirt_UpDown_Driven")); + } + + if (!strcmp(morphName, "Small_Butt")) + { + mMorphData.insert(clone_morph_param(morph_data, + LLVector3(0,0,0.05f), + "Butt_Physics_UpDown_Driven")); + } + if (!strcmp(morphName, "Small_Butt")) + { + mMorphData.insert(clone_morph_param(morph_data, + LLVector3(0,0.02f,0), + "Butt_Physics_LeftRight_Driven")); + } + } + + S32 numRemaps; + if (fread(&numRemaps, sizeof(S32), 1, fp) == 1) + { + llendianswizzle(&numRemaps, sizeof(S32), 1); + for (S32 i = 0; i < numRemaps; i++) + { + S32 remapSrc; + S32 remapDst; + if (fread(&remapSrc, sizeof(S32), 1, fp) != 1) + { + llerrs << "can't read source vertex in vertex remap data" << llendl; + break; + } + if (fread(&remapDst, sizeof(S32), 1, fp) != 1) + { + llerrs << "can't read destination vertex in vertex remap data" << llendl; + break; + } + llendianswizzle(&remapSrc, sizeof(S32), 1); + llendianswizzle(&remapDst, sizeof(S32), 1); + + mSharedVerts[remapSrc] = remapDst; + } + } + } + + status = TRUE; + } + else + { + llerrs << "invalid mesh file header: " << fileName << llendl; + status = FALSE; + } + + if (0 == mNumJointNames) + { + allocateJointNames(1); + } + + fclose( fp ); + + return status; } //----------------------------------------------------------------------------- @@ -701,11 +701,11 @@ BOOL LLPolyMeshSharedData::loadMesh( const std::string& fileName ) //----------------------------------------------------------------------------- const S32 *LLPolyMeshSharedData::getSharedVert(S32 vert) { - if (mSharedVerts.count(vert) > 0) - { - return &mSharedVerts[vert]; - } - return NULL; + if (mSharedVerts.count(vert) > 0) + { + return &mSharedVerts[vert]; + } + return NULL; } //----------------------------------------------------------------------------- @@ -713,69 +713,69 @@ const S32 *LLPolyMeshSharedData::getSharedVert(S32 vert) //----------------------------------------------------------------------------- const LLVector2 &LLPolyMeshSharedData::getUVs(U32 index) { - // TODO: convert all index variables to S32 - llassert((S32)index < mNumVertices); + // TODO: convert all index variables to S32 + llassert((S32)index < mNumVertices); - return mTexCoords[index]; + return mTexCoords[index]; } //----------------------------------------------------------------------------- // LLPolyMesh() //----------------------------------------------------------------------------- LLPolyMesh::LLPolyMesh(LLPolyMeshSharedData *shared_data, LLPolyMesh *reference_mesh) -{ - LLMemType mt(LLMemType::MTYPE_AVATAR_MESH); - - llassert(shared_data); - - mSharedData = shared_data; - mReferenceMesh = reference_mesh; - mAvatarp = NULL; - mVertexData = NULL; - - mCurVertexCount = 0; - mFaceIndexCount = 0; - mFaceIndexOffset = 0; - mFaceVertexCount = 0; - mFaceVertexOffset = 0; - - if (shared_data->isLOD() && reference_mesh) - { - mCoords = reference_mesh->mCoords; - mNormals = reference_mesh->mNormals; - mScaledNormals = reference_mesh->mScaledNormals; - mBinormals = reference_mesh->mBinormals; - mScaledBinormals = reference_mesh->mScaledBinormals; - mTexCoords = reference_mesh->mTexCoords; - mClothingWeights = reference_mesh->mClothingWeights; - } - else - { -#if 1 // Allocate memory without initializing every vector - // NOTE: This makes asusmptions about the size of LLVector[234] - int nverts = mSharedData->mNumVertices; - int nfloats = nverts * (3*5 + 2 + 4); - mVertexData = new F32[nfloats]; - int offset = 0; - mCoords = (LLVector3*)(mVertexData + offset); offset += 3*nverts; - mNormals = (LLVector3*)(mVertexData + offset); offset += 3*nverts; - mScaledNormals = (LLVector3*)(mVertexData + offset); offset += 3*nverts; - mBinormals = (LLVector3*)(mVertexData + offset); offset += 3*nverts; - mScaledBinormals = (LLVector3*)(mVertexData + offset); offset += 3*nverts; - mTexCoords = (LLVector2*)(mVertexData + offset); offset += 2*nverts; - mClothingWeights = (LLVector4*)(mVertexData + offset); offset += 4*nverts; +{ + LLMemType mt(LLMemType::MTYPE_AVATAR_MESH); + + llassert(shared_data); + + mSharedData = shared_data; + mReferenceMesh = reference_mesh; + mAvatarp = NULL; + mVertexData = NULL; + + mCurVertexCount = 0; + mFaceIndexCount = 0; + mFaceIndexOffset = 0; + mFaceVertexCount = 0; + mFaceVertexOffset = 0; + + if (shared_data->isLOD() && reference_mesh) + { + mCoords = reference_mesh->mCoords; + mNormals = reference_mesh->mNormals; + mScaledNormals = reference_mesh->mScaledNormals; + mBinormals = reference_mesh->mBinormals; + mScaledBinormals = reference_mesh->mScaledBinormals; + mTexCoords = reference_mesh->mTexCoords; + mClothingWeights = reference_mesh->mClothingWeights; + } + else + { +#if 1 // Allocate memory without initializing every vector + // NOTE: This makes asusmptions about the size of LLVector[234] + int nverts = mSharedData->mNumVertices; + int nfloats = nverts * (3*5 + 2 + 4); + mVertexData = new F32[nfloats]; + int offset = 0; + mCoords = (LLVector3*)(mVertexData + offset); offset += 3*nverts; + mNormals = (LLVector3*)(mVertexData + offset); offset += 3*nverts; + mScaledNormals = (LLVector3*)(mVertexData + offset); offset += 3*nverts; + mBinormals = (LLVector3*)(mVertexData + offset); offset += 3*nverts; + mScaledBinormals = (LLVector3*)(mVertexData + offset); offset += 3*nverts; + mTexCoords = (LLVector2*)(mVertexData + offset); offset += 2*nverts; + mClothingWeights = (LLVector4*)(mVertexData + offset); offset += 4*nverts; #else - mCoords = new LLVector3[mSharedData->mNumVertices]; - mNormals = new LLVector3[mSharedData->mNumVertices]; - mScaledNormals = new LLVector3[mSharedData->mNumVertices]; - mBinormals = new LLVector3[mSharedData->mNumVertices]; - mScaledBinormals = new LLVector3[mSharedData->mNumVertices]; - mTexCoords = new LLVector2[mSharedData->mNumVertices]; - mClothingWeights = new LLVector4[mSharedData->mNumVertices]; - memset(mClothingWeights, 0, sizeof(LLVector4) * mSharedData->mNumVertices); + mCoords = new LLVector3[mSharedData->mNumVertices]; + mNormals = new LLVector3[mSharedData->mNumVertices]; + mScaledNormals = new LLVector3[mSharedData->mNumVertices]; + mBinormals = new LLVector3[mSharedData->mNumVertices]; + mScaledBinormals = new LLVector3[mSharedData->mNumVertices]; + mTexCoords = new LLVector2[mSharedData->mNumVertices]; + mClothingWeights = new LLVector4[mSharedData->mNumVertices]; + memset(mClothingWeights, 0, sizeof(LLVector4) * mSharedData->mNumVertices); #endif - initializeForMorph(); - } + initializeForMorph(); + } } @@ -784,22 +784,22 @@ LLPolyMesh::LLPolyMesh(LLPolyMeshSharedData *shared_data, LLPolyMesh *reference_ //----------------------------------------------------------------------------- LLPolyMesh::~LLPolyMesh() { - S32 i; - for (i = 0; i < mJointRenderData.count(); i++) - { - delete mJointRenderData[i]; - mJointRenderData[i] = NULL; - } + S32 i; + for (i = 0; i < mJointRenderData.count(); i++) + { + delete mJointRenderData[i]; + mJointRenderData[i] = NULL; + } #if 0 // These are now allocated as one big uninitialized chunk - delete [] mCoords; - delete [] mNormals; - delete [] mScaledNormals; - delete [] mBinormals; - delete [] mScaledBinormals; - delete [] mClothingWeights; - delete [] mTexCoords; + delete [] mCoords; + delete [] mNormals; + delete [] mScaledNormals; + delete [] mBinormals; + delete [] mScaledBinormals; + delete [] mClothingWeights; + delete [] mTexCoords; #else - delete [] mVertexData; + delete [] mVertexData; #endif } @@ -809,40 +809,40 @@ LLPolyMesh::~LLPolyMesh() //----------------------------------------------------------------------------- LLPolyMesh *LLPolyMesh::getMesh(const std::string &name, LLPolyMesh* reference_mesh) { - //------------------------------------------------------------------------- - // search for an existing mesh by this name - //------------------------------------------------------------------------- - LLPolyMeshSharedData* meshSharedData = get_if_there(sGlobalSharedMeshList, name, (LLPolyMeshSharedData*)NULL); - if (meshSharedData) - { -// llinfos << "Polymesh " << name << " found in global mesh table." << llendl; - LLPolyMesh *poly_mesh = new LLPolyMesh(meshSharedData, reference_mesh); - return poly_mesh; - } - - //------------------------------------------------------------------------- - // if not found, create a new one, add it to the list - //------------------------------------------------------------------------- - std::string full_path; - full_path = gDirUtilp->getExpandedFilename(LL_PATH_CHARACTER,name); - - LLPolyMeshSharedData *mesh_data = new LLPolyMeshSharedData(); - if (reference_mesh) - { - mesh_data->setupLOD(reference_mesh->getSharedData()); - } - if ( ! mesh_data->loadMesh( full_path ) ) - { - delete mesh_data; - return NULL; - } - - LLPolyMesh *poly_mesh = new LLPolyMesh(mesh_data, reference_mesh); - -// llinfos << "Polymesh " << name << " added to global mesh table." << llendl; - sGlobalSharedMeshList[name] = poly_mesh->mSharedData; - - return poly_mesh; + //------------------------------------------------------------------------- + // search for an existing mesh by this name + //------------------------------------------------------------------------- + LLPolyMeshSharedData* meshSharedData = get_if_there(sGlobalSharedMeshList, name, (LLPolyMeshSharedData*)NULL); + if (meshSharedData) + { +// llinfos << "Polymesh " << name << " found in global mesh table." << llendl; + LLPolyMesh *poly_mesh = new LLPolyMesh(meshSharedData, reference_mesh); + return poly_mesh; + } + + //------------------------------------------------------------------------- + // if not found, create a new one, add it to the list + //------------------------------------------------------------------------- + std::string full_path; + full_path = gDirUtilp->getExpandedFilename(LL_PATH_CHARACTER,name); + + LLPolyMeshSharedData *mesh_data = new LLPolyMeshSharedData(); + if (reference_mesh) + { + mesh_data->setupLOD(reference_mesh->getSharedData()); + } + if ( ! mesh_data->loadMesh( full_path ) ) + { + delete mesh_data; + return NULL; + } + + LLPolyMesh *poly_mesh = new LLPolyMesh(mesh_data, reference_mesh); + +// llinfos << "Polymesh " << name << " added to global mesh table." << llendl; + sGlobalSharedMeshList[name] = poly_mesh->mSharedData; + + return poly_mesh; } //----------------------------------------------------------------------------- @@ -850,14 +850,14 @@ LLPolyMesh *LLPolyMesh::getMesh(const std::string &name, LLPolyMesh* reference_m //----------------------------------------------------------------------------- void LLPolyMesh::freeAllMeshes() { - // delete each item in the global lists - for_each(sGlobalSharedMeshList.begin(), sGlobalSharedMeshList.end(), DeletePairedPointer()); - sGlobalSharedMeshList.clear(); + // delete each item in the global lists + for_each(sGlobalSharedMeshList.begin(), sGlobalSharedMeshList.end(), DeletePairedPointer()); + sGlobalSharedMeshList.clear(); } LLPolyMeshSharedData *LLPolyMesh::getSharedData() const { - return mSharedData; + return mSharedData; } @@ -866,41 +866,41 @@ LLPolyMeshSharedData *LLPolyMesh::getSharedData() const //-------------------------------------------------------------------- void LLPolyMesh::dumpDiagInfo() { - // keep track of totals - U32 total_verts = 0; - U32 total_faces = 0; - U32 total_kb = 0; - - std::string buf; - - llinfos << "-----------------------------------------------------" << llendl; - llinfos << " Global PolyMesh Table (DEBUG only)" << llendl; - llinfos << " Verts Faces Mem(KB) Name" << llendl; - llinfos << "-----------------------------------------------------" << llendl; - - // print each loaded mesh, and it's memory usage - for(LLPolyMeshSharedDataTable::iterator iter = sGlobalSharedMeshList.begin(); - iter != sGlobalSharedMeshList.end(); ++iter) - { - const std::string& mesh_name = iter->first; - LLPolyMeshSharedData* mesh = iter->second; - - S32 num_verts = mesh->mNumVertices; - S32 num_faces = mesh->mNumFaces; - U32 num_kb = mesh->getNumKB(); - - buf = llformat("%8d %8d %8d %s", num_verts, num_faces, num_kb, mesh_name.c_str()); - llinfos << buf << llendl; - - total_verts += num_verts; - total_faces += num_faces; - total_kb += num_kb; - } - - llinfos << "-----------------------------------------------------" << llendl; - buf = llformat("%8d %8d %8d TOTAL", total_verts, total_faces, total_kb ); - llinfos << buf << llendl; - llinfos << "-----------------------------------------------------" << llendl; + // keep track of totals + U32 total_verts = 0; + U32 total_faces = 0; + U32 total_kb = 0; + + std::string buf; + + llinfos << "-----------------------------------------------------" << llendl; + llinfos << " Global PolyMesh Table (DEBUG only)" << llendl; + llinfos << " Verts Faces Mem(KB) Name" << llendl; + llinfos << "-----------------------------------------------------" << llendl; + + // print each loaded mesh, and it's memory usage + for(LLPolyMeshSharedDataTable::iterator iter = sGlobalSharedMeshList.begin(); + iter != sGlobalSharedMeshList.end(); ++iter) + { + const std::string& mesh_name = iter->first; + LLPolyMeshSharedData* mesh = iter->second; + + S32 num_verts = mesh->mNumVertices; + S32 num_faces = mesh->mNumFaces; + U32 num_kb = mesh->getNumKB(); + + buf = llformat("%8d %8d %8d %s", num_verts, num_faces, num_kb, mesh_name.c_str()); + llinfos << buf << llendl; + + total_verts += num_verts; + total_faces += num_faces; + total_kb += num_kb; + } + + llinfos << "-----------------------------------------------------" << llendl; + buf = llformat("%8d %8d %8d TOTAL", total_verts, total_faces, total_kb ); + llinfos << buf << llendl; + llinfos << "-----------------------------------------------------" << llendl; } //----------------------------------------------------------------------------- @@ -908,7 +908,7 @@ void LLPolyMesh::dumpDiagInfo() //----------------------------------------------------------------------------- LLVector3 *LLPolyMesh::getWritableCoords() { - return mCoords; + return mCoords; } //----------------------------------------------------------------------------- @@ -916,7 +916,7 @@ LLVector3 *LLPolyMesh::getWritableCoords() //----------------------------------------------------------------------------- LLVector3 *LLPolyMesh::getWritableNormals() { - return mNormals; + return mNormals; } //----------------------------------------------------------------------------- @@ -924,24 +924,24 @@ LLVector3 *LLPolyMesh::getWritableNormals() //----------------------------------------------------------------------------- LLVector3 *LLPolyMesh::getWritableBinormals() { - return mBinormals; + return mBinormals; } //----------------------------------------------------------------------------- // getWritableClothingWeights() //----------------------------------------------------------------------------- -LLVector4 *LLPolyMesh::getWritableClothingWeights() +LLVector4 *LLPolyMesh::getWritableClothingWeights() { - return mClothingWeights; + return mClothingWeights; } //----------------------------------------------------------------------------- // getWritableTexCoords() //----------------------------------------------------------------------------- -LLVector2 *LLPolyMesh::getWritableTexCoords() +LLVector2 *LLPolyMesh::getWritableTexCoords() { - return mTexCoords; + return mTexCoords; } //----------------------------------------------------------------------------- @@ -949,7 +949,7 @@ LLVector2 *LLPolyMesh::getWritableTexCoords() //----------------------------------------------------------------------------- LLVector3 *LLPolyMesh::getScaledNormals() { - return mScaledNormals; + return mScaledNormals; } //----------------------------------------------------------------------------- @@ -957,7 +957,7 @@ LLVector3 *LLPolyMesh::getScaledNormals() //----------------------------------------------------------------------------- LLVector3 *LLPolyMesh::getScaledBinormals() { - return mScaledBinormals; + return mScaledBinormals; } @@ -966,66 +966,66 @@ LLVector3 *LLPolyMesh::getScaledBinormals() //----------------------------------------------------------------------------- void LLPolyMesh::initializeForMorph() { - if (!mSharedData) - return; - - memcpy(mCoords, mSharedData->mBaseCoords, sizeof(LLVector3) * mSharedData->mNumVertices); /*Flawfinder: ignore*/ - memcpy(mNormals, mSharedData->mBaseNormals, sizeof(LLVector3) * mSharedData->mNumVertices); /*Flawfinder: ignore*/ - memcpy(mScaledNormals, mSharedData->mBaseNormals, sizeof(LLVector3) * mSharedData->mNumVertices); /*Flawfinder: ignore*/ - memcpy(mBinormals, mSharedData->mBaseBinormals, sizeof(LLVector3) * mSharedData->mNumVertices); /*Flawfinder: ignore*/ - memcpy(mScaledBinormals, mSharedData->mBaseBinormals, sizeof(LLVector3) * mSharedData->mNumVertices); /*Flawfinder: ignore*/ - memcpy(mTexCoords, mSharedData->mTexCoords, sizeof(LLVector2) * mSharedData->mNumVertices); /*Flawfinder: ignore*/ - memset(mClothingWeights, 0, sizeof(LLVector4) * mSharedData->mNumVertices); + if (!mSharedData) + return; + + memcpy(mCoords, mSharedData->mBaseCoords, sizeof(LLVector3) * mSharedData->mNumVertices); /*Flawfinder: ignore*/ + memcpy(mNormals, mSharedData->mBaseNormals, sizeof(LLVector3) * mSharedData->mNumVertices); /*Flawfinder: ignore*/ + memcpy(mScaledNormals, mSharedData->mBaseNormals, sizeof(LLVector3) * mSharedData->mNumVertices); /*Flawfinder: ignore*/ + memcpy(mBinormals, mSharedData->mBaseBinormals, sizeof(LLVector3) * mSharedData->mNumVertices); /*Flawfinder: ignore*/ + memcpy(mScaledBinormals, mSharedData->mBaseBinormals, sizeof(LLVector3) * mSharedData->mNumVertices); /*Flawfinder: ignore*/ + memcpy(mTexCoords, mSharedData->mTexCoords, sizeof(LLVector2) * mSharedData->mNumVertices); /*Flawfinder: ignore*/ + memset(mClothingWeights, 0, sizeof(LLVector4) * mSharedData->mNumVertices); } //----------------------------------------------------------------------------- // getMorphData() //----------------------------------------------------------------------------- -LLPolyMorphData* LLPolyMesh::getMorphData(const std::string& morph_name) +LLPolyMorphData* LLPolyMesh::getMorphData(const std::string& morph_name) { - if (!mSharedData) - return NULL; - for (LLPolyMeshSharedData::morphdata_list_t::iterator iter = mSharedData->mMorphData.begin(); - iter != mSharedData->mMorphData.end(); ++iter) - { - LLPolyMorphData *morph_data = *iter; - if (morph_data->getName() == morph_name) - { - return morph_data; - } - } - return NULL; + if (!mSharedData) + return NULL; + for (LLPolyMeshSharedData::morphdata_list_t::iterator iter = mSharedData->mMorphData.begin(); + iter != mSharedData->mMorphData.end(); ++iter) + { + LLPolyMorphData *morph_data = *iter; + if (morph_data->getName() == morph_name) + { + return morph_data; + } + } + return NULL; } //----------------------------------------------------------------------------- // removeMorphData() //----------------------------------------------------------------------------- // // erasing but not deleting seems bad, but fortunately we don't actually use this... -// void LLPolyMesh::removeMorphData(LLPolyMorphData *morph_target) +// void LLPolyMesh::removeMorphData(LLPolyMorphData *morph_target) // { -// if (!mSharedData) -// return; -// mSharedData->mMorphData.erase(morph_target); +// if (!mSharedData) +// return; +// mSharedData->mMorphData.erase(morph_target); // } //----------------------------------------------------------------------------- // deleteAllMorphData() //----------------------------------------------------------------------------- -// void LLPolyMesh::deleteAllMorphData() +// void LLPolyMesh::deleteAllMorphData() // { -// if (!mSharedData) -// return; +// if (!mSharedData) +// return; -// for_each(mSharedData->mMorphData.begin(), mSharedData->mMorphData.end(), DeletePointer()); -// mSharedData->mMorphData.clear(); +// for_each(mSharedData->mMorphData.begin(), mSharedData->mMorphData.end(), DeletePointer()); +// mSharedData->mMorphData.clear(); // } //----------------------------------------------------------------------------- // getWritableWeights() //----------------------------------------------------------------------------- -F32* LLPolyMesh::getWritableWeights() const +F32* LLPolyMesh::getWritableWeights() const { - return mSharedData->mWeights; + return mSharedData->mWeights; } //----------------------------------------------------------------------------- @@ -1037,58 +1037,58 @@ LLPolySkeletalDistortionInfo::LLPolySkeletalDistortionInfo() BOOL LLPolySkeletalDistortionInfo::parseXml(LLXmlTreeNode* node) { - llassert( node->hasName( "param" ) && node->getChildByName( "param_skeleton" ) ); - - if (!LLViewerVisualParamInfo::parseXml(node)) - return FALSE; - - LLXmlTreeNode* skeletalParam = node->getChildByName("param_skeleton"); - - if (NULL == skeletalParam) - { - llwarns << "Failed to getChildByName(\"param_skeleton\")" - << llendl; - return FALSE; - } - - for( LLXmlTreeNode* bone = skeletalParam->getFirstChild(); bone; bone = skeletalParam->getNextChild() ) - { - if (bone->hasName("bone")) - { - std::string name; - LLVector3 scale; - LLVector3 pos; - BOOL haspos = FALSE; - - static LLStdStringHandle name_string = LLXmlTree::addAttributeString("name"); - if (!bone->getFastAttributeString(name_string, name)) - { - llwarns << "No bone name specified for skeletal param." << llendl; - continue; - } - - static LLStdStringHandle scale_string = LLXmlTree::addAttributeString("scale"); - if (!bone->getFastAttributeVector3(scale_string, scale)) - { - llwarns << "No scale specified for bone " << name << "." << llendl; - continue; - } - - // optional offset deformation (translation) - static LLStdStringHandle offset_string = LLXmlTree::addAttributeString("offset"); - if (bone->getFastAttributeVector3(offset_string, pos)) - { - haspos = TRUE; - } - mBoneInfoList.push_back(LLPolySkeletalBoneInfo(name, scale, pos, haspos)); - } - else - { - llwarns << "Unrecognized element " << bone->getName() << " in skeletal distortion" << llendl; - continue; - } - } - return TRUE; + llassert( node->hasName( "param" ) && node->getChildByName( "param_skeleton" ) ); + + if (!LLViewerVisualParamInfo::parseXml(node)) + return FALSE; + + LLXmlTreeNode* skeletalParam = node->getChildByName("param_skeleton"); + + if (NULL == skeletalParam) + { + llwarns << "Failed to getChildByName(\"param_skeleton\")" + << llendl; + return FALSE; + } + + for( LLXmlTreeNode* bone = skeletalParam->getFirstChild(); bone; bone = skeletalParam->getNextChild() ) + { + if (bone->hasName("bone")) + { + std::string name; + LLVector3 scale; + LLVector3 pos; + BOOL haspos = FALSE; + + static LLStdStringHandle name_string = LLXmlTree::addAttributeString("name"); + if (!bone->getFastAttributeString(name_string, name)) + { + llwarns << "No bone name specified for skeletal param." << llendl; + continue; + } + + static LLStdStringHandle scale_string = LLXmlTree::addAttributeString("scale"); + if (!bone->getFastAttributeVector3(scale_string, scale)) + { + llwarns << "No scale specified for bone " << name << "." << llendl; + continue; + } + + // optional offset deformation (translation) + static LLStdStringHandle offset_string = LLXmlTree::addAttributeString("offset"); + if (bone->getFastAttributeVector3(offset_string, pos)) + { + haspos = TRUE; + } + mBoneInfoList.push_back(LLPolySkeletalBoneInfo(name, scale, pos, haspos)); + } + else + { + llwarns << "Unrecognized element " << bone->getName() << " in skeletal distortion" << llendl; + continue; + } + } + return TRUE; } //----------------------------------------------------------------------------- @@ -1096,8 +1096,8 @@ BOOL LLPolySkeletalDistortionInfo::parseXml(LLXmlTreeNode* node) //----------------------------------------------------------------------------- LLPolySkeletalDistortion::LLPolySkeletalDistortion(LLVOAvatar *avatarp) { - mAvatar = avatarp; - mDefaultVec.setVec(0.001f, 0.001f, 0.001f); + mAvatar = avatarp; + mDefaultVec.setVec(0.001f, 0.001f, 0.001f); } //----------------------------------------------------------------------------- @@ -1109,62 +1109,62 @@ LLPolySkeletalDistortion::~LLPolySkeletalDistortion() BOOL LLPolySkeletalDistortion::setInfo(LLPolySkeletalDistortionInfo *info) { - llassert(mInfo == NULL); - if (info->mID < 0) - return FALSE; - mInfo = info; - mID = info->mID; - setWeight(getDefaultWeight(), FALSE ); - - LLPolySkeletalDistortionInfo::bone_info_list_t::iterator iter; - for (iter = getInfo()->mBoneInfoList.begin(); iter != getInfo()->mBoneInfoList.end(); iter++) - { - LLPolySkeletalBoneInfo *bone_info = &(*iter); - LLJoint* joint = mAvatar->getJoint(bone_info->mBoneName); - if (!joint) - { - llwarns << "Joint " << bone_info->mBoneName << " not found." << llendl; - continue; - } - - if (mJointScales.find(joint) != mJointScales.end()) - { - llwarns << "Scale deformation already supplied for joint " << joint->getName() << "." << llendl; - } - - // store it - mJointScales[joint] = bone_info->mScaleDeformation; - - // apply to children that need to inherit it - for (LLJoint::child_list_t::iterator iter = joint->mChildren.begin(); - iter != joint->mChildren.end(); ++iter) - { - LLViewerJoint* child_joint = (LLViewerJoint*)(*iter); - if (child_joint->inheritScale()) - { - LLVector3 childDeformation = LLVector3(child_joint->getScale()); - childDeformation.scaleVec(bone_info->mScaleDeformation); - mJointScales[child_joint] = childDeformation; - } - } - - if (bone_info->mHasPositionDeformation) - { - if (mJointOffsets.find(joint) != mJointOffsets.end()) - { - llwarns << "Offset deformation already supplied for joint " << joint->getName() << "." << llendl; - } - mJointOffsets[joint] = bone_info->mPositionDeformation; - } - } - return TRUE; + llassert(mInfo == NULL); + if (info->mID < 0) + return FALSE; + mInfo = info; + mID = info->mID; + setWeight(getDefaultWeight(), FALSE ); + + LLPolySkeletalDistortionInfo::bone_info_list_t::iterator iter; + for (iter = getInfo()->mBoneInfoList.begin(); iter != getInfo()->mBoneInfoList.end(); iter++) + { + LLPolySkeletalBoneInfo *bone_info = &(*iter); + LLJoint* joint = mAvatar->getJoint(bone_info->mBoneName); + if (!joint) + { + llwarns << "Joint " << bone_info->mBoneName << " not found." << llendl; + continue; + } + + if (mJointScales.find(joint) != mJointScales.end()) + { + llwarns << "Scale deformation already supplied for joint " << joint->getName() << "." << llendl; + } + + // store it + mJointScales[joint] = bone_info->mScaleDeformation; + + // apply to children that need to inherit it + for (LLJoint::child_list_t::iterator iter = joint->mChildren.begin(); + iter != joint->mChildren.end(); ++iter) + { + LLViewerJoint* child_joint = (LLViewerJoint*)(*iter); + if (child_joint->inheritScale()) + { + LLVector3 childDeformation = LLVector3(child_joint->getScale()); + childDeformation.scaleVec(bone_info->mScaleDeformation); + mJointScales[child_joint] = childDeformation; + } + } + + if (bone_info->mHasPositionDeformation) + { + if (mJointOffsets.find(joint) != mJointOffsets.end()) + { + llwarns << "Offset deformation already supplied for joint " << joint->getName() << "." << llendl; + } + mJointOffsets[joint] = bone_info->mPositionDeformation; + } + } + return TRUE; } /*virtual*/ LLViewerVisualParam* LLPolySkeletalDistortion::cloneParam(LLWearable* wearable) const { - LLPolySkeletalDistortion *new_param = new LLPolySkeletalDistortion(mAvatar); - *new_param = *this; - return new_param; + LLPolySkeletalDistortion *new_param = new LLPolySkeletalDistortion(mAvatar); + *new_param = *this; + return new_param; } //----------------------------------------------------------------------------- @@ -1172,75 +1172,75 @@ BOOL LLPolySkeletalDistortion::setInfo(LLPolySkeletalDistortionInfo *info) //----------------------------------------------------------------------------- void LLPolySkeletalDistortion::apply( ESex avatar_sex ) { - F32 effective_weight = ( getSex() & avatar_sex ) ? mCurWeight : getDefaultWeight(); - - LLJoint* joint; - joint_vec_map_t::iterator iter; - - for (iter = mJointScales.begin(); - iter != mJointScales.end(); - iter++) - { - joint = iter->first; - LLVector3 newScale = joint->getScale(); - LLVector3 scaleDelta = iter->second; - newScale = newScale + (effective_weight * scaleDelta) - (mLastWeight * scaleDelta); - joint->setScale(newScale); - } - - for (iter = mJointOffsets.begin(); - iter != mJointOffsets.end(); - iter++) - { - joint = iter->first; - LLVector3 newPosition = joint->getPosition(); - LLVector3 positionDelta = iter->second; - newPosition = newPosition + (effective_weight * positionDelta) - (mLastWeight * positionDelta); - joint->setPosition(newPosition); - } - - if (mLastWeight != mCurWeight && !mIsAnimating) - { - mAvatar->setSkeletonSerialNum(mAvatar->getSkeletonSerialNum() + 1); - } - mLastWeight = mCurWeight; + F32 effective_weight = ( getSex() & avatar_sex ) ? mCurWeight : getDefaultWeight(); + + LLJoint* joint; + joint_vec_map_t::iterator iter; + + for (iter = mJointScales.begin(); + iter != mJointScales.end(); + iter++) + { + joint = iter->first; + LLVector3 newScale = joint->getScale(); + LLVector3 scaleDelta = iter->second; + newScale = newScale + (effective_weight * scaleDelta) - (mLastWeight * scaleDelta); + joint->setScale(newScale); + } + + for (iter = mJointOffsets.begin(); + iter != mJointOffsets.end(); + iter++) + { + joint = iter->first; + LLVector3 newPosition = joint->getPosition(); + LLVector3 positionDelta = iter->second; + newPosition = newPosition + (effective_weight * positionDelta) - (mLastWeight * positionDelta); + joint->setPosition(newPosition); + } + + if (mLastWeight != mCurWeight && !mIsAnimating) + { + mAvatar->setSkeletonSerialNum(mAvatar->getSkeletonSerialNum() + 1); + } + mLastWeight = mCurWeight; } LLPolyMorphData *clone_morph_param(const LLPolyMorphData *src_data, - const LLVector3 &direction, - const std::string &name) + const LLVector3 &direction, + const std::string &name) { - LLPolyMorphData* cloned_morph_data = new LLPolyMorphData(*src_data); - cloned_morph_data->mName = name; - for (U32 v=0; v < cloned_morph_data->mNumIndices; v++) - { - cloned_morph_data->mCoords[v] = direction; - cloned_morph_data->mNormals[v] = LLVector3(0,0,0); - cloned_morph_data->mBinormals[v] = LLVector3(0,0,0); - } - return cloned_morph_data; + LLPolyMorphData* cloned_morph_data = new LLPolyMorphData(*src_data); + cloned_morph_data->mName = name; + for (U32 v=0; v < cloned_morph_data->mNumIndices; v++) + { + cloned_morph_data->mCoords[v] = direction; + cloned_morph_data->mNormals[v] = LLVector3(0,0,0); + cloned_morph_data->mBinormals[v] = LLVector3(0,0,0); + } + return cloned_morph_data; } LLPolyMorphData *clone_morph_param_cleavage(const LLPolyMorphData *src_data, F32 scale, const std::string &name) { - LLPolyMorphData* cloned_morph_data = new LLPolyMorphData(*src_data); - cloned_morph_data->mName = name; - for (U32 v=0; v < cloned_morph_data->mNumIndices; v++) - { - cloned_morph_data->mCoords[v] = src_data->mCoords[v]*scale; - cloned_morph_data->mNormals[v] = src_data->mNormals[v]*scale; - cloned_morph_data->mBinormals[v] = src_data->mBinormals[v]*scale; - if (cloned_morph_data->mCoords[v][1] < 0) - { - cloned_morph_data->mCoords[v][1] *= -1; - cloned_morph_data->mNormals[v][1] *= -1; - cloned_morph_data->mBinormals[v][1] *= -1; - } - } - return cloned_morph_data; + LLPolyMorphData* cloned_morph_data = new LLPolyMorphData(*src_data); + cloned_morph_data->mName = name; + for (U32 v=0; v < cloned_morph_data->mNumIndices; v++) + { + cloned_morph_data->mCoords[v] = src_data->mCoords[v]*scale; + cloned_morph_data->mNormals[v] = src_data->mNormals[v]*scale; + cloned_morph_data->mBinormals[v] = src_data->mBinormals[v]*scale; + if (cloned_morph_data->mCoords[v][1] < 0) + { + cloned_morph_data->mCoords[v][1] *= -1; + cloned_morph_data->mNormals[v][1] *= -1; + cloned_morph_data->mBinormals[v][1] *= -1; + } + } + return cloned_morph_data; } // End -- cgit v1.2.3 From 9c3b0ddeaf39bfbfe1bdfbbb614c8abe0b7c03a9 Mon Sep 17 00:00:00 2001 From: Seraph Linden <none@none> Date: Sun, 3 Apr 2011 17:27:11 -0400 Subject: Fix for compile error. --- indra/newview/llphysicsmotion.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 57ba76cf6d..15797e5ab7 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -627,8 +627,7 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) // If this is one of our "hidden" driver params, then make sure it's // the default value. if ((driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) && - (driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT) && - (driver_param->getVisualParamWeight() != 0)) + (driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT)) { mCharacter->setVisualParamWeight(driver_param, 0, -- cgit v1.2.3 From 05e23c39f731ed50663d3dd3f8fa442d95161241 Mon Sep 17 00:00:00 2001 From: Seraph Linden <none@none> Date: Sun, 3 Apr 2011 17:46:56 -0400 Subject: Minor fixes. --- indra/newview/llphysicsmotion.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 15797e5ab7..8f747af824 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -420,7 +420,7 @@ F32 LLPhysicsMotion::calculateAcceleration_local(const F32 velocity_local, const F32 time_delta) { // const F32 smoothing = getParamValue("Smoothing"); - static const F32 smoothing = 3.0f; // Removed smoothing param since it's probably not necessary + static const F32 smoothing = 3.0f; // Removed smoothing param since it's probably not necessary const F32 acceleration_local = velocity_local - mVelocityJoint_local; const F32 smoothed_acceleration_local = @@ -584,7 +584,7 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) // Calculate the new acceleration based on the net force. // a = F/m const F32 acceleration_new_local = force_net / behavior_mass; - const F32 max_acceleration = 10.0f; // magic number, used to be customizable. + static const F32 max_acceleration = 10.0f; // magic number, used to be customizable. F32 velocity_new_local = mVelocity_local + acceleration_new_local; velocity_new_local = llclamp(velocity_new_local, -max_acceleration, max_acceleration); -- cgit v1.2.3 From 01c236df47c2bc48af26e96d2a7bde8d32cf3514 Mon Sep 17 00:00:00 2001 From: Seraph Linden <none@none> Date: Sun, 3 Apr 2011 18:09:38 -0400 Subject: Fix for butt gravity direction. Added more displacement range for butt leftright. --- indra/newview/llphysicsmotion.cpp | 22 +++++++++++----------- indra/newview/llpolymesh.cpp | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 8f747af824..eab66749d0 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -346,7 +346,7 @@ LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter "", "mPelvis", character, - LLVector3(0,1,0), + LLVector3(0,-1,0), controller); if (!motion->initialize()) { @@ -420,7 +420,7 @@ F32 LLPhysicsMotion::calculateAcceleration_local(const F32 velocity_local, const F32 time_delta) { // const F32 smoothing = getParamValue("Smoothing"); - static const F32 smoothing = 3.0f; // Removed smoothing param since it's probably not necessary + static const F32 smoothing = 3.0f; // Removed smoothing param since it's probably not necessary const F32 acceleration_local = velocity_local - mVelocityJoint_local; const F32 smoothed_acceleration_local = @@ -624,15 +624,15 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) llassert_always(driver_param); if (driver_param) { - // If this is one of our "hidden" driver params, then make sure it's - // the default value. - if ((driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) && - (driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT)) - { - mCharacter->setVisualParamWeight(driver_param, - 0, - FALSE); - } + // If this is one of our "hidden" driver params, then make sure it's + // the default value. + if ((driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) && + (driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT)) + { + mCharacter->setVisualParamWeight(driver_param, + 0, + FALSE); + } for (LLDriverParam::entry_list_t::iterator iter = driver_param->mDriven.begin(); iter != driver_param->mDriven.end(); ++iter) diff --git a/indra/newview/llpolymesh.cpp b/indra/newview/llpolymesh.cpp index 7a2ecffb34..f0910d404a 100644 --- a/indra/newview/llpolymesh.cpp +++ b/indra/newview/llpolymesh.cpp @@ -647,7 +647,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const std::string& fileName ) if (!strcmp(morphName, "Small_Butt")) { mMorphData.insert(clone_morph_param(morph_data, - LLVector3(0,0.02f,0), + LLVector3(0,0.03f,0), "Butt_Physics_LeftRight_Driven")); } } -- cgit v1.2.3 From 62ebe50a561694d2072dcf4db27119303c686bb8 Mon Sep 17 00:00:00 2001 From: Seraph Linden <none@none> Date: Sun, 3 Apr 2011 21:16:34 -0400 Subject: Added duplicate morph to handle breast bounce/clap. Took out unused params in llphysicsmotion.cpp. --- indra/newview/character/avatar_lad.xml | 78 +++++++++++++++------ indra/newview/llphysicsmotion.cpp | 96 +++++++++----------------- indra/newview/llpolymesh.cpp | 69 ++++++++++++------ indra/newview/skins/default/xui/en/strings.xml | 4 +- 4 files changed, 136 insertions(+), 111 deletions(-) diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index f8229ec465..d0158cf9f8 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -4042,6 +4042,25 @@ </param_morph> </param> + <param + id="507" + group="0" + sex="female" + name="Breast_Gravity" + label="Breast Buoyancy" + wearable="shape" + edit_group="shape_torso" + edit_group_order="7" + label_min="Less Gravity" + label_max="More Gravity" + value_default="0" + value_min="-1.5" + value_max="2" + camera_elevation=".3" + camera_distance=".8"> + <param_morph /> + </param> + <param id="628" group="1" @@ -4092,6 +4111,25 @@ </param_morph> </param> + <param + id="684" + group="0" + sex="female" + name="Breast_Female_Cleavage" + label="Breast Cleavage" + wearable="shape" + edit_group="shape_torso" + edit_group_order="8" + label_min="Separate" + label_max="Join" + value_default="0" + value_min="-.3" + value_max="1.3" + camera_elevation=".3" + camera_distance=".8"> + <param_morph /> + </param> + <param id="685" group="0" @@ -4297,11 +4335,11 @@ id="1200" group="1" sex="female" - name="Breast_Gravity" + name="Breast_Physics_UpDown_Driven" wearable="shape" edit_group="driven" value_default="0" - value_min="-1.5" + value_min="-2" value_max="2"> <param_morph /> </param> @@ -4310,12 +4348,12 @@ id="1201" group="1" sex="female" - name="Breast_Female_Cleavage" + name="Breast_Physics_InOut_Driven" wearable="shape" edit_group="driven" value_default="0" - value_min="-.3" - value_max="1.3"> + value_min="-1" + value_max="1"> <param_morph /> </param> @@ -11719,19 +11757,15 @@ render_pass="bump"> <!-- ==PHYSICS PARAMETERS======================================= --> <param - id="507" - group="0" + id="1100" + group="1" sex="female" + wearable="physics" name="Breast_Physics_UpDown_Controller" label="Breast Physics UpDown Controller" - wearable="shape" - edit_group="shape_torso" - edit_group_order="7" - value_default="0" - value_min="-1.5" - value_max="2" - camera_elevation=".3" - camera_distance=".8"> + value_min="-1" + value_max="1" + value_default="0"> <param_driver> <driven id="1200" /> @@ -11739,17 +11773,15 @@ render_pass="bump"> </param> <param - id="684" - group="0" + id="1101" + group="1" sex="female" + wearable="physics" name="Breast_Physics_InOut_Controller" label="Breast Physics InOut Controller" - wearable="shape" - edit_group="shape_torso" - edit_group_order="8" - value_default="0" - value_min="-.3" - value_max="1.3"> + value_min="-1" + value_max="1" + value_default="0"> <param_driver> <driven id="1201" /> diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index eab66749d0..acf8973f03 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -72,17 +72,7 @@ class LLPhysicsMotion { public: /* - param_user_name: The param (if any) that the user sees and controls. This is what - the particular property would look like without physics. For example, it may be - the breast gravity. This param's value should will not be altered, and is only - used as a reference point for the rest position of the body party. This is usually - a driver param and the param(s) that physics is altering are the driven params. - - param_driven_name: The param whose value is actually set by the physics. If you - leave this blank (which should suffice normally), the physics will assume that - param_user_name is a driver param and will set the params that the driver is - in charge of (i.e. the "driven" params). - + param_driver_name: The param that controls the params that are being affected by the physics. joint_name: The joint that the body part is attached to. The joint is used to determine the orientation (rotation) of the body part. @@ -95,19 +85,15 @@ public: controllers: The various settings (e.g. spring force, mass) that determine how the body part behaves. */ - LLPhysicsMotion(const std::string ¶m_user_name, - const std::string ¶m_driven_name, + LLPhysicsMotion(const std::string ¶m_driver_name, const std::string &joint_name, LLCharacter *character, const LLVector3 &motion_direction_vec, const controller_map_t &controllers) : - mParamUserName(param_user_name), - mParamDrivenName(param_driven_name), + mParamDriverName(param_driver_name), mJointName(joint_name), mMotionDirectionVec(motion_direction_vec), - mParamUser(NULL), - mParamDriven(NULL), - + mParamDriver(NULL), mParamControllers(controllers), mCharacter(character), mLastTime(0), @@ -147,8 +133,8 @@ protected: F32 calculateAcceleration_local(F32 velocity_local, const F32 time_delta); private: - const std::string mParamDrivenName; - const std::string mParamUserName; + const std::string mParamDriverName; + const std::string mParamControllerName; const LLVector3 mMotionDirectionVec; const std::string mJointName; @@ -160,8 +146,7 @@ private: F32 mPositionLastUpdate_local; LLVector3 mPosition_world; - LLViewerVisualParam *mParamUser; - LLViewerVisualParam *mParamDriven; + LLViewerVisualParam *mParamDriver; const controller_map_t mParamControllers; LLPointer<LLJointState> mJointState; @@ -193,12 +178,10 @@ BOOL LLPhysicsMotion::initialize() return FALSE; mJointState->setUsage(LLJointState::ROT); - mParamUser = (LLViewerVisualParam*)mCharacter->getVisualParam(mParamUserName.c_str()); - if (mParamDrivenName != "") - mParamDriven = (LLViewerVisualParam*)mCharacter->getVisualParam(mParamDrivenName.c_str()); - if (mParamUser == NULL) + mParamDriver = (LLViewerVisualParam*)mCharacter->getVisualParam(mParamDriverName.c_str()); + if (mParamDriver == NULL) { - llinfos << "Failure reading in [ " << mParamUserName << " ]" << llendl; + llinfos << "Failure reading in [ " << mParamDriverName << " ]" << llendl; return FALSE; } @@ -248,7 +231,6 @@ LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter controller["Spring"] = "Breast_Physics_InOut_Spring"; controller["Gain"] = "Breast_Physics_InOut_Gain"; LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_InOut_Controller", - "", "mChest", character, LLVector3(-1,0,0), @@ -272,7 +254,6 @@ LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter controller["Spring"] = "Breast_Physics_UpDown_Spring"; controller["Gain"] = "Breast_Physics_UpDown_Gain"; LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_UpDown_Controller", - "", "mChest", character, LLVector3(0,0,1), @@ -296,7 +277,6 @@ LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter controller["Spring"] = "Breast_Physics_LeftRight_Spring"; controller["Gain"] = "Breast_Physics_LeftRight_Gain"; LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_LeftRight_Controller", - "", "mChest", character, LLVector3(0,-1,0), @@ -319,7 +299,6 @@ LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter controller["Spring"] = "Butt_Physics_UpDown_Spring"; controller["Gain"] = "Butt_Physics_UpDown_Gain"; LLPhysicsMotion *motion = new LLPhysicsMotion("Butt_Physics_UpDown_Controller", - "", "mPelvis", character, LLVector3(0,0,-1), @@ -343,7 +322,6 @@ LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter controller["Spring"] = "Butt_Physics_LeftRight_Spring"; controller["Gain"] = "Butt_Physics_LeftRight_Gain"; LLPhysicsMotion *motion = new LLPhysicsMotion("Butt_Physics_LeftRight_Controller", - "", "mPelvis", character, LLVector3(0,-1,0), @@ -367,7 +345,6 @@ LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter controller["Spring"] = "Belly_Physics_UpDown_Spring"; controller["Gain"] = "Belly_Physics_UpDown_Gain"; LLPhysicsMotion *motion = new LLPhysicsMotion("Belly_Physics_UpDown_Controller", - "", "mPelvis", character, LLVector3(0,0,-1), @@ -459,7 +436,7 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) { // static FILE *mFileWrite = fopen("c:\\temp\\avatar_data.txt","w"); - if (!mParamUser) + if (!mParamDriver) return FALSE; if (!mLastTime) @@ -513,8 +490,8 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) // We have to use normalized values because there may be more than one driven param, // and each of these driven params may have its own range. // This means we'll do all our calculations in normalized [0,1] local coordinates. - F32 position_user_local = mParamUser->getWeight(); - position_user_local = (position_user_local - mParamUser->getMinWeight()) / (mParamUser->getMaxWeight() - mParamUser->getMinWeight()); + F32 position_user_local = mParamDriver->getWeight(); + position_user_local = (position_user_local - mParamDriver->getMinWeight()) / (mParamDriver->getMaxWeight() - mParamDriver->getMinWeight()); // If the effect is turned off then don't process unless we need one more update // to set the position to the default (i.e. user) position. @@ -610,37 +587,26 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) min_val, max_val); - // Set the new param. - // If a specific param has been declared, then set that one. - // Otherwise, assume that the param is a driver param, and - // set the params that it drives. - if (mParamDriven) + LLDriverParam *driver_param = dynamic_cast<LLDriverParam *>(mParamDriver); + llassert_always(driver_param); + if (driver_param) { - setParamValue(mParamDriven,position_new_local_clamped); - } - else - { - LLDriverParam *driver_param = dynamic_cast<LLDriverParam *>(mParamUser); - llassert_always(driver_param); - if (driver_param) + // If this is one of our "hidden" driver params, then make sure it's + // the default value. + if ((driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) && + (driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT)) + { + mCharacter->setVisualParamWeight(driver_param, + 0, + FALSE); + } + for (LLDriverParam::entry_list_t::iterator iter = driver_param->mDriven.begin(); + iter != driver_param->mDriven.end(); + ++iter) { - // If this is one of our "hidden" driver params, then make sure it's - // the default value. - if ((driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) && - (driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT)) - { - mCharacter->setVisualParamWeight(driver_param, - 0, - FALSE); - } - for (LLDriverParam::entry_list_t::iterator iter = driver_param->mDriven.begin(); - iter != driver_param->mDriven.end(); - ++iter) - { - LLDrivenEntry &entry = (*iter); - LLViewerVisualParam *driven_param = entry.mParam; - setParamValue(driven_param,position_new_local_clamped); - } + LLDrivenEntry &entry = (*iter); + LLViewerVisualParam *driven_param = entry.mParam; + setParamValue(driven_param,position_new_local_clamped); } } diff --git a/indra/newview/llpolymesh.cpp b/indra/newview/llpolymesh.cpp index f0910d404a..bacaa0cd76 100644 --- a/indra/newview/llpolymesh.cpp +++ b/indra/newview/llpolymesh.cpp @@ -46,9 +46,11 @@ extern LLControlGroup gSavedSettings; // read only -LLPolyMorphData *clone_morph_param(const LLPolyMorphData *src_data, - const LLVector3 &direction, - const std::string &name); +LLPolyMorphData *clone_morph_param_duplicate(const LLPolyMorphData *src_data, + const std::string &name); +LLPolyMorphData *clone_morph_param_direction(const LLPolyMorphData *src_data, + const LLVector3 &direction, + const std::string &name); LLPolyMorphData *clone_morph_param_cleavage(const LLPolyMorphData *src_data, F32 scale, const std::string &name); @@ -617,38 +619,49 @@ BOOL LLPolyMeshSharedData::loadMesh( const std::string& fileName ) "Breast_Physics_LeftRight_Driven")); } + if (!strcmp(morphName, "Breast_Female_Cleavage")) + { + mMorphData.insert(clone_morph_param_duplicate(morph_data, + "Breast_Physics_InOut_Driven")); + } + if (!strcmp(morphName, "Breast_Gravity")) + { + mMorphData.insert(clone_morph_param_duplicate(morph_data, + "Breast_Physics_UpDown_Driven")); + } + if (!strcmp(morphName, "Big_Belly_Torso")) { - mMorphData.insert(clone_morph_param(morph_data, - LLVector3(0,0,0.05f), - "Belly_Physics_Torso_UpDown_Driven")); + mMorphData.insert(clone_morph_param_direction(morph_data, + LLVector3(0,0,0.05f), + "Belly_Physics_Torso_UpDown_Driven")); } if (!strcmp(morphName, "Big_Belly_Legs")) { - mMorphData.insert(clone_morph_param(morph_data, - LLVector3(0,0,0.05f), - "Belly_Physics_Legs_UpDown_Driven")); + mMorphData.insert(clone_morph_param_direction(morph_data, + LLVector3(0,0,0.05f), + "Belly_Physics_Legs_UpDown_Driven")); } if (!strcmp(morphName, "skirt_belly")) { - mMorphData.insert(clone_morph_param(morph_data, - LLVector3(0,0,0.05f), - "Belly_Physics_Skirt_UpDown_Driven")); + mMorphData.insert(clone_morph_param_direction(morph_data, + LLVector3(0,0,0.05f), + "Belly_Physics_Skirt_UpDown_Driven")); } if (!strcmp(morphName, "Small_Butt")) { - mMorphData.insert(clone_morph_param(morph_data, - LLVector3(0,0,0.05f), - "Butt_Physics_UpDown_Driven")); + mMorphData.insert(clone_morph_param_direction(morph_data, + LLVector3(0,0,0.05f), + "Butt_Physics_UpDown_Driven")); } if (!strcmp(morphName, "Small_Butt")) { - mMorphData.insert(clone_morph_param(morph_data, - LLVector3(0,0.03f,0), - "Butt_Physics_LeftRight_Driven")); + mMorphData.insert(clone_morph_param_direction(morph_data, + LLVector3(0,0.03f,0), + "Butt_Physics_LeftRight_Driven")); } } @@ -1207,9 +1220,23 @@ void LLPolySkeletalDistortion::apply( ESex avatar_sex ) } -LLPolyMorphData *clone_morph_param(const LLPolyMorphData *src_data, - const LLVector3 &direction, - const std::string &name) +LLPolyMorphData *clone_morph_param_duplicate(const LLPolyMorphData *src_data, + const std::string &name) +{ + LLPolyMorphData* cloned_morph_data = new LLPolyMorphData(*src_data); + cloned_morph_data->mName = name; + for (U32 v=0; v < cloned_morph_data->mNumIndices; v++) + { + cloned_morph_data->mCoords[v] = src_data->mCoords[v]; + cloned_morph_data->mNormals[v] = src_data->mNormals[v]; + cloned_morph_data->mBinormals[v] = src_data->mBinormals[v]; + } + return cloned_morph_data; +} + +LLPolyMorphData *clone_morph_param_direction(const LLPolyMorphData *src_data, + const LLVector3 &direction, + const std::string &name) { LLPolyMorphData* cloned_morph_data = new LLPolyMorphData(*src_data); cloned_morph_data->mName = name; diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 548d49308f..3b59642bfb 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2500,8 +2500,8 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="Body Thin">Body Thin</string> <string name="Bow Legged">Bow Legged</string> -<string name="Breast Physics UpDown Controller">Breast Buoyancy</string> -<string name="Breast Physics InOut Controller">Breast Cleavage</string> +<string name="Breast Buoyancy">Breast Buoyancy</string> +<string name="Breast Cleavage">Breast Cleavage</string> <string name="Breast Size">Breast Size</string> <string name="Bridge Width">Bridge Width</string> <string name="Broad">Broad</string> -- cgit v1.2.3 From 3d25b9adb50a5ed146121202fd0f25861b31b9ec Mon Sep 17 00:00:00 2001 From: Seraph Linden <none@none> Date: Sun, 3 Apr 2011 22:10:41 -0400 Subject: Fixed issue where changes in physics params were not being transmitted to other avatars. Fixed issue where left/right was appearing in non-female edit physics. --- indra/newview/character/avatar_lad.xml | 4 ++++ indra/newview/llvoavatarself.cpp | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index d0158cf9f8..85899603ee 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -12224,6 +12224,7 @@ render_pass="bump"> <param id="10029" group="0" + sex="female" name="Breast_Physics_LeftRight_Max_Effect" label="Breast Physics LeftRight Max Effect" wearable="physics" @@ -12236,6 +12237,7 @@ render_pass="bump"> <param id="10030" group="0" + sex="female" name="Breast_Physics_LeftRight_Spring" label="Breast Physics LeftRight Spring" wearable="physics" @@ -12248,6 +12250,7 @@ render_pass="bump"> <param id="10031" group="0" + sex="female" name="Breast_Physics_LeftRight_Gain" label="Breast Physics LeftRight Gain" wearable="physics" @@ -12260,6 +12263,7 @@ render_pass="bump"> <param id="10032" group="0" + sex="female" name="Breast_Physics_LeftRight_Damping" label="Breast Physics LeftRight Damping" wearable="physics" diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 5f9e343907..799ed433d7 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -1017,6 +1017,13 @@ void LLVOAvatarSelf::wearableUpdated( LLWearableType::EType type, BOOL upload_re } } } + + // Physics type has no associated baked textures, but change of params needs to be sent to + // other avatars. + if (type == LLWearableType::WT_PHYSICS) + { + gAgent.sendAgentSetAppearance(); + } } //----------------------------------------------------------------------------- -- cgit v1.2.3 From a00d9994db3195bfe89bc09c6b75f8e3aec35c56 Mon Sep 17 00:00:00 2001 From: Seraph Linden <none@none> Date: Sun, 3 Apr 2011 23:24:46 -0400 Subject: New physics icon --- .../skins/default/textures/icons/Inv_Physics.png | Bin 616 -> 539 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/indra/newview/skins/default/textures/icons/Inv_Physics.png b/indra/newview/skins/default/textures/icons/Inv_Physics.png index ddd36b446b..360baec46d 100644 Binary files a/indra/newview/skins/default/textures/icons/Inv_Physics.png and b/indra/newview/skins/default/textures/icons/Inv_Physics.png differ -- cgit v1.2.3 From 56caf8b643787832aa92770821b6d52e07b72719 Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Mon, 4 Apr 2011 07:56:00 -0400 Subject: Added tag 2.6.3-start for changeset ec32f1045e7c --- .hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/.hgtags b/.hgtags index 67a66dfa88..a8cae0056d 100644 --- a/.hgtags +++ b/.hgtags @@ -94,3 +94,4 @@ c5bdef3aaa2744626aef3c217ce29e1900d357b3 2.6.1-beta1 d1203046bb653b763f835b04d184646949d8dd5c DRTVWR-45_2.6.2-beta1 d1203046bb653b763f835b04d184646949d8dd5c 2.6.2-beta1 52b2263ab28f0976c689fd0b76c55a9eb027cdbf end-of-develop.py +ec32f1045e7c2644015245df3a9933620aa194b8 2.6.3-start -- cgit v1.2.3 From 3c6a09372da395a621fb35db4934af2c7c21e910 Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Mon, 4 Apr 2011 07:56:56 -0400 Subject: increment viewer version to 2.6.4 --- indra/llcommon/llversionviewer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h index 488ec5b239..ae2bd0d78b 100644 --- a/indra/llcommon/llversionviewer.h +++ b/indra/llcommon/llversionviewer.h @@ -29,7 +29,7 @@ const S32 LL_VERSION_MAJOR = 2; const S32 LL_VERSION_MINOR = 6; -const S32 LL_VERSION_PATCH = 3; +const S32 LL_VERSION_PATCH = 4; const S32 LL_VERSION_BUILD = 0; const char * const LL_CHANNEL = "Second Life Developer"; -- cgit v1.2.3 From ca186a64014942540baaf280bb3967d2582336bd Mon Sep 17 00:00:00 2001 From: Ricky Curtice <kf6kjg+hg@gmail.com> Date: Mon, 4 Apr 2011 10:24:43 -0700 Subject: Parenthisized a #define to make it safer, adjusted some notes (and added a TODO) around some extremely obscure code that needs further attention but which is outside this scope. --- doc/contributions.txt | 2 +- indra/llmath/tests/llbbox_test.cpp | 2 +- indra/newview/llselectmgr.cpp | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/doc/contributions.txt b/doc/contributions.txt index 9ba155eece..ae10957b24 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -237,7 +237,7 @@ Coaldust Numbers VWR-1095 Cron Stardust VWR-10579 - VWR-25126 + STORM-1075 Cypren Christenson STORM-417 Dale Glass diff --git a/indra/llmath/tests/llbbox_test.cpp b/indra/llmath/tests/llbbox_test.cpp index b9e1d29cd7..fd0dbb58fc 100644 --- a/indra/llmath/tests/llbbox_test.cpp +++ b/indra/llmath/tests/llbbox_test.cpp @@ -34,7 +34,7 @@ #define ANGLE (3.14159265f / 2.0f) -#define APPROX_EQUAL(a, b) dist_vec_squared((a),(b)) < 1e-10 +#define APPROX_EQUAL(a, b) (dist_vec_squared((a),(b)) < 1e-10) namespace tut { diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 262c9a4515..2c5073d027 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -6589,11 +6589,11 @@ bool LLSelectMgr::selectionMove(const LLVector3& displ, // note the use of fsqrtf, this was used in the definition of dist_vec() and is therefore re-used here F32 min_dist = fsqrtf(min_dist_squared); - // factor the distance inside the displacement vector. This will get us + // factor the distance into the displacement vector. This will get us // equally visible movements for both close and far away selections. - F32 min_dist_factored = sqrt(min_dist) / 2; - displ_global.setVec(displ.mV[0]*min_dist_factored, - displ.mV[1]*min_dist_factored, + F32 min_dist_factored = sqrt(min_dist) / 2; // FIXME: this variable name doesn't state its true meaning. + displ_global.setVec(displ.mV[0]*min_dist_factored, + displ.mV[1]*min_dist_factored, displ.mV[2]*min_dist_factored); // equates to: Displ_global = Displ * M_cam_axes_in_global_frame -- cgit v1.2.3 From 7054aaba6d6f044cd835e79e3be898d63ce96def Mon Sep 17 00:00:00 2001 From: "Andrew A. de Laix" <alain@lindenlab.com> Date: Mon, 4 Apr 2011 10:57:13 -0700 Subject: use private locations for fmod and kdu. --- autobuild.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 4951be63bc..a31d280b6f 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -404,7 +404,7 @@ <key>hash</key> <string>61ead113e6479452e6b690c84b4e9d30</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/fmod-3.75-darwin-20110222.tar.bz2</string> + <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-fmod-private/rev/221852/arch/Darwin/installer/fmod-3.75-darwin-20110222.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -416,7 +416,7 @@ <key>hash</key> <string>0c61d643db54d2e5999be8254569d8b3</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/fmod-3.75-linux-20110223.tar.bz2</string> + <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-fmod-private/rev/221852/arch/Linux/installer/fmod-3.75-linux-20110223.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -428,7 +428,7 @@ <key>hash</key> <string>d9a9a6ad86895353bcd63374a4c1a91d</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/fmod-3.75-windows-20110222.tar.bz2</string> + <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-fmod-private/rev/221852/arch/CYGWIN/installer/fmod-3.75-windows-20110222.tar.bz2</string> </map> <key>name</key> <string>windows</string> @@ -920,7 +920,7 @@ <key>hash</key> <string>d91e1f483209cd3eba04135c6a59e829</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/kdu-6.4.1-darwin-20110218.tar.bz2</string> + <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-kdu-private/rev/221672/arch/Darwin/installer/kdu-6.4.1-darwin-20110218.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -932,7 +932,7 @@ <key>hash</key> <string>fbf8a4f78dff986d7c16b3a0437e033e</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/kdu-6.4.1-linux-20110311.tar.bz2</string> + <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-kdu-private/rev/223538/arch/Linux/installer/kdu-6.4.1-linux-20110311.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -944,7 +944,7 @@ <key>hash</key> <string>6cd9f36465ef73a3df34bf2b3bba2ced</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/kdu-6.4.1-windows-20110218.tar.bz2</string> + <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-kdu-private/rev/221672/arch/CYGWIN/installer/kdu-6.4.1-windows-20110218.tar.bz2</string> </map> <key>name</key> <string>windows</string> -- cgit v1.2.3 From 83ec0cd62f70888c90671ea91cd056ecb6095bc1 Mon Sep 17 00:00:00 2001 From: Merov Linden <merov@lindenlab.com> Date: Mon, 4 Apr 2011 18:37:32 -0700 Subject: STORM-746 : add new arguments for precincts and blocks on output, region and level on input, add code for input loading restriction --- .../llimage_libtest/llimage_libtest.cpp | 126 +++++++++++++++++++-- indra/llimage/llimagej2c.cpp | 7 ++ indra/llimage/llimagej2c.h | 2 + indra/llimagej2coj/llimagej2coj.cpp | 5 + indra/llimagej2coj/llimagej2coj.h | 1 + indra/llkdu/llimagej2ckdu.cpp | 38 ++++--- indra/llkdu/llimagej2ckdu.h | 3 +- 7 files changed, 161 insertions(+), 21 deletions(-) diff --git a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp index 365f5f758c..10d6ffb685 100644 --- a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp +++ b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp @@ -53,12 +53,28 @@ static const char USAGE[] = "\n" " -o, --output <file1 .. file2> OR <type>\n" " List of image files to create (assumes same order as for input files)\n" " OR 3 letters file type extension to convert each input file into.\n" +" -r, --region <x0, y0, x1, y1>\n" +" Crop region on the input file in pixel.\n" +" Only used for j2c images. Default is no region cropping.\n" +" -d, --discard_level <n>\n" +" Discard level max used on input. 0 is high resolution. Max discard level is 5.\n" +" This allows the input image to be clamped in resolution when loading.\n" +" Only valid for j2c images. Default is no discard.\n" +" -p, --precincts <n>\n" +" Dimension of precincts in pixels. Precincts are assumed square and identical for\n" +" all levels. Note that this oprion also uses PLT and tile markers, \n" +" as well as RPCL order. Power of 2 must be used.\n" +" Only valid for output j2c images. Default is no precincts used.\n" +" -b, --blocks <n>\n" +" Dimension of coding blocks in pixels. Blocks are assumed square. Power of 2 must\n" +" be used. Blocks must be smaller than precincts.\n" +" Only valid for output j2c images. Default is 64.\n" " -log, --logmetrics <metric>\n" " Log performance data for <metric>. Results in <metric>.slp\n" " Note: so far, only ImageCompressionTester has been tested.\n" -" -r, --analyzeperformance\n" +" -a, --analyzeperformance\n" " Create a report comparing <metric>_baseline.slp with current <metric>.slp\n" -" Results in <metric>_report.csv" +" Results in <metric>_report.csv\n" " -s, --image-stats\n" " Output stats for each input and output image.\n" "\n"; @@ -110,10 +126,11 @@ void output_image_stats(LLPointer<LLImageFormatted> image, const std::string &fi } // Load an image from file and return a raw (decompressed) instance of its data -LLPointer<LLImageRaw> load_image(const std::string &src_filename, bool output_stats) +LLPointer<LLImageRaw> load_image(const std::string &src_filename, bool output_stats, bool use_discard_level, int discard_level, bool use_region, int* region) { LLPointer<LLImageFormatted> image = create_image(src_filename); - + + // This just load the image file stream into a buffer. No decoding done. if (!image->load(src_filename)) { return NULL; @@ -131,6 +148,17 @@ LLPointer<LLImageRaw> load_image(const std::string &src_filename, bool output_st } LLPointer<LLImageRaw> raw_image = new LLImageRaw; + + // Set the image restriction on load in the case of a j2c image + if ((image->getCodec() == IMG_CODEC_J2C) && (use_discard_level || use_region)) + { + int discard = (use_discard_level ? discard_level : -1); + int* reg = (use_region ? region : NULL); + // That method doesn't exist (and likely, doesn't make sense) for any other image file format + // hence the required cryptic cast. + ((LLImageJ2C*)(image.get()))->initDecode(*raw_image, discard, reg); + } + if (!image->decode(raw_image, 0.0f)) { return NULL; @@ -280,8 +308,17 @@ int main(int argc, char** argv) // List of input and output files std::list<std::string> input_filenames; std::list<std::string> output_filenames; + // Other optional parsed arguments bool analyze_performance = false; bool image_stats = false; + bool use_region = false; + int region[4]; + bool use_discard_level = false; + int discard_level = 0; + bool use_precincts = false; + int precincts_size; + bool use_blocks = false; + int blocks_size; // Init whatever is necessary ll_init_apr(); @@ -323,6 +360,81 @@ int main(int argc, char** argv) file_name = argv[arg+1]; // Next argument and loop over } } + else if ((!strcmp(argv[arg], "--region") || !strcmp(argv[arg], "-r")) && arg < argc-1) + { + std::string value_str = argv[arg+1]; + int index = 0; + while (value_str[0] != '-') // if arg starts with '-', it's the next option + { + int value = atoi(value_str.c_str()); + region[index++] = value; + arg += 1; // Definitely skip that arg now we know it's a number + if ((arg + 1) == argc) // Break out of the loop if we reach the end of the arg list + break; + if (index == 4) // Break out of the loop if we captured 4 values already + break; + value_str = argv[arg+1]; // Next argument and loop over + } + if (index == 4) + { + use_region = true; + } + else + { + std::cout << "--region arguments invalid" << std::endl; + } + } + else if (!strcmp(argv[arg], "--discard_level") || !strcmp(argv[arg], "-d")) + { + std::string value_str; + if ((arg + 1) < argc) + { + value_str = argv[arg+1]; + } + if (((arg + 1) >= argc) || (value_str[0] == '-')) + { + std::cout << "No valid --discard_level argument given, discard_level ignored" << std::endl; + } + else + { + use_discard_level = true; + discard_level = atoi(value_str.c_str()); + } + } + else if (!strcmp(argv[arg], "--precincts") || !strcmp(argv[arg], "-p")) + { + std::string value_str; + if ((arg + 1) < argc) + { + value_str = argv[arg+1]; + } + if (((arg + 1) >= argc) || (value_str[0] == '-')) + { + std::cout << "No valid --precincts argument given, precincts ignored" << std::endl; + } + else + { + use_precincts = true; + precincts_size = atoi(value_str.c_str()); + } + } + else if (!strcmp(argv[arg], "--blocks") || !strcmp(argv[arg], "-b")) + { + std::string value_str; + if ((arg + 1) < argc) + { + value_str = argv[arg+1]; + } + if (((arg + 1) >= argc) || (value_str[0] == '-')) + { + std::cout << "No valid --blocks argument given, blocks ignored" << std::endl; + } + else + { + use_blocks = true; + blocks_size = atoi(value_str.c_str()); + } + } else if (!strcmp(argv[arg], "--logmetrics") || !strcmp(argv[arg], "-log")) { // '--logmetrics' needs to be specified with a named test metric argument @@ -346,7 +458,7 @@ int main(int argc, char** argv) break; } } - else if (!strcmp(argv[arg], "--analyzeperformance") || !strcmp(argv[arg], "-r")) + else if (!strcmp(argv[arg], "--analyzeperformance") || !strcmp(argv[arg], "-a")) { analyze_performance = true; } @@ -364,7 +476,7 @@ int main(int argc, char** argv) } if (analyze_performance && !LLFastTimer::sMetricLog) { - std::cout << "Cannot create perf report if no perf gathered (i.e. use argument -log <perf> with -r) -> exit" << std::endl; + std::cout << "Cannot create perf report if no perf gathered (i.e. use argument -log <perf> with -a) -> exit" << std::endl; return 0; } @@ -385,7 +497,7 @@ int main(int argc, char** argv) for (; in_file != in_end; ++in_file) { // Load file - LLPointer<LLImageRaw> raw_image = load_image(*in_file, image_stats); + LLPointer<LLImageRaw> raw_image = load_image(*in_file, image_stats, use_discard_level, discard_level, use_region, region); if (!raw_image) { std::cout << "Error: Image " << *in_file << " could not be loaded" << std::endl; diff --git a/indra/llimage/llimagej2c.cpp b/indra/llimage/llimagej2c.cpp index 80fec7f8a0..6b49f3de88 100644 --- a/indra/llimage/llimagej2c.cpp +++ b/indra/llimage/llimagej2c.cpp @@ -139,6 +139,10 @@ BOOL LLImageJ2C::updateData() return res; } +BOOL LLImageJ2C::initDecode(LLImageRaw &raw_image, int discard_level, int* region) +{ + return mImpl->initDecode(*this,raw_image,discard_level,region); +} BOOL LLImageJ2C::decode(LLImageRaw *raw_imagep, F32 decode_time) { @@ -251,6 +255,9 @@ S32 LLImageJ2C::calcHeaderSizeJ2C() //static S32 LLImageJ2C::calcDataSizeJ2C(S32 w, S32 h, S32 comp, S32 discard_level, F32 rate) { + // Note: this only provides an *estimate* of the size in bytes of an image level + // *TODO: find a way to read the true size (when available) and convey the fact + // that the result is an estimate in the other cases if (rate <= 0.f) rate = .125f; while (discard_level > 0) { diff --git a/indra/llimage/llimagej2c.h b/indra/llimage/llimagej2c.h index dd5bec8b2e..7af1c13921 100644 --- a/indra/llimage/llimagej2c.h +++ b/indra/llimage/llimagej2c.h @@ -56,6 +56,7 @@ public: /*virtual*/ void resetLastError(); /*virtual*/ void setLastError(const std::string& message, const std::string& filename = std::string()); + BOOL initDecode(LLImageRaw &raw_image, int discard_level, int* region); // Encode with comment text BOOL encode(const LLImageRaw *raw_imagep, const char* comment_text, F32 encode_time=0.0); @@ -117,6 +118,7 @@ protected: virtual BOOL decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count) = 0; virtual BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0, BOOL reversible=FALSE) = 0; + virtual BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL) = 0; friend class LLImageJ2C; }; diff --git a/indra/llimagej2coj/llimagej2coj.cpp b/indra/llimagej2coj/llimagej2coj.cpp index 13b12c0928..11c826e41a 100644 --- a/indra/llimagej2coj/llimagej2coj.cpp +++ b/indra/llimagej2coj/llimagej2coj.cpp @@ -107,6 +107,11 @@ LLImageJ2COJ::~LLImageJ2COJ() { } +BOOL LLImageJ2COJ::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level, int* region) +{ + // No specific implementaion for this method in the OpenJpeg case + return FALSE; +} BOOL LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count) { diff --git a/indra/llimagej2coj/llimagej2coj.h b/indra/llimagej2coj/llimagej2coj.h index 9476665ccb..d5f2f7a2d1 100644 --- a/indra/llimagej2coj/llimagej2coj.h +++ b/indra/llimagej2coj/llimagej2coj.h @@ -39,6 +39,7 @@ protected: /*virtual*/ BOOL decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count); /*virtual*/ BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0, BOOL reversible = FALSE); + /*virtual*/ BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL); }; #endif diff --git a/indra/llkdu/llimagej2ckdu.cpp b/indra/llkdu/llimagej2ckdu.cpp index 61b16c80e6..e51cfee6eb 100644 --- a/indra/llkdu/llimagej2ckdu.cpp +++ b/indra/llkdu/llimagej2ckdu.cpp @@ -106,7 +106,11 @@ const char* fallbackEngineInfoLLImageJ2CImpl() class LLKDUDecodeState { public: + LLKDUDecodeState(kdu_tile tile, kdu_byte *buf, S32 row_gap); + ~LLKDUDecodeState(); + BOOL processTileDecode(F32 decode_time, BOOL limit_time = TRUE); +private: S32 mNumComponents; BOOL mUseYCC; kdu_dims mDims; @@ -116,20 +120,10 @@ public: kdu_pull_ifc mEngines[4]; bool mReversible[4]; // Some components may be reversible and others not int mBitDepths[4]; // Original bit-depth may be quite different from 8 - + kdu_tile mTile; kdu_byte *mBuf; S32 mRowGap; - - LLKDUDecodeState(kdu_tile tile, kdu_byte *buf, S32 row_gap); - ~LLKDUDecodeState(); - BOOL processTileDecode(F32 decode_time, BOOL limit_time = TRUE); - -public: - int *AssignLayerBytes(siz_params *siz, int &num_specs); - - void setupCodeStream(BOOL keep_codestream, LLImageJ2CKDU::ECodeStreamMode mode); - BOOL initDecode(LLImageRaw &raw_image, F32 decode_time, LLImageJ2CKDU::ECodeStreamMode mode, S32 first_channel, S32 max_channel_count ); }; void ll_kdu_error( void ) @@ -327,7 +321,12 @@ void LLImageJ2CKDU::cleanupCodeStream() mTileIndicesp = NULL; } -BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, ECodeStreamMode mode, S32 first_channel, S32 max_channel_count ) +BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level, int* region) +{ + return initDecode(base,raw_image,0.0f,MODE_FAST,0,4,discard_level,region); +} + +BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, ECodeStreamMode mode, S32 first_channel, S32 max_channel_count, int discard_level, int* region) { base.resetLastError(); @@ -340,7 +339,20 @@ BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco mRawImagep = &raw_image; mCodeStreamp->change_appearance(false, true, false); - mCodeStreamp->apply_input_restrictions(first_channel,max_channel_count,base.getRawDiscardLevel(),0,NULL); + + // Apply loading discard level and cropping if required + kdu_dims* region_kdu = NULL; + if (region != NULL) + { + region_kdu = new kdu_dims; + region_kdu->pos.x = region[0]; + region_kdu->pos.y = region[1]; + region_kdu->size.x = region[2] - region[0]; + region_kdu->size.y = region[3] - region[1]; + } + int discard = (discard_level != -1 ? discard_level : base.getRawDiscardLevel()); + + mCodeStreamp->apply_input_restrictions( first_channel, max_channel_count, discard, 0, region_kdu); kdu_dims dims; mCodeStreamp->get_dims(0,dims); S32 channels = base.getComponents() - first_channel; diff --git a/indra/llkdu/llimagej2ckdu.h b/indra/llkdu/llimagej2ckdu.h index 5628f69eeb..8231004f2c 100644 --- a/indra/llkdu/llimagej2ckdu.h +++ b/indra/llkdu/llimagej2ckdu.h @@ -58,11 +58,12 @@ protected: /*virtual*/ BOOL decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count); /*virtual*/ BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0, BOOL reversible=FALSE); + /*virtual*/ BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL); private: + BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, ECodeStreamMode mode, S32 first_channel, S32 max_channel_count, int discard_level = -1, int* region = NULL); void setupCodeStream(LLImageJ2C &base, BOOL keep_codestream, ECodeStreamMode mode); void cleanupCodeStream(); - BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, ECodeStreamMode mode, S32 first_channel, S32 max_channel_count ); // Encode variable LLKDUMemSource *mInputp; -- cgit v1.2.3 From e752e918283acf95c1ed33d92a7bf34bbca83071 Mon Sep 17 00:00:00 2001 From: Merov Linden <merov@lindenlab.com> Date: Mon, 4 Apr 2011 23:49:40 -0700 Subject: STORM-746 : add precincts and blocks arguments taken into account in j2c output --- .../llimage_libtest/llimage_libtest.cpp | 50 +++++++++++----------- indra/llimage/llimagej2c.cpp | 5 +++ indra/llimage/llimagej2c.h | 2 + indra/llimagej2coj/llimagej2coj.cpp | 8 +++- indra/llimagej2coj/llimagej2coj.h | 1 + indra/llkdu/llimagej2ckdu.cpp | 34 +++++++++++++-- indra/llkdu/llimagej2ckdu.h | 3 ++ 7 files changed, 74 insertions(+), 29 deletions(-) diff --git a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp index 10d6ffb685..31d3e18877 100644 --- a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp +++ b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp @@ -126,7 +126,7 @@ void output_image_stats(LLPointer<LLImageFormatted> image, const std::string &fi } // Load an image from file and return a raw (decompressed) instance of its data -LLPointer<LLImageRaw> load_image(const std::string &src_filename, bool output_stats, bool use_discard_level, int discard_level, bool use_region, int* region) +LLPointer<LLImageRaw> load_image(const std::string &src_filename, int discard_level, int* region, bool output_stats) { LLPointer<LLImageFormatted> image = create_image(src_filename); @@ -150,13 +150,11 @@ LLPointer<LLImageRaw> load_image(const std::string &src_filename, bool output_st LLPointer<LLImageRaw> raw_image = new LLImageRaw; // Set the image restriction on load in the case of a j2c image - if ((image->getCodec() == IMG_CODEC_J2C) && (use_discard_level || use_region)) + if ((image->getCodec() == IMG_CODEC_J2C) && ((discard_level != -1) || (region != NULL))) { - int discard = (use_discard_level ? discard_level : -1); - int* reg = (use_region ? region : NULL); // That method doesn't exist (and likely, doesn't make sense) for any other image file format // hence the required cryptic cast. - ((LLImageJ2C*)(image.get()))->initDecode(*raw_image, discard, reg); + ((LLImageJ2C*)(image.get()))->initDecode(*raw_image, discard_level, region); } if (!image->decode(raw_image, 0.0f)) @@ -168,10 +166,18 @@ LLPointer<LLImageRaw> load_image(const std::string &src_filename, bool output_st } // Save a raw image instance into a file -bool save_image(const std::string &dest_filename, LLPointer<LLImageRaw> raw_image, bool output_stats) +bool save_image(const std::string &dest_filename, LLPointer<LLImageRaw> raw_image, int blocks_size, int precincts_size, bool output_stats) { LLPointer<LLImageFormatted> image = create_image(dest_filename); + // Set the image restriction on load in the case of a j2c image + if ((image->getCodec() == IMG_CODEC_J2C) && ((blocks_size != -1) || (precincts_size != -1))) + { + // That method doesn't exist (and likely, doesn't make sense) for any other image file format + // hence the required cryptic cast. + ((LLImageJ2C*)(image.get()))->initEncode(*raw_image, blocks_size, precincts_size); + } + if (!image->encode(raw_image, 0.0f)) { return false; @@ -311,14 +317,10 @@ int main(int argc, char** argv) // Other optional parsed arguments bool analyze_performance = false; bool image_stats = false; - bool use_region = false; - int region[4]; - bool use_discard_level = false; - int discard_level = 0; - bool use_precincts = false; - int precincts_size; - bool use_blocks = false; - int blocks_size; + int* region = NULL; + int discard_level = -1; + int precincts_size = -1; + int blocks_size = -1; // Init whatever is necessary ll_init_apr(); @@ -364,6 +366,7 @@ int main(int argc, char** argv) { std::string value_str = argv[arg+1]; int index = 0; + region = new int[4]; while (value_str[0] != '-') // if arg starts with '-', it's the next option { int value = atoi(value_str.c_str()); @@ -375,13 +378,11 @@ int main(int argc, char** argv) break; value_str = argv[arg+1]; // Next argument and loop over } - if (index == 4) - { - use_region = true; - } - else + if (index != 4) { std::cout << "--region arguments invalid" << std::endl; + delete [] region; + region = NULL; } } else if (!strcmp(argv[arg], "--discard_level") || !strcmp(argv[arg], "-d")) @@ -397,8 +398,9 @@ int main(int argc, char** argv) } else { - use_discard_level = true; discard_level = atoi(value_str.c_str()); + // Clamp to the values accepted by the viewer + discard_level = llclamp(discard_level,0,5); } } else if (!strcmp(argv[arg], "--precincts") || !strcmp(argv[arg], "-p")) @@ -414,8 +416,8 @@ int main(int argc, char** argv) } else { - use_precincts = true; precincts_size = atoi(value_str.c_str()); + // *TODO: make sure precincts_size is a power of 2 } } else if (!strcmp(argv[arg], "--blocks") || !strcmp(argv[arg], "-b")) @@ -431,8 +433,8 @@ int main(int argc, char** argv) } else { - use_blocks = true; blocks_size = atoi(value_str.c_str()); + // *TODO: make sure blocks_size is a power of 2 } } else if (!strcmp(argv[arg], "--logmetrics") || !strcmp(argv[arg], "-log")) @@ -497,7 +499,7 @@ int main(int argc, char** argv) for (; in_file != in_end; ++in_file) { // Load file - LLPointer<LLImageRaw> raw_image = load_image(*in_file, image_stats, use_discard_level, discard_level, use_region, region); + LLPointer<LLImageRaw> raw_image = load_image(*in_file, discard_level, region, image_stats); if (!raw_image) { std::cout << "Error: Image " << *in_file << " could not be loaded" << std::endl; @@ -507,7 +509,7 @@ int main(int argc, char** argv) // Save file if (out_file != out_end) { - if (!save_image(*out_file, raw_image, image_stats)) + if (!save_image(*out_file, raw_image, blocks_size, precincts_size, image_stats)) { std::cout << "Error: Image " << *out_file << " could not be saved" << std::endl; } diff --git a/indra/llimage/llimagej2c.cpp b/indra/llimage/llimagej2c.cpp index 6b49f3de88..a90df0f1c1 100644 --- a/indra/llimage/llimagej2c.cpp +++ b/indra/llimage/llimagej2c.cpp @@ -144,6 +144,11 @@ BOOL LLImageJ2C::initDecode(LLImageRaw &raw_image, int discard_level, int* regio return mImpl->initDecode(*this,raw_image,discard_level,region); } +BOOL LLImageJ2C::initEncode(LLImageRaw &raw_image, int blocks_size, int precincts_size) +{ + return mImpl->initEncode(*this,raw_image,blocks_size,precincts_size); +} + BOOL LLImageJ2C::decode(LLImageRaw *raw_imagep, F32 decode_time) { return decodeChannels(raw_imagep, decode_time, 0, 4); diff --git a/indra/llimage/llimagej2c.h b/indra/llimage/llimagej2c.h index 7af1c13921..6bba81aab5 100644 --- a/indra/llimage/llimagej2c.h +++ b/indra/llimage/llimagej2c.h @@ -57,6 +57,7 @@ public: /*virtual*/ void setLastError(const std::string& message, const std::string& filename = std::string()); BOOL initDecode(LLImageRaw &raw_image, int discard_level, int* region); + BOOL initEncode(LLImageRaw &raw_image, int blocks_size, int precincts_size); // Encode with comment text BOOL encode(const LLImageRaw *raw_imagep, const char* comment_text, F32 encode_time=0.0); @@ -119,6 +120,7 @@ protected: virtual BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0, BOOL reversible=FALSE) = 0; virtual BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL) = 0; + virtual BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1) = 0; friend class LLImageJ2C; }; diff --git a/indra/llimagej2coj/llimagej2coj.cpp b/indra/llimagej2coj/llimagej2coj.cpp index 11c826e41a..8288fa1f5c 100644 --- a/indra/llimagej2coj/llimagej2coj.cpp +++ b/indra/llimagej2coj/llimagej2coj.cpp @@ -109,7 +109,13 @@ LLImageJ2COJ::~LLImageJ2COJ() BOOL LLImageJ2COJ::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level, int* region) { - // No specific implementaion for this method in the OpenJpeg case + // No specific implementation for this method in the OpenJpeg case + return FALSE; +} + +BOOL LLImageJ2COJ::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size, int precincts_size) +{ + // No specific implementation for this method in the OpenJpeg case return FALSE; } diff --git a/indra/llimagej2coj/llimagej2coj.h b/indra/llimagej2coj/llimagej2coj.h index d5f2f7a2d1..9c7cc09fcb 100644 --- a/indra/llimagej2coj/llimagej2coj.h +++ b/indra/llimagej2coj/llimagej2coj.h @@ -40,6 +40,7 @@ protected: /*virtual*/ BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0, BOOL reversible = FALSE); /*virtual*/ BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL); + /*virtual*/ BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1); }; #endif diff --git a/indra/llkdu/llimagej2ckdu.cpp b/indra/llkdu/llimagej2ckdu.cpp index e51cfee6eb..8d2ed8f8c4 100644 --- a/indra/llkdu/llimagej2ckdu.cpp +++ b/indra/llkdu/llimagej2ckdu.cpp @@ -190,7 +190,9 @@ mCodeStreamp(NULL), mTPosp(NULL), mTileIndicesp(NULL), mRawImagep(NULL), -mDecodeState(NULL) +mDecodeState(NULL), +mBlocksSize(-1), +mPrecinctsSize(-1) { } @@ -326,6 +328,13 @@ BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int disc return initDecode(base,raw_image,0.0f,MODE_FAST,0,4,discard_level,region); } +BOOL LLImageJ2CKDU::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size, int precincts_size) +{ + mBlocksSize = blocks_size; + mPrecinctsSize = precincts_size; + return TRUE; +} + BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, ECodeStreamMode mode, S32 first_channel, S32 max_channel_count, int discard_level, int* region) { base.resetLastError(); @@ -623,9 +632,26 @@ BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, co } } - // *TODO : Add precinct specification here - //std::string precincts_string = llformat("Cprecincts={128,128}"); - //codestream.access_siz()->parse_string(precincts_string.c_str()); + // Set up data ordering, markers, etc... if precincts or blocks specified + if ((mBlocksSize != -1) || (mPrecinctsSize != -1)) + { + if (mPrecinctsSize != -1) + { + std::string precincts_string = llformat("Cprecincts={%d,%d}",mPrecinctsSize,mPrecinctsSize); + codestream.access_siz()->parse_string(precincts_string.c_str()); + } + if (mBlocksSize != -1) + { + std::string blocks_string = llformat("Cblk={%d,%d}",mBlocksSize,mBlocksSize); + codestream.access_siz()->parse_string(blocks_string.c_str()); + } + std::string ordering_string = llformat("Corder=RPCL"); + codestream.access_siz()->parse_string(ordering_string.c_str()); + std::string PLT_string = llformat("ORGgen_plt=yes"); + codestream.access_siz()->parse_string(PLT_string.c_str()); + std::string Parts_string = llformat("ORGtparts=R"); + codestream.access_siz()->parse_string(Parts_string.c_str()); + } codestream.access_siz()->finalize_all(); codestream.change_appearance(transpose,vflip,hflip); diff --git a/indra/llkdu/llimagej2ckdu.h b/indra/llkdu/llimagej2ckdu.h index 8231004f2c..9fce58b762 100644 --- a/indra/llkdu/llimagej2ckdu.h +++ b/indra/llkdu/llimagej2ckdu.h @@ -59,6 +59,7 @@ protected: /*virtual*/ BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0, BOOL reversible=FALSE); /*virtual*/ BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL); + /*virtual*/ BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1); private: BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, ECodeStreamMode mode, S32 first_channel, S32 max_channel_count, int discard_level = -1, int* region = NULL); @@ -70,6 +71,8 @@ private: kdu_codestream *mCodeStreamp; kdu_coords *mTPosp; // tile position kdu_dims *mTileIndicesp; + int mBlocksSize; + int mPrecinctsSize; // Temporary variables for in-progress decodes... LLImageRaw *mRawImagep; -- cgit v1.2.3 From 3c5dc8b9d3a71d2fdcaee83858c7a02a2813f892 Mon Sep 17 00:00:00 2001 From: Wolfpup Lowenhar <wolfpup67@earthlink.net> Date: Tue, 5 Apr 2011 12:37:03 -0400 Subject: STORM-1098 : Made change to debug setting description for ShowNetStatus --- doc/contributions.txt | 1 + indra/newview/app_settings/settings.xml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/contributions.txt b/doc/contributions.txt index 71c54e8624..82f7407c5c 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -864,6 +864,7 @@ WolfPup Lowenhar STORM-674 STORM-776 STORM-825 + STORM-1098 VWR-20741 VWR-20933 Zai Lynch diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index dd85c5cb86..490558337b 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -9557,7 +9557,7 @@ <key>ShowNetStats</key> <map> <key>Comment</key> - <string>Show the Search Bar in the Status Overlay</string> + <string>Show the Status Indicators for the Viewer and Network Usage in the Status Overlay</string> <key>Persist</key> <integer>1</integer> <key>Type</key> -- cgit v1.2.3 From 84df608ade855c9ee4e76b78a8345b7f7ad08db3 Mon Sep 17 00:00:00 2001 From: "Nyx (Neal Orman)" <nyx@lindenlab.com> Date: Tue, 5 Apr 2011 14:11:28 -0400 Subject: initial pass at adding new mesh libraries to autobuild. Needs a license review and some other fixes, but autobuild configure completes successfully. --- autobuild.xml | 372 ++++++++++++++++++++++++++++++-------- indra/cmake/GooglePerfTools.cmake | 2 +- indra/newview/CMakeLists.txt | 1 - 3 files changed, 295 insertions(+), 80 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 4951be63bc..ec5d7d51ac 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -51,6 +51,54 @@ </map> </map> </map> + <key>GLOD</key> + <map> + <key>license</key> + <string>GLOD</string> + <key>license_file</key> + <string>LICENSES/glod.txt</string> + <key>name</key> + <string>GLOD</string> + <key>platforms</key> + <map> + <key>darwin</key> + <map> + <key>archive</key> + <map> + <key>hash</key> + <string>3a7263246813ecf9aff5a240892f9641</string> + <key>url</key> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glod-1.0pre4-darwin-20101007a.tar.bz2</string> + </map> + <key>name</key> + <string>darwin</string> + </map> + <key>linux</key> + <map> + <key>archive</key> + <map> + <key>hash</key> + <string>ca7368e9a1baf266b82d910fa8f821bd</string> + <key>url</key> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glod-1.0pre4-linux-20100920a.tar.bz2</string> + </map> + <key>name</key> + <string>linux</string> + </map> + <key>windows</key> + <map> + <key>archive</key> + <map> + <key>hash</key> + <string>e40e1eac81dc57d8724f96fd977a3d58</string> + <key>url</key> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glod-1.0pre4-windows-20110330.tar.bz2</string> + </map> + <key>name</key> + <string>windows</string> + </map> + </map> + </map> <key>SDL</key> <map> <key>license</key> @@ -219,6 +267,54 @@ </map> </map> </map> + <key>colladadom</key> + <map> + <key>license</key> + <string>scea</string> + <key>license_file</key> + <string>LICENSES/scea.txt</string> + <key>name</key> + <string>colladadom</string> + <key>platforms</key> + <map> + <key>darwin</key> + <map> + <key>archive</key> + <map> + <key>hash</key> + <string>86de85fa85aa58b5ee550a6a3c77a7d3</string> + <key>url</key> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/colladadom-2.1-darwin-20101117.tar.bz2</string> + </map> + <key>name</key> + <string>darwin</string> + </map> + <key>linux</key> + <map> + <key>archive</key> + <map> + <key>hash</key> + <string>e515afc3fa4dcb00d9fb06fbb6343669</string> + <key>url</key> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/colladadom-2.1-linux-20101102.tar.bz2</string> + </map> + <key>name</key> + <string>linux</string> + </map> + <key>windows</key> + <map> + <key>archive</key> + <map> + <key>hash</key> + <string>c1e79c9d3084727be35ce140db87717e</string> + <key>url</key> + <string>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/colladadom-2.1-windows-20110223.tar.bz2</string> + </map> + <key>name</key> + <string>windows</string> + </map> + </map> + </map> <key>curl</key> <map> <key>license</key> @@ -615,42 +711,6 @@ </map> </map> </map> - <key>google-perftools</key> - <map> - <key>license</key> - <string>bsd</string> - <key>license_file</key> - <string>LICENSES/google-perftools.txt</string> - <key>name</key> - <string>google-perftools</string> - <key>platforms</key> - <map> - <key>linux</key> - <map> - <key>archive</key> - <map> - <key>hash</key> - <string>cf513fc2eec4a414cc804cf408932a45</string> - <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google_perftools-1.7-linux-20110315.tar.bz2</string> - </map> - <key>name</key> - <string>linux</string> - </map> - <key>windows</key> - <map> - <key>archive</key> - <map> - <key>hash</key> - <string>8108bffe1c814be9d035b47dac3d4541</string> - <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google-perftools-1.0-windows-20101001b.tar.bz2</string> - </map> - <key>name</key> - <string>windows</string> - </map> - </map> - </map> <key>google_breakpad</key> <map> <key>license</key> @@ -1047,6 +1107,102 @@ </map> </map> </map> + <key>llconvexdecomposition</key> + <map> + <key>license</key> + <string>havok</string> + <key>license_file</key> + <string>on_file</string> + <key>name</key> + <string>llconvexdecomposition</string> + <key>platforms</key> + <map> + <key>darwin</key> + <map> + <key>archive</key> + <map> + <key>hash</key> + <string>47ef880db4aea1a9561194c54fc28433</string> + <key>url</key> + <string>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/llconvexdecomposition-0.3-darwin-20101222.tar.bz2</string> + </map> + <key>name</key> + <string>darwin</string> + </map> + <key>linux</key> + <map> + <key>archive</key> + <map> + <key>hash</key> + <string>f63424076d4fadd133950af0cf9c3564</string> + <key>url</key> + <string>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/llconvexdecomposition-0.3-linux-20101222.tar.bz2</string> + </map> + <key>name</key> + <string>linux</string> + </map> + <key>windows</key> + <map> + <key>archive</key> + <map> + <key>hash</key> + <string>5ae8bab01189c5dbbc6f383c751e031a</string> + <key>url</key> + <string>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/llconvexdecomposition-0.3-windows-20101222.tar.bz2</string> + </map> + <key>name</key> + <string>windows</string> + </map> + </map> + </map> + <key>llconvexdecompositionstub</key> + <map> + <key>license</key> + <string>lgpl</string> + <key>license_file</key> + <string>LICENSES/lgpl.txt</string> + <key>name</key> + <string>llconvexdecompositionstub</string> + <key>platforms</key> + <map> + <key>darwin</key> + <map> + <key>archive</key> + <map> + <key>hash</key> + <string>349fa0e287fb275bbee43ced194a1db1</string> + <key>url</key> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llconvexdecompositionstub-0.3-darwin-20101015.tar.bz2</string> + </map> + <key>name</key> + <string>darwin</string> + </map> + <key>linux</key> + <map> + <key>archive</key> + <map> + <key>hash</key> + <string>dbf4b15e74ce9042e8500720dffc461a</string> + <key>url</key> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llconvexdecompositionstub-0.3-linux-20101015a.tar.bz2</string> + </map> + <key>name</key> + <string>linux</string> + </map> + <key>windows</key> + <map> + <key>archive</key> + <map> + <key>hash</key> + <string>bba9a4dd04fda1b263f34448a044783b</string> + <key>url</key> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llconvexdecompositionstub-0.3-windows-20101015.tar.bz2</string> + </map> + <key>name</key> + <string>windows</string> + </map> + </map> + </map> <key>llqtwebkit</key> <map> <key>license</key> @@ -1351,6 +1507,42 @@ </map> </map> </map> + <key>pcre</key> + <map> + <key>license</key> + <string>bsd</string> + <key>license_file</key> + <string>LICENSES/bsd.txt</string> + <key>name</key> + <string>pcre</string> + <key>platforms</key> + <map> + <key>darwin</key> + <map> + <key>archive</key> + <map> + <key>hash</key> + <string>ef430ae3b9cdba518ad9952e99b12367</string> + <key>url</key> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/pcre-7.6-darwin-20101102.tar.bz2</string> + </map> + <key>name</key> + <string>darwin</string> + </map> + <key>linux</key> + <map> + <key>archive</key> + <map> + <key>hash</key> + <string>86195b0680604fe86cfbbfb921c31dff</string> + <key>url</key> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/pcre-7.6-linux-20101029.tar.bz2</string> + </map> + <key>name</key> + <string>linux</string> + </map> + </map> + </map> <key>pth</key> <map> <key>license</key> @@ -1447,6 +1639,42 @@ </map> </map> </map> + <key>tcmalloc</key> + <map> + <key>license</key> + <string>bsd</string> + <key>license_file</key> + <string>LICENSES/google-perftools.txt</string> + <key>name</key> + <string>google-perftools</string> + <key>platforms</key> + <map> + <key>linux</key> + <map> + <key>archive</key> + <map> + <key>hash</key> + <string>cf513fc2eec4a414cc804cf408932a45</string> + <key>url</key> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google_perftools-1.7-linux-20110315.tar.bz2</string> + </map> + <key>name</key> + <string>linux</string> + </map> + <key>windows</key> + <map> + <key>archive</key> + <map> + <key>hash</key> + <string>8108bffe1c814be9d035b47dac3d4541</string> + <key>url</key> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google-perftools-1.0-windows-20101001b.tar.bz2</string> + </map> + <key>name</key> + <string>windows</string> + </map> + </map> + </map> <key>tut</key> <map> <key>license</key> @@ -1740,8 +1968,7 @@ <key>name</key> <string>Release</string> </map> - <!-- OPEN-1 WORKAROUND begin - to be removed when VC express is detected correctly --> - <key>VCexpressRelWithDebInfo</key> + <key>VC10msbuildRelWithDebInfo</key> <map> <key>configure</key> <map> @@ -1760,11 +1987,9 @@ </array> </map> <key>name</key> - <string>VCexpressRelWithDebInfo</string> + <string>VC10msbuildRelWithDebInfo</string> </map> - <!-- OPEN-1 WORKAROUND end --> - <!-- OPEN-1a WORKAROUND begin - to be removed when VC 2010 is detected correctly --> - <key>VC10msbuildRelWithDebInfo</key> + <key>VC10msbuildRelease</key> <map> <key>configure</key> <map> @@ -1776,18 +2001,16 @@ <string>cmake</string> <key>options</key> <array> - <string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string> + <string>-DCMAKE_BUILD_TYPE:STRING=Release</string> <string>-DUNATTENDED:BOOL=OFF</string> <string>-DWORD_SIZE:STRING=32</string> <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> </array> </map> <key>name</key> - <string>VC10msbuildRelWithDebInfo</string> + <string>VC10msbuildRelease</string> </map> - <!-- OPEN-1a WORKAROUND end --> - <!-- OPEN-1a Release WORKAROUND begin - to be removed when VC 2010 is detected correctly --> - <key>VC10msbuildRelease</key> + <key>VCexpressRelWithDebInfo</key> <map> <key>configure</key> <map> @@ -1799,16 +2022,15 @@ <string>cmake</string> <key>options</key> <array> - <string>-DCMAKE_BUILD_TYPE:STRING=Release</string> + <string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string> <string>-DUNATTENDED:BOOL=OFF</string> <string>-DWORD_SIZE:STRING=32</string> <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> </array> </map> <key>name</key> - <string>VC10msbuildRelease</string> + <string>VCexpressRelWithDebInfo</string> </map> - <!-- OPEN-1a Release WORKAROUND end --> </map> <key>name</key> <string>common</string> @@ -2752,21 +2974,21 @@ <key>name</key> <string>Release</string> </map> - <!-- OPEN-1 WORKAROUND begin - to be removed when VC express is detected correctly --> - <key>VCexpressRelWithDebInfo</key> + <key>VC10msbuildRelWithDebInfo</key> <map> <key>build</key> <map> - <key>arguments</key> - <array> - <string>"RelWithDebInfo|Win32"</string> - </array> <key>command</key> - <string>vcbuild.exe</string> + <string>msbuild.exe</string> <key>options</key> <array> - <string>/u</string> <string>SecondLife.sln</string> + <string>/verbosity:minimal</string> + <string>/t:build</string> + <string>/p:Configuration=RelWithDebInfo</string> + <string>/p:Platform=Win32</string> + <string>/p:"VCBuildAdditionalOptions= /useenv"</string> + <string>/p:"VCBuildAdditionalOptions= /incremental"</string> </array> </map> <key>configure</key> @@ -2781,11 +3003,9 @@ </array> </map> <key>name</key> - <string>VCexpressRelWithDebInfo</string> + <string>VC10msbuildRelWithDebInfo</string> </map> - <!-- OPEN-1 WORKAROUND end --> - <!-- OPEN-1a WORKAROUND begin - to be removed when VC 2010 is detected correctly --> - <key>VC10msbuildRelWithDebInfo</key> + <key>VC10msbuildRelease</key> <map> <key>build</key> <map> @@ -2794,13 +3014,12 @@ <key>options</key> <array> <string>SecondLife.sln</string> - <string>/verbosity:minimal</string> <string>/t:build</string> - <string>/p:Configuration=RelWithDebInfo</string> + <string>/p:Configuration=Release</string> <string>/p:Platform=Win32</string> <string>/p:"VCBuildAdditionalOptions= /useenv"</string> <string>/p:"VCBuildAdditionalOptions= /incremental"</string> - </array> + </array> </map> <key>configure</key> <map> @@ -2814,25 +3033,23 @@ </array> </map> <key>name</key> - <string>VC10msbuildRelWithDebInfo</string> + <string>VC10msbuildRelease</string> </map> - <!-- OPEN-1a WORKAROUND end --> - <!-- OPEN-1a Release WORKAROUND begin - to be removed when VC 2010 is detected correctly --> - <key>VC10msbuildRelease</key> + <key>VCexpressRelWithDebInfo</key> <map> <key>build</key> <map> + <key>arguments</key> + <array> + <string>"RelWithDebInfo|Win32"</string> + </array> <key>command</key> - <string>msbuild.exe</string> + <string>vcbuild.exe</string> <key>options</key> <array> + <string>/u</string> <string>SecondLife.sln</string> - <string>/t:build</string> - <string>/p:Configuration=Release</string> - <string>/p:Platform=Win32</string> - <string>/p:"VCBuildAdditionalOptions= /useenv"</string> - <string>/p:"VCBuildAdditionalOptions= /incremental"</string> - </array> + </array> </map> <key>configure</key> <map> @@ -2846,9 +3063,8 @@ </array> </map> <key>name</key> - <string>VC10msbuildRelease</string> + <string>VCexpressRelWithDebInfo</string> </map> - <!-- OPEN-1a WORKAROUND end --> </map> <key>name</key> <string>windows</string> diff --git a/indra/cmake/GooglePerfTools.cmake b/indra/cmake/GooglePerfTools.cmake index c401245043..5f653c8fb3 100644 --- a/indra/cmake/GooglePerfTools.cmake +++ b/indra/cmake/GooglePerfTools.cmake @@ -12,7 +12,7 @@ else (STANDALONE) set(GOOGLE_PERFTOOLS_FOUND "YES") endif (WINDOWS) if (LINUX) - use_prebuilt_binary(google-perftools) + use_prebuilt_binary(tcmalloc) set(TCMALLOC_LIBRARIES tcmalloc_minimal) set(PROFILER_LIBRARIES profiler) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 6b3b1c4bb0..73b4d41895 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1462,7 +1462,6 @@ if (WINDOWS) LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\"" LINK_FLAGS_RELEASE ${release_flags} ) - LINK_FLAGS_RELEASE "" set_target_properties(${VIEWER_BINARY_NAME} PROPERTIES LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:WINDOWS /INCREMENTAL:NO /INCLUDE:__tcmalloc" -- cgit v1.2.3 From f23bd166fc27bc7b17f54e657c5919f275730fbd Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Tue, 5 Apr 2011 16:48:05 -0400 Subject: remove obsolete workaround configurations --- autobuild.xml | 99 +++++++++++------------------------------------------------ 1 file changed, 18 insertions(+), 81 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index a31d280b6f..1a9788047e 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1740,8 +1740,7 @@ <key>name</key> <string>Release</string> </map> - <!-- OPEN-1 WORKAROUND begin - to be removed when VC express is detected correctly --> - <key>VCexpressRelWithDebInfo</key> + <key>VC10msbuildRelWithDebInfo</key> <map> <key>configure</key> <map> @@ -1760,11 +1759,9 @@ </array> </map> <key>name</key> - <string>VCexpressRelWithDebInfo</string> + <string>VC10msbuildRelWithDebInfo</string> </map> - <!-- OPEN-1 WORKAROUND end --> - <!-- OPEN-1a WORKAROUND begin - to be removed when VC 2010 is detected correctly --> - <key>VC10msbuildRelWithDebInfo</key> + <key>VC10msbuildRelease</key> <map> <key>configure</key> <map> @@ -1776,18 +1773,16 @@ <string>cmake</string> <key>options</key> <array> - <string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string> + <string>-DCMAKE_BUILD_TYPE:STRING=Release</string> <string>-DUNATTENDED:BOOL=OFF</string> <string>-DWORD_SIZE:STRING=32</string> <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> </array> </map> <key>name</key> - <string>VC10msbuildRelWithDebInfo</string> + <string>VC10msbuildRelease</string> </map> - <!-- OPEN-1a WORKAROUND end --> - <!-- OPEN-1a Release WORKAROUND begin - to be removed when VC 2010 is detected correctly --> - <key>VC10msbuildRelease</key> + <key>VCexpressRelWithDebInfo</key> <map> <key>configure</key> <map> @@ -1799,16 +1794,15 @@ <string>cmake</string> <key>options</key> <array> - <string>-DCMAKE_BUILD_TYPE:STRING=Release</string> + <string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string> <string>-DUNATTENDED:BOOL=OFF</string> <string>-DWORD_SIZE:STRING=32</string> <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> </array> </map> <key>name</key> - <string>VC10msbuildRelease</string> + <string>VCexpressRelWithDebInfo</string> </map> - <!-- OPEN-1a Release WORKAROUND end --> </map> <key>name</key> <string>common</string> @@ -2752,7 +2746,16 @@ <key>name</key> <string>Release</string> </map> - <!-- OPEN-1 WORKAROUND begin - to be removed when VC express is detected correctly --> + <key>VC10msbuildRelWithDebInfo</key> + <map> + <key>name</key> + <string>VC10msbuildRelWithDebInfo</string> + </map> + <key>VC10msbuildRelease</key> + <map> + <key>name</key> + <string>VC10msbuildRelease</string> + </map> <key>VCexpressRelWithDebInfo</key> <map> <key>build</key> @@ -2783,72 +2786,6 @@ <key>name</key> <string>VCexpressRelWithDebInfo</string> </map> - <!-- OPEN-1 WORKAROUND end --> - <!-- OPEN-1a WORKAROUND begin - to be removed when VC 2010 is detected correctly --> - <key>VC10msbuildRelWithDebInfo</key> - <map> - <key>build</key> - <map> - <key>command</key> - <string>msbuild.exe</string> - <key>options</key> - <array> - <string>SecondLife.sln</string> - <string>/verbosity:minimal</string> - <string>/t:build</string> - <string>/p:Configuration=RelWithDebInfo</string> - <string>/p:Platform=Win32</string> - <string>/p:"VCBuildAdditionalOptions= /useenv"</string> - <string>/p:"VCBuildAdditionalOptions= /incremental"</string> - </array> - </map> - <key>configure</key> - <map> - <key>options</key> - <array> - <string>-G</string> - <string>"Visual Studio 10"</string> - <string>-DSTANDALONE:BOOL=FALSE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> - </array> - </map> - <key>name</key> - <string>VC10msbuildRelWithDebInfo</string> - </map> - <!-- OPEN-1a WORKAROUND end --> - <!-- OPEN-1a Release WORKAROUND begin - to be removed when VC 2010 is detected correctly --> - <key>VC10msbuildRelease</key> - <map> - <key>build</key> - <map> - <key>command</key> - <string>msbuild.exe</string> - <key>options</key> - <array> - <string>SecondLife.sln</string> - <string>/t:build</string> - <string>/p:Configuration=Release</string> - <string>/p:Platform=Win32</string> - <string>/p:"VCBuildAdditionalOptions= /useenv"</string> - <string>/p:"VCBuildAdditionalOptions= /incremental"</string> - </array> - </map> - <key>configure</key> - <map> - <key>options</key> - <array> - <string>-G</string> - <string>"Visual Studio 10"</string> - <string>-DSTANDALONE:BOOL=FALSE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> - </array> - </map> - <key>name</key> - <string>VC10msbuildRelease</string> - </map> - <!-- OPEN-1a WORKAROUND end --> </map> <key>name</key> <string>windows</string> -- cgit v1.2.3 From 8d452969dbfd5513186425511f7b4eb211278887 Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Tue, 5 Apr 2011 17:03:40 -0400 Subject: remove unused configurations for standalone, and change open source configuration names from "OpenSource" prefix to "OS" suffix --- autobuild.xml | 593 ++++++++-------------------------------------------------- 1 file changed, 76 insertions(+), 517 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 1a9788047e..a6444b0b86 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1598,7 +1598,7 @@ <key>name</key> <string>Debug</string> </map> - <key>OpenSourceDebug</key> + <key>DebugOS</key> <map> <key>configure</key> <map> @@ -1613,61 +1613,13 @@ </array> </map> <key>name</key> - <string>OpenSourceDebug</string> + <string>DebugOS</string> </map> - <key>OpenSourceRelWithDebInfo</key> - <map> - <key>configure</key> - <map> - <key>command</key> - <string>cmake</string> - <key>options</key> - <array> - <string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string> - <string>-DUNATTENDED:BOOL=OFF</string> - <string>-DWORD_SIZE:STRING=32</string> - <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> - </array> - </map> - <key>name</key> - <string>OpenSourceRelWithDebInfo</string> - </map> - <key>OpenSourceRelease</key> - <map> - <key>configure</key> - <map> - <key>command</key> - <string>cmake</string> - <key>options</key> - <array> - <string>-DCMAKE_BUILD_TYPE:STRING=Release</string> - <string>-DUNATTENDED:BOOL=OFF</string> - <string>-DWORD_SIZE:STRING=32</string> - <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> - </array> - </map> - <key>name</key> - <string>OpenSourceRelease</string> - </map> - <key>OpenSourceStandAloneDebug</key> + <key>RelWithDebInfo</key> <map> - <key>configure</key> + <key>build</key> <map> - <key>command</key> - <string>cmake</string> - <key>options</key> - <array> - <string>-DCMAKE_BUILD_TYPE:STRING=Debug</string> - <string>-DUNATTENDED:BOOL=OFF</string> - <string>-DWORD_SIZE:STRING=32</string> - <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> - </array> </map> - <key>name</key> - <string>OpenSourceStandAloneDebug</string> - </map> - <key>OpenSourceStandAloneRelWithDebInfo</key> - <map> <key>configure</key> <map> <key>command</key> @@ -1681,30 +1633,10 @@ </array> </map> <key>name</key> - <string>OpenSourceStandAloneRelWithDebInfo</string> + <string>RelWithDebInfo</string> </map> - <key>OpenSourceStandAloneRelease</key> + <key>RelWithDebInfoOS</key> <map> - <key>configure</key> - <map> - <key>command</key> - <string>cmake</string> - <key>options</key> - <array> - <string>-DCMAKE_BUILD_TYPE:STRING=Release</string> - <string>-DUNATTENDED:BOOL=OFF</string> - <string>-DWORD_SIZE:STRING=32</string> - <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> - </array> - </map> - <key>name</key> - <string>OpenSourceStandAloneRelease</string> - </map> - <key>RelWithDebInfo</key> - <map> - <key>build</key> - <map> - </map> <key>configure</key> <map> <key>command</key> @@ -1718,7 +1650,7 @@ </array> </map> <key>name</key> - <string>RelWithDebInfo</string> + <string>RelWithDebInfoOS</string> </map> <key>Release</key> <map> @@ -1740,35 +1672,10 @@ <key>name</key> <string>Release</string> </map> - <key>VC10msbuildRelWithDebInfo</key> + <key>ReleaseOS</key> <map> <key>configure</key> <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> - <key>command</key> - <string>cmake</string> - <key>options</key> - <array> - <string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string> - <string>-DUNATTENDED:BOOL=OFF</string> - <string>-DWORD_SIZE:STRING=32</string> - <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> - </array> - </map> - <key>name</key> - <string>VC10msbuildRelWithDebInfo</string> - </map> - <key>VC10msbuildRelease</key> - <map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> <key>command</key> <string>cmake</string> <key>options</key> @@ -1780,28 +1687,7 @@ </array> </map> <key>name</key> - <string>VC10msbuildRelease</string> - </map> - <key>VCexpressRelWithDebInfo</key> - <map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> - <key>command</key> - <string>cmake</string> - <key>options</key> - <array> - <string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string> - <string>-DUNATTENDED:BOOL=OFF</string> - <string>-DWORD_SIZE:STRING=32</string> - <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> - </array> - </map> - <key>name</key> - <string>VCexpressRelWithDebInfo</string> + <string>ReleaseOS</string> </map> </map> <key>name</key> @@ -1850,7 +1736,7 @@ <key>name</key> <string>Debug</string> </map> - <key>OpenSourceDebug</key> + <key>DebugOS</key> <map> <key>build</key> <map> @@ -1878,102 +1764,19 @@ </array> </map> <key>name</key> - <string>OpenSourceDebug</string> + <string>DebugOS</string> </map> - <key>OpenSourceRelWithDebInfo</key> - <map> - <key>build</key> - <map> - <key>command</key> - <string>xcodebuild</string> - <key>options</key> - <array> - <string>-configuration RelWithDebInfo</string> - <string>-project SecondLife.xcodeproj</string> - </array> - </map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> - <key>options</key> - <array> - <string>-G</string> - <string>'Xcode'</string> - <string>-DSTANDALONE:BOOL=FALSE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> - </array> - </map> - <key>name</key> - <string>OpenSourceRelWithDebInfo</string> - </map> - <key>OpenSourceRelease</key> - <map> - <key>build</key> - <map> - <key>command</key> - <string>xcodebuild</string> - <key>options</key> - <array> - <string>-configuration Release</string> - <string>-project SecondLife.xcodeproj</string> - </array> - </map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> - <key>options</key> - <array> - <string>-G</string> - <string>'Xcode'</string> - <string>-DSTANDALONE:BOOL=FALSE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> - </array> - </map> - <key>name</key> - <string>OpenSourceRelease</string> - </map> - <key>OpenSourceStandAloneDebug</key> + <key>RelWithDebInfo</key> <map> <key>build</key> - <map> - <key>command</key> - <string>xcodebuild</string> - <key>options</key> - <array> - <string>-configuration Debug</string> - <string>-project SecondLife.xcodeproj</string> - </array> - </map> - <key>configure</key> <map> <key>arguments</key> <array> - <string>../indra</string> - </array> - <key>options</key> - <array> - <string>-G</string> - <string>'Xcode'</string> - <string>-DSTANDALONE:BOOL=TRUE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> + <string>|</string> + <string>grep</string> + <string>-v</string> + <string>setenv</string> </array> - </map> - <key>name</key> - <string>OpenSourceStandAloneDebug</string> - </map> - <key>OpenSourceStandAloneRelWithDebInfo</key> - <map> - <key>build</key> - <map> <key>command</key> <string>xcodebuild</string> <key>options</key> @@ -1992,15 +1795,17 @@ <array> <string>-G</string> <string>'Xcode'</string> - <string>-DSTANDALONE:BOOL=TRUE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> + <string>-DSTANDALONE:BOOL=OFF</string> + <string>-DINSTALL_PROPRIETARY=TRUE</string> + <string>-DFMOD=TRUE</string> </array> </map> + <key>default</key> + <string>True</string> <key>name</key> - <string>OpenSourceStandAloneRelWithDebInfo</string> + <string>RelWithDebInfo</string> </map> - <key>OpenSourceStandAloneRelease</key> + <key>RelWithDebInfoOS</key> <map> <key>build</key> <map> @@ -2008,7 +1813,7 @@ <string>xcodebuild</string> <key>options</key> <array> - <string>-configuration Release</string> + <string>-configuration RelWithDebInfo</string> <string>-project SecondLife.xcodeproj</string> </array> </map> @@ -2022,15 +1827,15 @@ <array> <string>-G</string> <string>'Xcode'</string> - <string>-DSTANDALONE:BOOL=TRUE</string> + <string>-DSTANDALONE:BOOL=FALSE</string> <string>-DINSTALL_PROPRIETARY=FALSE</string> <string>-DFMOD=FALSE</string> </array> </map> <key>name</key> - <string>OpenSourceStandAloneRelease</string> + <string>RelWithDebInfoOS</string> </map> - <key>RelWithDebInfo</key> + <key>Release</key> <map> <key>build</key> <map> @@ -2045,7 +1850,7 @@ <string>xcodebuild</string> <key>options</key> <array> - <string>-configuration RelWithDebInfo</string> + <string>-configuration Release</string> <string>-project SecondLife.xcodeproj</string> </array> </map> @@ -2064,22 +1869,13 @@ <string>-DFMOD=TRUE</string> </array> </map> - <key>default</key> - <string>True</string> <key>name</key> - <string>RelWithDebInfo</string> + <string>Release</string> </map> - <key>Release</key> + <key>ReleaseOS</key> <map> <key>build</key> <map> - <key>arguments</key> - <array> - <string>|</string> - <string>grep</string> - <string>-v</string> - <string>setenv</string> - </array> <key>command</key> <string>xcodebuild</string> <key>options</key> @@ -2098,13 +1894,13 @@ <array> <string>-G</string> <string>'Xcode'</string> - <string>-DSTANDALONE:BOOL=OFF</string> - <string>-DINSTALL_PROPRIETARY=TRUE</string> - <string>-DFMOD=TRUE</string> + <string>-DSTANDALONE:BOOL=FALSE</string> + <string>-DINSTALL_PROPRIETARY=FALSE</string> + <string>-DFMOD=FALSE</string> </array> </map> <key>name</key> - <string>Release</string> + <string>ReleaseOS</string> </map> </map> <key>name</key> @@ -2145,7 +1941,7 @@ <key>name</key> <string>Debug</string> </map> - <key>OpenSourceDebug</key> + <key>DebugOS</key> <map> <key>build</key> <map> @@ -2172,9 +1968,9 @@ </array> </map> <key>name</key> - <string>OpenSourceDebug</string> + <string>DebugOS</string> </map> - <key>OpenSourceRelWithDebInfo</key> + <key>RelWithDebInfo</key> <map> <key>build</key> <map> @@ -2195,15 +1991,17 @@ <array> <string>-G</string> <string>'Unix Makefiles'</string> - <string>-DSTANDALONE:BOOL=FALSE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> + <string>-DSTANDALONE:BOOL=OFF</string> + <string>-DINSTALL_PROPRIETARY=TRUE</string> + <string>-DFMOD=TRUE</string> </array> </map> + <key>default</key> + <string>True</string> <key>name</key> - <string>OpenSourceRelWithDebInfo</string> + <string>RelWithDebInfo</string> </map> - <key>OpenSourceRelease</key> + <key>RelWithDebInfoOS</key> <map> <key>build</key> <map> @@ -2230,96 +2028,9 @@ </array> </map> <key>name</key> - <string>OpenSourceRelease</string> + <string>RelWithDebInfoOS</string> </map> - <key>OpenSourceStandAloneDebug</key> - <map> - <key>build</key> - <map> - <key>command</key> - <string>make</string> - <key>options</key> - <array> - <string>-j 12</string> - </array> - </map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> - <key>options</key> - <array> - <string>-G</string> - <string>'Unix Makefiles'</string> - <string>-DSTANDALONE:BOOL=TRUE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> - </array> - </map> - <key>name</key> - <string>OpenSourceStandAloneDebug</string> - </map> - <key>OpenSourceStandAloneRelWithDebInfo</key> - <map> - <key>build</key> - <map> - <key>command</key> - <string>make</string> - <key>options</key> - <array> - <string>-j 12</string> - </array> - </map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> - <key>options</key> - <array> - <string>-G</string> - <string>'Unix Makefiles'</string> - <string>-DSTANDALONE:BOOL=TRUE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> - </array> - </map> - <key>name</key> - <string>OpenSourceStandAloneRelWithDebInfo</string> - </map> - <key>OpenSourceStandAloneRelease</key> - <map> - <key>build</key> - <map> - <key>command</key> - <string>make</string> - <key>options</key> - <array> - <string>-j 12</string> - </array> - </map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> - <key>options</key> - <array> - <string>-G</string> - <string>'Unix Makefiles'</string> - <string>-DSTANDALONE:BOOL=TRUE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> - </array> - </map> - <key>name</key> - <string>OpenSourceStandAloneRelease</string> - </map> - <key>RelWithDebInfo</key> + <key>Release</key> <map> <key>build</key> <map> @@ -2345,12 +2056,10 @@ <string>-DFMOD=TRUE</string> </array> </map> - <key>default</key> - <string>True</string> <key>name</key> - <string>RelWithDebInfo</string> + <string>Release</string> </map> - <key>Release</key> + <key>ReleaseOS</key> <map> <key>build</key> <map> @@ -2371,13 +2080,13 @@ <array> <string>-G</string> <string>'Unix Makefiles'</string> - <string>-DSTANDALONE:BOOL=OFF</string> - <string>-DINSTALL_PROPRIETARY=TRUE</string> - <string>-DFMOD=TRUE</string> + <string>-DSTANDALONE:BOOL=FALSE</string> + <string>-DINSTALL_PROPRIETARY=FALSE</string> + <string>-DFMOD=FALSE</string> </array> </map> <key>name</key> - <string>Release</string> + <string>ReleaseOS</string> </map> <key>default</key> <map> @@ -2439,7 +2148,7 @@ <key>name</key> <string>Debug</string> </map> - <key>OpenSourceDebug</key> + <key>DebugOS</key> <map> <key>build</key> <map> @@ -2479,77 +2188,9 @@ </array> </map> <key>name</key> - <string>OpenSourceDebug</string> - </map> - <key>OpenSourceRelWithDebInfo</key> - <map> - <key>build</key> - <map> - <key>arguments</key> - <array> - <string>SecondLife.sln</string> - </array> - <key>command</key> - <string>devenv.com</string> - <key>options</key> - <array> - <string>/build</string> - <string>RelWithDebInfo</string> - </array> - </map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> - <key>options</key> - <array> - <string>-G</string> - <string>"Visual Studio 10"</string> - <string>-DSTANDALONE:BOOL=FALSE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> - </array> - </map> - <key>name</key> - <string>OpenSourceRelWithDebInfo</string> - </map> - <key>OpenSourceRelease</key> - <map> - <key>build</key> - <map> - <key>arguments</key> - <array> - <string>SecondLife.sln</string> - </array> - <key>command</key> - <string>devenv.com</string> - <key>options</key> - <array> - <string>/build</string> - <string>Release</string> - </array> - </map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> - <key>options</key> - <array> - <string>-G</string> - <string>"Visual Studio 10"</string> - <string>-DSTANDALONE:BOOL=FALSE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> - </array> - </map> - <key>name</key> - <string>OpenSourceRelease</string> + <string>DebugOS</string> </map> - <key>OpenSourceStandAloneDebug</key> + <key>RelWithDebInfo</key> <map> <key>build</key> <map> @@ -2558,11 +2199,11 @@ <string>SecondLife.sln</string> </array> <key>command</key> - <string>devenv.com</string> + <string>BuildConsole</string> <key>options</key> <array> <string>/build</string> - <string>Debug</string> + <string>"/cfg=RelWithDebInfo|Win32"</string> </array> </map> <key>configure</key> @@ -2583,15 +2224,17 @@ <array> <string>-G</string> <string>"Visual Studio 10"</string> - <string>-DSTANDALONE:BOOL=TRUE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> + <string>-DSTANDALONE:BOOL=OFF</string> + <string>-DINSTALL_PROPRIETARY=TRUE</string> + <string>-DFMOD=TRUE</string> </array> </map> + <key>default</key> + <string>True</string> <key>name</key> - <string>OpenSourceStandAloneDebug</string> + <string>RelWithDebInfo</string> </map> - <key>OpenSourceStandAloneRelWithDebInfo</key> + <key>RelWithDebInfoOS</key> <map> <key>build</key> <map> @@ -2617,91 +2260,13 @@ <array> <string>-G</string> <string>"Visual Studio 10"</string> - <string>-DSTANDALONE:BOOL=TRUE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> - </array> - </map> - <key>name</key> - <string>OpenSourceStandAloneRelWithDebInfo</string> - </map> - <key>OpenSourceStandAloneRelease</key> - <map> - <key>build</key> - <map> - <key>arguments</key> - <array> - <string>SecondLife.sln</string> - </array> - <key>command</key> - <string>devenv.com</string> - <key>options</key> - <array> - <string>/build</string> - <string>Release</string> - </array> - </map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> - <key>options</key> - <array> - <string>-G</string> - <string>"Visual Studio 10"</string> - <string>-DSTANDALONE:BOOL=TRUE</string> + <string>-DSTANDALONE:BOOL=FALSE</string> <string>-DINSTALL_PROPRIETARY=FALSE</string> <string>-DFMOD=FALSE</string> </array> </map> <key>name</key> - <string>OpenSourceStandAloneRelease</string> - </map> - <key>RelWithDebInfo</key> - <map> - <key>build</key> - <map> - <key>arguments</key> - <array> - <string>SecondLife.sln</string> - </array> - <key>command</key> - <string>BuildConsole</string> - <key>options</key> - <array> - <string>/build</string> - <string>"/cfg=RelWithDebInfo|Win32"</string> - </array> - </map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>..\indra</string> - <string>&&</string> - <string>..\indra\tools\vstool\VSTool.exe</string> - <string>--solution</string> - <string>SecondLife.sln</string> - <string>--config</string> - <string>RelWithDebInfo</string> - <string>--startup</string> - <string>secondlife-bin</string> - </array> - <key>options</key> - <array> - <string>-G</string> - <string>"Visual Studio 10"</string> - <string>-DSTANDALONE:BOOL=OFF</string> - <string>-DINSTALL_PROPRIETARY=TRUE</string> - <string>-DFMOD=TRUE</string> - </array> - </map> - <key>default</key> - <string>True</string> - <key>name</key> - <string>RelWithDebInfo</string> + <string>RelWithDebInfoOS</string> </map> <key>Release</key> <map> @@ -2746,34 +2311,28 @@ <key>name</key> <string>Release</string> </map> - <key>VC10msbuildRelWithDebInfo</key> - <map> - <key>name</key> - <string>VC10msbuildRelWithDebInfo</string> - </map> - <key>VC10msbuildRelease</key> - <map> - <key>name</key> - <string>VC10msbuildRelease</string> - </map> - <key>VCexpressRelWithDebInfo</key> + <key>ReleaseOS</key> <map> <key>build</key> <map> <key>arguments</key> <array> - <string>"RelWithDebInfo|Win32"</string> + <string>SecondLife.sln</string> </array> <key>command</key> - <string>vcbuild.exe</string> + <string>devenv.com</string> <key>options</key> <array> - <string>/u</string> - <string>SecondLife.sln</string> + <string>/build</string> + <string>Release</string> </array> </map> <key>configure</key> <map> + <key>arguments</key> + <array> + <string>../indra</string> + </array> <key>options</key> <array> <string>-G</string> @@ -2784,7 +2343,7 @@ </array> </map> <key>name</key> - <string>VCexpressRelWithDebInfo</string> + <string>ReleaseOS</string> </map> </map> <key>name</key> -- cgit v1.2.3 From e32d1cf7564dd38664781ea7360fa8daa132961c Mon Sep 17 00:00:00 2001 From: Xiaohong Bao <bao@lindenlab.com> Date: Tue, 5 Apr 2011 15:28:18 -0600 Subject: fix for STORM-973: [crashhunters] crash at LLViewerTextureList::removeImageFromList(LLViewerFetchedTexture *) --- indra/newview/lldrawpoolbump.cpp | 5 +++++ indra/newview/llviewertexturelist.cpp | 36 ++++++++++++++++++++++++----------- indra/newview/llviewertexturelist.h | 9 +++++++-- 3 files changed, 37 insertions(+), 13 deletions(-) diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp index 223e4a438c..c987847c66 100644 --- a/indra/newview/lldrawpoolbump.cpp +++ b/indra/newview/lldrawpoolbump.cpp @@ -853,6 +853,11 @@ void LLBumpImageList::destroyGL() void LLBumpImageList::restoreGL() { + if(!gTextureList.isInitialized()) + { + return ; + } + LLStandardBumpmap::restoreGL(); // Images will be recreated as they are needed. } diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 10126219f8..f32d563dc1 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -76,18 +76,23 @@ LLStat LLViewerTextureList::sFormattedMemStat(32, TRUE); LLViewerTextureList gTextureList; static LLFastTimer::DeclareTimer FTM_PROCESS_IMAGES("Process Images"); +U32 LLViewerTextureList::sRenderThreadID = 0 ; /////////////////////////////////////////////////////////////////////////////// LLViewerTextureList::LLViewerTextureList() : mForceResetTextureStats(FALSE), mUpdateStats(FALSE), mMaxResidentTexMemInMegaBytes(0), - mMaxTotalTextureMemInMegaBytes(0) + mMaxTotalTextureMemInMegaBytes(0), + mInitialized(FALSE) { } void LLViewerTextureList::init() { + sRenderThreadID = LLThread::currentID() ; + + mInitialized = TRUE ; sNumImages = 0; mMaxResidentTexMemInMegaBytes = 0; mMaxTotalTextureMemInMegaBytes = 0 ; @@ -110,6 +115,10 @@ void LLViewerTextureList::doPreloadImages() { LL_DEBUGS("ViewerImages") << "Preloading images..." << LL_ENDL; + llassert_always(mInitialized) ; + llassert_always(mImageList.empty()) ; + llassert_always(mUUIDMap.empty()) ; + // Set the "missing asset" image LLViewerFetchedTexture::sMissingAssetImagep = LLViewerTextureManager::getFetchedTextureFromFile("missing_asset.tga", MIPMAP_NO, LLViewerFetchedTexture::BOOST_UI); @@ -305,6 +314,7 @@ void LLViewerTextureList::destroyGL(BOOL save_state) void LLViewerTextureList::restoreGL() { + llassert_always(mInitialized) ; LLImageGL::restoreGL(); } @@ -489,8 +499,10 @@ LLViewerFetchedTexture *LLViewerTextureList::findImage(const LLUUID &image_id) return iter->second; } -void LLViewerTextureList::addImageToList(LLViewerFetchedTexture *image) +void LLViewerTextureList::addImageToList(LLViewerFetchedTexture *image, U32 thread_id) { + llassert_always(mInitialized) ; + llassert_always(sRenderThreadID == thread_id); llassert(image); if (image->isInImageList()) { @@ -504,8 +516,10 @@ void LLViewerTextureList::addImageToList(LLViewerFetchedTexture *image) image->setInImageList(TRUE) ; } -void LLViewerTextureList::removeImageFromList(LLViewerFetchedTexture *image) +void LLViewerTextureList::removeImageFromList(LLViewerFetchedTexture *image, U32 thread_id) { + llassert_always(mInitialized) ; + llassert_always(sRenderThreadID == thread_id); llassert(image); if (!image->isInImageList()) { @@ -702,9 +716,9 @@ void LLViewerTextureList::updateImagesDecodePriorities() if ((decode_priority_test < old_priority_test * .8f) || (decode_priority_test > old_priority_test * 1.25f)) { - removeImageFromList(imagep); + removeImageFromList(imagep, sRenderThreadID); imagep->setDecodePriority(decode_priority); - addImageToList(imagep); + addImageToList(imagep, sRenderThreadID); } update_counter--; } @@ -781,9 +795,8 @@ void LLViewerTextureList::forceImmediateUpdate(LLViewerFetchedTexture* imagep) imagep->processTextureStats(); F32 decode_priority = LLViewerFetchedTexture::maxDecodePriority() ; imagep->setDecodePriority(decode_priority); - mImageList.insert(imagep); - imagep->setInImageList(TRUE) ; - + addImageToList(imagep); + return ; } @@ -877,7 +890,9 @@ void LLViewerTextureList::decodeAllImages(F32 max_time) { LLTimer timer; if(gNoRender) return; - + + llassert_always(sRenderThreadID == LLThread::currentID()); + // Update texture stats and priorities std::vector<LLPointer<LLViewerFetchedTexture> > image_list; for (image_priority_list_t::iterator iter = mImageList.begin(); @@ -895,8 +910,7 @@ void LLViewerTextureList::decodeAllImages(F32 max_time) imagep->processTextureStats(); F32 decode_priority = imagep->calcDecodePriority(); imagep->setDecodePriority(decode_priority); - mImageList.insert(imagep); - imagep->setInImageList(TRUE) ; + addImageToList(imagep); } image_list.clear(); diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h index d508ce1ac6..27aab0c081 100644 --- a/indra/newview/llviewertexturelist.h +++ b/indra/newview/llviewertexturelist.h @@ -83,6 +83,7 @@ public: void dump(); void destroyGL(BOOL save_state = TRUE); void restoreGL(); + BOOL isInitialized() const {return mInitialized;} LLViewerFetchedTexture *findImage(const LLUUID &image_id); @@ -120,8 +121,8 @@ private: void addImage(LLViewerFetchedTexture *image); void deleteImage(LLViewerFetchedTexture *image); - void addImageToList(LLViewerFetchedTexture *image); - void removeImageFromList(LLViewerFetchedTexture *image); + void addImageToList(LLViewerFetchedTexture *image, U32 thread_id = LLThread::currentID()); + void removeImageFromList(LLViewerFetchedTexture *image, U32 thread_id = LLThread::currentID()); LLViewerFetchedTexture * getImage(const LLUUID &image_id, BOOL usemipmap = TRUE, @@ -187,6 +188,7 @@ private: // simply holds on to LLViewerFetchedTexture references to stop them from being purged too soon std::set<LLPointer<LLViewerFetchedTexture> > mImagePreloads; + BOOL mInitialized ; BOOL mUpdateStats; S32 mMaxResidentTexMemInMegaBytes; S32 mMaxTotalTextureMemInMegaBytes; @@ -206,6 +208,9 @@ public: private: static S32 sNumImages; static void (*sUUIDCallback)(void**, const LLUUID &); + + //debug use + static U32 sRenderThreadID; }; class LLUIImageList : public LLImageProviderInterface, public LLSingleton<LLUIImageList> -- cgit v1.2.3 From e4e33cac29556cc0399380cdadb8f71814cc2e17 Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine <vsavchuk@productengine.com> Date: Wed, 6 Apr 2011 01:48:07 +0300 Subject: STORM-1028 WIP Fixing bottom bar buttons reshaping, tier 1 Fixed bottom tray buttons not showing under some circumstances. (the fix was made weeks ago, so I don't remember what the circumstances are) --- indra/newview/llbottomtray.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index d8ec4b605c..9e069d63bb 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -1652,8 +1652,11 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible S32 result_width = 0; bool decrease_width = false; +#if 0 // Mark this button to be shown + lldebugs << "Adding " << resizeStateToString(object_type) << " to mResizeState" << llendl; mResizeState |= object_type; +#endif if (preferred_width > 0 && available_width >= preferred_width) { -- cgit v1.2.3 From 318752fe3df9ef86d3735fc0ef935d27ac3d5f7d Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine <vsavchuk@productengine.com> Date: Wed, 6 Apr 2011 01:48:07 +0300 Subject: STORM-1028 WIP Fixing bottom bar buttons reshaping, tier 2 * When there is some free space and all auto-hidden buttons have been already shown, first extend the Speak button, then the others (was: vice versa). * Made the Speak button always have fixed width. --- indra/newview/llbottomtray.cpp | 148 ++++++++++++++++++++++++++++++----------- indra/newview/llbottomtray.h | 14 ++++ 2 files changed, 122 insertions(+), 40 deletions(-) diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index 9e069d63bb..838b072fd3 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -1392,53 +1392,80 @@ void LLBottomTray::processExtendButtons(S32& available_width) // do not allow extending any buttons if we have some buttons hidden via resize if (mResizeState & RS_BUTTONS_CAN_BE_HIDDEN) return; - // process buttons from left to right - resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin(); - const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end(); + lldebugs << "Distributing " << available_width << " px" << llendl; - // iterate through buttons in the mButtonsProcessOrder first - for (; it != it_end; ++it) + // First try extending the Speak button. + if (available_width > 0) { - // is there available space? - if (available_width <= 0) break; - - // try to extend next button - processExtendButton(*it, available_width); + if (!processExtendSpeakButton(available_width)) + { + // The Speak button needs extension but lacks some space. + // Don't extend other buttons in this case: the Speak button + // should consume the available headroom first. + return; + } } - const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth(); - static const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth(); - const S32 available_width_chiclet = chiclet_panel_width - chiclet_panel_min_width; + // Then process the other buttons from left to right. + if (available_width > 0) + { + resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin(); + const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end(); - // then try to extend Speak button - if (available_width > 0 || available_width_chiclet > 0) + // iterate through buttons in the mButtonsProcessOrder first + for (; it != it_end; ++it) + { + // is there available space? + if (available_width <= 0) break; + + // try to extend next button + processExtendButton(*it, available_width); + } + } +} + +bool LLBottomTray::processExtendSpeakButton(S32& available_width) +{ + if (available_width <= 0) { - S32 panel_max_width = mObjectDefaultWidthMap[RS_BUTTON_SPEAK]; - S32 panel_width = mSpeakPanel->getRect().getWidth(); - S32 possible_extend_width = panel_max_width - panel_width; + llassert(available_width > 0); + return true; + } - if (possible_extend_width >= 0 && possible_extend_width <= available_width + available_width_chiclet) // HACK: this button doesn't change size so possible_extend_width will be 0 + const S32 panel_max_width = mObjectDefaultWidthMap[RS_BUTTON_SPEAK]; + const S32 panel_width = mSpeakPanel->getRect().getWidth(); + const S32 required_headroom = panel_max_width - panel_width; + +#if 0 + lldebugs << "required_extend_width = (panel_max_width - panel_width) = " + << "(" << panel_max_width << " - " << panel_width << ") = " << required_headroom << llendl; +#endif + + if (panel_width < panel_max_width) // if the button isn't extended already + { + if (available_width < required_headroom) // not enough space { - mSpeakBtn->setLabelVisible(true); - mSpeakPanel->reshape(panel_max_width, mSpeakPanel->getRect().getHeight()); - log(mSpeakBtn, "speak button is extended"); + lldebugs << "Need (" << required_headroom << " - " << available_width << ") = " + << (required_headroom - available_width) << " more px" + << " to extend the Speak button"<< llendl; - if( available_width > possible_extend_width) - { - available_width -= possible_extend_width; - } - else - { - S32 required_width = possible_extend_width - available_width; - available_width = 0; - mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - required_width, mChicletPanel->getParent()->getRect().getHeight()); - } - lldebugs << "Extending Speak button panel: " << mSpeakPanel->getName() - << ", extended width: " << possible_extend_width - << ", rest width to process: " << available_width - << llendl; + return false; // Don't extend other buttons until we extend Speak. } + + // Reshape the Speak button to its maximum width. + mSpeakBtn->setLabelVisible(true); + mSpeakPanel->reshape(panel_max_width, mSpeakPanel->getRect().getHeight()); + + available_width -= required_headroom; + llassert(available_width >= 0); + + lldebugs << "Extending Speak button panel: " << mSpeakPanel->getName() + << ", extended width: " << required_headroom + << ", rest width to process: " << available_width + << llendl; } + + return true; } void LLBottomTray::processExtendButton(EResizeState processed_object_type, S32& available_width) @@ -1727,6 +1754,7 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible setTrayButtonVisible(object_type, false); // Mark button NOT to show while future bottom tray extending + lldebugs << "Removing " << resizeStateToString(object_type) << " from mResizeState" << llendl; mResizeState &= ~object_type; // Extend other buttons if need @@ -1786,10 +1814,7 @@ void LLBottomTray::processChatbarCustomization(S32 new_width) mDesiredNearbyChatWidth = new_width; - LLView * chiclet_layout_panel = mChicletPanel->getParent(); - const S32 chiclet_min_width = get_panel_min_width(mToolbarStack, chiclet_layout_panel); - const S32 chiclet_panel_width = chiclet_layout_panel->getRect().getWidth(); - const S32 available_chiclet_shrink_width = chiclet_panel_width - chiclet_min_width; + const S32 available_chiclet_shrink_width = getChicletPanelShrinkHeadroom(); llassert(available_chiclet_shrink_width >= 0); if (delta_width > 0) // panel gets narrowly @@ -1808,6 +1833,16 @@ void LLBottomTray::processChatbarCustomization(S32 new_width) } } +S32 LLBottomTray::getChicletPanelShrinkHeadroom() const +{ + static const S32 min_width = mChicletPanel->getMinWidth(); + const S32 cur_width = mChicletPanel->getParent()->getRect().getWidth(); + + S32 shrink_headroom = cur_width - min_width; + llassert(shrink_headroom >= 0); // the panel cannot get narrower than the minimum + return shrink_headroom; +} + // static std::string LLBottomTray::resizeStateToString(EResizeState state) { @@ -1833,4 +1868,37 @@ std::string LLBottomTray::resizeStateToString(EResizeState state) return "UNKNOWN_BUTTON"; } +// static +std::string LLBottomTray::resizeStateMaskToString(MASK mask) +{ + std::string res; + + bool add_delimiter = false; + for (U32 i = 0; i < 16; i++) + { + EResizeState state = (EResizeState) (1 << i); + if (mask & state) + { + if (!add_delimiter) + { + add_delimiter = true; + } + else + { + res += ", "; + } + + res += resizeStateToString(state); + } + } + + if (res.empty()) + { + res = resizeStateToString(RS_NORESIZE); + } + + res += llformat(" (0x%X)", mask); + return res; +} + //EOF diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h index 04e5f5e9e0..f1c193ef16 100644 --- a/indra/newview/llbottomtray.h +++ b/indra/newview/llbottomtray.h @@ -316,6 +316,20 @@ private: */ void processExtendButtons(S32& available_width); + /** + * Extends the Speak button if there is anough headroom. + * + * Unlike other buttons, the Speak buttons has only two possible widths: + * the minimal one (without label) and the maximal (default) one. + * + * If the button is at its minimum width there is not enough headroom to + * reshape it to the maximum width, the method does nothing. + * + * @param available_width Available headroom. + * @return false if the button requires extension but there's not enough headroom, true otherwise. + */ + bool processExtendSpeakButton(S32& available_width); + /** * Extends shown button to increase total taken space. * -- cgit v1.2.3 From 1218ffb000289954cbbbf7fc5c62e494c85f1ede Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine <vsavchuk@productengine.com> Date: Wed, 6 Apr 2011 01:48:07 +0300 Subject: STORM-1028 WIP Fixing bottom bar buttons reshaping, tier 3 * Rewritten some code for better readability. Behavior should not be affected. * Debug prints and other minor changes. --- indra/newview/llbottomtray.cpp | 157 +++++++++++++++++++++++------------------ indra/newview/llbottomtray.h | 11 ++- 2 files changed, 100 insertions(+), 68 deletions(-) diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index 838b072fd3..a206724cd0 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -917,7 +917,7 @@ void LLBottomTray::log(LLView* panel, const std::string& descr) << ", rect: " << panel->getRect() - << "layout: " << layout->getName() + << " layout: " << layout->getName() << ", rect: " << layout->getRect() << llendl ; @@ -1023,6 +1023,7 @@ void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent) { mDesiredNearbyChatWidth = new_width; processChatbarCustomization(new_width); + lldebugs << "Setting nearby chat bar width to " << new_width << " px" << llendl; mChatBarContainer->reshape(new_width, mChatBarContainer->getRect().getHeight()); } needs_restore_custom_state = false; @@ -1034,29 +1035,27 @@ S32 LLBottomTray::processWidthDecreased(S32 delta_width) { bool still_should_be_processed = true; - const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth(); - const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth(); + const S32 chiclet_panel_shrink_headrom = getChicletPanelShrinkHeadroom(); // There are four steps of processing width decrease. If in one of them required width was reached, // further are not needed. // 1. Decreasing width of chiclet panel. - if (chiclet_panel_width > chiclet_panel_min_width) + if (chiclet_panel_shrink_headrom > 0) { // we have some space to decrease chiclet panel - S32 panel_delta_min = chiclet_panel_width - chiclet_panel_min_width; - - S32 delta_panel = llmin(-delta_width, panel_delta_min); + S32 delta_panel = llmin(-delta_width, chiclet_panel_shrink_headrom); lldebugs << "delta_width: " << delta_width - << ", panel_delta_min: " << panel_delta_min + << ", panel_delta_min: " << chiclet_panel_shrink_headrom << ", delta_panel: " << delta_panel << llendl; // is chiclet panel width enough to process resizing? - delta_width += panel_delta_min; + delta_width += chiclet_panel_shrink_headrom; still_should_be_processed = delta_width < 0; + lldebugs << "Shrinking chiclet panel by " << delta_panel << " px" << llendl; mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - delta_panel, mChicletPanel->getParent()->getRect().getHeight()); log(mChicletPanel, "after processing panel decreasing via chiclet panel"); @@ -1089,6 +1088,7 @@ S32 LLBottomTray::processWidthDecreased(S32 delta_width) // chatbar should only be shrunk here, not stretched if(delta_panel > 0) { + lldebugs << "Shrinking nearby chat bar by " << delta_panel << " px " << llendl; mChatBarContainer->reshape(mNearbyChatBar->getRect().getWidth() - delta_panel, mChatBarContainer->getRect().getHeight()); } @@ -1120,6 +1120,7 @@ S32 LLBottomTray::processWidthDecreased(S32 delta_width) { S32 compensative_width = nearby_needed_width > buttons_freed_width ? buttons_freed_width : nearby_needed_width; log(mNearbyChatBar, "before applying compensative width"); + lldebugs << "Extending nearby chat bar by " << compensative_width << " px" << llendl; mChatBarContainer->reshape(mChatBarContainer->getRect().getWidth() + compensative_width, mChatBarContainer->getRect().getHeight() ); log(mNearbyChatBar, "after applying compensative width"); lldebugs << buttons_freed_width << llendl; @@ -1134,52 +1135,45 @@ void LLBottomTray::processWidthIncreased(S32 delta_width) { if (delta_width <= 0) return; - const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth(); - static const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth(); - - const S32 available_width_chiclet = chiclet_panel_width - chiclet_panel_min_width; - - // how many room we have to show hidden buttons - S32 total_available_width = delta_width + available_width_chiclet; + // how much room we have to show hidden buttons + S32 available_width = delta_width + getChicletPanelShrinkHeadroom(); - lldebugs << "Processing extending, available width:" - << ", chiclets - " << available_width_chiclet - << ", total - " << total_available_width - << llendl; + lldebugs << "Distributing (" << getChicletPanelShrinkHeadroom() + << " + " << delta_width << ") = " << available_width << " px" << llendl; - S32 available_width = total_available_width; + S32 processed_width = processShowButtons(available_width); + lldebugs << "processed_width = " << processed_width << ", delta_width = " << delta_width << llendl; - processShowButtons(available_width); + lldebugs << "Available_width after showing buttons: " << available_width << llendl; // if we have to show/extend some buttons but resized delta width is not enough... - S32 processed_width = total_available_width - available_width; if (processed_width > delta_width) { // ... let's shrink nearby chat & chiclet panels - S32 required_to_process_width = processed_width; - // 1. use delta width of resizing - required_to_process_width -= delta_width; + S32 shrink_by = processed_width - delta_width; // 2. use width available via decreasing of chiclet panel - if (required_to_process_width > 0) + if (shrink_by > 0) { - mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - required_to_process_width, mChicletPanel->getParent()->getRect().getHeight()); + lldebugs << "Shrinking chiclet panel by " << shrink_by << " px" << llendl; + mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - shrink_by, mChicletPanel->getParent()->getRect().getHeight()); log(mChicletPanel, "after applying compensative width for chiclets: "); - lldebugs << required_to_process_width << llendl; + lldebugs << shrink_by << llendl; } - } // shown buttons take some space, rest should be processed by nearby chatbar & chiclet panels delta_width -= processed_width; - - // how many space can nearby chatbar take? - S32 chatbar_panel_width_ = mChatBarContainer->getRect().getWidth(); - if (delta_width > 0 && chatbar_panel_width_ < mDesiredNearbyChatWidth) + // how much space can nearby chatbar take? + S32 chatbar_panel_width = mChatBarContainer->getRect().getWidth(); + lldebugs << "delta_width = " << delta_width + << ", chatbar_panel_width = " << chatbar_panel_width + << ", mDesiredNearbyChatWidth = " << mDesiredNearbyChatWidth << llendl; + if (delta_width > 0 && chatbar_panel_width < mDesiredNearbyChatWidth) { - S32 delta_panel_max = mDesiredNearbyChatWidth - chatbar_panel_width_; + S32 delta_panel_max = mDesiredNearbyChatWidth - chatbar_panel_width; S32 delta_panel = llmin(delta_width, delta_panel_max); lldebugs << "Unprocesed delta width: " << delta_width << ", can be applied to chatbar: " << delta_panel_max @@ -1187,17 +1181,22 @@ void LLBottomTray::processWidthIncreased(S32 delta_width) << llendl; delta_width -= delta_panel_max; - mChatBarContainer->reshape(chatbar_panel_width_ + delta_panel, mChatBarContainer->getRect().getHeight()); + lldebugs << "Extending nearby chat bar by " << delta_panel << " px " << llendl; + mChatBarContainer->reshape(chatbar_panel_width + delta_panel, mChatBarContainer->getRect().getHeight()); log(mNearbyChatBar, "applied unprocessed delta width"); } + if (delta_width > 0) { processExtendButtons(delta_width); } } -void LLBottomTray::processShowButtons(S32& available_width) +S32 LLBottomTray::processShowButtons(S32& available_width) { + lldebugs << "Distributing " << available_width << " px" << llendl; + S32 original_available_width = available_width; + // process buttons from left to right resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin(); const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end(); @@ -1210,22 +1209,30 @@ void LLBottomTray::processShowButtons(S32& available_width) // try to show next button processShowButton(*it, available_width); } + + return original_available_width - available_width; } bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32& available_width) { - lldebugs << "Trying to show object type: " << shown_object_type << llendl; - LLPanel* panel = getButtonPanel(shown_object_type); if (NULL == panel) { - lldebugs << "There is no object to process for state: " << shown_object_type << llendl; return false; } + + if (panel->getVisible()) + { + return false; + } + + // We can only show a button if it was previously hidden due to lack of space + // and all buttons to the left of it are not auto-hidden + // (we auto-show the buttons left to right). bool can_be_shown = canButtonBeShown(shown_object_type); if (can_be_shown) { - //validate if we have enough room to show this button + // Make sure we have enough room to show this button. const S32 required_width = panel->getRect().getWidth(); can_be_shown = available_width >= required_width; if (can_be_shown) @@ -1234,11 +1241,16 @@ bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32& availa setTrayButtonVisible(shown_object_type, true); - lldebugs << "processed object type: " << shown_object_type - << ", rest available width: " << available_width + lldebugs << "Showing button " << resizeStateToString(shown_object_type) + << ", remaining available width: " << available_width << llendl; mResizeState &= ~shown_object_type; } + else + { + lldebugs << "Need " << (required_width - available_width) << " more px to show " + << resizeStateToString(shown_object_type) << llendl; + } } return can_be_shown; } @@ -1265,7 +1277,6 @@ void LLBottomTray::processHideButton(EResizeState processed_object_type, S32& re LLPanel* panel = getButtonPanel(processed_object_type); if (NULL == panel) { - lldebugs << "There is no object to process for state: " << processed_object_type << llendl; return; } @@ -1345,7 +1356,6 @@ void LLBottomTray::processShrinkButton(EResizeState processed_object_type, S32& LLPanel* panel = getButtonPanel(processed_object_type); if (NULL == panel) { - lldebugs << "There is no object to process for type: " << processed_object_type << llendl; return; } @@ -1470,38 +1480,32 @@ bool LLBottomTray::processExtendSpeakButton(S32& available_width) void LLBottomTray::processExtendButton(EResizeState processed_object_type, S32& available_width) { + llassert(available_width >= 0); + LLPanel* panel = getButtonPanel(processed_object_type); if (NULL == panel) { - lldebugs << "There is no object to process for type: " << processed_object_type << llendl; return; } if (!panel->getVisible()) return; + // Widen the button up to its maximum width, but by not more than <available_width> px. S32 panel_max_width = mObjectDefaultWidthMap[processed_object_type]; S32 panel_width = panel->getRect().getWidth(); - S32 possible_extend_width = panel_max_width - panel_width; + S32 required_headroom = panel_max_width - panel_width; - if (possible_extend_width > 0) + S32 extend_by = llmin(available_width, required_headroom); + if (extend_by > 0) { - // let calculate real width to extend - - // 1. apply all possible width - available_width -= possible_extend_width; + panel->reshape(panel_width + extend_by, panel->getRect().getHeight()); - // 2. it it is too much... - if (available_width < 0) - { - // reduce applied extended width to the excessive value. - possible_extend_width += available_width; - available_width = 0; - } - panel->reshape(panel_width + possible_extend_width, panel->getRect().getHeight()); + // Decrease amount of headroom available for other panels. + available_width -= extend_by; - lldebugs << "Extending panel: " << panel->getName() - << ", extended width: " << possible_extend_width - << ", rest width to process: " << available_width + lldebugs << "Extending " << panel->getName() + << " by " << extend_by + << " px; remaining available width: " << available_width << llendl; } } @@ -1510,6 +1514,13 @@ bool LLBottomTray::canButtonBeShown(EResizeState processed_object_type) const { // 0. Check if passed button was previously hidden on resize bool can_be_shown = mResizeState & processed_object_type; +#if 0 + if (!can_be_shown) + { + lldebugs << "Button " << resizeStateToString(processed_object_type) << " was not auto-hidden" << llendl; + } +#endif + if (can_be_shown) { // Yes, it was. Lets now check that all buttons before it (that can be hidden on resize) @@ -1531,6 +1542,15 @@ bool LLBottomTray::canButtonBeShown(EResizeState processed_object_type) const // 2. Check if some previous buttons are still hidden on resize can_be_shown = !(buttons_before_mask & mResizeState); +#if 0 + if (!can_be_shown) + { + lldebugs << llformat("mResizeState = 0x%4x, buttons_before_mask = 0x%4x", mResizeState, buttons_before_mask) << llendl; + lldebugs << "Auto-hidden: " << resizeStateMaskToString(mResizeState) << llendl; + lldebugs << "Must show the following buttons to the left of " << resizeStateToString(processed_object_type) << " first:" << llendl; + lldebugs << resizeStateMaskToString(buttons_before_mask & mResizeState) << llendl; + } +#endif } return can_be_shown; } @@ -1595,6 +1615,7 @@ void LLBottomTray::initButtonsVisibility() setVisibleAndFitWidths(RS_BUTTON_SEARCH, gSavedSettings.getBOOL("ShowSearchButton")); setVisibleAndFitWidths(RS_BUTTON_WORLD_MAP, gSavedSettings.getBOOL("ShowWorldMapButton")); setVisibleAndFitWidths(RS_BUTTON_MINI_MAP, gSavedSettings.getBOOL("ShowMiniMapButton")); + lldebugs << "mResizeState = " << resizeStateMaskToString(mResizeState) << llendl; } void LLBottomTray::setButtonsControlsAndListeners() @@ -1631,7 +1652,6 @@ void LLBottomTray::setTrayButtonVisible(EResizeState shown_object_type, bool vis LLPanel* panel = getButtonPanel(shown_object_type); if (NULL == panel) { - lldebugs << "There is no object to show for state: " << shown_object_type << llendl; return; } @@ -1662,7 +1682,6 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible LLPanel* cur_panel = getButtonPanel(object_type); if (NULL == cur_panel) { - lldebugs << "There is no object to process for state: " << object_type << llendl; return false; } @@ -1671,8 +1690,7 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible if (visible) { // Assume that only chiclet panel can be auto-resized - const S32 available_width = - mChicletPanel->getParent()->getRect().getWidth() - mChicletPanel->getMinWidth(); + const S32 available_width = getChicletPanelShrinkHeadroom(); S32 preferred_width = mObjectDefaultWidthMap[object_type]; S32 current_width = cur_panel->getRect().getWidth(); @@ -1812,6 +1830,11 @@ void LLBottomTray::processChatbarCustomization(S32 new_width) if (delta_width == 0) return; + { + static unsigned dbg_cnt = 0; + lldebugs << llformat("*** (%03d) ************************************* %d", delta_width, ++dbg_cnt) << llendl; + } + mDesiredNearbyChatWidth = new_width; const S32 available_chiclet_shrink_width = getChicletPanelShrinkHeadroom(); diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h index f1c193ef16..7301551975 100644 --- a/indra/newview/llbottomtray.h +++ b/indra/newview/llbottomtray.h @@ -240,8 +240,9 @@ private: * * @params[in, out] available_width - reference to available width to be used to show buttons. * @see processShowButton() + * @return consumed pixels (difference in available width). */ - void processShowButtons(S32& available_width); + S32 processShowButtons(S32& available_width); /** * Tries to show panel with specified button using available width. @@ -431,9 +432,17 @@ private: */ void processChatbarCustomization(S32 new_width); + /** + * @return difference between current chiclet panel width and the minimum. + */ + S32 getChicletPanelShrinkHeadroom() const; + /// Get button name for debugging. static std::string resizeStateToString(EResizeState state); + /// Dump a mask for debugging + static std::string resizeStateMaskToString(MASK mask); + /// Buttons automatically hidden due to lack of space. MASK mResizeState; -- cgit v1.2.3 From dfb17cf204b9fbf97129569398efe3d7bc88fe6a Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine <vsavchuk@productengine.com> Date: Wed, 6 Apr 2011 01:48:07 +0300 Subject: STORM-1028 WIP Fixing bottom bar buttons reshaping, tier 4 When user manually toggles a button (via context menu), show it regardless of whether it has been auto-hidden. Tech note: Added showButton() method which does the same as processShowButton() did but the check for the button being auto-hidden. --- indra/newview/llbottomtray.cpp | 137 ++++++++++++++++++++--------------------- indra/newview/llbottomtray.h | 10 +++ 2 files changed, 78 insertions(+), 69 deletions(-) diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index a206724cd0..0d18321f1c 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -1215,44 +1215,14 @@ S32 LLBottomTray::processShowButtons(S32& available_width) bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32& available_width) { - LLPanel* panel = getButtonPanel(shown_object_type); - if (NULL == panel) + // Check if the button was previously auto-hidden (due to lack of space). + if ((mResizeState & shown_object_type) == 0) { return false; } - if (panel->getVisible()) - { - return false; - } - - // We can only show a button if it was previously hidden due to lack of space - // and all buttons to the left of it are not auto-hidden - // (we auto-show the buttons left to right). - bool can_be_shown = canButtonBeShown(shown_object_type); - if (can_be_shown) - { - // Make sure we have enough room to show this button. - const S32 required_width = panel->getRect().getWidth(); - can_be_shown = available_width >= required_width; - if (can_be_shown) - { - available_width -= required_width; - - setTrayButtonVisible(shown_object_type, true); - - lldebugs << "Showing button " << resizeStateToString(shown_object_type) - << ", remaining available width: " << available_width - << llendl; - mResizeState &= ~shown_object_type; - } - else - { - lldebugs << "Need " << (required_width - available_width) << " more px to show " - << resizeStateToString(shown_object_type) << llendl; - } - } - return can_be_shown; + // Ok. Try showing the button. + return showButton(shown_object_type, available_width); } void LLBottomTray::processHideButtons(S32& required_width, S32& buttons_freed_width) @@ -1512,46 +1482,33 @@ void LLBottomTray::processExtendButton(EResizeState processed_object_type, S32& bool LLBottomTray::canButtonBeShown(EResizeState processed_object_type) const { - // 0. Check if passed button was previously hidden on resize - bool can_be_shown = mResizeState & processed_object_type; -#if 0 - if (!can_be_shown) - { - lldebugs << "Button " << resizeStateToString(processed_object_type) << " was not auto-hidden" << llendl; - } -#endif - - if (can_be_shown) - { - // Yes, it was. Lets now check that all buttons before it (that can be hidden on resize) - // are already shown + // 1. Let's check that all buttons (that can be hidden on resize) before the given one are already shown. - // process buttons in direct order (from left to right) - resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin(); - const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end(); + // process buttons in direct order (from left to right) + resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin(); + const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end(); - // 1. Find and accumulate all buttons types before one passed into the method. - MASK buttons_before_mask = RS_NORESIZE; - for (; it != it_end; ++it) - { - const EResizeState button_type = *it; - if (button_type == processed_object_type) break; + // 1. Find and accumulate all buttons types before one passed into the method. + MASK buttons_before_mask = RS_NORESIZE; + for (; it != it_end; ++it) + { + const EResizeState button_type = *it; + if (button_type == processed_object_type) break; - buttons_before_mask |= button_type; - } + buttons_before_mask |= button_type; + } - // 2. Check if some previous buttons are still hidden on resize - can_be_shown = !(buttons_before_mask & mResizeState); + // 2. Check if some previous buttons are still hidden on resize + bool can_be_shown = !(buttons_before_mask & mResizeState); #if 0 - if (!can_be_shown) - { - lldebugs << llformat("mResizeState = 0x%4x, buttons_before_mask = 0x%4x", mResizeState, buttons_before_mask) << llendl; - lldebugs << "Auto-hidden: " << resizeStateMaskToString(mResizeState) << llendl; - lldebugs << "Must show the following buttons to the left of " << resizeStateToString(processed_object_type) << " first:" << llendl; - lldebugs << resizeStateMaskToString(buttons_before_mask & mResizeState) << llendl; - } -#endif + if (!can_be_shown) + { + lldebugs << llformat("mResizeState = 0x%4x, buttons_before_mask = 0x%4x", mResizeState, buttons_before_mask) << llendl; + lldebugs << "Auto-hidden: " << resizeStateMaskToString(mResizeState) << llendl; + lldebugs << "Must show the following buttons to the left of " << resizeStateToString(processed_object_type) << " first:" << llendl; + lldebugs << resizeStateMaskToString(buttons_before_mask & mResizeState) << llendl; } +#endif return can_be_shown; } @@ -1647,6 +1604,48 @@ bool LLBottomTray::toggleShowButton(LLBottomTray::EResizeState button_type, cons return true; } +bool LLBottomTray::showButton(EResizeState button_type, S32& available_width) +{ + LLPanel* panel = getButtonPanel(button_type); + if (NULL == panel) + { + return false; + } + + if (panel->getVisible()) + { + return false; + } + + // Check if none of the buttons to the left of the given one was auto-hidden. + // (we auto-show the buttons left to right). + if (!canButtonBeShown(button_type)) + { + return false; + } + + // Make sure we have enough room to show this button. + const S32 required_width = panel->getRect().getWidth(); + if (available_width < required_width) + { + lldebugs << "Need " << (required_width - available_width) << " more px to show " << resizeStateToString(button_type) << llendl; + return false; + } + + // All good. Show the button. + setTrayButtonVisible(button_type, true); + + // Let the caller know that there is now less available space. + available_width -= required_width; + + lldebugs << "Showing button " << resizeStateToString(button_type) + << ", remaining available width: " << available_width + << llendl; + mResizeState &= ~button_type; + + return true; +} + void LLBottomTray::setTrayButtonVisible(EResizeState shown_object_type, bool visible) { LLPanel* panel = getButtonPanel(shown_object_type); @@ -1757,7 +1756,7 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible current_width = result_width; } - is_set = processShowButton(object_type, current_width); + is_set = showButton(object_type, current_width); // Shrink buttons if needed if (is_set && decrease_width) diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h index 7301551975..1e8554f434 100644 --- a/indra/newview/llbottomtray.h +++ b/indra/newview/llbottomtray.h @@ -379,6 +379,16 @@ private: */ static bool toggleShowButton(EResizeState button_type, const LLSD& new_visibility); + /** + * Show the button if there is enough space. + * + * @param[in] button_type - type of button to be shown. + * @param[in, out] available_width amount of available space on the bottom bar. + * + * @return true if button was shown, false that's not possible (not enough space, etc) + */ + bool showButton(EResizeState button_type, S32& available_width); + /** * Sets passed visibility to object specified by resize type. */ -- cgit v1.2.3 From 4f09c204781d20e1b491b2aa22eed7c797685102 Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine <vsavchuk@productengine.com> Date: Wed, 6 Apr 2011 01:48:07 +0300 Subject: STORM-1028 WIP Fixing bottom bar buttons reshaping, tier 5 Changes to improve readability. --- indra/newview/llbottomtray.cpp | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index 0d18321f1c..0f69c7e474 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -940,7 +940,9 @@ void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent) if (mNearbyChatBar) log(mNearbyChatBar, "before"); if (mChicletPanel) log(mChicletPanel, "before"); - // stores width size on which bottom tray is less than width required by its children. EXT-991 + // Difference between bottom tray width required to fit its children and the actual width. (see EXT-991) + // Positive value means that bottom tray is not wide enough. + // Negative value means that there is free space. static S32 extra_shrink_width = 0; bool should_be_reshaped = true; @@ -962,11 +964,9 @@ void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent) // bottom tray is narrowed if (delta_width < 0) { - if (extra_shrink_width > 0) + if (extra_shrink_width > 0) // not enough space { - // is world rect was extra shrunk and decreasing again only update this value - // to delta_width negative - extra_shrink_width -= delta_width; // use "-=" because delta_width is negative + extra_shrink_width += llabs(delta_width); should_be_reshaped = false; } else @@ -977,13 +977,13 @@ void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent) width += extra_shrink_width; } } - // bottom tray is widen + // bottom tray is widened else { if (extra_shrink_width > delta_width) { - // Less than minimum width is more than increasing (delta_width) - // only reduce it value and make no reshape + // Still not enough space. + // Only subtract the delta from the required delta and don't reshape. extra_shrink_width -= delta_width; should_be_reshaped = false; } @@ -1043,20 +1043,20 @@ S32 LLBottomTray::processWidthDecreased(S32 delta_width) if (chiclet_panel_shrink_headrom > 0) { // we have some space to decrease chiclet panel - S32 delta_panel = llmin(-delta_width, chiclet_panel_shrink_headrom); + S32 shrink_by = llmin(-delta_width, chiclet_panel_shrink_headrom); lldebugs << "delta_width: " << delta_width << ", panel_delta_min: " << chiclet_panel_shrink_headrom - << ", delta_panel: " << delta_panel + << ", shrink_by: " << shrink_by << llendl; - // is chiclet panel width enough to process resizing? + // is chiclet panel wide enough to process resizing? delta_width += chiclet_panel_shrink_headrom; still_should_be_processed = delta_width < 0; - lldebugs << "Shrinking chiclet panel by " << delta_panel << " px" << llendl; - mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - delta_panel, mChicletPanel->getParent()->getRect().getHeight()); + lldebugs << "Shrinking chiclet panel by " << shrink_by << " px" << llendl; + mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - shrink_by, mChicletPanel->getParent()->getRect().getHeight()); log(mChicletPanel, "after processing panel decreasing via chiclet panel"); lldebugs << "RS_CHICLET_PANEL" @@ -1080,7 +1080,7 @@ S32 LLBottomTray::processWidthDecreased(S32 delta_width) S32 delta_panel = llmin(-delta_width, panel_delta_min); - // whether chatbar panel width is enough to process resizing? + // is chatbar panel wide enough to process resizing? delta_width += panel_delta_min; still_should_be_processed = delta_width < 0; -- cgit v1.2.3 From e710d740dcb14d696d3533071b030fd30e9cf198 Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine <vsavchuk@productengine.com> Date: Wed, 6 Apr 2011 01:48:07 +0300 Subject: STORM-1028 WIP Fixing bottom bar buttons reshaping, tier 6 Fixed: if you slowly increase the viewer window width, the Speak button fails to expand. --- indra/newview/llbottomtray.cpp | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index 0f69c7e474..0a6dd7beff 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -912,15 +912,14 @@ void LLBottomTray::log(LLView* panel, const std::string& descr) { if (NULL == panel) return; LLView* layout = panel->getParent(); - lldebugs << descr << ": " + LL_DEBUGS("Bottom Tray Rects") << descr << ": " << "panel: " << panel->getName() << ", rect: " << panel->getRect() << " layout: " << layout->getName() << ", rect: " << layout->getRect() - << llendl - ; + << LL_ENDL; } void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent) @@ -1141,15 +1140,16 @@ void LLBottomTray::processWidthIncreased(S32 delta_width) lldebugs << "Distributing (" << getChicletPanelShrinkHeadroom() << " + " << delta_width << ") = " << available_width << " px" << llendl; + // 1. Try showing buttons that have been auto-hidden. S32 processed_width = processShowButtons(available_width); lldebugs << "processed_width = " << processed_width << ", delta_width = " << delta_width << llendl; lldebugs << "Available_width after showing buttons: " << available_width << llendl; - // if we have to show/extend some buttons but resized delta width is not enough... + // If the newly shown buttons have consumed more than delta_width pixels, + // shrink the chiclet panel. if (processed_width > delta_width) { - // ... let's shrink nearby chat & chiclet panels // 1. use delta width of resizing S32 shrink_by = processed_width - delta_width; @@ -1161,12 +1161,12 @@ void LLBottomTray::processWidthIncreased(S32 delta_width) log(mChicletPanel, "after applying compensative width for chiclets: "); lldebugs << shrink_by << llendl; } - } - // shown buttons take some space, rest should be processed by nearby chatbar & chiclet panels - delta_width -= processed_width; + // shown buttons take some space, rest should be processed by nearby chatbar & chiclet panels + delta_width -= processed_width; + } - // how much space can nearby chatbar take? + // 2. Expand the nearby chat bar if needed. S32 chatbar_panel_width = mChatBarContainer->getRect().getWidth(); lldebugs << "delta_width = " << delta_width << ", chatbar_panel_width = " << chatbar_panel_width @@ -1186,9 +1186,12 @@ void LLBottomTray::processWidthIncreased(S32 delta_width) log(mNearbyChatBar, "applied unprocessed delta width"); } + // 3. Expand buttons that have been auto-shrunk, + // if we haven't yet consumed all the available headroom. if (delta_width > 0) { - processExtendButtons(delta_width); + S32 available_width = delta_width + getChicletPanelShrinkHeadroom(); + processExtendButtons(available_width); } } -- cgit v1.2.3 From 00a3e47e74a6a0e7843fb9de5b042a7694a9fcb5 Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine <vsavchuk@productengine.com> Date: Wed, 6 Apr 2011 02:17:07 +0300 Subject: STORM-1028 WIP Fixing bottom bar buttons reshaping, tier 7 * Removed dead code. * Minor comment changes. --- indra/newview/llbottomtray.cpp | 28 +++------------------------- 1 file changed, 3 insertions(+), 25 deletions(-) diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index 0a6dd7beff..aacdf4845a 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -1419,11 +1419,6 @@ bool LLBottomTray::processExtendSpeakButton(S32& available_width) const S32 panel_width = mSpeakPanel->getRect().getWidth(); const S32 required_headroom = panel_max_width - panel_width; -#if 0 - lldebugs << "required_extend_width = (panel_max_width - panel_width) = " - << "(" << panel_max_width << " - " << panel_width << ") = " << required_headroom << llendl; -#endif - if (panel_width < panel_max_width) // if the button isn't extended already { if (available_width < required_headroom) // not enough space @@ -1485,13 +1480,13 @@ void LLBottomTray::processExtendButton(EResizeState processed_object_type, S32& bool LLBottomTray::canButtonBeShown(EResizeState processed_object_type) const { - // 1. Let's check that all buttons (that can be hidden on resize) before the given one are already shown. + // Check that all buttons (that can be hidden on resize) + // to the left of the given one are already shown. // process buttons in direct order (from left to right) resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin(); const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end(); - // 1. Find and accumulate all buttons types before one passed into the method. MASK buttons_before_mask = RS_NORESIZE; for (; it != it_end; ++it) { @@ -1501,18 +1496,7 @@ bool LLBottomTray::canButtonBeShown(EResizeState processed_object_type) const buttons_before_mask |= button_type; } - // 2. Check if some previous buttons are still hidden on resize - bool can_be_shown = !(buttons_before_mask & mResizeState); -#if 0 - if (!can_be_shown) - { - lldebugs << llformat("mResizeState = 0x%4x, buttons_before_mask = 0x%4x", mResizeState, buttons_before_mask) << llendl; - lldebugs << "Auto-hidden: " << resizeStateMaskToString(mResizeState) << llendl; - lldebugs << "Must show the following buttons to the left of " << resizeStateToString(processed_object_type) << " first:" << llendl; - lldebugs << resizeStateMaskToString(buttons_before_mask & mResizeState) << llendl; - } -#endif - return can_be_shown; + return !(buttons_before_mask & mResizeState); } void LLBottomTray::initResizeStateContainers() @@ -1699,12 +1683,6 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible S32 result_width = 0; bool decrease_width = false; -#if 0 - // Mark this button to be shown - lldebugs << "Adding " << resizeStateToString(object_type) << " to mResizeState" << llendl; - mResizeState |= object_type; -#endif - if (preferred_width > 0 && available_width >= preferred_width) { result_width = preferred_width; -- cgit v1.2.3 From 9a518aaa3a6dd7d07c4d01b416080208e3171ac1 Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine <vsavchuk@productengine.com> Date: Wed, 6 Apr 2011 02:24:43 +0300 Subject: STORM-1028 WIP Fixing bottom bar buttons reshaping, tier 8 Fixed Mini-Map button label truncation. --- indra/newview/skins/default/xui/en/panel_bottomtray.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index a92cc886e7..6620808da6 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -341,7 +341,7 @@ Disabled for now. height="28" layout="topleft" min_height="28" - min_width="52" + min_width="62" mouse_opaque="false" name="mini_map_btn_panel" user_resize="false" -- cgit v1.2.3 From cdfd66eec27355930a50309273961ad4bc7e4606 Mon Sep 17 00:00:00 2001 From: Merov Linden <merov@lindenlab.com> Date: Tue, 5 Apr 2011 22:58:53 -0700 Subject: STORM-610 : Changes to water color and density in the Environment Editor now persist between sessions. --- indra/newview/app_settings/settings.xml | 27 +++++++++++++++++++++++++++ indra/newview/llwaterparammanager.cpp | 28 ++++++++++++++++++++++++++++ indra/newview/llwaterparammanager.h | 6 ++++++ 3 files changed, 61 insertions(+) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 3048f8d492..3d89d294f2 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -11926,6 +11926,33 @@ <key>Value</key> <integer>0</integer> </map> + <key>WaterFogColor</key> + <map> + <key>Comment</key> + <string>Water fog color</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Color4</string> + <key>Value</key> + <array> + <real>22</real> + <real>43</real> + <real>54</real> + <real>0</real> + </array> + </map> + <key>WaterFogDensity</key> + <map> + <key>Comment</key> + <string>Water fog density</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>16.0</real> + </map> <key>WaterGLFogDensityScale</key> <map> <key>Comment</key> diff --git a/indra/newview/llwaterparammanager.cpp b/indra/newview/llwaterparammanager.cpp index d239347810..3d3d43e20d 100644 --- a/indra/newview/llwaterparammanager.cpp +++ b/indra/newview/llwaterparammanager.cpp @@ -72,6 +72,7 @@ LLWaterParamManager::LLWaterParamManager() : mWave1Dir(.5f, .5f, "wave1Dir"), mWave2Dir(.5f, .5f, "wave2Dir"), mDensitySliderValue(1.0f), + mPrevFogDensity(16.0f), // 2^4 mWaterFogKS(1.0f) { } @@ -265,6 +266,20 @@ void LLWaterParamManager::update(LLViewerCamera * cam) // update the shaders and the menu propagateParameters(); + // If water fog color has been changed, save it. + if (mPrevFogColor != mFogColor) + { + gSavedSettings.setColor4("WaterFogColor", mFogColor); + mPrevFogColor = mFogColor; + } + + // If water fog density has been changed, save it. + if (mPrevFogDensity != mFogDensity) + { + gSavedSettings.setF32("WaterFogDensity", mFogDensity); + mPrevFogDensity = mFogDensity; + } + // sync menus if they exist LLFloaterWater* waterfloater = LLFloaterReg::findTypedInstance<LLFloaterWater>("env_water"); if(waterfloater) @@ -449,7 +464,20 @@ LLWaterParamManager * LLWaterParamManager::instance() sInstance->loadAllPresets(LLStringUtil::null); sInstance->getParamSet("Default", sInstance->mCurParams); + sInstance->initOverrides(); } return sInstance; } + +void LLWaterParamManager::initOverrides() +{ + // Override fog color from the current preset with the saved setting. + LLColor4 fog_color_override = gSavedSettings.getColor4("WaterFogColor"); + mCurParams.set("waterFogColor", mPrevFogColor = mFogColor = fog_color_override); + + // Do the same with fog density. + F32 fog_density = gSavedSettings.getF32("WaterFogDensity"); + mCurParams.set("waterFogDensity", mPrevFogDensity = mFogDensity = fog_density); + setDensitySliderValue(mFogDensity.mExp); +} diff --git a/indra/newview/llwaterparammanager.h b/indra/newview/llwaterparammanager.h index c479f1861c..f465034c39 100644 --- a/indra/newview/llwaterparammanager.h +++ b/indra/newview/llwaterparammanager.h @@ -284,6 +284,9 @@ public: // singleton pattern implementation static LLWaterParamManager * instance(); +private: + void initOverrides(); + public: LLWaterParamSet mCurParams; @@ -314,6 +317,9 @@ private: LLVector4 mWaterPlane; F32 mWaterFogKS; + LLColor4 mPrevFogColor; + F32 mPrevFogDensity; + // our parameter manager singleton instance static LLWaterParamManager * sInstance; }; -- cgit v1.2.3 From 8f0d59cab387b266ce777a0487effeb5da89f1f1 Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Wed, 6 Apr 2011 05:46:45 -0400 Subject: OPEN-50 (partial): refactor cmake switches to common configurations and default values --- autobuild.xml | 69 ++++++--------------------------------------- indra/cmake/Variables.cmake | 1 + 2 files changed, 10 insertions(+), 60 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index a6444b0b86..d78ef2325a 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1590,7 +1590,6 @@ <key>options</key> <array> <string>-DCMAKE_BUILD_TYPE:STRING=Debug</string> - <string>-DUNATTENDED:BOOL=OFF</string> <string>-DWORD_SIZE:STRING=32</string> <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> </array> @@ -1607,9 +1606,11 @@ <key>options</key> <array> <string>-DCMAKE_BUILD_TYPE:STRING=Debug</string> - <string>-DUNATTENDED:BOOL=OFF</string> <string>-DWORD_SIZE:STRING=32</string> <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> + <string>-DINSTALL_PROPRIETARY=FALSE</string> + <string>-DUSE_PRECOMPILED_HEADERS=ON</string> + <string>-DFMOD=FALSE</string> </array> </map> <key>name</key> @@ -1627,7 +1628,6 @@ <key>options</key> <array> <string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string> - <string>-DUNATTENDED:BOOL=OFF</string> <string>-DWORD_SIZE:STRING=32</string> <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> </array> @@ -1644,9 +1644,11 @@ <key>options</key> <array> <string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string> - <string>-DUNATTENDED:BOOL=OFF</string> <string>-DWORD_SIZE:STRING=32</string> <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> + <string>-DINSTALL_PROPRIETARY=FALSE</string> + <string>-DUSE_PRECOMPILED_HEADERS=ON</string> + <string>-DFMOD=FALSE</string> </array> </map> <key>name</key> @@ -1664,7 +1666,6 @@ <key>options</key> <array> <string>-DCMAKE_BUILD_TYPE:STRING=Release</string> - <string>-DUNATTENDED:BOOL=OFF</string> <string>-DWORD_SIZE:STRING=32</string> <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> </array> @@ -1681,9 +1682,11 @@ <key>options</key> <array> <string>-DCMAKE_BUILD_TYPE:STRING=Release</string> - <string>-DUNATTENDED:BOOL=OFF</string> <string>-DWORD_SIZE:STRING=32</string> <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> + <string>-DINSTALL_PROPRIETARY=FALSE</string> + <string>-DUSE_PRECOMPILED_HEADERS=ON</string> + <string>-DFMOD=FALSE</string> </array> </map> <key>name</key> @@ -1728,9 +1731,6 @@ <array> <string>-G</string> <string>'Xcode'</string> - <string>-DSTANDALONE:BOOL=OFF</string> - <string>-DINSTALL_PROPRIETARY=TRUE</string> - <string>-DFMOD=TRUE</string> </array> </map> <key>name</key> @@ -1758,9 +1758,6 @@ <array> <string>-G</string> <string>'Xcode'</string> - <string>-DSTANDALONE:BOOL=FALSE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> </array> </map> <key>name</key> @@ -1795,9 +1792,6 @@ <array> <string>-G</string> <string>'Xcode'</string> - <string>-DSTANDALONE:BOOL=OFF</string> - <string>-DINSTALL_PROPRIETARY=TRUE</string> - <string>-DFMOD=TRUE</string> </array> </map> <key>default</key> @@ -1827,9 +1821,6 @@ <array> <string>-G</string> <string>'Xcode'</string> - <string>-DSTANDALONE:BOOL=FALSE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> </array> </map> <key>name</key> @@ -1864,9 +1855,6 @@ <array> <string>-G</string> <string>'Xcode'</string> - <string>-DSTANDALONE:BOOL=OFF</string> - <string>-DINSTALL_PROPRIETARY=TRUE</string> - <string>-DFMOD=TRUE</string> </array> </map> <key>name</key> @@ -1894,9 +1882,6 @@ <array> <string>-G</string> <string>'Xcode'</string> - <string>-DSTANDALONE:BOOL=FALSE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> </array> </map> <key>name</key> @@ -1933,9 +1918,6 @@ <array> <string>-G</string> <string>'Unix Makefiles'</string> - <string>-DSTANDALONE:BOOL=OFF</string> - <string>-DINSTALL_PROPRIETARY=TRUE</string> - <string>-DFMOD=TRUE</string> </array> </map> <key>name</key> @@ -1962,9 +1944,6 @@ <array> <string>-G</string> <string>'Unix Makefiles'</string> - <string>-DSTANDALONE:BOOL=FALSE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> </array> </map> <key>name</key> @@ -1991,9 +1970,6 @@ <array> <string>-G</string> <string>'Unix Makefiles'</string> - <string>-DSTANDALONE:BOOL=OFF</string> - <string>-DINSTALL_PROPRIETARY=TRUE</string> - <string>-DFMOD=TRUE</string> </array> </map> <key>default</key> @@ -2022,9 +1998,6 @@ <array> <string>-G</string> <string>'Unix Makefiles'</string> - <string>-DSTANDALONE:BOOL=FALSE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> </array> </map> <key>name</key> @@ -2051,9 +2024,6 @@ <array> <string>-G</string> <string>'Unix Makefiles'</string> - <string>-DSTANDALONE:BOOL=OFF</string> - <string>-DINSTALL_PROPRIETARY=TRUE</string> - <string>-DFMOD=TRUE</string> </array> </map> <key>name</key> @@ -2080,9 +2050,6 @@ <array> <string>-G</string> <string>'Unix Makefiles'</string> - <string>-DSTANDALONE:BOOL=FALSE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> </array> </map> <key>name</key> @@ -2140,9 +2107,6 @@ <array> <string>-G</string> <string>"Visual Studio 10"</string> - <string>-DSTANDALONE:BOOL=OFF</string> - <string>-DINSTALL_PROPRIETARY=TRUE</string> - <string>-DFMOD=TRUE</string> </array> </map> <key>name</key> @@ -2182,9 +2146,6 @@ <array> <string>-G</string> <string>"Visual Studio 10"</string> - <string>-DSTANDALONE:BOOL=FALSE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> </array> </map> <key>name</key> @@ -2224,9 +2185,6 @@ <array> <string>-G</string> <string>"Visual Studio 10"</string> - <string>-DSTANDALONE:BOOL=OFF</string> - <string>-DINSTALL_PROPRIETARY=TRUE</string> - <string>-DFMOD=TRUE</string> </array> </map> <key>default</key> @@ -2260,9 +2218,6 @@ <array> <string>-G</string> <string>"Visual Studio 10"</string> - <string>-DSTANDALONE:BOOL=FALSE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> </array> </map> <key>name</key> @@ -2303,9 +2258,6 @@ <array> <string>-G</string> <string>"Visual Studio 10"</string> - <string>-DSTANDALONE:BOOL=OFF</string> - <string>-DINSTALL_PROPRIETARY=TRUE</string> - <string>-DFMOD=TRUE</string> </array> </map> <key>name</key> @@ -2337,9 +2289,6 @@ <array> <string>-G</string> <string>"Visual Studio 10"</string> - <string>-DSTANDALONE:BOOL=FALSE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> </array> </map> <key>name</key> diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake index 77dd34d122..8c9c375790 100644 --- a/indra/cmake/Variables.cmake +++ b/indra/cmake/Variables.cmake @@ -135,6 +135,7 @@ set(VIEWER_LOGIN_CHANNEL ${VIEWER_CHANNEL} CACHE STRING "Fake login channel for set(VERSION_BUILD "0" CACHE STRING "Revision number passed in from the outside") set(STANDALONE OFF CACHE BOOL "Do not use Linden-supplied prebuilt libraries.") +set(UNATTENDED OFF CACHE BOOL "Should be set to ON for building with VC Express editions.") if (NOT STANDALONE AND EXISTS ${CMAKE_SOURCE_DIR}/llphysics) set(SERVER ON CACHE BOOL "Build Second Life server software.") -- cgit v1.2.3 From a1a5a793a70f62c977e97b7433840fcb70f47c03 Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Wed, 6 Apr 2011 08:13:44 -0400 Subject: fix line endings (one missing, two files of DOS) --- indra/llui/lllineeditor.cpp | 2 +- indra/newview/llphysicsmotion.cpp | 1402 ++++++++++++++++++------------------- indra/newview/llphysicsmotion.h | 248 +++---- 3 files changed, 826 insertions(+), 826 deletions(-) diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index 900742ed6c..d99ee5a545 100644 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -2294,4 +2294,4 @@ void LLLineEditor::setContextMenu(LLContextMenu* new_context_menu) void LLLineEditor::setFont(const LLFontGL* font) { mGLFont = font; -} \ No newline at end of file +} diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index acf8973f03..cb7a55320a 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -1,701 +1,701 @@ -/** - * @file llphysicsmotion.cpp - * @brief Implementation of LLPhysicsMotion class. - * - * $LicenseInfo:firstyear=2001&license=viewergpl$ - * - * Copyright (c) 2001-2009, Linden Research, Inc. - * - * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - * $/LicenseInfo$ - */ - -//----------------------------------------------------------------------------- -// Header Files -//----------------------------------------------------------------------------- -#include "llviewerprecompiledheaders.h" -#include "linden_common.h" - -#include "m3math.h" -#include "v3dmath.h" - -#include "llphysicsmotion.h" -#include "llcharacter.h" -#include "llviewercontrol.h" -#include "llviewervisualparam.h" -#include "llvoavatarself.h" - -typedef std::map<std::string, std::string> controller_map_t; -typedef std::map<std::string, F32> default_controller_map_t; - -#define MIN_REQUIRED_PIXEL_AREA_BREAST_MOTION 0.f; - -inline F64 llsgn(const F64 a) -{ - if (a >= 0) - return 1; - return -1; -} - -/* - At a high level, this works by setting temporary parameters that are not stored - in the avatar's list of params, and are not conveyed to other users. We accomplish - this by creating some new temporary driven params inside avatar_lad that are then driven - by the actual params that the user sees and sets. For example, in the old system, - the user sets a param called breast bouyancy, which controls the Z value of the breasts. - In our new system, the user still sets the breast bouyancy, but that param is redefined - as a driver param so that affects a new temporary driven param that the bounce is applied - to. -*/ - -class LLPhysicsMotion -{ -public: - /* - param_driver_name: The param that controls the params that are being affected by the physics. - joint_name: The joint that the body part is attached to. The joint is - used to determine the orientation (rotation) of the body part. - - character: The avatar that this physics affects. - - motion_direction_vec: The direction (in world coordinates) that determines the - motion. For example, (0,0,1) is up-down, and means that up-down motion is what - determines how this joint moves. - - controllers: The various settings (e.g. spring force, mass) that determine how - the body part behaves. - */ - LLPhysicsMotion(const std::string ¶m_driver_name, - const std::string &joint_name, - LLCharacter *character, - const LLVector3 &motion_direction_vec, - const controller_map_t &controllers) : - mParamDriverName(param_driver_name), - mJointName(joint_name), - mMotionDirectionVec(motion_direction_vec), - mParamDriver(NULL), - mParamControllers(controllers), - mCharacter(character), - mLastTime(0), - mPosition_local(0), - mVelocityJoint_local(0), - mPositionLastUpdate_local(0) - { - mJointState = new LLJointState; - } - - BOOL initialize(); - - ~LLPhysicsMotion() {} - - BOOL onUpdate(F32 time); - - LLPointer<LLJointState> getJointState() - { - return mJointState; - } -protected: - F32 getParamValue(const std::string& controller_key) - { - const controller_map_t::const_iterator& entry = mParamControllers.find(controller_key); - if (entry == mParamControllers.end()) - { - return sDefaultController[controller_key]; - } - const std::string& param_name = (*entry).second.c_str(); - return mCharacter->getVisualParamWeight(param_name.c_str()); - } - void setParamValue(LLViewerVisualParam *param, - const F32 new_value_local); - - F32 toLocal(const LLVector3 &world); - F32 calculateVelocity_local(const F32 time_delta); - F32 calculateAcceleration_local(F32 velocity_local, - const F32 time_delta); -private: - const std::string mParamDriverName; - const std::string mParamControllerName; - const LLVector3 mMotionDirectionVec; - const std::string mJointName; - - F32 mPosition_local; - F32 mVelocityJoint_local; // How fast the joint is moving - F32 mAccelerationJoint_local; // Acceleration on the joint - - F32 mVelocity_local; // How fast the param is moving - F32 mPositionLastUpdate_local; - LLVector3 mPosition_world; - - LLViewerVisualParam *mParamDriver; - const controller_map_t mParamControllers; - - LLPointer<LLJointState> mJointState; - LLCharacter *mCharacter; - - F32 mLastTime; - - static default_controller_map_t sDefaultController; -}; - -default_controller_map_t initDefaultController() -{ - default_controller_map_t controller; - controller["Mass"] = 0.2f; - controller["Gravity"] = 0.0f; - controller["Damping"] = .05f; - controller["Drag"] = 0.15f; - controller["MaxEffect"] = 0.1f; - controller["Spring"] = 0.1f; - controller["Gain"] = 10.0f; - return controller; -} - -default_controller_map_t LLPhysicsMotion::sDefaultController = initDefaultController(); - -BOOL LLPhysicsMotion::initialize() -{ - if (!mJointState->setJoint(mCharacter->getJoint(mJointName.c_str()))) - return FALSE; - mJointState->setUsage(LLJointState::ROT); - - mParamDriver = (LLViewerVisualParam*)mCharacter->getVisualParam(mParamDriverName.c_str()); - if (mParamDriver == NULL) - { - llinfos << "Failure reading in [ " << mParamDriverName << " ]" << llendl; - return FALSE; - } - - return TRUE; -} - -LLPhysicsMotionController::LLPhysicsMotionController(const LLUUID &id) : - LLMotion(id), - mCharacter(NULL) -{ - mName = "breast_motion"; -} - -LLPhysicsMotionController::~LLPhysicsMotionController() -{ - for (motion_vec_t::iterator iter = mMotions.begin(); - iter != mMotions.end(); - ++iter) - { - delete (*iter); - } -} - -BOOL LLPhysicsMotionController::onActivate() -{ - return TRUE; -} - -void LLPhysicsMotionController::onDeactivate() -{ -} - -LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter *character) -{ - mCharacter = character; - - mMotions.clear(); - - // Breast Cleavage - { - controller_map_t controller; - controller["Mass"] = "Breast_Physics_Mass"; - controller["Gravity"] = "Breast_Physics_Gravity"; - controller["Drag"] = "Breast_Physics_Drag"; - controller["Damping"] = "Breast_Physics_InOut_Damping"; - controller["MaxEffect"] = "Breast_Physics_InOut_Max_Effect"; - controller["Spring"] = "Breast_Physics_InOut_Spring"; - controller["Gain"] = "Breast_Physics_InOut_Gain"; - LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_InOut_Controller", - "mChest", - character, - LLVector3(-1,0,0), - controller); - if (!motion->initialize()) - { - llassert_always(FALSE); - return STATUS_FAILURE; - } - addMotion(motion); - } - - // Breast Bounce - { - controller_map_t controller; - controller["Mass"] = "Breast_Physics_Mass"; - controller["Gravity"] = "Breast_Physics_Gravity"; - controller["Drag"] = "Breast_Physics_Drag"; - controller["Damping"] = "Breast_Physics_UpDown_Damping"; - controller["MaxEffect"] = "Breast_Physics_UpDown_Max_Effect"; - controller["Spring"] = "Breast_Physics_UpDown_Spring"; - controller["Gain"] = "Breast_Physics_UpDown_Gain"; - LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_UpDown_Controller", - "mChest", - character, - LLVector3(0,0,1), - controller); - if (!motion->initialize()) - { - llassert_always(FALSE); - return STATUS_FAILURE; - } - addMotion(motion); - } - - // Breast Sway - { - controller_map_t controller; - controller["Mass"] = "Breast_Physics_Mass"; - controller["Gravity"] = "Breast_Physics_Gravity"; - controller["Drag"] = "Breast_Physics_Drag"; - controller["Damping"] = "Breast_Physics_LeftRight_Damping"; - controller["MaxEffect"] = "Breast_Physics_LeftRight_Max_Effect"; - controller["Spring"] = "Breast_Physics_LeftRight_Spring"; - controller["Gain"] = "Breast_Physics_LeftRight_Gain"; - LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_LeftRight_Controller", - "mChest", - character, - LLVector3(0,-1,0), - controller); - if (!motion->initialize()) - { - llassert_always(FALSE); - return STATUS_FAILURE; - } - addMotion(motion); - } - // Butt Bounce - { - controller_map_t controller; - controller["Mass"] = "Butt_Physics_Mass"; - controller["Gravity"] = "Butt_Physics_Gravity"; - controller["Drag"] = "Butt_Physics_Drag"; - controller["Damping"] = "Butt_Physics_UpDown_Damping"; - controller["MaxEffect"] = "Butt_Physics_UpDown_Max_Effect"; - controller["Spring"] = "Butt_Physics_UpDown_Spring"; - controller["Gain"] = "Butt_Physics_UpDown_Gain"; - LLPhysicsMotion *motion = new LLPhysicsMotion("Butt_Physics_UpDown_Controller", - "mPelvis", - character, - LLVector3(0,0,-1), - controller); - if (!motion->initialize()) - { - llassert_always(FALSE); - return STATUS_FAILURE; - } - addMotion(motion); - } - - // Butt LeftRight - { - controller_map_t controller; - controller["Mass"] = "Butt_Physics_Mass"; - controller["Gravity"] = "Butt_Physics_Gravity"; - controller["Drag"] = "Butt_Physics_Drag"; - controller["Damping"] = "Butt_Physics_LeftRight_Damping"; - controller["MaxEffect"] = "Butt_Physics_LeftRight_Max_Effect"; - controller["Spring"] = "Butt_Physics_LeftRight_Spring"; - controller["Gain"] = "Butt_Physics_LeftRight_Gain"; - LLPhysicsMotion *motion = new LLPhysicsMotion("Butt_Physics_LeftRight_Controller", - "mPelvis", - character, - LLVector3(0,-1,0), - controller); - if (!motion->initialize()) - { - llassert_always(FALSE); - return STATUS_FAILURE; - } - addMotion(motion); - } - - // Belly Bounce - { - controller_map_t controller; - controller["Mass"] = "Belly_Physics_Mass"; - controller["Gravity"] = "Belly_Physics_Gravity"; - controller["Drag"] = "Belly_Physics_Drag"; - controller["Damping"] = "Belly_Physics_UpDown_Damping"; - controller["MaxEffect"] = "Belly_Physics_UpDown_Max_Effect"; - controller["Spring"] = "Belly_Physics_UpDown_Spring"; - controller["Gain"] = "Belly_Physics_UpDown_Gain"; - LLPhysicsMotion *motion = new LLPhysicsMotion("Belly_Physics_UpDown_Controller", - "mPelvis", - character, - LLVector3(0,0,-1), - controller); - if (!motion->initialize()) - { - llassert_always(FALSE); - return STATUS_FAILURE; - } - addMotion(motion); - } - - return STATUS_SUCCESS; -} - -void LLPhysicsMotionController::addMotion(LLPhysicsMotion *motion) -{ - addJointState(motion->getJointState()); - mMotions.push_back(motion); -} - -F32 LLPhysicsMotionController::getMinPixelArea() -{ - return MIN_REQUIRED_PIXEL_AREA_BREAST_MOTION; -} - -// Local space means "parameter space". -F32 LLPhysicsMotion::toLocal(const LLVector3 &world) -{ - LLJoint *joint = mJointState->getJoint(); - const LLQuaternion rotation_world = joint->getWorldRotation(); - - LLVector3 dir_world = mMotionDirectionVec * rotation_world; - dir_world.normalize(); - return world * dir_world; -} - -F32 LLPhysicsMotion::calculateVelocity_local(const F32 time_delta) -{ - LLJoint *joint = mJointState->getJoint(); - const LLVector3 position_world = joint->getWorldPosition(); - const LLQuaternion rotation_world = joint->getWorldRotation(); - const LLVector3 last_position_world = mPosition_world; - const LLVector3 velocity_world = (position_world-last_position_world) / time_delta; - const F32 velocity_local = toLocal(velocity_world); - return velocity_local; -} - -F32 LLPhysicsMotion::calculateAcceleration_local(const F32 velocity_local, - const F32 time_delta) -{ -// const F32 smoothing = getParamValue("Smoothing"); - static const F32 smoothing = 3.0f; // Removed smoothing param since it's probably not necessary - const F32 acceleration_local = velocity_local - mVelocityJoint_local; - - const F32 smoothed_acceleration_local = - acceleration_local * 1.0/smoothing + - mAccelerationJoint_local * (smoothing-1.0)/smoothing; - - return smoothed_acceleration_local; -} - -BOOL LLPhysicsMotionController::onUpdate(F32 time, U8* joint_mask) -{ - // Skip if disabled globally. - if (!gSavedSettings.getBOOL("AvatarPhysics")) - { - return TRUE; - } - - BOOL update_visuals = FALSE; - for (motion_vec_t::iterator iter = mMotions.begin(); - iter != mMotions.end(); - ++iter) - { - LLPhysicsMotion *motion = (*iter); - update_visuals |= motion->onUpdate(time); - } - - if (update_visuals) - mCharacter->updateVisualParams(); - - return TRUE; -} - - -// Return TRUE if character has to update visual params. -BOOL LLPhysicsMotion::onUpdate(F32 time) -{ - // static FILE *mFileWrite = fopen("c:\\temp\\avatar_data.txt","w"); - - if (!mParamDriver) - return FALSE; - - if (!mLastTime) - { - mLastTime = time; - return FALSE; - } - - //////////////////////////////////////////////////////////////////////////////// - // Get all parameters and settings - // - - const F32 time_delta = time - mLastTime; - if (time_delta > 3.0 || time_delta <= 0.01) - { - mLastTime = time; - return FALSE; - } - - // Higher LOD is better. This controls the granularity - // and frequency of updates for the motions. - const F32 lod_factor = LLVOAvatar::sPhysicsLODFactor; - if (lod_factor == 0) - { - return TRUE; - } - - LLJoint *joint = mJointState->getJoint(); - - const F32 behavior_mass = getParamValue("Mass"); - const F32 behavior_gravity = getParamValue("Gravity"); - const F32 behavior_spring = getParamValue("Spring"); - const F32 behavior_gain = getParamValue("Gain"); - const F32 behavior_damping = getParamValue("Damping"); - const F32 behavior_drag = getParamValue("Drag"); - const BOOL physics_test = gSavedSettings.getBOOL("AvatarPhysicsTest"); - - F32 behavior_maxeffect = getParamValue("MaxEffect"); - if (physics_test) - behavior_maxeffect = 1.0f; - // Maximum effect is [0,1] range. - const F32 min_val = 0.5f-behavior_maxeffect/2.0; - const F32 max_val = 0.5f+behavior_maxeffect/2.0; - - // mPositon_local should be in normalized 0,1 range already. Just making sure... - F32 position_current_local = llclamp(mPosition_local, - 0.0f, - 1.0f); - - // Normalize the param position to be from [0,1]. - // We have to use normalized values because there may be more than one driven param, - // and each of these driven params may have its own range. - // This means we'll do all our calculations in normalized [0,1] local coordinates. - F32 position_user_local = mParamDriver->getWeight(); - position_user_local = (position_user_local - mParamDriver->getMinWeight()) / (mParamDriver->getMaxWeight() - mParamDriver->getMinWeight()); - - // If the effect is turned off then don't process unless we need one more update - // to set the position to the default (i.e. user) position. - if ((behavior_maxeffect == 0) && (position_current_local == position_user_local)) - { - return FALSE; - } - - // - // End parameters and settings - //////////////////////////////////////////////////////////////////////////////// - - - //////////////////////////////////////////////////////////////////////////////// - // Calculate velocity and acceleration in parameter space. - // - - const F32 velocity_joint_local = calculateVelocity_local(time_delta); - const F32 acceleration_joint_local = calculateAcceleration_local(velocity_joint_local, time_delta); - - // - // End velocity and acceleration - //////////////////////////////////////////////////////////////////////////////// - - - //////////////////////////////////////////////////////////////////////////////// - // Calculate the total force - // - - // Spring force is a restoring force towards the original user-set breast position. - // F = kx - const F32 spring_length = position_current_local - position_user_local; - const F32 force_spring = -spring_length * behavior_spring; - - // Acceleration is the force that comes from the change in velocity of the torso. - // F = ma - const F32 force_accel = behavior_gain * (acceleration_joint_local * behavior_mass); - - // Gravity always points downward in world space. - // F = mg - const LLVector3 gravity_world(0,0,1); - const F32 force_gravity = behavior_gain * (toLocal(gravity_world) * behavior_gravity * behavior_mass); - - // Damping is a restoring force that opposes the current velocity. - // F = -kv - const F32 force_damping = -behavior_damping * mVelocity_local; - - // Drag is a force imparted by velocity (intuitively it is similar to wind resistance) - // F = .5kv^2 - const F32 force_drag = .5*behavior_drag*velocity_joint_local*velocity_joint_local*llsgn(velocity_joint_local); - - const F32 force_net = (force_accel + - force_gravity + - force_spring + - force_damping + - force_drag); - - // - // End total force - //////////////////////////////////////////////////////////////////////////////// - - - //////////////////////////////////////////////////////////////////////////////// - // Calculate new params - // - - // Calculate the new acceleration based on the net force. - // a = F/m - const F32 acceleration_new_local = force_net / behavior_mass; - static const F32 max_acceleration = 10.0f; // magic number, used to be customizable. - F32 velocity_new_local = mVelocity_local + acceleration_new_local; - velocity_new_local = llclamp(velocity_new_local, - -max_acceleration, max_acceleration); - - // Temporary debugging setting to cause all avatars to move, for profiling purposes. - if (physics_test) - { - velocity_new_local = sin(time*4.0); - } - // Calculate the new parameters, or remain unchanged if max speed is 0. - F32 position_new_local = position_current_local + velocity_new_local*time_delta; - if (behavior_maxeffect == 0) - position_new_local = position_user_local; - - // Zero out the velocity if the param is being pushed beyond its limits. - if ((position_new_local < min_val && velocity_new_local < 0) || - (position_new_local > max_val && velocity_new_local > 0)) - { - velocity_new_local = 0; - } - - const F32 position_new_local_clamped = llclamp(position_new_local, - min_val, - max_val); - - LLDriverParam *driver_param = dynamic_cast<LLDriverParam *>(mParamDriver); - llassert_always(driver_param); - if (driver_param) - { - // If this is one of our "hidden" driver params, then make sure it's - // the default value. - if ((driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) && - (driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT)) - { - mCharacter->setVisualParamWeight(driver_param, - 0, - FALSE); - } - for (LLDriverParam::entry_list_t::iterator iter = driver_param->mDriven.begin(); - iter != driver_param->mDriven.end(); - ++iter) - { - LLDrivenEntry &entry = (*iter); - LLViewerVisualParam *driven_param = entry.mParam; - setParamValue(driven_param,position_new_local_clamped); - } - } - - // - // End calculate new params - //////////////////////////////////////////////////////////////////////////////// - - //////////////////////////////////////////////////////////////////////////////// - // Conditionally update the visual params - // - - // Updating the visual params (i.e. what the user sees) is fairly expensive. - // So only update if the params have changed enough, and also take into account - // the graphics LOD settings. - - BOOL update_visuals = FALSE; - - // For non-self, if the avatar is small enough visually, then don't update. - const F32 area_for_max_settings = 0.0; - const F32 area_for_min_settings = 1400.0; - const F32 area_for_this_setting = area_for_max_settings + (area_for_min_settings-area_for_max_settings)*(1.0-lod_factor); - const F32 pixel_area = fsqrtf(mCharacter->getPixelArea()); - - const BOOL is_self = (dynamic_cast<LLVOAvatarSelf *>(mCharacter) != NULL); - if ((pixel_area > area_for_this_setting) || is_self) - { - const F32 position_diff_local = llabs(mPositionLastUpdate_local-position_new_local_clamped); - const F32 min_delta = (1.01f-lod_factor)*0.4f; - if (llabs(position_diff_local) > min_delta) - { - update_visuals = TRUE; - mPositionLastUpdate_local = position_new_local; - } - } - - // - // End update visual params - //////////////////////////////////////////////////////////////////////////////// - - mVelocityJoint_local = velocity_joint_local; - - mVelocity_local = velocity_new_local; - mAccelerationJoint_local = acceleration_joint_local; - mPosition_local = position_new_local; - - mPosition_world = joint->getWorldPosition(); - mLastTime = time; - - /* - // Write out debugging info into a spreadsheet. - if (mFileWrite != NULL && is_self) - { - fprintf(mFileWrite,"%f\t%f\t%f \t\t%f \t\t%f\t%f\t%f\t \t\t%f\t%f\t%f\t%f\t%f \t\t%f\t%f\t%f\n", - position_new_local, - velocity_new_local, - acceleration_new_local, - - time_delta, - - mPosition_world[0], - mPosition_world[1], - mPosition_world[2], - - force_net, - force_spring, - force_accel, - force_damping, - force_drag, - - spring_length, - velocity_joint_local, - acceleration_joint_local - ); - } - */ - - return update_visuals; -} - -// Range of new_value_local is assumed to be [0 , 1] normalized. -void LLPhysicsMotion::setParamValue(LLViewerVisualParam *param, - F32 new_value_normalized) -{ - const F32 value_min_local = param->getMinWeight(); - const F32 value_max_local = param->getMaxWeight(); - - const F32 new_value_local = value_min_local + (value_max_local-value_min_local) * new_value_normalized; - - mCharacter->setVisualParamWeight(param, - new_value_local, - FALSE); -} +/** + * @file llphysicsmotion.cpp + * @brief Implementation of LLPhysicsMotion class. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +//----------------------------------------------------------------------------- +// Header Files +//----------------------------------------------------------------------------- +#include "llviewerprecompiledheaders.h" +#include "linden_common.h" + +#include "m3math.h" +#include "v3dmath.h" + +#include "llphysicsmotion.h" +#include "llcharacter.h" +#include "llviewercontrol.h" +#include "llviewervisualparam.h" +#include "llvoavatarself.h" + +typedef std::map<std::string, std::string> controller_map_t; +typedef std::map<std::string, F32> default_controller_map_t; + +#define MIN_REQUIRED_PIXEL_AREA_BREAST_MOTION 0.f; + +inline F64 llsgn(const F64 a) +{ + if (a >= 0) + return 1; + return -1; +} + +/* + At a high level, this works by setting temporary parameters that are not stored + in the avatar's list of params, and are not conveyed to other users. We accomplish + this by creating some new temporary driven params inside avatar_lad that are then driven + by the actual params that the user sees and sets. For example, in the old system, + the user sets a param called breast bouyancy, which controls the Z value of the breasts. + In our new system, the user still sets the breast bouyancy, but that param is redefined + as a driver param so that affects a new temporary driven param that the bounce is applied + to. +*/ + +class LLPhysicsMotion +{ +public: + /* + param_driver_name: The param that controls the params that are being affected by the physics. + joint_name: The joint that the body part is attached to. The joint is + used to determine the orientation (rotation) of the body part. + + character: The avatar that this physics affects. + + motion_direction_vec: The direction (in world coordinates) that determines the + motion. For example, (0,0,1) is up-down, and means that up-down motion is what + determines how this joint moves. + + controllers: The various settings (e.g. spring force, mass) that determine how + the body part behaves. + */ + LLPhysicsMotion(const std::string ¶m_driver_name, + const std::string &joint_name, + LLCharacter *character, + const LLVector3 &motion_direction_vec, + const controller_map_t &controllers) : + mParamDriverName(param_driver_name), + mJointName(joint_name), + mMotionDirectionVec(motion_direction_vec), + mParamDriver(NULL), + mParamControllers(controllers), + mCharacter(character), + mLastTime(0), + mPosition_local(0), + mVelocityJoint_local(0), + mPositionLastUpdate_local(0) + { + mJointState = new LLJointState; + } + + BOOL initialize(); + + ~LLPhysicsMotion() {} + + BOOL onUpdate(F32 time); + + LLPointer<LLJointState> getJointState() + { + return mJointState; + } +protected: + F32 getParamValue(const std::string& controller_key) + { + const controller_map_t::const_iterator& entry = mParamControllers.find(controller_key); + if (entry == mParamControllers.end()) + { + return sDefaultController[controller_key]; + } + const std::string& param_name = (*entry).second.c_str(); + return mCharacter->getVisualParamWeight(param_name.c_str()); + } + void setParamValue(LLViewerVisualParam *param, + const F32 new_value_local); + + F32 toLocal(const LLVector3 &world); + F32 calculateVelocity_local(const F32 time_delta); + F32 calculateAcceleration_local(F32 velocity_local, + const F32 time_delta); +private: + const std::string mParamDriverName; + const std::string mParamControllerName; + const LLVector3 mMotionDirectionVec; + const std::string mJointName; + + F32 mPosition_local; + F32 mVelocityJoint_local; // How fast the joint is moving + F32 mAccelerationJoint_local; // Acceleration on the joint + + F32 mVelocity_local; // How fast the param is moving + F32 mPositionLastUpdate_local; + LLVector3 mPosition_world; + + LLViewerVisualParam *mParamDriver; + const controller_map_t mParamControllers; + + LLPointer<LLJointState> mJointState; + LLCharacter *mCharacter; + + F32 mLastTime; + + static default_controller_map_t sDefaultController; +}; + +default_controller_map_t initDefaultController() +{ + default_controller_map_t controller; + controller["Mass"] = 0.2f; + controller["Gravity"] = 0.0f; + controller["Damping"] = .05f; + controller["Drag"] = 0.15f; + controller["MaxEffect"] = 0.1f; + controller["Spring"] = 0.1f; + controller["Gain"] = 10.0f; + return controller; +} + +default_controller_map_t LLPhysicsMotion::sDefaultController = initDefaultController(); + +BOOL LLPhysicsMotion::initialize() +{ + if (!mJointState->setJoint(mCharacter->getJoint(mJointName.c_str()))) + return FALSE; + mJointState->setUsage(LLJointState::ROT); + + mParamDriver = (LLViewerVisualParam*)mCharacter->getVisualParam(mParamDriverName.c_str()); + if (mParamDriver == NULL) + { + llinfos << "Failure reading in [ " << mParamDriverName << " ]" << llendl; + return FALSE; + } + + return TRUE; +} + +LLPhysicsMotionController::LLPhysicsMotionController(const LLUUID &id) : + LLMotion(id), + mCharacter(NULL) +{ + mName = "breast_motion"; +} + +LLPhysicsMotionController::~LLPhysicsMotionController() +{ + for (motion_vec_t::iterator iter = mMotions.begin(); + iter != mMotions.end(); + ++iter) + { + delete (*iter); + } +} + +BOOL LLPhysicsMotionController::onActivate() +{ + return TRUE; +} + +void LLPhysicsMotionController::onDeactivate() +{ +} + +LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter *character) +{ + mCharacter = character; + + mMotions.clear(); + + // Breast Cleavage + { + controller_map_t controller; + controller["Mass"] = "Breast_Physics_Mass"; + controller["Gravity"] = "Breast_Physics_Gravity"; + controller["Drag"] = "Breast_Physics_Drag"; + controller["Damping"] = "Breast_Physics_InOut_Damping"; + controller["MaxEffect"] = "Breast_Physics_InOut_Max_Effect"; + controller["Spring"] = "Breast_Physics_InOut_Spring"; + controller["Gain"] = "Breast_Physics_InOut_Gain"; + LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_InOut_Controller", + "mChest", + character, + LLVector3(-1,0,0), + controller); + if (!motion->initialize()) + { + llassert_always(FALSE); + return STATUS_FAILURE; + } + addMotion(motion); + } + + // Breast Bounce + { + controller_map_t controller; + controller["Mass"] = "Breast_Physics_Mass"; + controller["Gravity"] = "Breast_Physics_Gravity"; + controller["Drag"] = "Breast_Physics_Drag"; + controller["Damping"] = "Breast_Physics_UpDown_Damping"; + controller["MaxEffect"] = "Breast_Physics_UpDown_Max_Effect"; + controller["Spring"] = "Breast_Physics_UpDown_Spring"; + controller["Gain"] = "Breast_Physics_UpDown_Gain"; + LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_UpDown_Controller", + "mChest", + character, + LLVector3(0,0,1), + controller); + if (!motion->initialize()) + { + llassert_always(FALSE); + return STATUS_FAILURE; + } + addMotion(motion); + } + + // Breast Sway + { + controller_map_t controller; + controller["Mass"] = "Breast_Physics_Mass"; + controller["Gravity"] = "Breast_Physics_Gravity"; + controller["Drag"] = "Breast_Physics_Drag"; + controller["Damping"] = "Breast_Physics_LeftRight_Damping"; + controller["MaxEffect"] = "Breast_Physics_LeftRight_Max_Effect"; + controller["Spring"] = "Breast_Physics_LeftRight_Spring"; + controller["Gain"] = "Breast_Physics_LeftRight_Gain"; + LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_LeftRight_Controller", + "mChest", + character, + LLVector3(0,-1,0), + controller); + if (!motion->initialize()) + { + llassert_always(FALSE); + return STATUS_FAILURE; + } + addMotion(motion); + } + // Butt Bounce + { + controller_map_t controller; + controller["Mass"] = "Butt_Physics_Mass"; + controller["Gravity"] = "Butt_Physics_Gravity"; + controller["Drag"] = "Butt_Physics_Drag"; + controller["Damping"] = "Butt_Physics_UpDown_Damping"; + controller["MaxEffect"] = "Butt_Physics_UpDown_Max_Effect"; + controller["Spring"] = "Butt_Physics_UpDown_Spring"; + controller["Gain"] = "Butt_Physics_UpDown_Gain"; + LLPhysicsMotion *motion = new LLPhysicsMotion("Butt_Physics_UpDown_Controller", + "mPelvis", + character, + LLVector3(0,0,-1), + controller); + if (!motion->initialize()) + { + llassert_always(FALSE); + return STATUS_FAILURE; + } + addMotion(motion); + } + + // Butt LeftRight + { + controller_map_t controller; + controller["Mass"] = "Butt_Physics_Mass"; + controller["Gravity"] = "Butt_Physics_Gravity"; + controller["Drag"] = "Butt_Physics_Drag"; + controller["Damping"] = "Butt_Physics_LeftRight_Damping"; + controller["MaxEffect"] = "Butt_Physics_LeftRight_Max_Effect"; + controller["Spring"] = "Butt_Physics_LeftRight_Spring"; + controller["Gain"] = "Butt_Physics_LeftRight_Gain"; + LLPhysicsMotion *motion = new LLPhysicsMotion("Butt_Physics_LeftRight_Controller", + "mPelvis", + character, + LLVector3(0,-1,0), + controller); + if (!motion->initialize()) + { + llassert_always(FALSE); + return STATUS_FAILURE; + } + addMotion(motion); + } + + // Belly Bounce + { + controller_map_t controller; + controller["Mass"] = "Belly_Physics_Mass"; + controller["Gravity"] = "Belly_Physics_Gravity"; + controller["Drag"] = "Belly_Physics_Drag"; + controller["Damping"] = "Belly_Physics_UpDown_Damping"; + controller["MaxEffect"] = "Belly_Physics_UpDown_Max_Effect"; + controller["Spring"] = "Belly_Physics_UpDown_Spring"; + controller["Gain"] = "Belly_Physics_UpDown_Gain"; + LLPhysicsMotion *motion = new LLPhysicsMotion("Belly_Physics_UpDown_Controller", + "mPelvis", + character, + LLVector3(0,0,-1), + controller); + if (!motion->initialize()) + { + llassert_always(FALSE); + return STATUS_FAILURE; + } + addMotion(motion); + } + + return STATUS_SUCCESS; +} + +void LLPhysicsMotionController::addMotion(LLPhysicsMotion *motion) +{ + addJointState(motion->getJointState()); + mMotions.push_back(motion); +} + +F32 LLPhysicsMotionController::getMinPixelArea() +{ + return MIN_REQUIRED_PIXEL_AREA_BREAST_MOTION; +} + +// Local space means "parameter space". +F32 LLPhysicsMotion::toLocal(const LLVector3 &world) +{ + LLJoint *joint = mJointState->getJoint(); + const LLQuaternion rotation_world = joint->getWorldRotation(); + + LLVector3 dir_world = mMotionDirectionVec * rotation_world; + dir_world.normalize(); + return world * dir_world; +} + +F32 LLPhysicsMotion::calculateVelocity_local(const F32 time_delta) +{ + LLJoint *joint = mJointState->getJoint(); + const LLVector3 position_world = joint->getWorldPosition(); + const LLQuaternion rotation_world = joint->getWorldRotation(); + const LLVector3 last_position_world = mPosition_world; + const LLVector3 velocity_world = (position_world-last_position_world) / time_delta; + const F32 velocity_local = toLocal(velocity_world); + return velocity_local; +} + +F32 LLPhysicsMotion::calculateAcceleration_local(const F32 velocity_local, + const F32 time_delta) +{ +// const F32 smoothing = getParamValue("Smoothing"); + static const F32 smoothing = 3.0f; // Removed smoothing param since it's probably not necessary + const F32 acceleration_local = velocity_local - mVelocityJoint_local; + + const F32 smoothed_acceleration_local = + acceleration_local * 1.0/smoothing + + mAccelerationJoint_local * (smoothing-1.0)/smoothing; + + return smoothed_acceleration_local; +} + +BOOL LLPhysicsMotionController::onUpdate(F32 time, U8* joint_mask) +{ + // Skip if disabled globally. + if (!gSavedSettings.getBOOL("AvatarPhysics")) + { + return TRUE; + } + + BOOL update_visuals = FALSE; + for (motion_vec_t::iterator iter = mMotions.begin(); + iter != mMotions.end(); + ++iter) + { + LLPhysicsMotion *motion = (*iter); + update_visuals |= motion->onUpdate(time); + } + + if (update_visuals) + mCharacter->updateVisualParams(); + + return TRUE; +} + + +// Return TRUE if character has to update visual params. +BOOL LLPhysicsMotion::onUpdate(F32 time) +{ + // static FILE *mFileWrite = fopen("c:\\temp\\avatar_data.txt","w"); + + if (!mParamDriver) + return FALSE; + + if (!mLastTime) + { + mLastTime = time; + return FALSE; + } + + //////////////////////////////////////////////////////////////////////////////// + // Get all parameters and settings + // + + const F32 time_delta = time - mLastTime; + if (time_delta > 3.0 || time_delta <= 0.01) + { + mLastTime = time; + return FALSE; + } + + // Higher LOD is better. This controls the granularity + // and frequency of updates for the motions. + const F32 lod_factor = LLVOAvatar::sPhysicsLODFactor; + if (lod_factor == 0) + { + return TRUE; + } + + LLJoint *joint = mJointState->getJoint(); + + const F32 behavior_mass = getParamValue("Mass"); + const F32 behavior_gravity = getParamValue("Gravity"); + const F32 behavior_spring = getParamValue("Spring"); + const F32 behavior_gain = getParamValue("Gain"); + const F32 behavior_damping = getParamValue("Damping"); + const F32 behavior_drag = getParamValue("Drag"); + const BOOL physics_test = gSavedSettings.getBOOL("AvatarPhysicsTest"); + + F32 behavior_maxeffect = getParamValue("MaxEffect"); + if (physics_test) + behavior_maxeffect = 1.0f; + // Maximum effect is [0,1] range. + const F32 min_val = 0.5f-behavior_maxeffect/2.0; + const F32 max_val = 0.5f+behavior_maxeffect/2.0; + + // mPositon_local should be in normalized 0,1 range already. Just making sure... + F32 position_current_local = llclamp(mPosition_local, + 0.0f, + 1.0f); + + // Normalize the param position to be from [0,1]. + // We have to use normalized values because there may be more than one driven param, + // and each of these driven params may have its own range. + // This means we'll do all our calculations in normalized [0,1] local coordinates. + F32 position_user_local = mParamDriver->getWeight(); + position_user_local = (position_user_local - mParamDriver->getMinWeight()) / (mParamDriver->getMaxWeight() - mParamDriver->getMinWeight()); + + // If the effect is turned off then don't process unless we need one more update + // to set the position to the default (i.e. user) position. + if ((behavior_maxeffect == 0) && (position_current_local == position_user_local)) + { + return FALSE; + } + + // + // End parameters and settings + //////////////////////////////////////////////////////////////////////////////// + + + //////////////////////////////////////////////////////////////////////////////// + // Calculate velocity and acceleration in parameter space. + // + + const F32 velocity_joint_local = calculateVelocity_local(time_delta); + const F32 acceleration_joint_local = calculateAcceleration_local(velocity_joint_local, time_delta); + + // + // End velocity and acceleration + //////////////////////////////////////////////////////////////////////////////// + + + //////////////////////////////////////////////////////////////////////////////// + // Calculate the total force + // + + // Spring force is a restoring force towards the original user-set breast position. + // F = kx + const F32 spring_length = position_current_local - position_user_local; + const F32 force_spring = -spring_length * behavior_spring; + + // Acceleration is the force that comes from the change in velocity of the torso. + // F = ma + const F32 force_accel = behavior_gain * (acceleration_joint_local * behavior_mass); + + // Gravity always points downward in world space. + // F = mg + const LLVector3 gravity_world(0,0,1); + const F32 force_gravity = behavior_gain * (toLocal(gravity_world) * behavior_gravity * behavior_mass); + + // Damping is a restoring force that opposes the current velocity. + // F = -kv + const F32 force_damping = -behavior_damping * mVelocity_local; + + // Drag is a force imparted by velocity (intuitively it is similar to wind resistance) + // F = .5kv^2 + const F32 force_drag = .5*behavior_drag*velocity_joint_local*velocity_joint_local*llsgn(velocity_joint_local); + + const F32 force_net = (force_accel + + force_gravity + + force_spring + + force_damping + + force_drag); + + // + // End total force + //////////////////////////////////////////////////////////////////////////////// + + + //////////////////////////////////////////////////////////////////////////////// + // Calculate new params + // + + // Calculate the new acceleration based on the net force. + // a = F/m + const F32 acceleration_new_local = force_net / behavior_mass; + static const F32 max_acceleration = 10.0f; // magic number, used to be customizable. + F32 velocity_new_local = mVelocity_local + acceleration_new_local; + velocity_new_local = llclamp(velocity_new_local, + -max_acceleration, max_acceleration); + + // Temporary debugging setting to cause all avatars to move, for profiling purposes. + if (physics_test) + { + velocity_new_local = sin(time*4.0); + } + // Calculate the new parameters, or remain unchanged if max speed is 0. + F32 position_new_local = position_current_local + velocity_new_local*time_delta; + if (behavior_maxeffect == 0) + position_new_local = position_user_local; + + // Zero out the velocity if the param is being pushed beyond its limits. + if ((position_new_local < min_val && velocity_new_local < 0) || + (position_new_local > max_val && velocity_new_local > 0)) + { + velocity_new_local = 0; + } + + const F32 position_new_local_clamped = llclamp(position_new_local, + min_val, + max_val); + + LLDriverParam *driver_param = dynamic_cast<LLDriverParam *>(mParamDriver); + llassert_always(driver_param); + if (driver_param) + { + // If this is one of our "hidden" driver params, then make sure it's + // the default value. + if ((driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) && + (driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT)) + { + mCharacter->setVisualParamWeight(driver_param, + 0, + FALSE); + } + for (LLDriverParam::entry_list_t::iterator iter = driver_param->mDriven.begin(); + iter != driver_param->mDriven.end(); + ++iter) + { + LLDrivenEntry &entry = (*iter); + LLViewerVisualParam *driven_param = entry.mParam; + setParamValue(driven_param,position_new_local_clamped); + } + } + + // + // End calculate new params + //////////////////////////////////////////////////////////////////////////////// + + //////////////////////////////////////////////////////////////////////////////// + // Conditionally update the visual params + // + + // Updating the visual params (i.e. what the user sees) is fairly expensive. + // So only update if the params have changed enough, and also take into account + // the graphics LOD settings. + + BOOL update_visuals = FALSE; + + // For non-self, if the avatar is small enough visually, then don't update. + const F32 area_for_max_settings = 0.0; + const F32 area_for_min_settings = 1400.0; + const F32 area_for_this_setting = area_for_max_settings + (area_for_min_settings-area_for_max_settings)*(1.0-lod_factor); + const F32 pixel_area = fsqrtf(mCharacter->getPixelArea()); + + const BOOL is_self = (dynamic_cast<LLVOAvatarSelf *>(mCharacter) != NULL); + if ((pixel_area > area_for_this_setting) || is_self) + { + const F32 position_diff_local = llabs(mPositionLastUpdate_local-position_new_local_clamped); + const F32 min_delta = (1.01f-lod_factor)*0.4f; + if (llabs(position_diff_local) > min_delta) + { + update_visuals = TRUE; + mPositionLastUpdate_local = position_new_local; + } + } + + // + // End update visual params + //////////////////////////////////////////////////////////////////////////////// + + mVelocityJoint_local = velocity_joint_local; + + mVelocity_local = velocity_new_local; + mAccelerationJoint_local = acceleration_joint_local; + mPosition_local = position_new_local; + + mPosition_world = joint->getWorldPosition(); + mLastTime = time; + + /* + // Write out debugging info into a spreadsheet. + if (mFileWrite != NULL && is_self) + { + fprintf(mFileWrite,"%f\t%f\t%f \t\t%f \t\t%f\t%f\t%f\t \t\t%f\t%f\t%f\t%f\t%f \t\t%f\t%f\t%f\n", + position_new_local, + velocity_new_local, + acceleration_new_local, + + time_delta, + + mPosition_world[0], + mPosition_world[1], + mPosition_world[2], + + force_net, + force_spring, + force_accel, + force_damping, + force_drag, + + spring_length, + velocity_joint_local, + acceleration_joint_local + ); + } + */ + + return update_visuals; +} + +// Range of new_value_local is assumed to be [0 , 1] normalized. +void LLPhysicsMotion::setParamValue(LLViewerVisualParam *param, + F32 new_value_normalized) +{ + const F32 value_min_local = param->getMinWeight(); + const F32 value_max_local = param->getMaxWeight(); + + const F32 new_value_local = value_min_local + (value_max_local-value_min_local) * new_value_normalized; + + mCharacter->setVisualParamWeight(param, + new_value_local, + FALSE); +} diff --git a/indra/newview/llphysicsmotion.h b/indra/newview/llphysicsmotion.h index 0c0087d269..657698e4f2 100644 --- a/indra/newview/llphysicsmotion.h +++ b/indra/newview/llphysicsmotion.h @@ -1,124 +1,124 @@ -/** - * @file llphysicsmotion.h - * @brief Implementation of LLPhysicsMotion class. - * - * $LicenseInfo:firstyear=2001&license=viewergpl$ - * - * Copyright (c) 2001-2009, Linden Research, Inc. - * - * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - * $/LicenseInfo$ - */ - -#ifndef LL_LLPHYSICSMOTIONCONTROLLER_H -#define LL_LLPHYSICSMOTIONCONTROLLER_H - -//----------------------------------------------------------------------------- -// Header files -//----------------------------------------------------------------------------- -#include "llmotion.h" -#include "llframetimer.h" - -#define PHYSICS_MOTION_FADEIN_TIME 1.0f -#define PHYSICS_MOTION_FADEOUT_TIME 1.0f - -class LLPhysicsMotion; - -//----------------------------------------------------------------------------- -// class LLPhysicsMotion -//----------------------------------------------------------------------------- -class LLPhysicsMotionController : - public LLMotion -{ -public: - // Constructor - LLPhysicsMotionController(const LLUUID &id); - - // Destructor - virtual ~LLPhysicsMotionController(); - -public: - //------------------------------------------------------------------------- - // functions to support MotionController and MotionRegistry - //------------------------------------------------------------------------- - - // static constructor - // all subclasses must implement such a function and register it - static LLMotion *create(const LLUUID &id) { return new LLPhysicsMotionController(id); } - -public: - //------------------------------------------------------------------------- - // animation callbacks to be implemented by subclasses - //------------------------------------------------------------------------- - - // motions must specify whether or not they loop - virtual BOOL getLoop() { return TRUE; } - - // motions must report their total duration - virtual F32 getDuration() { return 0.0; } - - // motions must report their "ease in" duration - virtual F32 getEaseInDuration() { return PHYSICS_MOTION_FADEIN_TIME; } - - // motions must report their "ease out" duration. - virtual F32 getEaseOutDuration() { return PHYSICS_MOTION_FADEOUT_TIME; } - - // called to determine when a motion should be activated/deactivated based on avatar pixel coverage - virtual F32 getMinPixelArea(); - - // motions must report their priority - virtual LLJoint::JointPriority getPriority() { return LLJoint::MEDIUM_PRIORITY; } - - virtual LLMotionBlendType getBlendType() { return ADDITIVE_BLEND; } - - // run-time (post constructor) initialization, - // called after parameters have been set - // must return true to indicate success and be available for activation - virtual LLMotionInitStatus onInitialize(LLCharacter *character); - - // called when a motion is activated - // must return TRUE to indicate success, or else - // it will be deactivated - virtual BOOL onActivate(); - - // called per time step - // must return TRUE while it is active, and - // must return FALSE when the motion is completed. - virtual BOOL onUpdate(F32 time, U8* joint_mask); - - // called when a motion is deactivated - virtual void onDeactivate(); - - LLCharacter* getCharacter() { return mCharacter; } - -protected: - void addMotion(LLPhysicsMotion *motion); -private: - LLCharacter* mCharacter; - - typedef std::vector<LLPhysicsMotion *> motion_vec_t; - motion_vec_t mMotions; -}; - -#endif // LL_LLPHYSICSMOTION_H - +/** + * @file llphysicsmotion.h + * @brief Implementation of LLPhysicsMotion class. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLPHYSICSMOTIONCONTROLLER_H +#define LL_LLPHYSICSMOTIONCONTROLLER_H + +//----------------------------------------------------------------------------- +// Header files +//----------------------------------------------------------------------------- +#include "llmotion.h" +#include "llframetimer.h" + +#define PHYSICS_MOTION_FADEIN_TIME 1.0f +#define PHYSICS_MOTION_FADEOUT_TIME 1.0f + +class LLPhysicsMotion; + +//----------------------------------------------------------------------------- +// class LLPhysicsMotion +//----------------------------------------------------------------------------- +class LLPhysicsMotionController : + public LLMotion +{ +public: + // Constructor + LLPhysicsMotionController(const LLUUID &id); + + // Destructor + virtual ~LLPhysicsMotionController(); + +public: + //------------------------------------------------------------------------- + // functions to support MotionController and MotionRegistry + //------------------------------------------------------------------------- + + // static constructor + // all subclasses must implement such a function and register it + static LLMotion *create(const LLUUID &id) { return new LLPhysicsMotionController(id); } + +public: + //------------------------------------------------------------------------- + // animation callbacks to be implemented by subclasses + //------------------------------------------------------------------------- + + // motions must specify whether or not they loop + virtual BOOL getLoop() { return TRUE; } + + // motions must report their total duration + virtual F32 getDuration() { return 0.0; } + + // motions must report their "ease in" duration + virtual F32 getEaseInDuration() { return PHYSICS_MOTION_FADEIN_TIME; } + + // motions must report their "ease out" duration. + virtual F32 getEaseOutDuration() { return PHYSICS_MOTION_FADEOUT_TIME; } + + // called to determine when a motion should be activated/deactivated based on avatar pixel coverage + virtual F32 getMinPixelArea(); + + // motions must report their priority + virtual LLJoint::JointPriority getPriority() { return LLJoint::MEDIUM_PRIORITY; } + + virtual LLMotionBlendType getBlendType() { return ADDITIVE_BLEND; } + + // run-time (post constructor) initialization, + // called after parameters have been set + // must return true to indicate success and be available for activation + virtual LLMotionInitStatus onInitialize(LLCharacter *character); + + // called when a motion is activated + // must return TRUE to indicate success, or else + // it will be deactivated + virtual BOOL onActivate(); + + // called per time step + // must return TRUE while it is active, and + // must return FALSE when the motion is completed. + virtual BOOL onUpdate(F32 time, U8* joint_mask); + + // called when a motion is deactivated + virtual void onDeactivate(); + + LLCharacter* getCharacter() { return mCharacter; } + +protected: + void addMotion(LLPhysicsMotion *motion); +private: + LLCharacter* mCharacter; + + typedef std::vector<LLPhysicsMotion *> motion_vec_t; + motion_vec_t mMotions; +}; + +#endif // LL_LLPHYSICSMOTION_H + -- cgit v1.2.3 From ee3048285f33d63a53cc12d66230e8c8b50cda3c Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Wed, 6 Apr 2011 12:30:39 -0400 Subject: For SH-1308 Edit Physics sometimes messes up camera Removed camera switching for phyics wearables. --- indra/newview/llpaneleditwearable.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp index 8bd2d5ad6a..cb8fbd66b5 100644 --- a/indra/newview/llpaneleditwearable.cpp +++ b/indra/newview/llpaneleditwearable.cpp @@ -1196,6 +1196,12 @@ void LLPanelEditWearable::onTabExpandedCollapsed(const LLSD& param, U8 index) void LLPanelEditWearable::changeCamera(U8 subpart) { + // Don't change the camera if this type doesn't have a camera switch. + // Useful for wearables like physics that don't have an associated physical body part. + if (LLWearableType::getDisableCameraSwitch(mWearablePtr->getType())) + { + return; + } const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(mWearablePtr->getType()); if (!wearable_entry) { -- cgit v1.2.3 From a738dcaa8b3d25a0c2ed0c7dc65c06ce16a69176 Mon Sep 17 00:00:00 2001 From: "Nyx (Neal Orman)" <nyx@lindenlab.com> Date: Wed, 6 Apr 2011 13:52:42 -0400 Subject: tcmalloc rename --- autobuild.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/autobuild.xml b/autobuild.xml index ec5d7d51ac..257eb6ec00 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1646,7 +1646,7 @@ <key>license_file</key> <string>LICENSES/google-perftools.txt</string> <key>name</key> - <string>google-perftools</string> + <string>tcmalloc</string> <key>platforms</key> <map> <key>linux</key> -- cgit v1.2.3 From dfff5a476c0cd280332157034311df0c3e011b11 Mon Sep 17 00:00:00 2001 From: "Nyx (Neal Orman)" <nyx@lindenlab.com> Date: Wed, 6 Apr 2011 14:30:27 -0400 Subject: SH-1289 VWR-25421 VWR-25415 FIX multiwearable "add" option disabled in inventory view Corrected the XUI menu logic that was causing the "add" right click option to be greyed out for clothing pieces that are valid for multiwearables. --- indra/newview/llinventorybridge.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 622a5607df..bdb9f6167a 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -4681,7 +4681,7 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags) if (LLWearableType::getAllowMultiwear(mWearableType)) { items.push_back(std::string("Wearable Add")); - if (gAgentWearables.getWearableCount(mWearableType) > 0) + if (gAgentWearables.getWearableCount(mWearableType) >= LLAgentWearables::MAX_CLOTHING_PER_TYPE) { disabled_items.push_back(std::string("Wearable Add")); } -- cgit v1.2.3 From 1e1fde5eb15c08fb664bd2f6a6f3176e7968b475 Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Wed, 6 Apr 2011 14:45:27 -0500 Subject: OPEN-58 Ditch GL package for glext.h package since glut.h isn't used anywhere. Probably don't need glext headers for mac or linux as they come in with system updates. --- autobuild.xml | 36 ++++++------------------------------ indra/cmake/OpenGL.cmake | 3 +-- 2 files changed, 7 insertions(+), 32 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index ec5d7d51ac..38a6d105b2 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -3,48 +3,24 @@ <map> <key>installables</key> <map> - <key>GL</key> + <key>glext</key> <map> <key>license</key> - <string>GL</string> + <string>glext</string> <key>license_file</key> - <string>LICENSES/GL.txt</string> + <string>LICENSES/glext.txt</string> <key>name</key> - <string>GL</string> + <string>glext</string> <key>platforms</key> <map> - <key>darwin</key> - <map> - <key>archive</key> - <map> - <key>hash</key> - <string>0b7c1d43dc2b39301fef6c05948fb826</string> - <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/GL-darwin-20101004.tar.bz2</string> - </map> - <key>name</key> - <string>darwin</string> - </map> - <key>linux</key> - <map> - <key>archive</key> - <map> - <key>hash</key> - <string>d85d88088360aee5b67105ad93b5ad16</string> - <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/GL-linux-20100929.tar.bz2</string> - </map> - <key>name</key> - <string>linux</string> - </map> <key>windows</key> <map> <key>archive</key> <map> <key>hash</key> - <string>f8d98cbe78d5aafbc7aaabf840325aaf</string> + <string>5de58ca0fe19abf68b25956762ee0d29</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/GL-0.0.0-windows-20110303.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glext-68-windows-20110406.tar.bz2</string> </map> <key>name</key> <string>windows</string> diff --git a/indra/cmake/OpenGL.cmake b/indra/cmake/OpenGL.cmake index 661666f00d..0a3dd976b4 100644 --- a/indra/cmake/OpenGL.cmake +++ b/indra/cmake/OpenGL.cmake @@ -2,8 +2,7 @@ include(Prebuilt) if (NOT STANDALONE) - use_prebuilt_binary(GL) - # possible glh_linear should have its own .cmake file instead + use_prebuilt_binary(glext) use_prebuilt_binary(glh_linear) set(GLEXT_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include) endif (NOT STANDALONE) -- cgit v1.2.3 From 3e5961d1830163a23ac6e813b348e7f50967419a Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" <vir@lindenlab.com> Date: Wed, 6 Apr 2011 15:54:27 -0400 Subject: Updated llconvexdecomposition library build --- autobuild.xml | 12 ++++++------ indra/cmake/Python.cmake | 0 2 files changed, 6 insertions(+), 6 deletions(-) mode change 100644 => 100755 indra/cmake/Python.cmake diff --git a/autobuild.xml b/autobuild.xml index ec5d7d51ac..65360f1526 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1122,9 +1122,9 @@ <key>archive</key> <map> <key>hash</key> - <string>47ef880db4aea1a9561194c54fc28433</string> + <string>3057f3978dff2b8e1216a19c2fa56604</string> <key>url</key> - <string>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/llconvexdecomposition-0.3-darwin-20101222.tar.bz2</string> + <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-llconvexdecomposition-vir/rev/225838/arch/Darwin/installer/llconvexdecomposition-0.1-darwin-20110406.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -1134,9 +1134,9 @@ <key>archive</key> <map> <key>hash</key> - <string>f63424076d4fadd133950af0cf9c3564</string> + <string>e92c9d621b034b1bf312c60df48fc798</string> <key>url</key> - <string>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/llconvexdecomposition-0.3-linux-20101222.tar.bz2</string> + <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-llconvexdecomposition-vir/rev/225838/arch/Linux/installer/llconvexdecomposition-0.1-linux-20110406.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -1146,9 +1146,9 @@ <key>archive</key> <map> <key>hash</key> - <string>5ae8bab01189c5dbbc6f383c751e031a</string> + <string>d8ecfc647df41d546b1e8c697571e0ea</string> <key>url</key> - <string>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/llconvexdecomposition-0.3-windows-20101222.tar.bz2</string> + <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-llconvexdecomposition-vir/rev/225838/arch/CYGWIN/installer/llconvexdecomposition-0.1-windows-20110406.tar.bz2</string> </map> <key>name</key> <string>windows</string> diff --git a/indra/cmake/Python.cmake b/indra/cmake/Python.cmake old mode 100644 new mode 100755 -- cgit v1.2.3 From 9dd00329791192f931155042a44f6c7181bacd37 Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Wed, 6 Apr 2011 14:55:20 -0500 Subject: get rid of INCREMENTAL_LINK parameter --- indra/newview/CMakeLists.txt | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 73b4d41895..4439018456 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1455,20 +1455,6 @@ set(PACKAGE ON CACHE BOOL "Add a package target that builds an installer package.") if (WINDOWS) - if (INCREMENTAL_LINK) - set_target_properties(${VIEWER_BINARY_NAME} - PROPERTIES - LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:WINDOWS /INCREMENTAL /INCLUDE:__tcmalloc" - LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\"" - LINK_FLAGS_RELEASE ${release_flags} - ) - set_target_properties(${VIEWER_BINARY_NAME} - PROPERTIES - LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:WINDOWS /INCREMENTAL:NO /INCLUDE:__tcmalloc" - LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\"" - ) - endif(INCREMENTAL_LINK) - if(USE_PRECOMPILED_HEADERS) set_target_properties( ${VIEWER_BINARY_NAME} -- cgit v1.2.3 From f17997e274a426086e20e1743f79748ccfadcbac Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Wed, 6 Apr 2011 16:21:40 -0500 Subject: merge cleanup --- indra/newview/llpolymesh.cpp | 122 +++++++++++++++++-------------------------- 1 file changed, 48 insertions(+), 74 deletions(-) diff --git a/indra/newview/llpolymesh.cpp b/indra/newview/llpolymesh.cpp index b512a867ba..90e835cda8 100644 --- a/indra/newview/llpolymesh.cpp +++ b/indra/newview/llpolymesh.cpp @@ -738,43 +738,40 @@ const LLVector2 &LLPolyMeshSharedData::getUVs(U32 index) //----------------------------------------------------------------------------- LLPolyMesh::LLPolyMesh(LLPolyMeshSharedData *shared_data, LLPolyMesh *reference_mesh) { - LLMemType mt(LLMemType::MTYPE_AVATAR_MESH); - - llassert(shared_data); - - mSharedData = shared_data; - mReferenceMesh = reference_mesh; - mAvatarp = NULL; - mVertexData = NULL; - - mCurVertexCount = 0; - mFaceIndexCount = 0; - mFaceIndexOffset = 0; - mFaceVertexCount = 0; - mFaceVertexOffset = 0; - - if (shared_data->isLOD() && reference_mesh) - { - mCoords = reference_mesh->mCoords; - mNormals = reference_mesh->mNormals; - mScaledNormals = reference_mesh->mScaledNormals; - mBinormals = reference_mesh->mBinormals; - mScaledBinormals = reference_mesh->mScaledBinormals; - mTexCoords = reference_mesh->mTexCoords; - mClothingWeights = reference_mesh->mClothingWeights; - } - else - { -#if 1 // Allocate memory without initializing every vector - // NOTE: This makes asusmptions about the size of LLVector[234] - int nverts = mSharedData->mNumVertices; - int nfloats = nverts * (3*5 + 2 + 4); - mVertexData = new F32[nfloats]; + LLMemType mt(LLMemType::MTYPE_AVATAR_MESH); + + llassert(shared_data); + + mSharedData = shared_data; + mReferenceMesh = reference_mesh; + mAvatarp = NULL; + mVertexData = NULL; + + mCurVertexCount = 0; + mFaceIndexCount = 0; + mFaceIndexOffset = 0; + mFaceVertexCount = 0; + mFaceVertexOffset = 0; + + if (shared_data->isLOD() && reference_mesh) + { + mCoords = reference_mesh->mCoords; + mNormals = reference_mesh->mNormals; + mScaledNormals = reference_mesh->mScaledNormals; + mBinormals = reference_mesh->mBinormals; + mScaledBinormals = reference_mesh->mScaledBinormals; + mTexCoords = reference_mesh->mTexCoords; + mClothingWeights = reference_mesh->mClothingWeights; + } + else + { + // Allocate memory without initializing every vector + // NOTE: This makes asusmptions about the size of LLVector[234] + int nverts = mSharedData->mNumVertices; + int nfloats = nverts * (3*5 + 2 + 4); //use 16 byte aligned vertex data to make LLPolyMesh SSE friendly - mVertexData = (F32*) malloc(nfloats*4); - int offset = 0; - mCoords = (LLVector3*)(mVertexData + offset); offset += 3*nverts; - mNormals = (LLVector3*)(mVertexData + offset); offset += 3*nverts; + mVertexData = new F32[nfloats]; + int offset = 0; mCoords = (LLVector4*)(mVertexData + offset); offset += 4*nverts; mNormals = (LLVector4*)(mVertexData + offset); offset += 4*nverts; mClothingWeights = (LLVector4*)(mVertexData + offset); offset += 4*nverts; @@ -782,23 +779,11 @@ LLPolyMesh::LLPolyMesh(LLPolyMeshSharedData *shared_data, LLPolyMesh *reference_ // these members don't need to be 16-byte aligned, but the first one might be // read during an aligned memcpy of mTexCoords - mScaledNormals = (LLVector3*)(mVertexData + offset); offset += 3*nverts; - mBinormals = (LLVector3*)(mVertexData + offset); offset += 3*nverts; - mScaledBinormals = (LLVector3*)(mVertexData + offset); offset += 3*nverts; - mTexCoords = (LLVector2*)(mVertexData + offset); offset += 2*nverts; - mClothingWeights = (LLVector4*)(mVertexData + offset); offset += 4*nverts; -#else - mCoords = new LLVector3[mSharedData->mNumVertices]; - mNormals = new LLVector3[mSharedData->mNumVertices]; - mScaledNormals = new LLVector3[mSharedData->mNumVertices]; - mBinormals = new LLVector3[mSharedData->mNumVertices]; - mScaledBinormals = new LLVector3[mSharedData->mNumVertices]; - mTexCoords = new LLVector2[mSharedData->mNumVertices]; - mClothingWeights = new LLVector4[mSharedData->mNumVertices]; - memset(mClothingWeights, 0, sizeof(LLVector4) * mSharedData->mNumVertices); -#endif - initializeForMorph(); - } + mScaledNormals = (LLVector3*)(mVertexData + offset); offset += 3*nverts; + mBinormals = (LLVector3*)(mVertexData + offset); offset += 3*nverts; + mScaledBinormals = (LLVector3*)(mVertexData + offset); offset += 3*nverts; + initializeForMorph(); + } } @@ -813,17 +798,9 @@ LLPolyMesh::~LLPolyMesh() delete mJointRenderData[i]; mJointRenderData[i] = NULL; } -#if 0 // These are now allocated as one big uninitialized chunk - delete [] mCoords; - delete [] mNormals; - delete [] mScaledNormals; - delete [] mBinormals; - delete [] mScaledBinormals; - delete [] mClothingWeights; - delete [] mTexCoords; -#else - delete [] mVertexData; -#endif + + delete [] mVertexData; + } @@ -989,20 +966,17 @@ LLVector3 *LLPolyMesh::getScaledBinormals() //----------------------------------------------------------------------------- void LLPolyMesh::initializeForMorph() { - if (!mSharedData) - return; - - memcpy(mCoords, mSharedData->mBaseCoords, sizeof(LLVector3) * mSharedData->mNumVertices); /*Flawfinder: ignore*/ - memcpy(mNormals, mSharedData->mBaseNormals, sizeof(LLVector3) * mSharedData->mNumVertices); /*Flawfinder: ignore*/ + for (U32 i = 0; i < mSharedData->mNumVertices; ++i) + { mCoords[i] = LLVector4(mSharedData->mBaseCoords[i]); mNormals[i] = LLVector4(mSharedData->mBaseNormals[i]); } - memcpy(mScaledNormals, mSharedData->mBaseNormals, sizeof(LLVector3) * mSharedData->mNumVertices); /*Flawfinder: ignore*/ - memcpy(mBinormals, mSharedData->mBaseBinormals, sizeof(LLVector3) * mSharedData->mNumVertices); /*Flawfinder: ignore*/ - memcpy(mScaledBinormals, mSharedData->mBaseBinormals, sizeof(LLVector3) * mSharedData->mNumVertices); /*Flawfinder: ignore*/ - memcpy(mTexCoords, mSharedData->mTexCoords, sizeof(LLVector2) * mSharedData->mNumVertices); /*Flawfinder: ignore*/ - memset(mClothingWeights, 0, sizeof(LLVector4) * mSharedData->mNumVertices); + memcpy(mScaledNormals, mSharedData->mBaseNormals, sizeof(LLVector3) * mSharedData->mNumVertices); /*Flawfinder: ignore*/ + memcpy(mBinormals, mSharedData->mBaseBinormals, sizeof(LLVector3) * mSharedData->mNumVertices); /*Flawfinder: ignore*/ + memcpy(mScaledBinormals, mSharedData->mBaseBinormals, sizeof(LLVector3) * mSharedData->mNumVertices); /*Flawfinder: ignore*/ + memcpy(mTexCoords, mSharedData->mTexCoords, sizeof(LLVector2) * mSharedData->mNumVertices); /*Flawfinder: ignore*/ + memset(mClothingWeights, 0, sizeof(LLVector4) * mSharedData->mNumVertices); } //----------------------------------------------------------------------------- -- cgit v1.2.3 From 25c9f3b0922513a95d37f02e9e76f241ef03b652 Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Wed, 6 Apr 2011 16:32:42 -0500 Subject: Remove unused classes. --- indra/newview/CMakeLists.txt | 4 - indra/newview/llfloaterimportcollada.cpp | 1112 ------------------------------ indra/newview/llfloaterimportcollada.h | 136 ---- indra/newview/llmeshreduction.cpp | 272 -------- indra/newview/llmeshreduction.h | 50 -- 5 files changed, 1574 deletions(-) delete mode 100644 indra/newview/llfloaterimportcollada.cpp delete mode 100644 indra/newview/llfloaterimportcollada.h delete mode 100644 indra/newview/llmeshreduction.cpp delete mode 100644 indra/newview/llmeshreduction.h diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 4439018456..3ed10c08ab 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -191,7 +191,6 @@ set(viewer_SOURCE_FILES llfloaterhelpbrowser.cpp llfloaterhud.cpp llfloaterimagepreview.cpp - llfloaterimportcollada.cpp llfloaterinspect.cpp llfloaterinventory.cpp llfloaterjoystick.cpp @@ -308,7 +307,6 @@ set(viewer_SOURCE_FILES llmemoryview.cpp llmenucommands.cpp llmeshrepository.cpp - llmeshreduction.cpp llmimetypes.cpp llmorphview.cpp llmoveview.cpp @@ -740,7 +738,6 @@ set(viewer_HEADER_FILES llfloaterhelpbrowser.h llfloaterhud.h llfloaterimagepreview.h - llfloaterimportcollada.h llfloaterinspect.h llfloaterinventory.h llfloaterjoystick.h @@ -857,7 +854,6 @@ set(viewer_HEADER_FILES llmemoryview.h llmenucommands.h llmeshrepository.h - llmeshreduction.h llmimetypes.h llmorphview.h llmoveview.h diff --git a/indra/newview/llfloaterimportcollada.cpp b/indra/newview/llfloaterimportcollada.cpp deleted file mode 100644 index 20907e899e..0000000000 --- a/indra/newview/llfloaterimportcollada.cpp +++ /dev/null @@ -1,1112 +0,0 @@ -/** - * @file llfloaterimportcollada.cpp - * - * $LicenseInfo:firstyear=2001&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - - -#include "llviewerprecompiledheaders.h" - -#if 0 //DEPRECATED - -#include "llfloaterimportcollada.h" - -#include "dae.h" -//#include "dom.h" -#include "dom/domAsset.h" -#include "dom/domBind_material.h" -#include "dom/domConstants.h" -#include "dom/domEffect.h" -#include "dom/domGeometry.h" -#include "dom/domInstance_geometry.h" -#include "dom/domInstance_material.h" -#include "dom/domInstance_node.h" -#include "dom/domInstance_effect.h" -#include "dom/domMaterial.h" -#include "dom/domMatrix.h" -#include "dom/domNode.h" -#include "dom/domProfile_COMMON.h" -#include "dom/domRotate.h" -#include "dom/domScale.h" -#include "dom/domTranslate.h" -#include "dom/domVisual_scene.h" - -#include "llagent.h" -#include "llassetuploadresponders.h" -#include "lleconomy.h" -#include "llfloaterperms.h" -#include "llfloaterreg.h" -#include "llsdutil.h" -#include "llsdutil_math.h" -#include "llselectmgr.h" -#include "llvfile.h" -#include "llvfs.h" -#include "llviewermenufile.h" -#include "llviewerregion.h" -#include "llvolumemessage.h" -#include "llmodel.h" -#include "llmeshreduction.h" -#include "material_codes.h" - -// -// floater -// - -LLFloaterImportCollada::LLFloaterImportCollada(const LLSD& key) - : LLFloater(key) -{ -} - - -BOOL LLFloaterImportCollada::postBuild() -{ - if (!LLFloater::postBuild()) - { - return FALSE; - } - - childSetCommitCallback("ok", LLImportCollada::onCommitOK, this); - childSetCommitCallback("cancel", LLImportCollada::onCommitCancel, this); - - setStatusIdle(); - setAssetCount(0,0); - enableOK(TRUE); - - return TRUE; -} - - -void LLFloaterImportCollada::setAssetCount(S32 mesh_count, S32 texture_count) -{ - childSetTextArg("mesh count", "[COUNT]", llformat("%d", mesh_count)); - childSetTextArg("texture count", "[COUNT]", llformat("%d", texture_count)); -} - -void LLFloaterImportCollada::setStatusAssetUploading(std::string asset_name) -{ - LLUIString uploading = getString("status_uploading"); - uploading.setArg("[NAME]", asset_name); - childSetTextArg("status", "[STATUS]", uploading.getString()); -} - -void LLFloaterImportCollada::setStatusCreatingPrim(std::string prim_name) -{ - LLUIString creating = getString("status_creating"); - creating.setArg("[NAME]", prim_name); - childSetTextArg("status", "[STATUS]", creating.getString()); -} - -void LLFloaterImportCollada::setStatusIdle() -{ - childSetTextArg("status", "[STATUS]", getString("status_idle")); -} - -void LLFloaterImportCollada::enableOK(BOOL enable) -{ - childSetEnabled("ok", enable); -} - - -// -// misc helpers -// - - -// why oh why do forbid matrix multiplication in our llmath library? -LLMatrix4 matrix_multiply(LLMatrix4 a, LLMatrix4 b) -{ - a *= b; - - return a; -} - -// why oh why does colladadom not provide such things? -daeElement* getFirstChild(daeElement* parent) -{ - daeTArray< daeSmartRef<daeElement> > children = parent->getChildren(); - - if (children.getCount() > 0) - { - return children[0]; - } - else - { - return NULL; - } -} - -// why oh why does colladadom not provide such things? -daeElement* getNextSibling(daeElement* child) -{ - daeElement* parent = child->getParent(); - - if (parent == NULL) - { - // must be root, root has no siblings - return NULL; - } - - daeElement* sibling = NULL; - - daeTArray< daeSmartRef<daeElement> > children = parent->getChildren(); - for (S32 i = 0; i < children.getCount(); i++) - { - if (child == children[i]) - { - if ((i+1) < children.getCount()) - { - sibling = children[i+1]; - } - } - } - - return sibling; -} - -// try to get a decent label for this element -std::string getElementLabel(daeElement *element) -{ - // if we have a name attribute, use it - std::string name = element->getAttribute("name"); - if (name.length()) - { - return name; - } - - // if we have an ID attribute, use it - if (element->getID()) - { - return std::string(element->getID()); - } - - // if we have a parent, use it - daeElement* parent = element->getParent(); - if (parent) - { - // if parent has a name, use it - std::string name = parent->getAttribute("name"); - if (name.length()) - { - return name; - } - - // if parent has an ID, use it - if (parent->getID()) - { - return std::string(parent->getID()); - } - } - - // try to use our type - daeString element_name = element->getElementName(); - if (element_name) - { - return std::string(element_name); - } - - // if all else fails, use "object" - return std::string("object"); -} - -LLColor4 getDaeColor(daeElement* element) -{ - LLColor4 value; - domCommon_color_or_texture_type_complexType::domColor* color = - daeSafeCast<domCommon_color_or_texture_type_complexType::domColor>(element->getDescendant("color")); - if (color) - { - domFx_color_common domfx_color = color->getValue(); - value = LLColor4(domfx_color[0], domfx_color[1], domfx_color[2], domfx_color[3]); - } - - return value; -} - -LLTextureEntry profileToTextureEntry(domProfile_COMMON* material) -{ - LLTextureEntry te; - - te.setID(LLUUID("5748decc-f629-461c-9a36-a35a221fe21f")); // blank texture - daeElement* diffuse = material->getDescendant("diffuse"); - if (diffuse) - { - te.setColor(LLColor3(0.1f, 0.9f, 1.0f)); - - domCommon_color_or_texture_type_complexType::domTexture* texture = - daeSafeCast<domCommon_color_or_texture_type_complexType::domTexture>(diffuse->getDescendant("texture")); - if (texture) - { - domCommon_newparam_type_Array newparams = material->getNewparam_array(); - for (S32 i = 0; i < newparams.getCount(); i++) - { - domFx_surface_common* surface = newparams[i]->getSurface(); - if (surface) - { - domFx_surface_init_common* init = surface->getFx_surface_init_common(); - if (init) - { - domFx_surface_init_from_common_Array init_from = init->getInit_from_array(); - - if (init_from.getCount() > 0) - { - daeElement* image = init_from[0]->getValue().getElement(); - if (image) - { - LLUUID texture_asset = LLImportColladaAssetCache::getInstance()->getAssetForDaeElement(image); - - if (texture_asset.notNull()) - { - te.setID(texture_asset); - te.setColor(LLColor3(1,1,1)); - } - } - } - } - } - } - } - - domCommon_color_or_texture_type_complexType::domColor* color = - daeSafeCast<domCommon_color_or_texture_type_complexType::domColor>(diffuse->getDescendant("color")); - if (color) - { - domFx_color_common domfx_color = color->getValue(); - LLColor4 value = LLColor4(domfx_color[0], domfx_color[1], domfx_color[2], domfx_color[3]); - te.setColor(value); - } - } - - daeElement* emission = material->getDescendant("emission"); - if (emission) - { - LLColor4 emission_color = getDaeColor(emission); - if (((emission_color[0] + emission_color[1] + emission_color[2]) / 3.0) > 0.25) - { - te.setFullbright(TRUE); - } - } - - return te; -} - -std::vector<LLTextureEntry> getMaterials(LLModel* model, domInstance_geometry* instance_geo) -{ - std::vector<LLTextureEntry> texture_entries; - for (int i = 0; i < model->mMaterialList.size(); i++) - { - LLTextureEntry texture_entry; - - domInstance_material* instance_mat = NULL; - - domBind_material::domTechnique_common* technique = - daeSafeCast<domBind_material::domTechnique_common>(instance_geo->getDescendant(daeElement::matchType(domBind_material::domTechnique_common::ID()))); - - if (technique) - { - daeTArray< daeSmartRef<domInstance_material> > inst_materials = technique->getChildrenByType<domInstance_material>(); - for (int j = 0; j < inst_materials.getCount(); j++) - { - std::string symbol(inst_materials[j]->getSymbol()); - - if (symbol == model->mMaterialList[i]) // found the binding - { - instance_mat = inst_materials[j]; - } - } - } - - if (instance_mat) - { - domMaterial* material = daeSafeCast<domMaterial>(instance_mat->getTarget().getElement()); - if (material) - { - domInstance_effect* instance_effect = - daeSafeCast<domInstance_effect>(material->getDescendant(daeElement::matchType(domInstance_effect::ID()))); - if (instance_effect) - { - domEffect* effect = daeSafeCast<domEffect>(instance_effect->getUrl().getElement()); - if (effect) - { - domProfile_COMMON* profile = - daeSafeCast<domProfile_COMMON>(effect->getDescendant(daeElement::matchType(domProfile_COMMON::ID()))); - if (profile) - { - texture_entry = profileToTextureEntry(profile); - } - } - } - } - } - - texture_entries.push_back(texture_entry); - } - - return texture_entries; -} - -LLTextureEntry instanceGeoToTextureEntry(domInstance_geometry* instance_geo) -{ - LLTextureEntry te; - domInstance_material* instance_mat = - daeSafeCast<domInstance_material>(instance_geo->getDescendant(daeElement::matchType(domInstance_material::ID()))); - if (instance_mat) - { - } - - return te; -} - - - -// responder for asset uploads -// does all the normal stuff followed by a notification to continue importing -// WARNING - currently unused - TODO -class LLColladaNewAgentInventoryResponder : public LLNewAgentInventoryResponder -{ - LLColladaNewAgentInventoryResponder(const LLSD& post_data, - const LLUUID& vfile_id, - LLAssetType::EType asset_type) - : LLNewAgentInventoryResponder(post_data, vfile_id, asset_type) - { - } - LLColladaNewAgentInventoryResponder(const LLSD& post_data, - const std::string& file_name, - LLAssetType::EType asset_type) - : LLNewAgentInventoryResponder(post_data, file_name, asset_type) - { - } - - virtual void uploadComplete(const LLSD& content) - { - LLNewAgentInventoryResponder::uploadComplete(content); - } - -}; - -BOOL LLImportColladaAssetCache::uploadImageAsset(domImage* image) -{ - // we only support init_from now - embedded data will come later - domImage::domInit_from* init = image->getInit_from(); - if (!init) - { - return FALSE; - } - - std::string filename = cdom::uriToNativePath(init->getValue().str()); - - std::string name = getElementLabel(image); - - LLUUID transaction_id = upload_new_resource(filename, name, std::string(), - 0, LLFolderType::FT_TEXTURE, LLInventoryType::IT_TEXTURE, - LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), - LLFloaterPerms::getEveryonePerms(), - name, NULL, - LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(), NULL); - - if (transaction_id.isNull()) - { - llwarns << "cannot upload " << filename << llendl; - - return FALSE; - } - - mTransactionMap[transaction_id] = image; - - LLFloaterReg::findTypedInstance<LLFloaterImportCollada>("import_collada")->setStatusAssetUploading(name); - - return TRUE; -} - - - -// -// asset cache - -// uploads assets and provides a map from collada element to asset -// - - - -BOOL LLImportColladaAssetCache::uploadMeshAsset(domMesh* mesh) -{ - LLPointer<LLModel> model = LLModel::loadModelFromDomMesh(mesh); - - if (model->getNumVolumeFaces() == 0) - { - return FALSE; - } - - // generate LODs - - - std::vector<LLPointer<LLModel> > lods; - lods.push_back(model); - S32 triangle_count = model->getNumTriangles(); - - for (S32 i = 0; i < 4; i++) - { - LLPointer<LLModel> last_model = lods.back(); - - S32 triangle_target = (S32)(triangle_count / pow(3.f, i + 1)); - if (triangle_target > 16) - { - LLMeshReduction reduction; - LLPointer<LLModel> new_model = reduction.reduce(model, triangle_target, LLMeshReduction::TRIANGLE_BUDGET); - lods.push_back(new_model); - } - else - { - lods.push_back(last_model); - } - } - - // write model to temp file - - std::string filename = gDirUtilp->getTempFilename(); - LLModel::writeModel( - filename, - lods[4], - lods[0], - lods[1], - lods[2], - lods[3], - lods[4]->mConvexHullDecomp); - - - // copy file to VFS - - LLTransactionID tid; - tid.generate(); - LLAssetID uuid = tid.makeAssetID(gAgent.getSecureSessionID()); // create asset uuid - - S32 file_size; - LLAPRFile infile ; - infile.open(filename, LL_APR_RB, NULL, &file_size); - - if (infile.getFileHandle()) - { - LLVFile file(gVFS, uuid, LLAssetType::AT_MESH, LLVFile::WRITE); - - file.setMaxSize(file_size); - - const S32 buf_size = 65536; - U8 copy_buf[buf_size]; - while ((file_size = infile.read(copy_buf, buf_size))) - { - file.write(copy_buf, file_size); - } - } - - - std::string name = getElementLabel(mesh); - - upload_new_resource(tid, LLAssetType::AT_MESH, name, std::string(), 0,LLFolderType::FT_MESH, LLInventoryType::IT_MESH, - LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(), - name, NULL, - LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(), NULL); - - LLFile::remove(filename); - - mTransactionMap[uuid] = mesh; - - LLFloaterReg::findTypedInstance<LLFloaterImportCollada>("import_collada")->setStatusAssetUploading(name); - - return TRUE; -} - - -// called by the mesh asset upload responder to indicate the mesh asset has been uploaded -void LLImportColladaAssetCache::assetUploaded(LLUUID transaction_uuid, LLUUID asset_uuid, BOOL success) -{ - std::map<LLUUID, daeElement*>::iterator i = mTransactionMap.find(transaction_uuid); - - if (i != mTransactionMap.end()) - { - daeElement* element = i->second; - - - if (success) - { - mAssetMap[element] = asset_uuid; - } - else // failure - { - // if failed, put back on end of queue - mUploadsPending.push_back(element); - } - - mUploads--; - uploadNextAsset(); - } -} - -const S32 MAX_CONCURRENT_UPLOADS = 5; - -void LLImportColladaAssetCache::uploadNextAsset() -{ - while ((mUploadsPending.size() > 0) && (mUploads < MAX_CONCURRENT_UPLOADS)) - { - BOOL upload_started = FALSE; - - daeElement* element = mUploadsPending.back(); - mUploadsPending.pop_back(); - - domImage* image = daeSafeCast<domImage>(element); - if (image) - { - upload_started = uploadImageAsset(image); - } - - domMesh* mesh = daeSafeCast<domMesh>(element); - if (mesh) - { - upload_started = uploadMeshAsset(mesh); - } - - if (upload_started) - { - mUploads++; - } - - } - - if ((mUploadsPending.size() == 0) && (mUploads == 0)) - { - // we're done! notify the importer - LLImportCollada::getInstance()->assetsUploaded(); - } - - updateCount(); -} - - -void LLImportColladaAssetCache::clear() -{ - mDAE = NULL; - mTransactionMap.clear(); - mAssetMap.clear(); - mUploadsPending.clear(); - mUploads = 0; -} - -void LLImportColladaAssetCache::endImport() -{ - clear(); -} - -void LLImportColladaAssetCache::updateCount() -{ - S32 mesh_count = 0; - S32 image_count = 0; - - for (S32 i = 0; i < mUploadsPending.size(); i++) - { - daeElement* element = mUploadsPending[i]; - - if (daeSafeCast<domMesh>(element)) - { - mesh_count++; - } - - if (daeSafeCast<domImage>(element)) - { - image_count++; - } - } - - LLFloaterReg::findTypedInstance<LLFloaterImportCollada>("import_collada")->setAssetCount(mesh_count, image_count); -} - -void LLImportColladaAssetCache::prepareForUpload(DAE* dae) -{ - clear(); - mDAE = dae; - - daeDatabase* db = mDAE->getDatabase(); - - S32 mesh_count = db->getElementCount(NULL, COLLADA_TYPE_MESH); - for (S32 i = 0; i < mesh_count; i++) - { - domMesh* mesh = NULL; - - db->getElement((daeElement**) &mesh, i, NULL, COLLADA_TYPE_MESH); - - mUploadsPending.push_back(mesh); - } - - - S32 image_count = db->getElementCount(NULL, COLLADA_TYPE_IMAGE); - for (S32 i = 0; i < image_count; i++) - { - domImage* image = NULL; - db->getElement((daeElement**) &image, i, NULL, COLLADA_TYPE_IMAGE); - - mUploadsPending.push_back(image); - } - - updateCount(); -} - - -void LLImportColladaAssetCache::uploadAssets() -{ - uploadNextAsset(); -} - - -LLUUID LLImportColladaAssetCache::getAssetForDaeElement(daeElement* element) -{ - LLUUID id; - - std::map<daeElement*, LLUUID>::iterator i = mAssetMap.find(element); - if (i != mAssetMap.end()) - { - id = i->second; - } - - return id; -} - - -// -// importer -// - - - -LLImportCollada::LLImportCollada() -{ - mIsImporting = FALSE; -} - - - - -void LLImportCollada::appendObjectAsset(domInstance_geometry* instance_geo) -{ - domGeometry* geo = daeSafeCast<domGeometry>(instance_geo->getUrl().getElement()); - if (!geo) - { - llwarns << "cannot find geometry" << llendl; - return; - } - - domMesh* mesh = daeSafeCast<domMesh>(geo->getDescendant(daeElement::matchType(domMesh::ID()))); - if (!mesh) - { - llwarns << "could not find mesh" << llendl; - return; - } - - LLUUID mesh_asset = LLImportColladaAssetCache::getInstance()->getAssetForDaeElement(mesh); - if (mesh_asset.isNull()) - { - llwarns << "no mesh asset, skipping" << llendl; - return; - } - - // load the model - LLModel* model = LLModel::loadModelFromDomMesh(mesh); - - - - - // get our local transformation - LLMatrix4 transformation = mStack.front().transformation; - - // adjust the transformation to compensate for mesh normalization - LLVector3 mesh_scale_vector; - LLVector3 mesh_translation_vector; - model->getNormalizedScaleTranslation(mesh_scale_vector, mesh_translation_vector); - LLMatrix4 mesh_translation; - mesh_translation.setTranslation(mesh_translation_vector); - transformation = matrix_multiply(mesh_translation, transformation); - LLMatrix4 mesh_scale; - mesh_scale.initScale(mesh_scale_vector); - transformation = matrix_multiply(mesh_scale, transformation); - - // check for reflection - BOOL reflected = (transformation.determinant() < 0); - - // compute position - LLVector3 position = LLVector3(0, 0, 0) * transformation; - - // compute scale - LLVector3 x_transformed = LLVector3(1, 0, 0) * transformation - position; - LLVector3 y_transformed = LLVector3(0, 1, 0) * transformation - position; - LLVector3 z_transformed = LLVector3(0, 0, 1) * transformation - position; - F32 x_length = x_transformed.normalize(); - F32 y_length = y_transformed.normalize(); - F32 z_length = z_transformed.normalize(); - LLVector3 scale = LLVector3(x_length, y_length, z_length); - - // adjust for "reflected" geometry - LLVector3 x_transformed_reflected = x_transformed; - if (reflected) - { - x_transformed_reflected *= -1.0; - } - - // compute rotation - LLMatrix3 rotation_matrix; - rotation_matrix.setRows(x_transformed_reflected, y_transformed, z_transformed); - LLQuaternion quat_rotation = rotation_matrix.quaternion(); - quat_rotation.normalize(); // the rotation_matrix might not have been orthoginal. make it so here. - LLVector3 euler_rotation; - quat_rotation.getEulerAngles(&euler_rotation.mV[VX], &euler_rotation.mV[VY], &euler_rotation.mV[VZ]); - - - // - // build parameter block to construct this prim - // - - LLSD object_params; - - // create prim - - // set volume params - LLVolumeParams volume_params; - volume_params.setType( LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE ); - volume_params.setBeginAndEndS( 0.f, 1.f ); - volume_params.setBeginAndEndT( 0.f, 1.f ); - volume_params.setRatio ( 1, 1 ); - volume_params.setShear ( 0, 0 ); - U8 sculpt_type = LL_SCULPT_TYPE_MESH; - if (reflected) - { - sculpt_type |= LL_SCULPT_FLAG_MIRROR; - } - volume_params.setSculptID(mesh_asset, sculpt_type); - object_params["shape"] = volume_params.asLLSD(); - - object_params["material"] = LL_MCODE_WOOD; - - object_params["group-id"] = gAgent.getGroupID(); - object_params["pos"] = ll_sd_from_vector3(position); - object_params["rotation"] = ll_sd_from_quaternion(quat_rotation); - object_params["scale"] = ll_sd_from_vector3(scale); - object_params["name"] = mStack.front().name; - - // load material from dae file - std::vector<LLTextureEntry> texture_entries = getMaterials(model, instance_geo); - object_params["facelist"] = LLSD::emptyArray(); - for (int i = 0; i < texture_entries.size(); i++) - { - object_params["facelist"][i] = texture_entries[i].asLLSD(); - } - - // set extra parameters - LLSculptParams sculpt_params; - sculpt_params.setSculptTexture(mesh_asset); - sculpt_params.setSculptType(sculpt_type); - U8 buffer[MAX_OBJECT_PARAMS_SIZE+1]; - LLDataPackerBinaryBuffer dp(buffer, MAX_OBJECT_PARAMS_SIZE); - sculpt_params.pack(dp); - std::vector<U8> v(dp.getCurrentSize()); - memcpy(&v[0], buffer, dp.getCurrentSize()); - LLSD extra_parameter; - extra_parameter["extra_parameter"] = sculpt_params.mType; - extra_parameter["param_data"] = v; - object_params["extra_parameters"].append(extra_parameter); - - mObjectList.append(object_params); - - delete model; - - LLFloaterReg::findTypedInstance<LLFloaterImportCollada>("import_collada")->setStatusCreatingPrim(mStack.front().name); - - return; -} - -void LLImportCollada::uploadObjectAsset() -{ - LLSD request; - request["objects"] = mObjectList; - - std::string url = gAgent.getRegion()->getCapability("UploadObjectAsset"); - LLHTTPClient::post(url, request, new LLHTTPClient::Responder()); -} - - - -void LLImportCollada::importFile(std::string filename) -{ - if (mIsImporting) - { - llwarns << "Importer already running, import command for " << filename << " ignored" << llendl; - return; - } - - LLFloaterReg::showInstance("import_collada"); - LLFloaterReg::findTypedInstance<LLFloaterImportCollada>("import_collada")->enableOK(TRUE); - - - mIsImporting = TRUE; - mDAE = new DAE; - mImportOrigin = gAgent.getPositionAgent() + LLVector3(0, 0, 2); - mSceneTransformation = LLMatrix4(); // identity - mFilename = filename; - mCreates = 0; - mObjectList = LLSD::emptyArray(); - - if (mDAE->open(mFilename) == NULL) - { - llwarns << "cannot open file " << mFilename << llendl; - endImport(); - return; - } - - LLImportColladaAssetCache::getInstance()->prepareForUpload(mDAE); - - return; -} - - -void LLImportCollada::assetsUploaded() -{ - if (!mIsImporting) - { - // weird, we got a callback while not importing. - return; - } - - daeDocument* doc = mDAE->getDoc(mFilename); - if (!doc) - { - llwarns << "can't find internal doc" << llendl; - endImport(); - } - - daeElement* root = doc->getDomRoot(); - if (!root) - { - llwarns << "document has no root" << llendl; - endImport(); - } - - domAsset::domUnit* unit = daeSafeCast<domAsset::domUnit>(root->getDescendant(daeElement::matchType(domAsset::domUnit::ID()))); - if (unit) - { - mSceneTransformation *= unit->getMeter(); - } - - domUpAxisType up = UPAXISTYPE_Y_UP; // default is Y_UP - domAsset::domUp_axis* up_axis = - daeSafeCast<domAsset::domUp_axis>(root->getDescendant(daeElement::matchType(domAsset::domUp_axis::ID()))); - if (up_axis) - { - up = up_axis->getValue(); - } - - if (up == UPAXISTYPE_X_UP) - { - LLMatrix4 rotation; - rotation.initRotation(0.0f, 90.0f * DEG_TO_RAD, 0.0f); - - mSceneTransformation = matrix_multiply(rotation, mSceneTransformation); - } - else if (up == UPAXISTYPE_Y_UP) - { - LLMatrix4 rotation; - rotation.initRotation(90.0f * DEG_TO_RAD, 0.0f, 0.0f); - - mSceneTransformation = matrix_multiply(rotation, mSceneTransformation); - } - // else Z_UP, which is our behavior - - - - daeElement* scene = root->getDescendant("visual_scene"); - if (!scene) - { - llwarns << "document has no visual_scene" << llendl; - endImport(); - } - - processElement(scene); - processNextElement(); -} - -void LLImportCollada::pushStack(daeElement* next_element, std::string name, LLMatrix4 transformation) -{ - struct StackState new_state; - - new_state.next_element = next_element; - new_state.name = name; - new_state.transformation = transformation; - - mStack.push_front(new_state); -} - - - -void LLImportCollada::popStack() -{ - mStack.pop_front(); -} - - - -BOOL LLImportCollada::processElement(daeElement* element) -{ - if (mStack.size() > 0) - { - mStack.front().next_element = getNextSibling(element); - } - - domTranslate* translate = daeSafeCast<domTranslate>(element); - if (translate) - { - domFloat3 dom_value = translate->getValue(); - - LLMatrix4 translation; - translation.setTranslation(LLVector3(dom_value[0], dom_value[1], dom_value[2])); - - mStack.front().transformation = matrix_multiply(translation, mStack.front().transformation); - } - - domRotate* rotate = daeSafeCast<domRotate>(element); - if (rotate) - { - domFloat4 dom_value = rotate->getValue(); - - LLMatrix4 rotation; - rotation.initRotTrans(dom_value[3] * DEG_TO_RAD, LLVector3(dom_value[0], dom_value[1], dom_value[2]), LLVector3(0, 0, 0)); - - mStack.front().transformation = matrix_multiply(rotation, mStack.front().transformation); - } - - domScale* scale = daeSafeCast<domScale>(element); - if (scale) - { - domFloat3 dom_value = scale->getValue(); - - LLMatrix4 scaling; - scaling.initScale(LLVector3(dom_value[0], dom_value[1], dom_value[2])); - - mStack.front().transformation = matrix_multiply(scaling, mStack.front().transformation); - } - - domMatrix* matrix = daeSafeCast<domMatrix>(element); - if (matrix) - { - domFloat4x4 dom_value = matrix->getValue(); - - LLMatrix4 matrix_transform; - - for (int i = 0; i < 4; i++) - for(int j = 0; j < 4; j++) - { - matrix_transform.mMatrix[i][j] = dom_value[i + j*4]; - } - - mStack.front().transformation = matrix_multiply(matrix_transform, mStack.front().transformation); - } - - domInstance_geometry* instance_geo = daeSafeCast<domInstance_geometry>(element); - if (instance_geo) - { - appendObjectAsset(instance_geo); - } - - domNode* node = daeSafeCast<domNode>(element); - if (node) - { - pushStack(getFirstChild(element), getElementLabel(element), mStack.front().transformation); - } - - domInstance_node* instance_node = daeSafeCast<domInstance_node>(element); - if (instance_node) - { - daeElement* instance = instance_node->getUrl().getElement(); - if (instance) - { - pushStack(getFirstChild(instance), getElementLabel(instance), mStack.front().transformation); - } - } - - domVisual_scene* scene = daeSafeCast<domVisual_scene>(element); - if (scene) - { - pushStack(getFirstChild(element), std::string("scene"), mSceneTransformation); - } - - return FALSE; -} - - -void LLImportCollada::processNextElement() -{ - while(1) - { - if (mStack.size() == 0) - { - uploadObjectAsset(); - endImport(); - return; - } - - daeElement *element = mStack.front().next_element; - - if (element == NULL) - { - popStack(); - } - else - { - processElement(element); - } - } -} - - -void LLImportCollada::endImport() -{ - LLFloaterReg::hideInstance("import_collada"); - - LLImportColladaAssetCache::getInstance()->endImport(); - - if (mDAE) - { - delete mDAE; - mDAE = NULL; - } - - mIsImporting = FALSE; -} - - -/* static */ -void LLImportCollada::onCommitOK(LLUICtrl*, void*) -{ - LLFloaterReg::findTypedInstance<LLFloaterImportCollada>("import_collada")->enableOK(FALSE); - - LLImportColladaAssetCache::getInstance()->uploadAssets(); -} - - -/* static */ -void LLImportCollada::onCommitCancel(LLUICtrl*, void*) -{ - getInstance()->endImport(); -} - -#endif diff --git a/indra/newview/llfloaterimportcollada.h b/indra/newview/llfloaterimportcollada.h deleted file mode 100644 index 30c4a9a7db..0000000000 --- a/indra/newview/llfloaterimportcollada.h +++ /dev/null @@ -1,136 +0,0 @@ -/** - * @file llfloaterimportcollada.h - * @brief The about box from Help -> About - * - * $LicenseInfo:firstyear=2001&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -#if 0 //DEPRECATED - -#ifndef LL_LLFLOATERIMPORTCOLLADA_H -#define LL_LLFLOATERIMPORTCOLLADA_H - -#include "llfloater.h" - -class LLFloaterImportCollada : public LLFloater -{ -public: - LLFloaterImportCollada(const LLSD& key); - /* virtual */ BOOL postBuild(); - - void setAssetCount(S32 mesh_count, S32 texture_count); - void setStatusAssetUploading(std::string asset_name); - void setStatusCreatingPrim(std::string prim_name); - void setStatusIdle(); - void enableOK(BOOL enable); -}; - -class LLViewerObject; -class DAE; -class daeElement; -class domMesh; -class domImage; -class domInstance_geometry; -class LLModel; -class LLImportCollada; - -class LLImportColladaAssetCache : public LLSingleton<LLImportColladaAssetCache> -{ -public: - // called first to initialize - void prepareForUpload(DAE* dae); - - // upload the assets in this collada file - void uploadAssets(); - - // get the uploaded assets which corresponds to this element - LLUUID getAssetForDaeElement(daeElement* element); - - // stop the upload - void endImport(); - - // reset - void clear(); - - // callback for notification when an asset has been uploaded - void assetUploaded(LLUUID transaction_uuid, LLUUID asset_uuid, BOOL success); - -private: - void uploadNextAsset(); - BOOL uploadMeshAsset(domMesh* mesh); - BOOL uploadImageAsset(domImage* image); - void updateCount(); - - std::vector<daeElement*> mUploadsPending; - std::map<LLUUID, daeElement*> mTransactionMap; - std::map<daeElement*, LLUUID> mAssetMap; - - DAE* mDAE; - S32 mUploads; -}; - - -class LLImportCollada -: public LLSingleton<LLImportCollada> -{ -public: - LLImportCollada(); - void importFile(std::string filename); - - // callback when all assets have been uploaded - void assetsUploaded(); - - // callback when buttons pressed - static void onCommitOK(LLUICtrl*, void*); - static void onCommitCancel(LLUICtrl*, void*); - - -private: - void endImport(); - void processNextElement(); - BOOL processElement(daeElement* element); - void pushStack(daeElement* next_element, std::string name, LLMatrix4 transformation); - void popStack(); - void appendObjectAsset(domInstance_geometry* instance_geo); - void uploadObjectAsset(); - - struct StackState - { - daeElement* next_element; - std::string name; - LLMatrix4 transformation; - }; - - std::list<struct StackState> mStack; - S32 mCreates; - LLVector3 mImportOrigin; - std::string mFilename; - BOOL mIsImporting; - DAE *mDAE; - LLSD mObjectList; - - LLMatrix4 mSceneTransformation; -}; - -#endif // LL_LLFLOATERIMPORTCOLLADA_H - -#endif //DEPRECATED diff --git a/indra/newview/llmeshreduction.cpp b/indra/newview/llmeshreduction.cpp deleted file mode 100644 index 14e8dd37b4..0000000000 --- a/indra/newview/llmeshreduction.cpp +++ /dev/null @@ -1,272 +0,0 @@ -/** - * @file llmeshreduction.cpp - * @brief LLMeshReduction class implementation - * - * $LicenseInfo:firstyear=2004&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -#include "llviewerprecompiledheaders.h" - -#include "llmeshreduction.h" -#include "llgl.h" -#include "llvertexbuffer.h" - -#include "glod/glod.h" - - -#if 0 //not used ? - -void create_vertex_buffers_from_model(LLModel* model, std::vector<LLPointer <LLVertexBuffer> >& vertex_buffers) -{ -#if 0 //VECTORIZE THIS ? - vertex_buffers.clear(); - - for (S32 i = 0; i < model->getNumVolumeFaces(); ++i) - { - const LLVolumeFace &vf = model->getVolumeFace(i); - U32 num_vertices = vf.mNumVertices; - U32 num_indices = vf.mNumIndices; - - if (!num_vertices || ! num_indices) - { - continue; - } - - LLVertexBuffer* vb = - new LLVertexBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0, 0); - - vb->allocateBuffer(num_vertices, num_indices, TRUE); - - LLStrider<LLVector3> vertex_strider; - LLStrider<LLVector3> normal_strider; - LLStrider<LLVector2> tc_strider; - LLStrider<U16> index_strider; - - vb->getVertexStrider(vertex_strider); - vb->getNormalStrider(normal_strider); - vb->getTexCoord0Strider(tc_strider); - - vb->getIndexStrider(index_strider); - - // build vertices and normals - for (U32 i = 0; (S32)i < num_vertices; i++) - { - *(vertex_strider++) = vf.mVertices[i].mPosition; - *(tc_strider++) = vf.mVertices[i].mTexCoord; - LLVector3 normal = vf.mVertices[i].mNormal; - normal.normalize(); - *(normal_strider++) = normal; - } - - // build indices - for (U32 i = 0; i < num_indices; i++) - { - *(index_strider++) = vf.mIndices[i]; - } - - - vertex_buffers.push_back(vb); - } -#endif -} - -void create_glod_object_from_vertex_buffers(S32 object, S32 group, std::vector<LLPointer <LLVertexBuffer> >& vertex_buffers) -{ - glodNewGroup(group); - stop_gloderror(); - glodNewObject(object, group, GLOD_DISCRETE); - stop_gloderror(); - - for (U32 i = 0; i < vertex_buffers.size(); ++i) - { - vertex_buffers[i]->setBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0); - - U32 num_indices = vertex_buffers[i]->getNumIndices(); - - if (num_indices > 2) - { - glodInsertElements(object, i, GL_TRIANGLES, num_indices, GL_UNSIGNED_SHORT, - vertex_buffers[i]->getIndicesPointer(), 0, 0.f); - } - stop_gloderror(); - } - - glodBuildObject(object); - stop_gloderror(); -} - -// extract the GLOD data into vertex buffers -void create_vertex_buffers_from_glod_object(S32 object, S32 group, std::vector<LLPointer <LLVertexBuffer> >& vertex_buffers) -{ - vertex_buffers.clear(); - - GLint patch_count = 0; - glodGetObjectParameteriv(object, GLOD_NUM_PATCHES, &patch_count); - stop_gloderror(); - - GLint* sizes = new GLint[patch_count*2]; - glodGetObjectParameteriv(object, GLOD_PATCH_SIZES, sizes); - stop_gloderror(); - - GLint* names = new GLint[patch_count]; - glodGetObjectParameteriv(object, GLOD_PATCH_NAMES, names); - stop_gloderror(); - - for (S32 i = 0; i < patch_count; i++) - { - LLPointer<LLVertexBuffer> buff = - new LLVertexBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0, 0); - - if (sizes[i*2+1] > 0 && sizes[i*2] > 0) - { - buff->allocateBuffer(sizes[i*2+1], sizes[i*2], true); - buff->setBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0); - glodFillElements(object, names[i], GL_UNSIGNED_SHORT, buff->getIndicesPointer()); - stop_gloderror(); - } - else - { - // this face was eliminated, create a dummy triangle (one vertex, 3 indices, all 0) - buff->allocateBuffer(1, 3, true); - } - - vertex_buffers.push_back(buff); - } - - glodDeleteObject(object); - stop_gloderror(); - glodDeleteGroup(group); - stop_gloderror(); - - delete [] sizes; - delete [] names; -} - - -LLPointer<LLModel> create_model_from_vertex_buffers(std::vector<LLPointer <LLVertexBuffer> >& vertex_buffers) -{ - // extract the newly reduced mesh - - // create our output model - LLVolumeParams volume_params; - volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE); - LLPointer<LLModel> out_model = new LLModel(volume_params, 0.f); - - out_model->setNumVolumeFaces(vertex_buffers.size()); - - // build new faces from each vertex buffer - for (GLint i = 0; i < vertex_buffers.size(); ++i) - { - LLStrider<LLVector3> pos; - LLStrider<LLVector3> norm; - LLStrider<LLVector2> tc; - LLStrider<U16> index; - - vertex_buffers[i]->getVertexStrider(pos); - vertex_buffers[i]->getNormalStrider(norm); - vertex_buffers[i]->getTexCoord0Strider(tc); - vertex_buffers[i]->getIndexStrider(index); - - out_model->setVolumeFaceData(i, pos, norm, tc, index, - vertex_buffers[i]->getNumVerts(), vertex_buffers[i]->getNumIndices()); - } - - return out_model; -} - - - -LLMeshReduction::LLMeshReduction() -{ - mCounter = 1; - - glodInit(); -} - -LLMeshReduction::~LLMeshReduction() -{ - glodShutdown(); -} - - -LLPointer<LLModel> LLMeshReduction::reduce(LLModel* in_model, F32 limit, S32 mode) -{ - LLVertexBuffer::unbind(); - - // create vertex buffers from model - std::vector<LLPointer<LLVertexBuffer> > in_vertex_buffers; - create_vertex_buffers_from_model(in_model, in_vertex_buffers); - - // create glod object from vertex buffers - stop_gloderror(); - S32 glod_group = mCounter++; - S32 glod_object = mCounter++; - create_glod_object_from_vertex_buffers(glod_object, glod_group, in_vertex_buffers); - - - // set reduction parameters - stop_gloderror(); - - if (mode == TRIANGLE_BUDGET) - { - // triangle budget mode - glodGroupParameteri(glod_group, GLOD_ADAPT_MODE, GLOD_TRIANGLE_BUDGET); - stop_gloderror(); - glodGroupParameteri(glod_group, GLOD_ERROR_MODE, GLOD_OBJECT_SPACE_ERROR); - stop_gloderror(); - S32 triangle_count = (S32)limit; - glodGroupParameteri(glod_group, GLOD_MAX_TRIANGLES, triangle_count); - stop_gloderror(); - } - else if (mode == ERROR_THRESHOLD) - { - // error threshold mode - glodGroupParameteri(glod_group, GLOD_ADAPT_MODE, GLOD_ERROR_THRESHOLD); - glodGroupParameteri(glod_group, GLOD_ERROR_MODE, GLOD_OBJECT_SPACE_ERROR); - F32 error_threshold = limit; - glodGroupParameterf(glod_group, GLOD_OBJECT_SPACE_ERROR_THRESHOLD, error_threshold); - stop_gloderror(); - } - - else - { - // not a legal mode - return NULL; - } - - - // do the reduction - glodAdaptGroup(glod_group); - stop_gloderror(); - - // convert glod object into vertex buffers - std::vector<LLPointer<LLVertexBuffer> > out_vertex_buffers; - create_vertex_buffers_from_glod_object(glod_object, glod_group, out_vertex_buffers); - - // convert vertex buffers into a model - LLPointer<LLModel> out_model = create_model_from_vertex_buffers(out_vertex_buffers); - - - return out_model; -} - -#endif diff --git a/indra/newview/llmeshreduction.h b/indra/newview/llmeshreduction.h deleted file mode 100644 index b518f6a650..0000000000 --- a/indra/newview/llmeshreduction.h +++ /dev/null @@ -1,50 +0,0 @@ -/** - * @file llmeshreduction.h - * @brief LLMeshReduction class definition - * - * $LicenseInfo:firstyear=2004&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -#ifndef LL_LLMESHREDUCTION_H -#define LL_LLMESHREDUCTION_H - -#include "llmodel.h" - -class LLMeshReduction -{ - public: - enum EReductionMode - { - TRIANGLE_BUDGET, - ERROR_THRESHOLD - }; - - LLMeshReduction(); - ~LLMeshReduction(); - - LLPointer<LLModel> reduce(LLModel* in_model, F32 limit, S32 mode); - -private: - U32 mCounter; -}; - -#endif // LL_LLMESHREDUCTION_H -- cgit v1.2.3 From 8374b50ae36e33872c93d054037a582887363df6 Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Wed, 6 Apr 2011 16:33:03 -0500 Subject: Get rid of extraneous "f" --- indra/newview/llphysicsmotion.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index acf8973f03..c15e72744f 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -628,7 +628,7 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) const F32 area_for_max_settings = 0.0; const F32 area_for_min_settings = 1400.0; const F32 area_for_this_setting = area_for_max_settings + (area_for_min_settings-area_for_max_settings)*(1.0-lod_factor); - const F32 pixel_area = fsqrtf(mCharacter->getPixelArea()); + const F32 pixel_area = sqrtf(mCharacter->getPixelArea()); const BOOL is_self = (dynamic_cast<LLVOAvatarSelf *>(mCharacter) != NULL); if ((pixel_area > area_for_this_setting) || is_self) -- cgit v1.2.3 From 4dd471d055bea672f5eb21cfcc4d07e6b3ba3f9b Mon Sep 17 00:00:00 2001 From: Leslie Linden <none@none> Date: Wed, 6 Apr 2011 14:38:55 -0700 Subject: WEB-3750 FIX - Gone profile * Added agent validation around calls to update avatar data * Removed references to profile panel save options Reviewed by Richard --- indra/newview/llavatarpropertiesprocessor.cpp | 25 ++++++++++------- indra/newview/llfloaterpreference.cpp | 31 ++++++++++++++-------- indra/newview/llfloaterpreference.h | 1 + indra/newview/llpanelme.cpp | 24 ++++------------- indra/newview/llpanelme.h | 1 - .../newview/skins/default/xui/en/panel_profile.xml | 17 ------------ 6 files changed, 42 insertions(+), 57 deletions(-) diff --git a/indra/newview/llavatarpropertiesprocessor.cpp b/indra/newview/llavatarpropertiesprocessor.cpp index 99aeb4cbad..b1cd83a1fb 100644 --- a/indra/newview/llavatarpropertiesprocessor.cpp +++ b/indra/newview/llavatarpropertiesprocessor.cpp @@ -160,6 +160,12 @@ void LLAvatarPropertiesProcessor::sendAvatarClassifiedsRequest(const LLUUID& ava void LLAvatarPropertiesProcessor::sendAvatarPropertiesUpdate(const LLAvatarData* avatar_props) { + if (!gAgent.isInitialized() || (gAgent.getID() == LLUUID::null)) + { + llwarns << "Sending avatarinfo update DENIED - invalid agent" << llendl; + return; + } + llinfos << "Sending avatarinfo update" << llendl; // This value is required by sendAvatarPropertiesUpdate method. @@ -168,20 +174,21 @@ void LLAvatarPropertiesProcessor::sendAvatarPropertiesUpdate(const LLAvatarData* LLMessageSystem *msg = gMessageSystem; - msg->newMessageFast(_PREHASH_AvatarPropertiesUpdate); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast( _PREHASH_AgentID, gAgent.getID() ); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() ); - msg->nextBlockFast(_PREHASH_PropertiesData); + msg->newMessageFast (_PREHASH_AvatarPropertiesUpdate); + msg->nextBlockFast (_PREHASH_AgentData); + msg->addUUIDFast (_PREHASH_AgentID, gAgent.getID() ); + msg->addUUIDFast (_PREHASH_SessionID, gAgent.getSessionID() ); + msg->nextBlockFast (_PREHASH_PropertiesData); - msg->addUUIDFast( _PREHASH_ImageID, avatar_props->image_id); - msg->addUUIDFast( _PREHASH_FLImageID, avatar_props->fl_image_id); - msg->addStringFast( _PREHASH_AboutText, avatar_props->about_text); - msg->addStringFast( _PREHASH_FLAboutText, avatar_props->fl_about_text); + msg->addUUIDFast (_PREHASH_ImageID, avatar_props->image_id); + msg->addUUIDFast (_PREHASH_FLImageID, avatar_props->fl_image_id); + msg->addStringFast (_PREHASH_AboutText, avatar_props->about_text); + msg->addStringFast (_PREHASH_FLAboutText, avatar_props->fl_about_text); msg->addBOOL(_PREHASH_AllowPublish, avatar_props->allow_publish); msg->addBOOL(_PREHASH_MaturePublish, mature); msg->addString(_PREHASH_ProfileURL, avatar_props->profile_url); + gAgent.sendReliableMessage(); } diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 724096b443..1dc1aa49ea 100755 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -285,6 +285,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key) mGotPersonalInfo(false), mOriginalIMViaEmail(false), mLanguageChanged(false), + mAvatarDataInitialized(false), mDoubleClickActionDirty(false), mFavoritesRecordMayExist(false) { @@ -353,14 +354,19 @@ void LLFloaterPreference::processProperties( void* pData, EAvatarProcessorType t void LLFloaterPreference::storeAvatarProperties( const LLAvatarData* pAvatarData ) { - mAvatarProperties.avatar_id = gAgent.getID(); - mAvatarProperties.image_id = pAvatarData->image_id; - mAvatarProperties.fl_image_id = pAvatarData->fl_image_id; - mAvatarProperties.about_text = pAvatarData->about_text; - mAvatarProperties.fl_about_text = pAvatarData->fl_about_text; - mAvatarProperties.profile_url = pAvatarData->profile_url; - mAvatarProperties.flags = pAvatarData->flags; - mAvatarProperties.allow_publish = pAvatarData->flags & AVATAR_ALLOW_PUBLISH; + if (gAgent.isInitialized() && (gAgent.getID() != LLUUID::null)) + { + mAvatarProperties.avatar_id = gAgent.getID(); + mAvatarProperties.image_id = pAvatarData->image_id; + mAvatarProperties.fl_image_id = pAvatarData->fl_image_id; + mAvatarProperties.about_text = pAvatarData->about_text; + mAvatarProperties.fl_about_text = pAvatarData->fl_about_text; + mAvatarProperties.profile_url = pAvatarData->profile_url; + mAvatarProperties.flags = pAvatarData->flags; + mAvatarProperties.allow_publish = pAvatarData->flags & AVATAR_ALLOW_PUBLISH; + + mAvatarDataInitialized = true; + } } void LLFloaterPreference::processProfileProperties(const LLAvatarData* pAvatarData ) @@ -371,12 +377,15 @@ void LLFloaterPreference::processProfileProperties(const LLAvatarData* pAvatarDa void LLFloaterPreference::saveAvatarProperties( void ) { mAvatarProperties.allow_publish = getChild<LLUICtrl>("online_searchresults")->getValue(); - if ( mAvatarProperties.allow_publish ) + if (mAvatarProperties.allow_publish) { mAvatarProperties.flags |= AVATAR_ALLOW_PUBLISH; } - - LLAvatarPropertiesProcessor::getInstance()->sendAvatarPropertiesUpdate( &mAvatarProperties ); + + if (mAvatarDataInitialized) + { + LLAvatarPropertiesProcessor::getInstance()->sendAvatarPropertiesUpdate( &mAvatarProperties ); + } } diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index 46014804ec..5d5e066ec5 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -169,6 +169,7 @@ private: bool mGotPersonalInfo; bool mOriginalIMViaEmail; bool mLanguageChanged; + bool mAvatarDataInitialized; bool mOriginalHideOnlineStatus; // Record of current user's favorites may be stored in file on disk. diff --git a/indra/newview/llpanelme.cpp b/indra/newview/llpanelme.cpp index d3c9c3e131..1347a02a52 100644 --- a/indra/newview/llpanelme.cpp +++ b/indra/newview/llpanelme.cpp @@ -67,8 +67,6 @@ BOOL LLPanelMe::postBuild() { LLPanelProfile::postBuild(); - getTabContainer()[PANEL_PROFILE]->childSetAction("edit_profile_btn", boost::bind(&LLPanelMe::onEditProfileClicked, this), this); - return TRUE; } @@ -135,7 +133,11 @@ void LLPanelMe::buildEditPanel() if (NULL == mEditPanel) { mEditPanel = new LLPanelMyProfileEdit(); - mEditPanel->childSetAction("save_btn", boost::bind(&LLPanelMe::onSaveChangesClicked, this), this); + + // Note: Remove support for editing profile through this method. + // All profile editing should go through the web. + //mEditPanel->childSetAction("save_btn", boost::bind(&LLPanelMe::onSaveChangesClicked, this), this); + mEditPanel->childSetAction("cancel_btn", boost::bind(&LLPanelMe::onCancelClicked, this), this); } } @@ -147,22 +149,6 @@ void LLPanelMe::onEditProfileClicked() togglePanel(mEditPanel, getAvatarId()); // open } -void LLPanelMe::onSaveChangesClicked() -{ - LLAvatarData data = LLAvatarData(); - data.avatar_id = gAgent.getID(); - data.image_id = mEditPanel->getChild<LLTextureCtrl>(PICKER_SECOND_LIFE)->getImageAssetID(); - data.fl_image_id = mEditPanel->getChild<LLTextureCtrl>(PICKER_FIRST_LIFE)->getImageAssetID(); - data.about_text = mEditPanel->getChild<LLUICtrl>("sl_description_edit")->getValue().asString(); - data.fl_about_text = mEditPanel->getChild<LLUICtrl>("fl_description_edit")->getValue().asString(); - data.profile_url = mEditPanel->getChild<LLUICtrl>("homepage_edit")->getValue().asString(); - data.allow_publish = mEditPanel->getChild<LLUICtrl>("show_in_search_checkbox")->getValue(); - - LLAvatarPropertiesProcessor::getInstance()->sendAvatarPropertiesUpdate(&data); - togglePanel(mEditPanel); // close - onOpen(getAvatarId()); -} - void LLPanelMe::onCancelClicked() { togglePanel(mEditPanel); // close diff --git a/indra/newview/llpanelme.h b/indra/newview/llpanelme.h index d5b2fee869..f27f5a268e 100644 --- a/indra/newview/llpanelme.h +++ b/indra/newview/llpanelme.h @@ -58,7 +58,6 @@ private: void buildEditPanel(); void onEditProfileClicked(); - void onSaveChangesClicked(); void onCancelClicked(); LLPanelMyProfileEdit * mEditPanel; diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml index d36220385d..cb701e03da 100644 --- a/indra/newview/skins/default/xui/en/panel_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_profile.xml @@ -453,23 +453,6 @@ </layout_panel> </layout_stack> </layout_panel> - <layout_panel - follows="bottom|left" - height="30" - layout="topleft" - name="profile_me_buttons_panel" - visible="false" - width="313"> - <button - follows="bottom|right" - height="23" - left="20" - top="0" - label="Edit Profile" - name="edit_profile_btn" - tool_tip="Edit your personal information" - width="130" /> - </layout_panel> </layout_stack> </panel> -- cgit v1.2.3 From 74787fda486a68e344caf125fc76c80ca9c40822 Mon Sep 17 00:00:00 2001 From: Merov Linden <merov@lindenlab.com> Date: Wed, 6 Apr 2011 14:51:00 -0700 Subject: STORM-610 : Fix init of and default color value --- indra/newview/app_settings/settings.xml | 6 +++--- indra/newview/llwaterparammanager.cpp | 9 +++++++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 3d89d294f2..b8c2350edd 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -11936,9 +11936,9 @@ <string>Color4</string> <key>Value</key> <array> - <real>22</real> - <real>43</real> - <real>54</real> + <real>0.0863</real> + <real>0.168</real> + <real>0.212</real> <real>0</real> </array> </map> diff --git a/indra/newview/llwaterparammanager.cpp b/indra/newview/llwaterparammanager.cpp index 3d3d43e20d..4b3a9a4dc3 100644 --- a/indra/newview/llwaterparammanager.cpp +++ b/indra/newview/llwaterparammanager.cpp @@ -73,6 +73,7 @@ LLWaterParamManager::LLWaterParamManager() : mWave2Dir(.5f, .5f, "wave2Dir"), mDensitySliderValue(1.0f), mPrevFogDensity(16.0f), // 2^4 + mPrevFogColor(22.f/255.f, 43.f/255.f, 54.f/255.f, 0.0f), mWaterFogKS(1.0f) { } @@ -474,10 +475,14 @@ void LLWaterParamManager::initOverrides() { // Override fog color from the current preset with the saved setting. LLColor4 fog_color_override = gSavedSettings.getColor4("WaterFogColor"); - mCurParams.set("waterFogColor", mPrevFogColor = mFogColor = fog_color_override); + mFogColor = fog_color_override; + mPrevFogColor = fog_color_override; + mCurParams.set("waterFogColor", fog_color_override); // Do the same with fog density. F32 fog_density = gSavedSettings.getF32("WaterFogDensity"); - mCurParams.set("waterFogDensity", mPrevFogDensity = mFogDensity = fog_density); + mPrevFogDensity = fog_density; + mFogDensity = fog_density; + mCurParams.set("waterFogDensity", fog_density); setDensitySliderValue(mFogDensity.mExp); } -- cgit v1.2.3 From 7cc0388d81476f61536c112d4838ef323f987c46 Mon Sep 17 00:00:00 2001 From: "Andrew A. de Laix" <alain@lindenlab.com> Date: Wed, 6 Apr 2011 14:55:09 -0700 Subject: FIX VWR-25444: properly initialize DEVMODE structure to prevent crash. --- indra/llwindow/llwindowwin32.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index ab089081e6..6722248c23 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -500,6 +500,8 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks, //----------------------------------------------------------------------- DEVMODE dev_mode; + ::ZeroMemory(&dev_mode, sizeof(DEVMODE)); + dev_mode.dmSize = sizeof(DEVMODE); DWORD current_refresh; if (EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dev_mode)) { @@ -878,6 +880,8 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO { GLuint pixel_format; DEVMODE dev_mode; + ::ZeroMemory(&dev_mode, sizeof(DEVMODE)); + dev_mode.dmSize = sizeof(DEVMODE); DWORD current_refresh; DWORD dw_ex_style; DWORD dw_style; @@ -2711,6 +2715,8 @@ LLWindow::LLWindowResolution* LLWindowWin32::getSupportedResolutions(S32 &num_re { mSupportedResolutions = new LLWindowResolution[MAX_NUM_RESOLUTIONS]; DEVMODE dev_mode; + ::ZeroMemory(&dev_mode, sizeof(DEVMODE)); + dev_mode.dmSize = sizeof(DEVMODE); mNumSupportedResolutions = 0; for (S32 mode_num = 0; mNumSupportedResolutions < MAX_NUM_RESOLUTIONS; mode_num++) @@ -2786,7 +2792,8 @@ F32 LLWindowWin32::getPixelAspectRatio() BOOL LLWindowWin32::setDisplayResolution(S32 width, S32 height, S32 bits, S32 refresh) { DEVMODE dev_mode; - dev_mode.dmSize = sizeof(dev_mode); + ::ZeroMemory(&dev_mode, sizeof(DEVMODE)); + dev_mode.dmSize = sizeof(DEVMODE); BOOL success = FALSE; // Don't change anything if we don't have to -- cgit v1.2.3 From e4819d9b22deebf080ca262a5a110a0ddfaee672 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" <vir@lindenlab.com> Date: Wed, 6 Apr 2011 18:20:18 -0400 Subject: Trying to fix missing python exe problem --- indra/cmake/LLTestCommand.cmake | 1 + 1 file changed, 1 insertion(+) mode change 100644 => 100755 indra/cmake/LLTestCommand.cmake diff --git a/indra/cmake/LLTestCommand.cmake b/indra/cmake/LLTestCommand.cmake old mode 100644 new mode 100755 index 554559edbd..b5a0580a90 --- a/indra/cmake/LLTestCommand.cmake +++ b/indra/cmake/LLTestCommand.cmake @@ -1,3 +1,4 @@ +include(Python) MACRO(LL_TEST_COMMAND OUTVAR LD_LIBRARY_PATH) # nat wonders how Kitware can use the term 'function' for a construct that # cannot return a value. And yet, variables you set inside a FUNCTION are -- cgit v1.2.3 From 31576e2d51214b5f535d9dc01a72f702cdc734a0 Mon Sep 17 00:00:00 2001 From: "niel@nirvana.planescape.home" <niel@nirvana.planescape.home> Date: Wed, 6 Apr 2011 23:26:05 +0100 Subject: OPEN-50 Changing windows build command from 'devenv.com', to 'msbuild.exe' along with associated options and arguments. --- autobuild.xml | 41 ++++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index d78ef2325a..b90c6ec2f3 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -2121,26 +2121,23 @@ <string>SecondLife.sln</string> </array> <key>command</key> - <string>devenv.com</string> + <string>msbuild.exe</string> <key>options</key> <array> - <string>/build</string> - <string>Debug</string> + <string>/p:Configuration=Debug</string> + <string>/p:Platform=Win32</string> + <string>/t:Build</string> + <string>/p:useenv=true</string> + <string>/verbosity:minimal</string> + <string>/toolsversion:4.0</string> + <string>/p:"VCBuildAdditionalOptions= /incremental"</string> </array> </map> <key>configure</key> <map> <key>arguments</key> <array> - <string>..\indra</string> - <string>&&</string> - <string>..\indra\tools\vstool\VSTool.exe</string> - <string>--solution</string> <string>SecondLife.sln</string> - <string>--config</string> - <string>Debug</string> - <string>--startup</string> - <string>secondlife-bin</string> </array> <key>options</key> <array> @@ -2201,11 +2198,16 @@ <string>SecondLife.sln</string> </array> <key>command</key> - <string>devenv.com</string> + <string>msbuild.exe</string> <key>options</key> <array> - <string>/build</string> - <string>RelWithDebInfo</string> + <string>/p:Configuration=RelWithDebInfo</string> + <string>/p:Platform=Win32</string> + <string>/t:Build</string> + <string>/p:useenv=true</string> + <string>/verbosity:minimal</string> + <string>/toolsversion:4.0</string> + <string>/p:"VCBuildAdditionalOptions= /incremental"</string> </array> </map> <key>configure</key> @@ -2272,11 +2274,16 @@ <string>SecondLife.sln</string> </array> <key>command</key> - <string>devenv.com</string> + <string>msbuild.exe</string> <key>options</key> <array> - <string>/build</string> - <string>Release</string> + <string>/p:Configuration=Release</string> + <string>/p:Platform=Win32</string> + <string>/t:Build</string> + <string>/p:useenv=true</string> + <string>/verbosity:minimal</string> + <string>/toolsversion:4.0</string> + <string>/p:"VCBuildAdditionalOptions= /incremental"</string> </array> </map> <key>configure</key> -- cgit v1.2.3 From 8cfb11ab91a5710c180b6a894d192f09f596cc2f Mon Sep 17 00:00:00 2001 From: Leslie Linden <none@none> Date: Wed, 6 Apr 2011 16:55:44 -0700 Subject: WEB-3796 FIX - First click in session on "Profile" button doesn't do anything * Updated to use the avatar name get callback function so it will always open the profile after the info has been properly cached, rather than silently passing through the function without doing anything. Reviewed by Leyla --- indra/newview/llavataractions.cpp | 41 +++++++++++---------------------------- 1 file changed, 11 insertions(+), 30 deletions(-) diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index afa8b62c74..ca7ec7cc30 100755 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -279,7 +279,7 @@ bool LLAvatarActions::isCalling(const LLUUID &id) //static bool LLAvatarActions::canCall() { - return LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking(); + return LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking(); } // static @@ -300,40 +300,21 @@ void LLAvatarActions::startConference(const uuid_vec_t& ids) make_ui_sound("UISndStartIM"); } +static void on_avatar_name_show_profile(const LLUUID& agent_id, const LLAvatarName& av_name) +{ + llinfos << "opening web profile for " << av_name.mUsername << llendl; + std::string url = getProfileURL(av_name.mUsername); + + // PROFILES: open in webkit window + LLWeb::loadWebURLInternal(url, "", agent_id.asString()); +} + // static void LLAvatarActions::showProfile(const LLUUID& id) { if (id.notNull()) { - LLSD params; - params["id"] = id; - params["open_tab_name"] = "panel_profile"; - - // PROFILES: open in webkit window - std::string full_name; - if (gCacheName->getFullName(id,full_name)) - { - std::string agent_name = LLCacheName::buildUsername(full_name); - llinfos << "opening web profile for " << agent_name << llendl; - std::string url = getProfileURL(agent_name); - LLWeb::loadWebURLInternal(url, "", id.asString()); - } - else - { - llwarns << "no name info for agent id " << id << llendl; - } -#if 0 - //Show own profile - if(gAgent.getID() == id) - { - LLSideTray::getInstance()->showPanel("panel_me", params); - } - //Show other user profile - else - { - LLSideTray::getInstance()->showPanel("panel_profile_view", params); - } -#endif + LLAvatarNameCache::get(id, boost::bind(&on_avatar_name_show_profile, _1, _2)); } } -- cgit v1.2.3 From 8cf15f1778e941f8aa33442095f1ad37f793a855 Mon Sep 17 00:00:00 2001 From: "niel@nirvana.planescape.home" <niel@nirvana.planescape.home> Date: Thu, 7 Apr 2011 12:41:43 +0100 Subject: OPEN-50 Adding UNATTENDED=ON to Windows' configurations so that the viewer can be built by all users out-of-the-box. OS Devs with full VS can switch it on if they want, however this is not needed any more for Open Source builds. --- autobuild.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/autobuild.xml b/autobuild.xml index b90c6ec2f3..f71a2621ba 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -2143,6 +2143,7 @@ <array> <string>-G</string> <string>"Visual Studio 10"</string> + <string>-DUNATTENDED:BOOL=ON</string> </array> </map> <key>name</key> @@ -2220,6 +2221,7 @@ <array> <string>-G</string> <string>"Visual Studio 10"</string> + <string>-DUNATTENDED:BOOL=ON</string> </array> </map> <key>name</key> @@ -2296,6 +2298,7 @@ <array> <string>-G</string> <string>"Visual Studio 10"</string> + <string>-DUNATTENDED:BOOL=ON</string> </array> </map> <key>name</key> -- cgit v1.2.3 From b996d6cb6a2c1a98a25007cf68050231b55186ea Mon Sep 17 00:00:00 2001 From: "niel@nirvana.planescape.home" <niel@nirvana.planescape.home> Date: Thu, 7 Apr 2011 12:54:17 +0100 Subject: OPEN-50 Moving common configuration arguments to the common entries. --- autobuild.xml | 48 ++++++++++++------------------------------------ 1 file changed, 12 insertions(+), 36 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index f71a2621ba..c14e24d904 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1612,6 +1612,10 @@ <string>-DUSE_PRECOMPILED_HEADERS=ON</string> <string>-DFMOD=FALSE</string> </array> + <key>arguments</key> + <array> + <string>../indra</string> + </array> </map> <key>name</key> <string>DebugOS</string> @@ -1650,6 +1654,10 @@ <string>-DUSE_PRECOMPILED_HEADERS=ON</string> <string>-DFMOD=FALSE</string> </array> + <key>arguments</key> + <array> + <string>../indra</string> + </array> </map> <key>name</key> <string>RelWithDebInfoOS</string> @@ -1688,6 +1696,10 @@ <string>-DUSE_PRECOMPILED_HEADERS=ON</string> <string>-DFMOD=FALSE</string> </array> + <key>arguments</key> + <array> + <string>../indra</string> + </array> </map> <key>name</key> <string>ReleaseOS</string> @@ -1750,10 +1762,6 @@ </map> <key>configure</key> <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> <key>options</key> <array> <string>-G</string> @@ -1813,10 +1821,6 @@ </map> <key>configure</key> <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> <key>options</key> <array> <string>-G</string> @@ -1874,10 +1878,6 @@ </map> <key>configure</key> <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> <key>options</key> <array> <string>-G</string> @@ -1936,10 +1936,6 @@ </map> <key>configure</key> <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> <key>options</key> <array> <string>-G</string> @@ -1990,10 +1986,6 @@ </map> <key>configure</key> <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> <key>options</key> <array> <string>-G</string> @@ -2042,10 +2034,6 @@ </map> <key>configure</key> <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> <key>options</key> <array> <string>-G</string> @@ -2135,10 +2123,6 @@ </map> <key>configure</key> <map> - <key>arguments</key> - <array> - <string>SecondLife.sln</string> - </array> <key>options</key> <array> <string>-G</string> @@ -2213,10 +2197,6 @@ </map> <key>configure</key> <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> <key>options</key> <array> <string>-G</string> @@ -2290,10 +2270,6 @@ </map> <key>configure</key> <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> <key>options</key> <array> <string>-G</string> -- cgit v1.2.3 From fa5852a71002eccf6d8083307faac1c51090399b Mon Sep 17 00:00:00 2001 From: "niel@nirvana.planescape.home" <niel@nirvana.planescape.home> Date: Thu, 7 Apr 2011 14:27:39 +0100 Subject: OPEN-50 Changed the default number of job slots, for Linux configurations, to a level (2) that all should be able to manage. --- autobuild.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index c14e24d904..3fc0ab5edf 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1931,7 +1931,7 @@ <string>make</string> <key>options</key> <array> - <string>-j 12</string> + <string>-j 2</string> </array> </map> <key>configure</key> @@ -1981,7 +1981,7 @@ <string>make</string> <key>options</key> <array> - <string>-j 12</string> + <string>-j 2</string> </array> </map> <key>configure</key> @@ -2029,7 +2029,7 @@ <string>make</string> <key>options</key> <array> - <string>-j 12</string> + <string>-j 2</string> </array> </map> <key>configure</key> -- cgit v1.2.3 From ef8ce5bf5eb3325dec8a51d27ca01ddab47f183c Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Thu, 7 Apr 2011 12:55:12 -0400 Subject: SH-1319: Fix for disappearing torso sections on avatars --- indra/newview/llphysicsmotion.cpp | 24 ++++++++++++++++++++---- indra/newview/llpolymorph.cpp | 10 ++++++++++ 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index acf8973f03..254fa5c33f 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -472,7 +472,7 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) const F32 behavior_gain = getParamValue("Gain"); const F32 behavior_damping = getParamValue("Damping"); const F32 behavior_drag = getParamValue("Drag"); - const BOOL physics_test = gSavedSettings.getBOOL("AvatarPhysicsTest"); + const BOOL physics_test = gSavedSettings.getBOOL("AvatarPhysicsTest") && gAgent.isGodlike(); F32 behavior_maxeffect = getParamValue("MaxEffect"); if (physics_test) @@ -583,9 +583,25 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) velocity_new_local = 0; } + // Check for NaN values. A NaN value is detected if the variables doesn't equal itself. + // If NaN, then reset everything. + if ((mPosition_local != mPosition_local) || + (mVelocity_local != mVelocity_local) || + (position_new_local != position_new_local)) + { + position_new_local = 0; + position_current_local = 0; + position_user_local = 0; + mVelocity_local = 0; + mVelocityJoint_local = 0; + mAccelerationJoint_local = 0; + mPosition_local = 0; + mPosition_world = LLVector3(0,0,0); + } + const F32 position_new_local_clamped = llclamp(position_new_local, - min_val, - max_val); + min_val, + max_val); LLDriverParam *driver_param = dynamic_cast<LLDriverParam *>(mParamDriver); llassert_always(driver_param); @@ -613,7 +629,7 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) // // End calculate new params //////////////////////////////////////////////////////////////////////////////// - + //////////////////////////////////////////////////////////////////////////////// // Conditionally update the visual params // diff --git a/indra/newview/llpolymorph.cpp b/indra/newview/llpolymorph.cpp index 5a67fd482a..36f8c8d13e 100644 --- a/indra/newview/llpolymorph.cpp +++ b/indra/newview/llpolymorph.cpp @@ -490,6 +490,16 @@ void LLPolyMorphTarget::apply( ESex avatar_sex ) mLastSex = avatar_sex; + // Check for NaN condition (NaN is detected if a variable doesn't equal itself. + if (mCurWeight != mCurWeight) + { + mCurWeight = 0.0; + } + if (mLastWeight != mLastWeight) + { + mLastWeight = mCurWeight+.001; + } + // perform differential update of morph F32 delta_weight = ( getSex() & avatar_sex ) ? (mCurWeight - mLastWeight) : (getDefaultWeight() - mLastWeight); // store last weight -- cgit v1.2.3 From 4895b24e3861021c26a9df3ba9ba04400c63f5c8 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Thu, 7 Apr 2011 13:23:01 -0400 Subject: SH-1319 fix missing include --- indra/newview/llphysicsmotion.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 254fa5c33f..67bb139a5e 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -40,6 +40,7 @@ #include "v3dmath.h" #include "llphysicsmotion.h" +#include "llagent.h" #include "llcharacter.h" #include "llviewercontrol.h" #include "llviewervisualparam.h" -- cgit v1.2.3 From d582f40315b7fa78added723d8a96ffd84514fdc Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Thu, 7 Apr 2011 11:06:03 -0700 Subject: SOCIAL-717 FIX Artwork for click to move hint updated hint text to use numbers from image --- .../newview/skins/default/xui/en/notifications.xml | 23 +++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 8f5a95a504..318bc9251f 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -7021,27 +7021,28 @@ Hiding the Speak button will disable the voice feature. To walk or run, open the Move Panel and use the directional arrows to navigate. You can also use the directional keys on your keyboard. </notification> - <notification - name="HintDisplayName" - label="Display Name" - type="hint" - unique="true"> - Set your customizable display name here. This is in addition to your unique username, which can't be changed. You can change how you see other people's names in your preferences. - </notification> - <notification name="HintMoveClick" - label="Move" + label="" type="hint" unique="true"> -Click to Walk +1. Click to Walk Click anywhere on the ground to walk to that spot. -Click and Drag to Rotate View +2. Click and Drag to Rotate View Click and drag anywhere on the world to rotate your view <tag>custom_skin</tag> </notification> + <notification + name="HintDisplayName" + label="Display Name" + type="hint" + unique="true"> + Set your customizable display name here. This is in addition to your unique username, which can't be changed. You can change how you see other people's names in your preferences. + </notification> + + <notification name="HintView" label="View" -- cgit v1.2.3 From 3ffc5dc09c186fe0ac57ac66b33bfc105ca01363 Mon Sep 17 00:00:00 2001 From: "Debi King (Dessie)" <dessie@lindenlab.com> Date: Thu, 7 Apr 2011 17:40:33 -0400 Subject: Added tag DRTVWR-42_2.6.1-release, 2.6.1-release for changeset c9182ed77d42 --- .hgtags | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.hgtags b/.hgtags index 4680772703..36889e9274 100644 --- a/.hgtags +++ b/.hgtags @@ -86,3 +86,5 @@ f1827b441e05bf37c68e2c15ebc6d09e9b03f527 2.6.0-start c5bdef3aaa2744626aef3c217ce29e1900d357b3 2.6.1-start c5bdef3aaa2744626aef3c217ce29e1900d357b3 DRTVWR-43_2.6.1-beta1 c5bdef3aaa2744626aef3c217ce29e1900d357b3 2.6.1-beta1 +c9182ed77d427c759cfacf49a7b71a2e20d522aa DRTVWR-42_2.6.1-release +c9182ed77d427c759cfacf49a7b71a2e20d522aa 2.6.1-release -- cgit v1.2.3 From 6fe4eaf4a059d49eb4132c68208a8e43b1830523 Mon Sep 17 00:00:00 2001 From: Leslie Linden <none@none> Date: Thu, 7 Apr 2011 16:20:23 -0700 Subject: SOCIAL-872 FIX -- User can toggle Show Me in Search before logging in which updates local settings file but not the actual value in the database WEB-3750 Attempted FIX -- Gone Profile * Check box for "show me in search" privacy setting no longer enabled until login. * Avatar server update message only sent on status change. Reviewed by Richard --- indra/newview/llfloaterpreference.cpp | 30 ++++++++++++++++------ .../default/xui/en/panel_preferences_privacy.xml | 2 +- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 5444c7dc6e..1a9d0af9af 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -344,7 +344,7 @@ void LLFloaterPreference::processProperties( void* pData, EAvatarProcessorType t if ( APT_PROPERTIES == type ) { const LLAvatarData* pAvatarData = static_cast<const LLAvatarData*>( pData ); - if( pAvatarData && gAgent.getID() == pAvatarData->avatar_id ) + if (pAvatarData && (gAgent.getID() == pAvatarData->avatar_id) && (pAvatarData->avatar_id != LLUUID::null)) { storeAvatarProperties( pAvatarData ); processProfileProperties( pAvatarData ); @@ -354,9 +354,9 @@ void LLFloaterPreference::processProperties( void* pData, EAvatarProcessorType t void LLFloaterPreference::storeAvatarProperties( const LLAvatarData* pAvatarData ) { - if (gAgent.isInitialized() && (gAgent.getID() != LLUUID::null)) + if (LLStartUp::getStartupState() == STATE_STARTED) { - mAvatarProperties.avatar_id = gAgent.getID(); + mAvatarProperties.avatar_id = pAvatarData->avatar_id; mAvatarProperties.image_id = pAvatarData->image_id; mAvatarProperties.fl_image_id = pAvatarData->fl_image_id; mAvatarProperties.about_text = pAvatarData->about_text; @@ -376,19 +376,32 @@ void LLFloaterPreference::processProfileProperties(const LLAvatarData* pAvatarDa void LLFloaterPreference::saveAvatarProperties( void ) { - mAvatarProperties.allow_publish = getChild<LLUICtrl>("online_searchresults")->getValue(); - if (mAvatarProperties.allow_publish) + const BOOL allowPublish = getChild<LLUICtrl>("online_searchresults")->getValue(); + + if (allowPublish) { mAvatarProperties.flags |= AVATAR_ALLOW_PUBLISH; } - if (mAvatarDataInitialized) + // + // NOTE: We really don't want to send the avatar properties unless we absolutely + // need to so we can avoid the accidental profile reset bug, so, if we're + // logged in, the avatar data has been initialized and we have a state change + // for the "allow publish" flag, then set the flag to its new value and send + // the properties update. + // + // NOTE: The only reason we can not remove this update altogether is because of the + // "allow publish" flag, the last remaining profile setting in the viewer + // that doesn't exist in the web profile. + // + if ((LLStartUp::getStartupState() == STATE_STARTED) && mAvatarDataInitialized && (allowPublish != mAvatarProperties.allow_publish)) { + mAvatarProperties.allow_publish = allowPublish; + LLAvatarPropertiesProcessor::getInstance()->sendAvatarPropertiesUpdate( &mAvatarProperties ); } } - BOOL LLFloaterPreference::postBuild() { gSavedSettings.getControl("PlainTextChatHistory")->getSignal()->connect(boost::bind(&LLIMFloater::processChatHistoryStyleUpdate, _2)); @@ -1364,6 +1377,8 @@ void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im mOriginalHideOnlineStatus = true; } + getChild<LLUICtrl>("online_searchresults")->setEnabled(TRUE); + getChildView("include_im_in_chat_history")->setEnabled(TRUE); getChildView("show_timestamps_check_im")->setEnabled(TRUE); getChildView("friends_online_notify_checkbox")->setEnabled(TRUE); @@ -1743,7 +1758,6 @@ void LLPanelPreferenceGraphics::draw() bool enable = hasDirtyChilds(); button_apply->setEnabled(enable); - } } bool LLPanelPreferenceGraphics::hasDirtyChilds() diff --git a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml index ef25588ca3..6954a8b53a 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml @@ -42,7 +42,7 @@ </text> <check_box height="16" - enabled="true" + enabled="false" label="Show me in Search results" layout="topleft" left="30" -- cgit v1.2.3 From bdef5609828a06b50ceadf61f56ac2d31e9b7f43 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Thu, 7 Apr 2011 16:20:26 -0700 Subject: SOCIAL-688 FIX Multiple SLurls error given in minimal skin when clicking links in web profile reverted throttling of untrusted slapps to 1 every 5 seconds don't treat slapps originating from external browsers as clicks and thus bypassing throttling --- indra/newview/llcommandhandler.cpp | 4 ++-- indra/newview/llviewerwindow.cpp | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/indra/newview/llcommandhandler.cpp b/indra/newview/llcommandhandler.cpp index bb1fb41fae..19dba3f917 100644 --- a/indra/newview/llcommandhandler.cpp +++ b/indra/newview/llcommandhandler.cpp @@ -35,7 +35,7 @@ // system includes #include <boost/tokenizer.hpp> -#define THROTTLE_PERIOD 20 // required secs between throttled commands +#define THROTTLE_PERIOD 5 // required seconds between throttled commands static LLCommandDispatcherListener sCommandDispatcherListener; @@ -134,7 +134,7 @@ bool LLCommandHandlerRegistry::dispatch(const std::string& cmd, if (cur_time < last_throttle_time + THROTTLE_PERIOD) { // block request from external browser if it happened - // within THROTTLE_PERIOD secs of the last command + // within THROTTLE_PERIOD seconds of the last command LL_WARNS_ONCE("SLURL") << "Throttled SLURL command from untrusted browser" << LL_ENDL; if (! slurl_throttled) { diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 8ce15c7dfc..4305349ea2 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1317,7 +1317,8 @@ void LLViewerWindow::handleDataCopy(LLWindow *window, S32 data_type, void *data) std::string url = (const char*)data; LLMediaCtrl* web = NULL; const bool trusted_browser = false; - if (LLURLDispatcher::dispatch(url, "clicked", web, trusted_browser)) + // don't treat slapps coming from external browsers as "clicks" as this would bypass throttling + if (LLURLDispatcher::dispatch(url, "", web, trusted_browser)) { // bring window to foreground, as it has just been "launched" from a URL mWindow->bringToFront(); -- cgit v1.2.3 From df370922aee21e853cbd641eab195f1b985816ce Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Thu, 7 Apr 2011 16:20:49 -0700 Subject: incorrect tooltip --- indra/newview/skins/minimal/xui/en/panel_bottomtray.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml index 0145de8be9..d0a77e8c2a 100644 --- a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml @@ -163,7 +163,7 @@ layout="topleft" left="0" name="destination_btn" - tool_tip="Shows people window" + tool_tip="Shows destinations" top="5" is_toggle="true" use_ellipses="true" -- cgit v1.2.3 From a84c8e0704e363a9b24f3ee56760178267086793 Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine <vsavchuk@productengine.com> Date: Fri, 8 Apr 2011 02:25:32 +0300 Subject: STORM-1118 FIXED STORM-1118 Viewer crashes when user tries to upload image without JFIF header. * Added checks for image file contents not matching the file extension (e.g. a bitmap named file.jpg). * Added checks for abnormally short files to avoid crashes when parsing them. --- indra/llimage/llimagedimensionsinfo.cpp | 83 +++++++++++++++++++++++++++++++-- indra/llimage/llimagedimensionsinfo.h | 3 ++ 2 files changed, 82 insertions(+), 4 deletions(-) diff --git a/indra/llimage/llimagedimensionsinfo.cpp b/indra/llimage/llimagedimensionsinfo.cpp index 835664c60f..c6bfa50b40 100644 --- a/indra/llimage/llimagedimensionsinfo.cpp +++ b/indra/llimage/llimagedimensionsinfo.cpp @@ -73,9 +73,28 @@ bool LLImageDimensionsInfo::load(const std::string& src_filename,U32 codec) bool LLImageDimensionsInfo::getImageDimensionsBmp() { - const S32 BMP_FILE_HEADER_SIZE = 14; + // Make sure the file is long enough. + const S32 DATA_LEN = 26; // BMP header (14) + DIB header size (4) + width (4) + height (4) + if (!checkFileLength(DATA_LEN)) + { + llwarns << "Premature end of file" << llendl; + return false; + } + + // Read BMP signature. + U8 signature[2]; + mInfile.read((void*)signature, sizeof(signature)/sizeof(signature[0])); + + // Make sure this is actually a BMP file. + // We only support Windows bitmaps (BM), according to LLImageBMP::updateData(). + if (signature[0] != 'B' || signature[1] != 'M') + { + llwarns << "Not a BMP" << llendl; + return false; + } - mInfile.seek(APR_CUR,BMP_FILE_HEADER_SIZE+4); + // Read image dimensions. + mInfile.seek(APR_CUR, 16); mWidth = read_reverse_s32(); mHeight = read_reverse_s32(); @@ -86,6 +105,14 @@ bool LLImageDimensionsInfo::getImageDimensionsTga() { const S32 TGA_FILE_HEADER_SIZE = 12; + // Make sure the file is long enough. + if (!checkFileLength(TGA_FILE_HEADER_SIZE + 1 /* width */ + 1 /* height */)) + { + llwarns << "Premature end of file" << llendl; + return false; + } + + // *TODO: Detect non-TGA files somehow. mInfile.seek(APR_CUR,TGA_FILE_HEADER_SIZE); mWidth = read_byte() | read_byte() << 8; mHeight = read_byte() | read_byte() << 8; @@ -95,9 +122,29 @@ bool LLImageDimensionsInfo::getImageDimensionsTga() bool LLImageDimensionsInfo::getImageDimensionsPng() { - const S32 PNG_FILE_MARKER_SIZE = 8; + const S32 PNG_MAGIC_SIZE = 8; + + // Make sure the file is long enough. + if (!checkFileLength(PNG_MAGIC_SIZE + 8 + sizeof(S32) * 2 /* width, height */)) + { + llwarns << "Premature end of file" << llendl; + return false; + } - mInfile.seek(APR_CUR,PNG_FILE_MARKER_SIZE + 8/*header offset+chunk length+chunk type*/); + // Read PNG signature. + const U8 png_magic[PNG_MAGIC_SIZE] = {0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A}; + U8 signature[PNG_MAGIC_SIZE]; + mInfile.read((void*)signature, PNG_MAGIC_SIZE); + + // Make sure it's a PNG file. + if (memcmp(signature, png_magic, PNG_MAGIC_SIZE) != 0) + { + llwarns << "Not a PNG" << llendl; + return false; + } + + // Read image dimensions. + mInfile.seek(APR_CUR, 8 /* chunk length + chunk type */); mWidth = read_s32(); mHeight = read_s32(); @@ -122,6 +169,24 @@ bool LLImageDimensionsInfo::getImageDimensionsJpeg() setLastError("Unable to open file for reading", mSrcFilename); return false; } + + /* Make sure this is a JPEG file. */ + const size_t JPEG_MAGIC_SIZE = 2; + const uint8_t jpeg_magic[JPEG_MAGIC_SIZE] = {0xFF, 0xD8}; + uint8_t signature[JPEG_MAGIC_SIZE]; + + if (fread(signature, sizeof(signature), 1, fp) != 1) + { + llwarns << "Premature end of file" << llendl; + return false; + } + if (memcmp(signature, jpeg_magic, JPEG_MAGIC_SIZE) != 0) + { + llwarns << "Not a JPEG" << llendl; + return false; + } + fseek(fp, 0, SEEK_SET); // go back to start of the file + /* Init jpeg */ jpeg_error_mgr jerr; jpeg_decompress_struct cinfo; @@ -145,3 +210,13 @@ bool LLImageDimensionsInfo::getImageDimensionsJpeg() return !sJpegErrorEncountered; } +bool LLImageDimensionsInfo::checkFileLength(S32 min_len) +{ + // Make sure the file is not shorter than min_len bytes. + // so that we don't have to check value returned by each read() or seek(). + char* buf = new char[min_len]; + int nread = mInfile.read(buf, min_len); + delete[] buf; + mInfile.seek(APR_SET, 0); + return nread == min_len; +} diff --git a/indra/llimage/llimagedimensionsinfo.h b/indra/llimage/llimagedimensionsinfo.h index 5384faf3f4..382fdb2a0e 100644 --- a/indra/llimage/llimagedimensionsinfo.h +++ b/indra/llimage/llimagedimensionsinfo.h @@ -119,6 +119,9 @@ protected: return read_byte() << 8 | read_byte(); } + /// Check if the file is not shorter than min_len bytes. + bool checkFileLength(S32 min_len); + protected: LLAPRFile mInfile ; std::string mSrcFilename; -- cgit v1.2.3 From 379e2e138d801ebf7f13d29512f76298aacf3dc5 Mon Sep 17 00:00:00 2001 From: Merov Linden <merov@lindenlab.com> Date: Thu, 7 Apr 2011 16:41:57 -0700 Subject: STORM-746 : Fix bug in performance report output --- .../llimage_libtest/llimage_libtest.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp index 31d3e18877..1466e44324 100644 --- a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp +++ b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp @@ -521,25 +521,25 @@ int main(int argc, char** argv) } } - // Stop the perf gathering system if needed - if (LLFastTimer::sMetricLog) - { - LLMetricPerformanceTesterBasic::deleteTester(LLFastTimer::sLogName); - sAllDone = true; - } - // Output perf data if requested by user if (analyze_performance) { - std::cout << "Analyzing performance" << std::endl; - std::string baseline_name = LLFastTimer::sLogName + "_baseline.slp"; std::string current_name = LLFastTimer::sLogName + ".slp"; std::string report_name = LLFastTimer::sLogName + "_report.csv"; + std::cout << "Analyzing performance, check report in : " << report_name << std::endl; + LLMetricPerformanceTesterBasic::doAnalysisMetrics(baseline_name, current_name, report_name); } + // Stop the perf gathering system if needed + if (LLFastTimer::sMetricLog) + { + LLMetricPerformanceTesterBasic::deleteTester(LLFastTimer::sLogName); + sAllDone = true; + } + // Cleanup and exit LLImage::cleanupClass(); if (fast_timer_log_thread) -- cgit v1.2.3 From cd363e8c87e176776f5db8fbaf60c264eabdaa3b Mon Sep 17 00:00:00 2001 From: Merov Linden <merov@lindenlab.com> Date: Thu, 7 Apr 2011 17:26:10 -0700 Subject: STORM-746 : Clean up typos in comments --- .../integration_tests/llimage_libtest/llimage_libtest.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp index 1466e44324..feb63e161d 100644 --- a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp +++ b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp @@ -54,20 +54,21 @@ static const char USAGE[] = "\n" " List of image files to create (assumes same order as for input files)\n" " OR 3 letters file type extension to convert each input file into.\n" " -r, --region <x0, y0, x1, y1>\n" -" Crop region on the input file in pixel.\n" +" Crop region applied to the input files in pixels.\n" " Only used for j2c images. Default is no region cropping.\n" " -d, --discard_level <n>\n" -" Discard level max used on input. 0 is high resolution. Max discard level is 5.\n" +" Discard level max used on input. 0 is highest resolution. Max discard level is 5.\n" " This allows the input image to be clamped in resolution when loading.\n" " Only valid for j2c images. Default is no discard.\n" " -p, --precincts <n>\n" " Dimension of precincts in pixels. Precincts are assumed square and identical for\n" -" all levels. Note that this oprion also uses PLT and tile markers, \n" -" as well as RPCL order. Power of 2 must be used.\n" +" all levels. Note that this option also add PLT and tile markers to the codestream, \n" +" and uses RPCL order. Power of 2 must be used.\n" " Only valid for output j2c images. Default is no precincts used.\n" " -b, --blocks <n>\n" " Dimension of coding blocks in pixels. Blocks are assumed square. Power of 2 must\n" -" be used. Blocks must be smaller than precincts.\n" +" be used. Blocks must be smaller than precincts. Like precincts, this option adds\n" +" PLT, tile markers and uses RPCL.\n" " Only valid for output j2c images. Default is 64.\n" " -log, --logmetrics <metric>\n" " Log performance data for <metric>. Results in <metric>.slp\n" @@ -130,7 +131,7 @@ LLPointer<LLImageRaw> load_image(const std::string &src_filename, int discard_le { LLPointer<LLImageFormatted> image = create_image(src_filename); - // This just load the image file stream into a buffer. No decoding done. + // This just loads the image file stream into a buffer. No decoding done. if (!image->load(src_filename)) { return NULL; @@ -170,7 +171,7 @@ bool save_image(const std::string &dest_filename, LLPointer<LLImageRaw> raw_imag { LLPointer<LLImageFormatted> image = create_image(dest_filename); - // Set the image restriction on load in the case of a j2c image + // Set the image codestream parameters on output in the case of a j2c image if ((image->getCodec() == IMG_CODEC_J2C) && ((blocks_size != -1) || (precincts_size != -1))) { // That method doesn't exist (and likely, doesn't make sense) for any other image file format -- cgit v1.2.3 From a22e3df7e5570e52abcba4a28103c3d76960a010 Mon Sep 17 00:00:00 2001 From: "Debi King (Dessie)" <dessie@lindenlab.com> Date: Thu, 7 Apr 2011 22:03:24 -0400 Subject: Set release-viewer.jira to DRTVWR-44 for v2.6.2 --- BuildParams | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BuildParams b/BuildParams index 01fde3b92d..49bbb89615 100644 --- a/BuildParams +++ b/BuildParams @@ -66,7 +66,7 @@ viewer-pre-release.viewer_channel = "Second Life Release" viewer-pre-release.login_channel = "Second Life Release" viewer-pre-release.build_debug_release_separately = true viewer-pre-release.build_viewer_update_version_manager = true -viewer-pre-release.release-viewer.jira = DRTVWR-42 +viewer-pre-release.release-viewer.jira = DRTVWR-44 # ======================================= # brad -- cgit v1.2.3 From 9c2f2b884a16d180f83e76d3ed58c949c9692eaf Mon Sep 17 00:00:00 2001 From: "Debi King (Dessie)" <dessie@lindenlab.com> Date: Thu, 7 Apr 2011 22:37:16 -0400 Subject: Added tag DRTVWR-47_2.6.3-beta1, 2.6.3-beta1 for changeset d7fcefabdf32 --- .hgtags | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.hgtags b/.hgtags index a8cae0056d..2cc1d48575 100644 --- a/.hgtags +++ b/.hgtags @@ -95,3 +95,5 @@ d1203046bb653b763f835b04d184646949d8dd5c DRTVWR-45_2.6.2-beta1 d1203046bb653b763f835b04d184646949d8dd5c 2.6.2-beta1 52b2263ab28f0976c689fd0b76c55a9eb027cdbf end-of-develop.py ec32f1045e7c2644015245df3a9933620aa194b8 2.6.3-start +d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc DRTVWR-47_2.6.3-beta1 +d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc 2.6.3-beta1 -- cgit v1.2.3 From c4f03ca949c25b6fd5794ebada5c5e65154a33c0 Mon Sep 17 00:00:00 2001 From: Paul ProductEngine <pguslisty@productengine.com> Date: Fri, 8 Apr 2011 19:21:21 +0300 Subject: STORM-595 FIXED (The presentation of IM sessions in message well depends on method that was used for opening IM window) - Added the callback with the timer on control name "ThrottleBandwidthKBPS" changes. Now message is sending to the simulator in 0.3 sec after LAST variable change. --- indra/newview/llfloaterpreference.cpp | 64 ++++++++++++++++++++++++++++++++++- indra/newview/llfloaterpreference.h | 5 +++ indra/newview/llviewercontrol.cpp | 7 ---- 3 files changed, 68 insertions(+), 8 deletions(-) diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index ffbb0efad3..87d8fca69f 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -43,6 +43,7 @@ #include "llcombobox.h" #include "llcommandhandler.h" #include "lldirpicker.h" +#include "lleventtimer.h" #include "llfeaturemanager.h" #include "llfocusmgr.h" //#include "llfirstuse.h" @@ -73,6 +74,7 @@ #include "llviewerwindow.h" #include "llviewermessage.h" #include "llviewershadermgr.h" +#include "llviewerthrottle.h" #include "llvotree.h" #include "llvosky.h" @@ -1534,10 +1536,56 @@ void LLFloaterPreference::setCacheLocation(const LLStringExplicit& location) cache_location_editor->setToolTip(location); } +//------------------------------Updater--------------------------------------- + +static bool handleBandwidthChanged(const LLSD& newvalue) +{ + gViewerThrottle.setMaxBandwidth((F32) newvalue.asReal()); + return true; +} + +class LLPanelPreference::Updater : public LLEventTimer +{ + +public: + + typedef boost::function<bool(const LLSD&)> callback_t; + + Updater(callback_t cb, F32 period) + :LLEventTimer(period), + mCallback(cb) + { + mEventTimer.stop(); + } + + virtual ~Updater(){} + + void update(const LLSD& new_value) + { + mNewValue = new_value; + mEventTimer.start(); + } + +protected: + + BOOL tick() + { + mCallback(mNewValue); + mEventTimer.stop(); + + return FALSE; + } + +private: + + LLSD mNewValue; + callback_t mCallback; +}; //---------------------------------------------------------------------------- static LLRegisterPanelClassWrapper<LLPanelPreference> t_places("panel_preference"); LLPanelPreference::LLPanelPreference() -: LLPanel() +: LLPanel(), + mBandWidthUpdater(NULL) { mCommitCallbackRegistrar.add("Pref.setControlFalse", boost::bind(&LLPanelPreference::setControlFalse,this, _2)); mCommitCallbackRegistrar.add("Pref.updateMediaAutoPlayCheckbox", boost::bind(&LLPanelPreference::updateMediaAutoPlayCheckbox, this, _1)); @@ -1607,10 +1655,24 @@ BOOL LLPanelPreference::postBuild() } } + //////////////////////PanelSetup /////////////////// + if (hasChild("max_bandwidth")) + { + mBandWidthUpdater = new LLPanelPreference::Updater(boost::bind(&handleBandwidthChanged, _1), 0.3); + gSavedSettings.getControl("ThrottleBandwidthKBPS")->getSignal()->connect(boost::bind(&LLPanelPreference::Updater::update, mBandWidthUpdater, _2)); + } + apply(); return true; } +LLPanelPreference::~LLPanelPreference() +{ + if (mBandWidthUpdater) + { + delete mBandWidthUpdater; + } +} void LLPanelPreference::apply() { // no-op diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index 46014804ec..2ccb0292c7 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -184,6 +184,8 @@ public: LLPanelPreference(); /*virtual*/ BOOL postBuild(); + virtual ~LLPanelPreference(); + virtual void apply(); virtual void cancel(); void setControlFalse(const LLSD& user_data); @@ -197,6 +199,7 @@ public: // cancel() can restore them. virtual void saveSettings(); + class Updater; private: //for "Only friends and groups can call or IM me" static void showFriendsOnlyWarning(LLUICtrl*, const LLSD&); @@ -208,6 +211,8 @@ private: typedef std::map<std::string, LLColor4> string_color_map_t; string_color_map_t mSavedColors; + + Updater* mBandWidthUpdater; }; class LLPanelPreferenceGraphics : public LLPanelPreference diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index ffe607f912..06c1520314 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -239,12 +239,6 @@ static bool handleVideoMemoryChanged(const LLSD& newvalue) return true; } -static bool handleBandwidthChanged(const LLSD& newvalue) -{ - gViewerThrottle.setMaxBandwidth((F32) newvalue.asReal()); - return true; -} - static bool handleChatFontSizeChanged(const LLSD& newvalue) { if(gConsole) @@ -562,7 +556,6 @@ void settings_setup_listeners() gSavedSettings.getControl("RenderTerrainLODFactor")->getSignal()->connect(boost::bind(&handleTerrainLODChanged, _2)); gSavedSettings.getControl("RenderTreeLODFactor")->getSignal()->connect(boost::bind(&handleTreeLODChanged, _2)); gSavedSettings.getControl("RenderFlexTimeFactor")->getSignal()->connect(boost::bind(&handleFlexLODChanged, _2)); - gSavedSettings.getControl("ThrottleBandwidthKBPS")->getSignal()->connect(boost::bind(&handleBandwidthChanged, _2)); gSavedSettings.getControl("RenderGamma")->getSignal()->connect(boost::bind(&handleGammaChanged, _2)); gSavedSettings.getControl("RenderFogRatio")->getSignal()->connect(boost::bind(&handleFogRatioChanged, _2)); gSavedSettings.getControl("RenderMaxPartCount")->getSignal()->connect(boost::bind(&handleMaxPartCountChanged, _2)); -- cgit v1.2.3 From 6f64469cddf8683e80c251ce543e54a18d98d258 Mon Sep 17 00:00:00 2001 From: Paul ProductEngine <pguslisty@productengine.com> Date: Fri, 8 Apr 2011 20:09:45 +0300 Subject: STORM-1083 FIXED Using -login client parameter always results in a last location unavailable error message - In case of using "login" or "autologin" command-line parameters, URL of the start location should be set during configuration initialization of application. This is because there won't be ability to set it before login state (panel login won't be shown). --- indra/newview/llappviewer.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index d96e376bc7..c889aa2979 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -2468,6 +2468,14 @@ bool LLAppViewer::initConfiguration() } } + // If automatic login from command line with --login switch + // init StartSLURL location. In interactive login, LLPanelLogin + // will take care of it. + if ((clp.hasOption("login") || clp.hasOption("autologin")) && !clp.hasOption("url") && !clp.hasOption("slurl")) + { + LLStartUp::setStartSLURL(LLSLURL(gSavedSettings.getString("LoginLocation"))); + } + if (!gSavedSettings.getBOOL("AllowMultipleViewers")) { // -- cgit v1.2.3 From d490081fe29adabfd3a2dba81f5e65d90db3fb51 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" <vir@lindenlab.com> Date: Fri, 8 Apr 2011 17:12:26 -0400 Subject: changes for newer collada build --- autobuild.xml | 52 +++++++++++++++++++------------------- indra/cmake/Copy3rdPartyLibs.cmake | 4 +-- indra/cmake/LLPrimitive.cmake | 4 +-- indra/newview/CMakeLists.txt | 6 ++--- 4 files changed, 33 insertions(+), 33 deletions(-) mode change 100644 => 100755 indra/cmake/Copy3rdPartyLibs.cmake mode change 100644 => 100755 indra/cmake/LLPrimitive.cmake mode change 100644 => 100755 indra/newview/CMakeLists.txt diff --git a/autobuild.xml b/autobuild.xml index ee401cc63a..392cdbabea 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -3,30 +3,6 @@ <map> <key>installables</key> <map> - <key>glext</key> - <map> - <key>license</key> - <string>glext</string> - <key>license_file</key> - <string>LICENSES/glext.txt</string> - <key>name</key> - <string>glext</string> - <key>platforms</key> - <map> - <key>windows</key> - <map> - <key>archive</key> - <map> - <key>hash</key> - <string>5de58ca0fe19abf68b25956762ee0d29</string> - <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glext-68-windows-20110406.tar.bz2</string> - </map> - <key>name</key> - <string>windows</string> - </map> - </map> - </map> <key>GLOD</key> <map> <key>license</key> @@ -282,9 +258,9 @@ <key>archive</key> <map> <key>hash</key> - <string>c1e79c9d3084727be35ce140db87717e</string> + <string>9667a5cde31fd8957e07b61f643d8404</string> <key>url</key> - <string>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/colladadom-2.1-windows-20110223.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-colladadom/rev/226086/arch/CYGWIN/installer/colladadom-2.2-windows-20110408.tar.bz2</string> </map> <key>name</key> <string>windows</string> @@ -603,6 +579,30 @@ </map> </map> </map> + <key>glext</key> + <map> + <key>license</key> + <string>glext</string> + <key>license_file</key> + <string>LICENSES/glext.txt</string> + <key>name</key> + <string>glext</string> + <key>platforms</key> + <map> + <key>windows</key> + <map> + <key>archive</key> + <map> + <key>hash</key> + <string>5de58ca0fe19abf68b25956762ee0d29</string> + <key>url</key> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glext-68-windows-20110406.tar.bz2</string> + </map> + <key>name</key> + <string>windows</string> + </map> + </map> + </map> <key>glh_linear</key> <map> <key>license</key> diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake old mode 100644 new mode 100755 index a301a8d6ba..d4c478c3c7 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -39,7 +39,7 @@ if(WINDOWS) libapriconv-1.dll ssleay32.dll libeay32.dll - libcollada14dom21-d.dll + libcollada14dom22-d.dll glod.dll ) @@ -51,7 +51,7 @@ if(WINDOWS) libapriconv-1.dll ssleay32.dll libeay32.dll - libcollada14dom21.dll + libcollada14dom22.dll glod.dll ) diff --git a/indra/cmake/LLPrimitive.cmake b/indra/cmake/LLPrimitive.cmake old mode 100644 new mode 100755 index 4bdbfe46e2..4d6a84b29e --- a/indra/cmake/LLPrimitive.cmake +++ b/indra/cmake/LLPrimitive.cmake @@ -14,8 +14,8 @@ if (WINDOWS) set(LLPRIMITIVE_LIBRARIES debug llprimitive optimized llprimitive - debug libcollada14dom21-d - optimized libcollada14dom21 + debug libcollada14dom22-d + optimized libcollada14dom22 debug libboost_filesystem-d optimized libboost_filesystem debug libboost_system-d diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt old mode 100644 new mode 100755 index 3ed10c08ab..d70f3ec337 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1489,9 +1489,9 @@ if (WINDOWS) ${SHARED_LIB_STAGING_DIR}/Release/glod.dll ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/glod.dll ${SHARED_LIB_STAGING_DIR}/Debug/glod.dll - ${SHARED_LIB_STAGING_DIR}/Release/libcollada14dom21.dll - ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/libcollada14dom21.dll - ${SHARED_LIB_STAGING_DIR}/Debug/libcollada14dom21-d.dll + ${SHARED_LIB_STAGING_DIR}/Release/libcollada14dom22.dll + ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/libcollada14dom22.dll + ${SHARED_LIB_STAGING_DIR}/Debug/libcollada14dom22-d.dll ${SHARED_LIB_STAGING_DIR}/Release/openjpeg.dll ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/openjpeg.dll ${SHARED_LIB_STAGING_DIR}/Debug/openjpegd.dll -- cgit v1.2.3 From 0f245490a43544b1687558b070359ef85f15f9ab Mon Sep 17 00:00:00 2001 From: "Nyx (Neal Orman)" <nyx@lindenlab.com> Date: Fri, 8 Apr 2011 19:04:01 -0400 Subject: updating colladadom libraries to use the newly autobuilt versions. --- autobuild.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 392cdbabea..8b94cf2077 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -234,9 +234,9 @@ <key>archive</key> <map> <key>hash</key> - <string>86de85fa85aa58b5ee550a6a3c77a7d3</string> + <string>1bc84a4f4299365120914e3e4dcc5602</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/colladadom-2.1-darwin-20101117.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-colladadom/rev/226114/arch/Darwin/installer/colladadom-2.2-darwin-20110408.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -246,9 +246,9 @@ <key>archive</key> <map> <key>hash</key> - <string>e515afc3fa4dcb00d9fb06fbb6343669</string> + <string>07343df2fcfd6ae73c62bb4099061eb6</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/colladadom-2.1-linux-20101102.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-colladadom/rev/226114/arch/Linux/installer/colladadom-2.2-linux-20110408.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -258,9 +258,9 @@ <key>archive</key> <map> <key>hash</key> - <string>9667a5cde31fd8957e07b61f643d8404</string> + <string>10614d1b7857277ccf6d79e076e22f4c</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-colladadom/rev/226086/arch/CYGWIN/installer/colladadom-2.2-windows-20110408.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-colladadom/rev/226114/arch/CYGWIN/installer/colladadom-2.2-windows-20110408.tar.bz2</string> </map> <key>name</key> <string>windows</string> -- cgit v1.2.3 From 235a4477abfb4875e5d08ce60251b389768319b7 Mon Sep 17 00:00:00 2001 From: "Nyx (Neal Orman)" <nyx@lindenlab.com> Date: Fri, 8 Apr 2011 19:54:36 -0400 Subject: updating GLOD libraries to be 2010/autobuild compatible. Linux was manually built as our build machines are having difficulties building it. Will revisit this later. --- autobuild.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 8b94cf2077..75b0c6823e 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -18,9 +18,9 @@ <key>archive</key> <map> <key>hash</key> - <string>3a7263246813ecf9aff5a240892f9641</string> + <string>1eea55da1625518390af4c315a0d43c3</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glod-1.0pre4-darwin-20101007a.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-glod/rev/226145/arch/Darwin/installer/glod-1.0pre4-darwin-20110408.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -30,9 +30,9 @@ <key>archive</key> <map> <key>hash</key> - <string>ca7368e9a1baf266b82d910fa8f821bd</string> + <string>5aeb923a0a50023d0b3a6a8a81cc3d06</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glod-1.0pre4-linux-20100920a.tar.bz2</string> + <string>https://viewer-source-downloads.s3.amazonaws.com/install_pkgs/glod-1.0pre4-linux-20110408.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -42,9 +42,9 @@ <key>archive</key> <map> <key>hash</key> - <string>e40e1eac81dc57d8724f96fd977a3d58</string> + <string>7fd216bdcf9be961a78bfaef31a617f1</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glod-1.0pre4-windows-20110330.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-glod/rev/226145/arch/CYGWIN/installer/glod-1.0pre4-windows-20110408.tar.bz2</string> </map> <key>name</key> <string>windows</string> -- cgit v1.2.3 From 5f872761ca1dd676cfddea2bae08c1d6b1388f1e Mon Sep 17 00:00:00 2001 From: "Nyx (Neal Orman)" <nyx@lindenlab.com> Date: Fri, 8 Apr 2011 20:03:44 -0400 Subject: no longer using tcmalloc-minimal, replacing cmake config to refer to full build version. --- indra/cmake/Copy3rdPartyLibs.cmake | 6 +++--- indra/cmake/GooglePerfTools.cmake | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index d4c478c3c7..38bfef6332 100755 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -56,8 +56,8 @@ if(WINDOWS) ) if(USE_GOOGLE_PERFTOOLS) - set(debug_files ${debug_files} libtcmalloc_minimal-debug.dll) - set(release_files ${release_files} libtcmalloc_minimal.dll) + set(debug_files ${debug_files} libtcmalloc-debug.dll) + set(release_files ${release_files} libtcmalloc.dll) endif(USE_GOOGLE_PERFTOOLS) if (FMOD) @@ -262,7 +262,7 @@ elseif(LINUX) libopenal.so libopenjpeg.so libssl.so - libtcmalloc_minimal.so + libtcmalloc.so libuuid.so.16 libuuid.so.16.0.22 libssl.so.0.9.8 diff --git a/indra/cmake/GooglePerfTools.cmake b/indra/cmake/GooglePerfTools.cmake index 5f653c8fb3..b3d78919f2 100644 --- a/indra/cmake/GooglePerfTools.cmake +++ b/indra/cmake/GooglePerfTools.cmake @@ -7,14 +7,14 @@ else (STANDALONE) if (WINDOWS) use_prebuilt_binary(tcmalloc) set(TCMALLOC_LIBRARIES - debug libtcmalloc_minimal-debug - optimized libtcmalloc_minimal) + debug libtcmalloc-debug + optimized libtcmalloc) set(GOOGLE_PERFTOOLS_FOUND "YES") endif (WINDOWS) if (LINUX) use_prebuilt_binary(tcmalloc) set(TCMALLOC_LIBRARIES - tcmalloc_minimal) + tcmalloc) set(PROFILER_LIBRARIES profiler) set(GOOGLE_PERFTOOLS_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include) -- cgit v1.2.3 From a6d87cbfea7b70e88a4b875d7c9af320c6fe2948 Mon Sep 17 00:00:00 2001 From: "Nyx (Neal Orman)" <nyx@lindenlab.com> Date: Fri, 8 Apr 2011 21:18:35 -0400 Subject: updated colladadom package with header files in the correct location. --- autobuild.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 75b0c6823e..73a49d742d 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -234,9 +234,9 @@ <key>archive</key> <map> <key>hash</key> - <string>1bc84a4f4299365120914e3e4dcc5602</string> + <string>d2b666a8eec1cadc81152ae94cad249f</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-colladadom/rev/226114/arch/Darwin/installer/colladadom-2.2-darwin-20110408.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-colladadom/rev/226180/arch/Darwin/installer/colladadom-2.2-darwin-20110408.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -246,9 +246,9 @@ <key>archive</key> <map> <key>hash</key> - <string>07343df2fcfd6ae73c62bb4099061eb6</string> + <string>414a7db51edbbb9e5fabb2dbea4c19a0</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-colladadom/rev/226114/arch/Linux/installer/colladadom-2.2-linux-20110408.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-colladadom/rev/226180/arch/Linux/installer/colladadom-2.2-linux-20110409.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -258,9 +258,9 @@ <key>archive</key> <map> <key>hash</key> - <string>10614d1b7857277ccf6d79e076e22f4c</string> + <string>7d8819dd334ccccc2b82747565fa6077</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-colladadom/rev/226114/arch/CYGWIN/installer/colladadom-2.2-windows-20110408.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-colladadom/rev/226180/arch/CYGWIN/installer/colladadom-2.2-windows-20110408.tar.bz2</string> </map> <key>name</key> <string>windows</string> -- cgit v1.2.3 From 07a122c43c0b3d01af7497daff3d27251d839792 Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Fri, 8 Apr 2011 21:29:52 -0400 Subject: adjust build parameters for Oz projects --- BuildParams | 3 +++ 1 file changed, 3 insertions(+) diff --git a/BuildParams b/BuildParams index 7855c06866..3b711397e3 100644 --- a/BuildParams +++ b/BuildParams @@ -156,6 +156,9 @@ media.build_viewer_update_version_manager = false # ================ oz_viewer-devreview.build_debug_release_separately = true +oz_project-1.build_debug_release_separately = true +oz_project-2.build_debug_release_separately = true +oz_project-3.build_debug_release_separately = true # ======================================== # enus -- cgit v1.2.3 From 86a66cea7482428f8314a49d1b8ea2a1b2bad687 Mon Sep 17 00:00:00 2001 From: "niel@nirvana.planescape.home" <niel@nirvana.planescape.home> Date: Sat, 9 Apr 2011 16:44:02 +0100 Subject: OPEN-50 Adding missing options for VC Release build --- autobuild.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/autobuild.xml b/autobuild.xml index 3fc0ab5edf..76e551938a 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1676,6 +1676,9 @@ <string>-DCMAKE_BUILD_TYPE:STRING=Release</string> <string>-DWORD_SIZE:STRING=32</string> <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> + <string>-DINSTALL_PROPRIETARY=FALSE</string> + <string>-DUSE_PRECOMPILED_HEADERS=ON</string> + <string>-DLL_RELEASE_FOR_DOWNLOAD:BOOL=TRUE</string> </array> </map> <key>name</key> -- cgit v1.2.3 From ab483c6e7c3cbee72dc9cf85c48e5ee48cc57e2c Mon Sep 17 00:00:00 2001 From: Thickbrick Sleaford <thickbrick.sleaford@gmail.com> Date: Sat, 9 Apr 2011 17:10:09 -0400 Subject: STORM-1147: fix skin-tight clothing --- doc/contributions.txt | 1 + indra/newview/llviewertexture.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/contributions.txt b/doc/contributions.txt index c381c5ec79..f95f4ce513 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -793,6 +793,7 @@ Thickbrick Sleaford VWR-13483 VWR-13947 VWR-24420 + STORM-1147 Thraxis Epsilon SVC-371 VWR-383 diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index cc635f71f9..f5fb074992 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -1469,7 +1469,7 @@ BOOL LLViewerFetchedTexture::createTexture(S32 usename/*= 0*/) } setActive() ; - if (!mForceToSaveRawImage) + if (!needsToSaveRawImage()) { mNeedsAux = FALSE; destroyRawImage(); -- cgit v1.2.3 From c94d6875396f1d68be5fddb93718543e4548a131 Mon Sep 17 00:00:00 2001 From: Seth ProductEngine <slitovchuk@productengine.com> Date: Sun, 10 Apr 2011 00:31:52 +0300 Subject: STORM-721 FIXED Fix for text clipping in a textbox without a scroller. Committed on behalf of Richard Linden: This patch makes clipping work consistently with text and embedded widgets. The widgets will only be displayed if the corresponding text they are embedded in is displayed. There is also a new param "clip" for text widgets that can be used to disable clipping entirely. I introduced this as a potential work around due to the fact that we *used* to assume that text was never clipped in the vertical direction unless we had scrolling turned on. This hasn't been the case for over a year, but now we can selectively turn off vertical text clipping with (clip="false") if we have to. --- indra/llui/lltextbase.cpp | 103 ++++++++++++++++++++++++++++++++++------------ indra/llui/lltextbase.h | 4 +- 2 files changed, 80 insertions(+), 27 deletions(-) diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 49537ef78f..82269282ef 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -157,6 +157,7 @@ LLTextBase::Params::Params() read_only("read_only", false), v_pad("v_pad", 0), h_pad("h_pad", 0), + clip("clip", true), clip_partial("clip_partial", true), line_spacing("line_spacing"), max_text_length("max_length", 255), @@ -199,6 +200,7 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p) mVAlign(p.font_valign), mLineSpacingMult(p.line_spacing.multiple), mLineSpacingPixels(p.line_spacing.pixels), + mClip(p.clip), mClipPartial(p.clip_partial && !p.allow_scroll), mTrackEnd( p.track_end ), mScrollIndex(-1), @@ -334,7 +336,7 @@ void LLTextBase::drawSelectionBackground() // binary search for line that starts before top of visible buffer line_list_t::const_iterator line_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), content_display_rect.mTop, compare_bottom()); - line_list_t::const_iterator end_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), content_display_rect.mBottom, compare_top()); + line_list_t::const_iterator end_iter = std::upper_bound(mLineInfoList.begin(), mLineInfoList.end(), content_display_rect.mBottom, compare_top()); bool done = false; @@ -512,7 +514,6 @@ void LLTextBase::drawText() selection_right = llmax( mSelectionStart, mSelectionEnd ); } - LLRect scrolled_view_rect = getVisibleDocumentRect(); std::pair<S32, S32> line_range = getVisibleLines(mClipPartial); S32 first_line = line_range.first; S32 last_line = line_range.second; @@ -545,10 +546,10 @@ void LLTextBase::drawText() line_end = next_start; } - LLRect text_rect(line.mRect.mLeft + mVisibleTextRect.mLeft - scrolled_view_rect.mLeft, - line.mRect.mTop - scrolled_view_rect.mBottom + mVisibleTextRect.mBottom, - llmin(mDocumentView->getRect().getWidth(), line.mRect.mRight) - scrolled_view_rect.mLeft, - line.mRect.mBottom - scrolled_view_rect.mBottom + mVisibleTextRect.mBottom); + LLRect text_rect(line.mRect); + text_rect.mRight = llmin(mDocumentView->getRect().getWidth(), text_rect.mRight); // clamp right edge to document extents + text_rect.translate(mVisibleTextRect.mLeft, mVisibleTextRect.mBottom); // translate into display region of text widget + text_rect.translate(mDocumentView->getRect().mLeft, mDocumentView->getRect().mBottom); // adjust by scroll position // draw a single line of text S32 seg_start = line_start; @@ -993,14 +994,28 @@ void LLTextBase::draw() updateScrollFromCursor(); } - LLRect doc_rect; + LLRect text_rect; if (mScroller) { - mScroller->localRectToOtherView(mScroller->getContentWindowRect(), &doc_rect, this); + mScroller->localRectToOtherView(mScroller->getContentWindowRect(), &text_rect, this); } else { - doc_rect = getLocalRect(); + LLRect visible_lines_rect; + std::pair<S32, S32> line_range = getVisibleLines(mClipPartial); + for (S32 i = line_range.first; i < line_range.second; i++) + { + if (visible_lines_rect.isEmpty()) + { + visible_lines_rect = mLineInfoList[i].mRect; + } + else + { + visible_lines_rect.unionWith(mLineInfoList[i].mRect); + } + } + text_rect = visible_lines_rect; + text_rect.translate(mDocumentView->getRect().mLeft, mDocumentView->getRect().mBottom); } if (mBGVisible) @@ -1010,28 +1025,37 @@ void LLTextBase::draw() LLRect bg_rect = mVisibleTextRect; if (mScroller) { - bg_rect.intersectWith(doc_rect); + bg_rect.intersectWith(text_rect); } LLColor4 bg_color = mReadOnly ? mReadOnlyBgColor.get() : hasFocus() ? mFocusBgColor.get() : mWriteableBgColor.get(); - gl_rect_2d(doc_rect, bg_color % alpha, TRUE); + gl_rect_2d(text_rect, bg_color % alpha, TRUE); } - // draw document view - LLUICtrl::draw(); - - { - // only clip if we support scrolling... - // since convention is that text boxes never vertically truncate their contents - // regardless of rect bounds - LLLocalClipRect clip(doc_rect, mScroller != NULL); + bool should_clip = mClip || mScroller != NULL; + { LLLocalClipRect clip(text_rect, should_clip); + + // draw document view + if (mScroller) + { + drawChild(mScroller); + } + else + { + drawChild(mDocumentView); + } + drawSelectionBackground(); drawText(); drawCursor(); } + + mDocumentView->setVisible(FALSE); + LLUICtrl::draw(); + mDocumentView->setVisible(TRUE); } @@ -1415,7 +1439,7 @@ S32 LLTextBase::getFirstVisibleLine() const return iter - mLineInfoList.begin(); } -std::pair<S32, S32> LLTextBase::getVisibleLines(bool fully_visible) +std::pair<S32, S32> LLTextBase::getVisibleLines(bool require_fully_visible) { LLRect visible_region = getVisibleDocumentRect(); line_list_t::const_iterator first_iter; @@ -1424,14 +1448,14 @@ std::pair<S32, S32> LLTextBase::getVisibleLines(bool fully_visible) // make sure we have an up-to-date mLineInfoList reflow(); - if (fully_visible) + if (require_fully_visible) { first_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mTop, compare_top()); - last_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mBottom, compare_bottom()); + last_iter = std::upper_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mBottom, compare_bottom()); } else { - first_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mTop, compare_bottom()); + first_iter = std::upper_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mTop, compare_bottom()); last_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mBottom, compare_top()); } return std::pair<S32, S32>(first_iter - mLineInfoList.begin(), last_iter - mLineInfoList.begin()); @@ -2405,14 +2429,41 @@ LLRect LLTextBase::getVisibleDocumentRect() const { return mScroller->getVisibleContentRect(); } - else + else if (mClip) { - // entire document rect is visible when not scrolling + LLRect visible_text_rect = getVisibleTextRect(); + LLRect doc_rect = mDocumentView->getRect(); + visible_text_rect.translate(-doc_rect.mLeft, -doc_rect.mBottom); + + // reject partially visible lines + LLRect visible_lines_rect; + for (line_list_t::const_iterator it = mLineInfoList.begin(), end_it = mLineInfoList.end(); + it != end_it; + ++it) + { + bool line_visible = mClipPartial ? visible_text_rect.contains(it->mRect) : visible_text_rect.overlaps(it->mRect); + if (line_visible) + { + if (visible_lines_rect.isEmpty()) + { + visible_lines_rect = it->mRect; + } + else + { + visible_lines_rect.unionWith(it->mRect); + } + } + } + return visible_lines_rect; + } + else + { // entire document rect is visible // but offset according to height of widget + LLRect doc_rect = mDocumentView->getLocalRect(); doc_rect.mLeft -= mDocumentView->getRect().mLeft; // adjust for height of text above widget baseline - doc_rect.mBottom = doc_rect.getHeight() - mVisibleTextRect.getHeight(); + doc_rect.mBottom = llmin(0, doc_rect.getHeight() - mVisibleTextRect.getHeight()); return doc_rect; } } diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index aafcf8ceb0..7d545a1ba6 100644 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -265,6 +265,7 @@ public: use_ellipses, parse_urls, parse_highlights, + clip, clip_partial; Optional<S32> v_pad, @@ -338,7 +339,7 @@ public: void addDocumentChild(LLView* view); void removeDocumentChild(LLView* view); const LLView* getDocumentView() const { return mDocumentView; } - LLRect getVisibleTextRect() { return mVisibleTextRect; } + LLRect getVisibleTextRect() const { return mVisibleTextRect; } LLRect getTextBoundingRect(); LLRect getVisibleDocumentRect() const; @@ -552,6 +553,7 @@ protected: bool mTrackEnd; // if true, keeps scroll position at end of document during resize bool mReadOnly; bool mBGVisible; // render background? + bool mClip; // clip text to widget rect bool mClipPartial; // false if we show lines that are partially inside bounding rect bool mPlainText; // didn't use Image or Icon segments S32 mMaxTextByteLength; // Maximum length mText is allowed to be in bytes -- cgit v1.2.3 From 3e7481064ff2f8a7e737ee7c1be32bfc0808c32a Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Sat, 9 Apr 2011 18:40:35 -0400 Subject: fix contributions.txt whitespace --- doc/contributions.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/contributions.txt b/doc/contributions.txt index f95f4ce513..ff982ec61a 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -793,7 +793,7 @@ Thickbrick Sleaford VWR-13483 VWR-13947 VWR-24420 - STORM-1147 + STORM-1147 Thraxis Epsilon SVC-371 VWR-383 -- cgit v1.2.3 From 60ffa83c325ede978f2de1dce2a0d49c1c137fe3 Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Sat, 9 Apr 2011 21:57:01 -0400 Subject: fix incorrect license headers --- indra/newview/llbreastmotion.cpp | 36 +++++++++++++++--------------------- indra/newview/llbreastmotion.h | 36 +++++++++++++++--------------------- indra/newview/llphysicsmotion.cpp | 36 +++++++++++++++--------------------- indra/newview/llphysicsmotion.h | 36 +++++++++++++++--------------------- 4 files changed, 60 insertions(+), 84 deletions(-) diff --git a/indra/newview/llbreastmotion.cpp b/indra/newview/llbreastmotion.cpp index 7c205a8b9f..9a8cd5ceae 100644 --- a/indra/newview/llbreastmotion.cpp +++ b/indra/newview/llbreastmotion.cpp @@ -2,31 +2,25 @@ * @file llbreastmotion.cpp * @brief Implementation of LLBreastMotion class. * - * $LicenseInfo:firstyear=2001&license=viewergpl$ - * - * Copyright (c) 2001-2009, Linden Research, Inc. - * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * This library 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 + * Lesser General Public License for more details. * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ diff --git a/indra/newview/llbreastmotion.h b/indra/newview/llbreastmotion.h index 8578d4ad1a..aa0fdf9f8b 100644 --- a/indra/newview/llbreastmotion.h +++ b/indra/newview/llbreastmotion.h @@ -2,31 +2,25 @@ * @file llbreastmotion.h * @brief Implementation of LLBreastMotion class. * - * $LicenseInfo:firstyear=2001&license=viewergpl$ - * - * Copyright (c) 2001-2009, Linden Research, Inc. - * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * This library 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 + * Lesser General Public License for more details. * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 7799ef04e6..968e62a8c3 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -2,31 +2,25 @@ * @file llphysicsmotion.cpp * @brief Implementation of LLPhysicsMotion class. * - * $LicenseInfo:firstyear=2001&license=viewergpl$ - * - * Copyright (c) 2001-2009, Linden Research, Inc. - * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * This library 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 + * Lesser General Public License for more details. * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ diff --git a/indra/newview/llphysicsmotion.h b/indra/newview/llphysicsmotion.h index 657698e4f2..b246fa99bb 100644 --- a/indra/newview/llphysicsmotion.h +++ b/indra/newview/llphysicsmotion.h @@ -2,31 +2,25 @@ * @file llphysicsmotion.h * @brief Implementation of LLPhysicsMotion class. * - * $LicenseInfo:firstyear=2001&license=viewergpl$ - * - * Copyright (c) 2001-2009, Linden Research, Inc. - * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * This library 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 + * Lesser General Public License for more details. * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ -- cgit v1.2.3 From e0adaa188ba06b6d3f3282121d149193de87c6e6 Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Sat, 9 Apr 2011 22:49:10 -0400 Subject: fix dos line endings --- indra/llwindow/llwindowwin32.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index 6722248c23..551d487cc8 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -500,7 +500,7 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks, //----------------------------------------------------------------------- DEVMODE dev_mode; - ::ZeroMemory(&dev_mode, sizeof(DEVMODE)); + ::ZeroMemory(&dev_mode, sizeof(DEVMODE)); dev_mode.dmSize = sizeof(DEVMODE); DWORD current_refresh; if (EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dev_mode)) @@ -880,7 +880,7 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO { GLuint pixel_format; DEVMODE dev_mode; - ::ZeroMemory(&dev_mode, sizeof(DEVMODE)); + ::ZeroMemory(&dev_mode, sizeof(DEVMODE)); dev_mode.dmSize = sizeof(DEVMODE); DWORD current_refresh; DWORD dw_ex_style; @@ -2715,7 +2715,7 @@ LLWindow::LLWindowResolution* LLWindowWin32::getSupportedResolutions(S32 &num_re { mSupportedResolutions = new LLWindowResolution[MAX_NUM_RESOLUTIONS]; DEVMODE dev_mode; - ::ZeroMemory(&dev_mode, sizeof(DEVMODE)); + ::ZeroMemory(&dev_mode, sizeof(DEVMODE)); dev_mode.dmSize = sizeof(DEVMODE); mNumSupportedResolutions = 0; @@ -2792,7 +2792,7 @@ F32 LLWindowWin32::getPixelAspectRatio() BOOL LLWindowWin32::setDisplayResolution(S32 width, S32 height, S32 bits, S32 refresh) { DEVMODE dev_mode; - ::ZeroMemory(&dev_mode, sizeof(DEVMODE)); + ::ZeroMemory(&dev_mode, sizeof(DEVMODE)); dev_mode.dmSize = sizeof(DEVMODE); BOOL success = FALSE; -- cgit v1.2.3 From 3809534edfb06970079b3b8871b6d28b3e4a6795 Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Mon, 11 Apr 2011 09:09:03 -0400 Subject: Added tag 2.6.4-start for changeset 74cd32a06837 --- .hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/.hgtags b/.hgtags index f5e5ea5ed0..41bd9a145a 100644 --- a/.hgtags +++ b/.hgtags @@ -101,3 +101,4 @@ d1203046bb653b763f835b04d184646949d8dd5c 2.6.2-beta1 ec32f1045e7c2644015245df3a9933620aa194b8 2.6.3-start d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc DRTVWR-47_2.6.3-beta1 d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc 2.6.3-beta1 +74cd32a06837b0c2cb793b2e8d4d82f5d49462b2 2.6.4-start -- cgit v1.2.3 From fa1827fa32f5dc046b17cde1ddbac8316f061793 Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Mon, 11 Apr 2011 09:09:30 -0400 Subject: increment viewer version to 2.6.5 --- indra/llcommon/llversionviewer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h index ae2bd0d78b..bd6df962a1 100644 --- a/indra/llcommon/llversionviewer.h +++ b/indra/llcommon/llversionviewer.h @@ -29,7 +29,7 @@ const S32 LL_VERSION_MAJOR = 2; const S32 LL_VERSION_MINOR = 6; -const S32 LL_VERSION_PATCH = 4; +const S32 LL_VERSION_PATCH = 5; const S32 LL_VERSION_BUILD = 0; const char * const LL_CHANNEL = "Second Life Developer"; -- cgit v1.2.3 From 0e8232790bf1e2f850f15670685811e40ea22d10 Mon Sep 17 00:00:00 2001 From: Paul ProductEngine <pguslisty@productengine.com> Date: Mon, 11 Apr 2011 18:07:24 +0300 Subject: STORM-413 FIXED The presentation of IM sessions in message well depends on method that was used for opening IM window - Replaced setRect method with setShape so that reshape and translate method be called --- indra/newview/llsyswellwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp index e7b5c13860..cb49976e5f 100644 --- a/indra/newview/llsyswellwindow.cpp +++ b/indra/newview/llsyswellwindow.cpp @@ -310,7 +310,7 @@ void LLIMWellWindow::RowPanel::onChicletSizeChanged(LLChiclet* ctrl, const LLSD& S32 new_text_left = mChiclet->getRect().mRight + CHICLET_HPAD; LLRect text_rect = text->getRect(); text_rect.mLeft = new_text_left; - text->setRect(text_rect); + text->setShape(text_rect); } //--------------------------------------------------------------------------------- -- cgit v1.2.3 From 675e0cfd993ca6fab5843bf7ad0254e5e14254fc Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Mon, 11 Apr 2011 14:12:49 -0500 Subject: Use tcmalloc from 3p-google-perftools on windows --- autobuild.xml | 8 ++++---- scripts/messages/message_template.msg.sha1 | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 73a49d742d..d12bb1d3f7 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -42,9 +42,9 @@ <key>archive</key> <map> <key>hash</key> - <string>7fd216bdcf9be961a78bfaef31a617f1</string> + <string>c4ae6cddc04e0b2908a301726a53922c</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-glod/rev/226145/arch/CYGWIN/installer/glod-1.0pre4-windows-20110408.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-glod/rev/226194/arch/CYGWIN/installer/glod-1.0pre4-windows-20110408.tar.bz2</string> </map> <key>name</key> <string>windows</string> @@ -1642,9 +1642,9 @@ <key>archive</key> <map> <key>hash</key> - <string>8108bffe1c814be9d035b47dac3d4541</string> + <string>8308f7bd68bb7083655753b7abe7225f</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google-perftools-1.0-windows-20101001b.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-perftools/rev/226287/arch/CYGWIN/installer/google_perftools-1.7-windows-20110411.tar.bz2</string> </map> <key>name</key> <string>windows</string> diff --git a/scripts/messages/message_template.msg.sha1 b/scripts/messages/message_template.msg.sha1 index 41e70011af..6486d92851 100644 --- a/scripts/messages/message_template.msg.sha1 +++ b/scripts/messages/message_template.msg.sha1 @@ -1 +1 @@ -ce3be58f4ea395c272fcfa3e6b6dad027c188e0d \ No newline at end of file +465164e1a07f63d68c4ad1f00c19805dfb6ee2d7 \ No newline at end of file -- cgit v1.2.3 From 0f785cef5751b0cf9428592ee9ddc9c991aaf7ec Mon Sep 17 00:00:00 2001 From: Seth ProductEngine <slitovchuk@productengine.com> Date: Mon, 11 Apr 2011 22:38:03 +0300 Subject: STORM-1145 FIXED displaying favorites list at login screen when user name is typed like "firstname.lastname" or "firstname_lastname" or user name consists of a single word. Restoring the fix for STORM-842 (changeset ccfd9a2e3b3c) lost during merging (changeset 5618715b7b2d). --- indra/newview/llpanellogin.cpp | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 7820ac3ecd..979d96ca0d 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -81,6 +81,9 @@ const S32 MAX_PASSWORD = 16; LLPanelLogin *LLPanelLogin::sInstance = NULL; BOOL LLPanelLogin::sCapslockDidNotification = FALSE; +// Helper for converting a user name into the canonical "Firstname Lastname" form. +// For new accounts without a last name "Resident" is added as a last name. +static std::string canonicalize_username(const std::string& name); class LLLoginRefreshHandler : public LLCommandHandler { @@ -302,7 +305,14 @@ void LLPanelLogin::addFavoritesToStartLocation() for (LLSD::map_const_iterator iter = fav_llsd.beginMap(); iter != fav_llsd.endMap(); ++iter) { - if(iter->first != getChild<LLComboBox>("username_combo")->getSimple()) continue; + std::string user_defined_name = getChild<LLComboBox>("username_combo")->getSimple(); + + // The account name in stored_favorites.xml has Resident last name even if user has + // a single word account name, so it can be compared case-insensitive with the + // user defined "firstname lastname". + S32 res = LLStringUtil::compareInsensitive(canonicalize_username(user_defined_name), iter->first); + if (res != 0) continue; + combo->addSeparator(); LLSD user_llsd = iter->second; for (LLSD::array_const_iterator iter1 = user_llsd.beginArray(); @@ -1186,3 +1196,28 @@ void LLPanelLogin::onModeChangeConfirm(const LLSD& original_value, const LLSD& n break; } } + +std::string canonicalize_username(const std::string& name) +{ + std::string cname = name; + LLStringUtil::trim(cname); + + // determine if the username is a first/last form or not. + size_t separator_index = cname.find_first_of(" ._"); + std::string first = cname.substr(0, separator_index); + std::string last; + if (separator_index != cname.npos) + { + last = cname.substr(separator_index+1, cname.npos); + LLStringUtil::trim(last); + } + else + { + // ...on Linden grids, single username users as considered to have + // last name "Resident" + last = "Resident"; + } + + // Username in traditional "firstname lastname" form. + return first + ' ' + last; +} -- cgit v1.2.3 From d4ac1fec779437136d19421076ee7fdf3575207f Mon Sep 17 00:00:00 2001 From: "niel@nirvana.planescape.home" <niel@nirvana.planescape.home> Date: Mon, 11 Apr 2011 21:04:02 +0100 Subject: OPEN-50 Moved USE_PRECOMPILED_HEADERS=ON from common, to Windows only settings as it doesn't appear to be used by others. --- autobuild.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 76e551938a..4acad499a9 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1609,7 +1609,6 @@ <string>-DWORD_SIZE:STRING=32</string> <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DUSE_PRECOMPILED_HEADERS=ON</string> <string>-DFMOD=FALSE</string> </array> <key>arguments</key> @@ -1651,7 +1650,6 @@ <string>-DWORD_SIZE:STRING=32</string> <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DUSE_PRECOMPILED_HEADERS=ON</string> <string>-DFMOD=FALSE</string> </array> <key>arguments</key> @@ -1696,7 +1694,6 @@ <string>-DWORD_SIZE:STRING=32</string> <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DUSE_PRECOMPILED_HEADERS=ON</string> <string>-DFMOD=FALSE</string> </array> <key>arguments</key> @@ -2131,6 +2128,7 @@ <string>-G</string> <string>"Visual Studio 10"</string> <string>-DUNATTENDED:BOOL=ON</string> + <string>-DUSE_PRECOMPILED_HEADERS=ON</string> </array> </map> <key>name</key> @@ -2205,6 +2203,7 @@ <string>-G</string> <string>"Visual Studio 10"</string> <string>-DUNATTENDED:BOOL=ON</string> + <string>-DUSE_PRECOMPILED_HEADERS=ON</string> </array> </map> <key>name</key> @@ -2278,6 +2277,7 @@ <string>-G</string> <string>"Visual Studio 10"</string> <string>-DUNATTENDED:BOOL=ON</string> + <string>-DUSE_PRECOMPILED_HEADERS=ON</string> </array> </map> <key>name</key> -- cgit v1.2.3 From 92c3107419a9c810d802318816dd8015f4762e3f Mon Sep 17 00:00:00 2001 From: Xiaohong Bao <bao@lindenlab.com> Date: Mon, 11 Apr 2011 14:08:01 -0600 Subject: fix for SH-1235: [PUBLIC] Select a HUD attachment and moving a child prim or entire linkset crashes viewer --- indra/newview/llviewerdisplay.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index b45d1aa3a6..ba48ad4517 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -1024,7 +1024,7 @@ void render_hud_attachments() gPipeline.renderGeom(hud_cam); LLSpatialGroup::sNoDelete = FALSE; - gPipeline.clearReferences(); + //gPipeline.clearReferences(); render_hud_elements(); -- cgit v1.2.3 From e955cb58dffa16d789d05a9a7128fc8b44c94a34 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Mon, 11 Apr 2011 16:13:22 -0400 Subject: SH-1328 FIXED Crash on LLWearableType::getAllowMultiwear Crash was because we weren't checking for null wearable lookups. --- indra/newview/llwearabletype.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/indra/newview/llwearabletype.cpp b/indra/newview/llwearabletype.cpp index f933be4d8f..9e95604712 100644 --- a/indra/newview/llwearabletype.cpp +++ b/indra/newview/llwearabletype.cpp @@ -144,6 +144,7 @@ BOOL LLWearableType::getDisableCameraSwitch(LLWearableType::EType type) { const LLWearableDictionary *dict = LLWearableDictionary::getInstance(); const WearableEntry *entry = dict->lookup(type); + if (!entry) return FALSE; return entry->mDisableCameraSwitch; } @@ -152,6 +153,7 @@ BOOL LLWearableType::getAllowMultiwear(LLWearableType::EType type) { const LLWearableDictionary *dict = LLWearableDictionary::getInstance(); const WearableEntry *entry = dict->lookup(type); + if (!entry) return FALSE; return entry->mAllowMultiwear; } -- cgit v1.2.3 From a32080afac1316154282e4ad2361af6bdce5e2a5 Mon Sep 17 00:00:00 2001 From: "niel@nirvana.planescape.home" <niel@nirvana.planescape.home> Date: Mon, 11 Apr 2011 21:24:04 +0100 Subject: OPEN-50 Removing unnecessary FMOD=FALSE from common. INSTALL_PROPRIETARY=FALSE covers this. --- autobuild.xml | 3 --- 1 file changed, 3 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 4acad499a9..1352e92ecc 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1609,7 +1609,6 @@ <string>-DWORD_SIZE:STRING=32</string> <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> </array> <key>arguments</key> <array> @@ -1650,7 +1649,6 @@ <string>-DWORD_SIZE:STRING=32</string> <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> </array> <key>arguments</key> <array> @@ -1694,7 +1692,6 @@ <string>-DWORD_SIZE:STRING=32</string> <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> </array> <key>arguments</key> <array> -- cgit v1.2.3 From 8fbe2bc2d6eebb6d225e59e25fae36137bca0418 Mon Sep 17 00:00:00 2001 From: "niel@nirvana.planescape.home" <niel@nirvana.planescape.home> Date: Mon, 11 Apr 2011 21:27:24 +0100 Subject: OPEN-50 Adding settings to Windows for controlling proprietary libs. This allows quictime to be used. Additionally, once a solution for FMOD is found this can also be enabled. --- autobuild.xml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/autobuild.xml b/autobuild.xml index 1352e92ecc..c5ec4b98ea 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -2126,6 +2126,9 @@ <string>"Visual Studio 10"</string> <string>-DUNATTENDED:BOOL=ON</string> <string>-DUSE_PRECOMPILED_HEADERS=ON</string> + <string>-DINSTALL_PROPRIETARY=TRUE</string> + <string>-DUSE_KDU=FALSE</string> + <string>-DFMOD=FALSE</string> </array> </map> <key>name</key> @@ -2201,6 +2204,9 @@ <string>"Visual Studio 10"</string> <string>-DUNATTENDED:BOOL=ON</string> <string>-DUSE_PRECOMPILED_HEADERS=ON</string> + <string>-DINSTALL_PROPRIETARY=TRUE</string> + <string>-DUSE_KDU=FALSE</string> + <string>-DFMOD=FALSE</string> </array> </map> <key>name</key> @@ -2275,6 +2281,9 @@ <string>"Visual Studio 10"</string> <string>-DUNATTENDED:BOOL=ON</string> <string>-DUSE_PRECOMPILED_HEADERS=ON</string> + <string>-DINSTALL_PROPRIETARY=TRUE</string> + <string>-DUSE_KDU=FALSE</string> + <string>-DFMOD=FALSE</string> </array> </map> <key>name</key> -- cgit v1.2.3 From 36d528e5dfb8ff8d5a349a023c2ebb95c5efb158 Mon Sep 17 00:00:00 2001 From: "niel@nirvana.planescape.home" <niel@nirvana.planescape.home> Date: Mon, 11 Apr 2011 21:29:50 +0100 Subject: OPEN-50 Adding LL_RELEASE_FOR_DOWNLOAD to ReleaseOS's common settings. --- autobuild.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/autobuild.xml b/autobuild.xml index c5ec4b98ea..a9ab71da29 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1692,6 +1692,7 @@ <string>-DWORD_SIZE:STRING=32</string> <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> <string>-DINSTALL_PROPRIETARY=FALSE</string> + <string>-DLL_RELEASE_FOR_DOWNLOAD:BOOL=YES</string> </array> <key>arguments</key> <array> -- cgit v1.2.3 -- cgit v1.2.3 From f9698c264442bb0db068e4dc9d4d1ab0ba5c210a Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine <vsavchuk@productengine.com> Date: Mon, 11 Apr 2011 23:33:06 +0300 Subject: STORM-1028 WIP Fixing bottom bar buttons reshaping, tier 9 Removed unused methods. --- indra/newview/llbottomtray.cpp | 20 -------------------- indra/newview/llbottomtray.h | 4 ---- 2 files changed, 24 deletions(-) diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index 9932dd5365..ca901766d7 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -492,26 +492,6 @@ void LLBottomTray::updateContextMenu(S32 x, S32 y, MASK mask) mBottomTrayContextMenu->setItemVisible("NearbyChatBar_Select_All", in_edit_box); } -void LLBottomTray::showGestureButton(BOOL visible) -{ - setTrayButtonVisibleIfPossible(RS_BUTTON_GESTURES, visible); -} - -void LLBottomTray::showMoveButton(BOOL visible) -{ - setTrayButtonVisibleIfPossible(RS_BUTTON_MOVEMENT, visible); -} - -void LLBottomTray::showCameraButton(BOOL visible) -{ - setTrayButtonVisibleIfPossible(RS_BUTTON_CAMERA, visible); -} - -void LLBottomTray::showSnapshotButton(BOOL visible) -{ - setTrayButtonVisibleIfPossible(RS_BUTTON_SNAPSHOT, visible); -} - void LLBottomTray::showSpeakButton(bool visible) { // Show/hide the button diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h index 1e8554f434..db7f5bc308 100644 --- a/indra/newview/llbottomtray.h +++ b/indra/newview/llbottomtray.h @@ -112,10 +112,6 @@ public: void showBottomTrayContextMenu(S32 x, S32 y, MASK mask); - void showGestureButton(BOOL visible); - void showMoveButton(BOOL visible); - void showCameraButton(BOOL visible); - void showSnapshotButton(BOOL visible); void showSpeakButton(bool visible); void toggleMovementControls(); -- cgit v1.2.3 From 0e2df0277510fc05d6038838ddf283dbd2e5124e Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Mon, 11 Apr 2011 15:42:17 -0500 Subject: Attempt at making tcmalloc work. --- indra/cmake/Copy3rdPartyLibs.cmake | 6 +++--- indra/cmake/GooglePerfTools.cmake | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index 38bfef6332..d4c478c3c7 100755 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -56,8 +56,8 @@ if(WINDOWS) ) if(USE_GOOGLE_PERFTOOLS) - set(debug_files ${debug_files} libtcmalloc-debug.dll) - set(release_files ${release_files} libtcmalloc.dll) + set(debug_files ${debug_files} libtcmalloc_minimal-debug.dll) + set(release_files ${release_files} libtcmalloc_minimal.dll) endif(USE_GOOGLE_PERFTOOLS) if (FMOD) @@ -262,7 +262,7 @@ elseif(LINUX) libopenal.so libopenjpeg.so libssl.so - libtcmalloc.so + libtcmalloc_minimal.so libuuid.so.16 libuuid.so.16.0.22 libssl.so.0.9.8 diff --git a/indra/cmake/GooglePerfTools.cmake b/indra/cmake/GooglePerfTools.cmake index b3d78919f2..8740e36753 100644 --- a/indra/cmake/GooglePerfTools.cmake +++ b/indra/cmake/GooglePerfTools.cmake @@ -7,8 +7,8 @@ else (STANDALONE) if (WINDOWS) use_prebuilt_binary(tcmalloc) set(TCMALLOC_LIBRARIES - debug libtcmalloc-debug - optimized libtcmalloc) + debug libtcmalloc_minimal-debug + optimized libtcmalloc_minimal) set(GOOGLE_PERFTOOLS_FOUND "YES") endif (WINDOWS) if (LINUX) -- cgit v1.2.3 From e5aaf90bffa7005c0aa872c2084b6d57659d0fee Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine <vsavchuk@productengine.com> Date: Tue, 12 Apr 2011 00:20:18 +0300 Subject: STORM-1028 WIP Fixing bottom bar buttons reshaping, tier 10 Fixing a regression introduced in tier 1: not displaying the bottom tray buttons added when bottom tray was not wide enough display them, even after increasing the width to show all visible buttons. The fix is to mark such buttons as auto-hidden so that they appear as soon as we have enough free space. --- indra/newview/llbottomtray.cpp | 35 ++++++++++++++++++++++++++++------- indra/newview/llbottomtray.h | 10 ++++++++++ 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index ca901766d7..d5d8a27d85 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -1223,7 +1223,7 @@ S32 LLBottomTray::processShowButtons(S32& available_width) bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32& available_width) { // Check if the button was previously auto-hidden (due to lack of space). - if ((mResizeState & shown_object_type) == 0) + if (!isAutoHidden(shown_object_type)) { return false; } @@ -1268,7 +1268,7 @@ void LLBottomTray::processHideButton(EResizeState processed_object_type, S32& re setTrayButtonVisible(processed_object_type, false); - mResizeState |= processed_object_type; + setAutoHidden(processed_object_type, true); lldebugs << "processing object type: " << processed_object_type << ", buttons_freed_width: " << buttons_freed_width @@ -1377,7 +1377,7 @@ void LLBottomTray::processShrinkButton(EResizeState processed_object_type, S32& void LLBottomTray::processExtendButtons(S32& available_width) { // do not allow extending any buttons if we have some buttons hidden via resize - if (mResizeState & RS_BUTTONS_CAN_BE_HIDDEN) return; + if (isAutoHidden(RS_BUTTONS_CAN_BE_HIDDEN)) return; lldebugs << "Distributing " << available_width << " px" << llendl; @@ -1500,7 +1500,7 @@ bool LLBottomTray::canButtonBeShown(EResizeState processed_object_type) const buttons_before_mask |= button_type; } - return !(buttons_before_mask & mResizeState); + return !isAutoHidden(buttons_before_mask); } void LLBottomTray::initResizeStateContainers() @@ -1632,7 +1632,7 @@ bool LLBottomTray::showButton(EResizeState button_type, S32& available_width) lldebugs << "Showing button " << resizeStateToString(button_type) << ", remaining available width: " << available_width << llendl; - mResizeState &= ~button_type; + setAutoHidden(button_type, false); return true; } @@ -1730,7 +1730,11 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible } else { - // Nothing can be done, give up... + lldebugs << "Need " << (minimal_width - available_width - possible_shrunk_width) + << " more px to show " << resizeStateToString(object_type) << llendl; + + // Make the button uppear when we have more available space. + setAutoHidden(object_type, true); return false; } } @@ -1757,7 +1761,7 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible // Mark button NOT to show while future bottom tray extending lldebugs << "Removing " << resizeStateToString(object_type) << " from mResizeState" << llendl; - mResizeState &= ~object_type; + setAutoHidden(object_type, false); // Extend other buttons if need if (delta_width) @@ -1908,4 +1912,21 @@ std::string LLBottomTray::resizeStateMaskToString(MASK mask) return res; } +bool LLBottomTray::isAutoHidden(MASK button_types) const +{ + return (mResizeState & button_types) != 0; +} + +void LLBottomTray::setAutoHidden(MASK button_types, bool hide) +{ + if (hide) + { + mResizeState |= button_types; + } + else + { + mResizeState &= ~button_types; + } +} + //EOF diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h index db7f5bc308..52bcd2ddac 100644 --- a/indra/newview/llbottomtray.h +++ b/indra/newview/llbottomtray.h @@ -449,6 +449,16 @@ private: /// Dump a mask for debugging static std::string resizeStateMaskToString(MASK mask); + /// @return true if any of the the passed buttons have been auto-hidden due to lack of available space. + bool isAutoHidden(MASK button_types) const; + + /** + * (Un)Mark the buttons as hidden. + * + * Auto-hidden buttons are those that re-appear as soon as we have enough available space. + */ + void setAutoHidden(MASK button_types, bool hide); + /// Buttons automatically hidden due to lack of space. MASK mResizeState; -- cgit v1.2.3 From 4a7f69f82008594d5f8d15887917e4b4a85ef587 Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine <vsavchuk@productengine.com> Date: Tue, 12 Apr 2011 00:32:24 +0300 Subject: STORM-1028 WIP Fixing bottom bar buttons reshaping, tier 11 Typo. --- indra/newview/llbottomtray.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index d5d8a27d85..b6482e0ec4 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -1038,23 +1038,23 @@ S32 LLBottomTray::processWidthDecreased(S32 delta_width) { bool still_should_be_processed = true; - const S32 chiclet_panel_shrink_headrom = getChicletPanelShrinkHeadroom(); + const S32 chiclet_panel_shrink_headroom = getChicletPanelShrinkHeadroom(); // There are four steps of processing width decrease. If in one of them required width was reached, // further are not needed. // 1. Decreasing width of chiclet panel. - if (chiclet_panel_shrink_headrom > 0) + if (chiclet_panel_shrink_headroom > 0) { // we have some space to decrease chiclet panel - S32 shrink_by = llmin(-delta_width, chiclet_panel_shrink_headrom); + S32 shrink_by = llmin(-delta_width, chiclet_panel_shrink_headroom); lldebugs << "delta_width: " << delta_width - << ", panel_delta_min: " << chiclet_panel_shrink_headrom + << ", panel_delta_min: " << chiclet_panel_shrink_headroom << ", shrink_by: " << shrink_by << llendl; // is chiclet panel wide enough to process resizing? - delta_width += chiclet_panel_shrink_headrom; + delta_width += chiclet_panel_shrink_headroom; still_should_be_processed = delta_width < 0; -- cgit v1.2.3 From 518181200dec957dccdfdd460fca06b53cb22b5a Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine <vsavchuk@productengine.com> Date: Tue, 12 Apr 2011 01:26:10 +0300 Subject: STORM-1028 WIP Fixing bottom bar buttons reshaping, tier 12 Decreased default nearby char bar width from 310 to 250 px. This enables the Speak button label to be shown by default. --- indra/newview/skins/default/xui/en/panel_bottomtray.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index 6620808da6..3bb5896c5b 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -47,13 +47,13 @@ mouse_opaque="false" name="chat_bar_layout_panel" user_resize="true" - width="310" > + width="250" > <panel name="chat_bar" filename="panel_nearby_chat_bar.xml" left="0" height="28" - width="308" + width="248" top="0" mouse_opaque="false" follows="left|right" -- cgit v1.2.3 From 8f01b70ff20f67501df0e6eab4c0965f210336c0 Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Mon, 11 Apr 2011 17:50:40 -0500 Subject: Fix for bad merge concerning incremental linking options. --- indra/newview/CMakeLists.txt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index d70f3ec337..991669d271 100755 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1451,6 +1451,14 @@ set(PACKAGE ON CACHE BOOL "Add a package target that builds an installer package.") if (WINDOWS) + set_target_properties(${VIEWER_BINARY_NAME} + PROPERTIES + # *TODO -reenable this once we get server usage sorted out + #LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:WINDOWS /INCLUDE:\"__tcmalloc\"" + LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:WINDOWS" + LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\" /INCREMENTAL:NO" + LINK_FLAGS_RELEASE "" + ) if(USE_PRECOMPILED_HEADERS) set_target_properties( ${VIEWER_BINARY_NAME} -- cgit v1.2.3 From f2de0bae8a4b2fdf18d5d314e835dd8ac4ad8383 Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Mon, 11 Apr 2011 18:07:43 -0500 Subject: Fix for bad merge in viewer_manifest.py --- indra/newview/viewer_manifest.py | 28 ---------------------------- 1 file changed, 28 deletions(-) diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 73967cdcb8..0850309d77 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -946,34 +946,6 @@ class Linux_i686Manifest(LinuxManifest): if self.prefix("../packages/lib/release", dst="lib"): self.path("libapr-1.so") - try: - self.path(self.find_existing_file(os.path.join(os.pardir, lib, libfile), - '../../libraries/i686-linux/lib_release_client/%s' % libfile), - dst=os.path.join(destdir, libfile)) - # keep this one to preserve syntax, open source mangling removes previous lines - pass - except RuntimeError: - print "Skipping %s - not found" % libfile - pass - - self.path("secondlife-bin","bin/do-not-directly-run-secondlife-bin") - - self.path("../linux_crash_logger/linux-crash-logger","bin/linux-crash-logger.bin") - self.path("../linux_updater/linux-updater", "bin/linux-updater.bin") - self.path("../llplugin/slplugin/SLPlugin", "bin/SLPlugin") - if self.prefix("res-sdl"): - self.path("*") - # recurse - self.end_prefix("res-sdl") - - # plugins - if self.prefix(src="", dst="bin/llplugin"): - self.path("../media_plugins/webkit/libmedia_plugin_webkit.so", "libmedia_plugin_webkit.so") - self.path("../media_plugins/gstreamer010/libmedia_plugin_gstreamer010.so", "libmedia_plugin_gstreamer.so") - self.end_prefix("bin/llplugin") - - self.path("featuretable_linux.txt") - #self.path("secondlife-i686.supp") self.path("libapr-1.so.0") self.path("libapr-1.so.0.4.2") self.path("libaprutil-1.so") -- cgit v1.2.3 From 73cfc64bee057d0f76ab2ca574681dd3fc18e7a8 Mon Sep 17 00:00:00 2001 From: Seth ProductEngine <slitovchuk@productengine.com> Date: Tue, 12 Apr 2011 02:09:37 +0300 Subject: STORM-1145 ADDITIONAL FIX Fixed removing the record of user favorites available at login location menu when user switches off this feature. User favorite locations record is removed from the settings file each time when user exits the viewer with "ShowFavoritesOnLogin" setting off and his name is found on the record. --- indra/newview/llfloaterpreference.cpp | 36 +---------------------------------- indra/newview/llfloaterpreference.h | 4 ---- indra/newview/llviewerinventory.cpp | 29 ++++++++++++++++++++++++++++ 3 files changed, 30 insertions(+), 39 deletions(-) diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 1a9d0af9af..c72cf13745 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -286,8 +286,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key) mOriginalIMViaEmail(false), mLanguageChanged(false), mAvatarDataInitialized(false), - mDoubleClickActionDirty(false), - mFavoritesRecordMayExist(false) + mDoubleClickActionDirty(false) { //Build Floater is now Called from LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreference>); @@ -565,34 +564,6 @@ void LLFloaterPreference::apply() updateDoubleClickSettings(); mDoubleClickActionDirty = false; } - - if (mFavoritesRecordMayExist && !gSavedPerAccountSettings.getBOOL("ShowFavoritesOnLogin")) - { - removeFavoritesRecordOfUser(); - } -} - -void LLFloaterPreference::removeFavoritesRecordOfUser() -{ - mFavoritesRecordMayExist = false; - std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml"); - LLSD fav_llsd; - llifstream file; - file.open(filename); - if (!file.is_open()) return; - LLSDSerialize::fromXML(fav_llsd, file); - - LLAvatarName av_name; - LLAvatarNameCache::get( gAgentID, &av_name ); - if (fav_llsd.has(av_name.getLegacyName())) - { - fav_llsd.erase(av_name.getLegacyName()); - } - - llofstream out_file; - out_file.open(filename); - LLSDSerialize::toPrettyXML(fav_llsd, out_file); - } void LLFloaterPreference::cancel() @@ -678,11 +649,6 @@ void LLFloaterPreference::onOpen(const LLSD& key) getChildView("maturity_desired_combobox")->setVisible( false); } - if (LLStartUp::getStartupState() == STATE_STARTED) - { - mFavoritesRecordMayExist = gSavedPerAccountSettings.getBOOL("ShowFavoritesOnLogin"); - } - // Forget previous language changes. mLanguageChanged = false; diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index 5d5e066ec5..4d8a2489be 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -159,8 +159,6 @@ public: void buildPopupLists(); static void refreshSkin(void* data); - // Remove record of current user's favorites from file on disk. - void removeFavoritesRecordOfUser(); private: static std::string sSkin; // set true if state of double-click action checkbox or radio-group was changed by user @@ -172,8 +170,6 @@ private: bool mAvatarDataInitialized; bool mOriginalHideOnlineStatus; - // Record of current user's favorites may be stored in file on disk. - bool mFavoritesRecordMayExist; std::string mDirectoryVisibility; LLAvatarData mAvatarProperties; diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 519514d99c..42750f8b3f 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -1450,6 +1450,9 @@ private: void saveFavoritesSLURLs(); + // Remove record of current user's favorites from file on disk. + void removeFavoritesRecordOfUser(); + void onLandmarkLoaded(const LLUUID& asset_id, LLLandmark* landmark); void storeFavoriteSLURL(const LLUUID& asset_id, std::string& slurl); @@ -1534,6 +1537,10 @@ void LLFavoritesOrderStorage::destroyClass() { LLFavoritesOrderStorage::instance().saveFavoritesSLURLs(); } + else + { + LLFavoritesOrderStorage::instance().removeFavoritesRecordOfUser(); + } } void LLFavoritesOrderStorage::load() @@ -1602,6 +1609,28 @@ void LLFavoritesOrderStorage::saveFavoritesSLURLs() LLSDSerialize::toPrettyXML(fav_llsd, file); } +void LLFavoritesOrderStorage::removeFavoritesRecordOfUser() +{ + std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml"); + LLSD fav_llsd; + llifstream file; + file.open(filename); + if (!file.is_open()) return; + LLSDSerialize::fromXML(fav_llsd, file); + + LLAvatarName av_name; + LLAvatarNameCache::get( gAgentID, &av_name ); + if (fav_llsd.has(av_name.getLegacyName())) + { + fav_llsd.erase(av_name.getLegacyName()); + } + + llofstream out_file; + out_file.open(filename); + LLSDSerialize::toPrettyXML(fav_llsd, out_file); + +} + void LLFavoritesOrderStorage::onLandmarkLoaded(const LLUUID& asset_id, LLLandmark* landmark) { if (!landmark) return; -- cgit v1.2.3 From 67f33bff1b078e10149151af32e62ea88e7484c3 Mon Sep 17 00:00:00 2001 From: Seth ProductEngine <slitovchuk@productengine.com> Date: Tue, 12 Apr 2011 03:00:05 +0300 Subject: STORM-1042 FIXED Fixed the inventory observers of newly added items. The problem was caused by an outdated message name stored in LLInventoryObserver::mMessageName and not updated properly in LLInventoryModel::notifyObservers(). The message name used in LLInventoryAddedObserver::changed() was the name of the message most recently passed by LLInventoryModel::notifyObservers(), instead of the name of the latest actually received message. Using the most recent message name in this case fixed the problem. --- indra/newview/llinventorymodel.cpp | 19 +++++-------------- indra/newview/llinventorymodel.h | 5 ++--- indra/newview/llinventorymodelbackgroundfetch.cpp | 6 +++--- indra/newview/llinventoryobserver.cpp | 11 +---------- indra/newview/llinventoryobserver.h | 1 - 5 files changed, 11 insertions(+), 31 deletions(-) diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 53835f0166..b1975c7261 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -1059,12 +1059,11 @@ void LLInventoryModel::idleNotifyObservers() { return; } - notifyObservers(""); + notifyObservers(); } // Call this method when it's time to update everyone on a new state. -// The optional argument 'service_name' is used by Agent Inventory Service [DEV-20328] -void LLInventoryModel::notifyObservers(const std::string service_name) +void LLInventoryModel::notifyObservers() { if (mIsNotifyObservers) { @@ -1081,15 +1080,7 @@ void LLInventoryModel::notifyObservers(const std::string service_name) { LLInventoryObserver* observer = *iter; - if (service_name.empty()) - { - observer->changed(mModifyMask); - } - else - { - observer->mMessageName = service_name; - observer->changed(mModifyMask); - } + observer->changed(mModifyMask); // safe way to increment since changed may delete entries! (@!##%@!@&*!) iter = mObservers.upper_bound(observer); @@ -1187,7 +1178,7 @@ void LLInventoryModel::fetchInventoryResponder::result(const LLSD& content) { changes |= gInventory.updateItem(*it); } - gInventory.notifyObservers("fetchinventory"); + gInventory.notifyObservers(); gViewerWindow->getWindow()->decBusyCount(); } @@ -1196,7 +1187,7 @@ void LLInventoryModel::fetchInventoryResponder::error(U32 status, const std::str { llinfos << "fetchInventory::error " << status << ": " << reason << llendl; - gInventory.notifyObservers("fetchinventory"); + gInventory.notifyObservers(); } bool LLInventoryModel::fetchDescendentsOf(const LLUUID& folder_id) const diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h index f6728fd575..15da09990f 100644 --- a/indra/newview/llinventorymodel.h +++ b/indra/newview/llinventorymodel.h @@ -425,9 +425,8 @@ public: // has been indicated. void idleNotifyObservers(); - // Call to explicitly update everyone on a new state. The optional argument - // 'service_name' is used by Agent Inventory Service [DEV-20328] - void notifyObservers(const std::string service_name=""); + // Call to explicitly update everyone on a new state. + void notifyObservers(); // Allows outsiders to tell the inventory if something has // been changed 'under the hood', but outside the control of the diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp index e31360fcbc..7b1ff102e7 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.cpp +++ b/indra/newview/llinventorymodelbackgroundfetch.cpp @@ -388,7 +388,7 @@ void LLInventoryModelFetchDescendentsResponder::result(const LLSD& content) titem->setParent(lost_uuid); titem->updateParentOnServer(FALSE); gInventory.updateItem(titem); - gInventory.notifyObservers("fetchDescendents"); + gInventory.notifyObservers(); } } @@ -464,7 +464,7 @@ void LLInventoryModelFetchDescendentsResponder::result(const LLSD& content) fetcher->setAllFoldersFetched(); } - gInventory.notifyObservers("fetchDescendents"); + gInventory.notifyObservers(); } // If we get back an error (not found, etc...), handle it here. @@ -496,7 +496,7 @@ void LLInventoryModelFetchDescendentsResponder::error(U32 status, const std::str fetcher->setAllFoldersFetched(); } } - gInventory.notifyObservers("fetchDescendents"); + gInventory.notifyObservers(); } BOOL LLInventoryModelFetchDescendentsResponder::getIsRecursive(const LLUUID& cat_id) const diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp index 0fd4b2bee5..6bf19e346d 100644 --- a/indra/newview/llinventoryobserver.cpp +++ b/indra/newview/llinventoryobserver.cpp @@ -572,16 +572,7 @@ void LLInventoryAddedObserver::changed(U32 mask) // the network, figure out which item was updated. LLMessageSystem* msg = gMessageSystem; - std::string msg_name; - if (mMessageName.empty()) - { - msg_name = msg->getMessageName(); - } - else - { - msg_name = mMessageName; - } - + std::string msg_name = msg->getMessageName(); if (msg_name.empty()) { return; diff --git a/indra/newview/llinventoryobserver.h b/indra/newview/llinventoryobserver.h index f2a2049a51..2d9021961e 100644 --- a/indra/newview/llinventoryobserver.h +++ b/indra/newview/llinventoryobserver.h @@ -63,7 +63,6 @@ public: LLInventoryObserver(); virtual ~LLInventoryObserver(); virtual void changed(U32 mask) = 0; - std::string mMessageName; // used by Agent Inventory Service only. [DEV-20328] }; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- cgit v1.2.3 From d640839826807d361aba30ccf90955280375de06 Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Tue, 12 Apr 2011 10:34:58 -0500 Subject: We're using libcollada14dom22 now. --- indra/newview/viewer_manifest.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 0850309d77..6f70034624 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -275,9 +275,9 @@ class WindowsManifest(ViewerManifest): # Mesh 3rd party libs needed for auto LOD and collada reading try: if self.args['configuration'].lower() == 'debug': - self.path("libcollada14dom21-d.dll") + self.path("libcollada14dom22-d.dll") else: - self.path("libcollada14dom21.dll") + self.path("libcollada14dom22.dll") self.path("glod.dll") except RuntimeError, err: -- cgit v1.2.3 From b13b6ef014c251b77a42e40c3fa08ccd05326f16 Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Tue, 12 Apr 2011 12:07:45 -0500 Subject: New tcmalloc. --- autobuild.xml | 8 ++++---- indra/llmath/lloctree.h | 10 +--------- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index d12bb1d3f7..fee61b7f2d 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1630,9 +1630,9 @@ <key>archive</key> <map> <key>hash</key> - <string>cf513fc2eec4a414cc804cf408932a45</string> + <string>e2e260409cbd9ac95bfbce929d88accb</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google_perftools-1.7-linux-20110315.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-perftools/rev/226424/arch/Linux/installer/google_perftools-1.7-linux-20110412.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -1642,9 +1642,9 @@ <key>archive</key> <map> <key>hash</key> - <string>8308f7bd68bb7083655753b7abe7225f</string> + <string>f68604547012e92db912b324c69fbeac</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-perftools/rev/226287/arch/CYGWIN/installer/google_perftools-1.7-windows-20110411.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-perftools/rev/226424/arch/CYGWIN/installer/google_perftools-1.7-windows-20110412.tar.bz2</string> </map> <key>name</key> <string>windows</string> diff --git a/indra/llmath/lloctree.h b/indra/llmath/lloctree.h index fdfc24f8b7..49e84cf1b4 100644 --- a/indra/llmath/lloctree.h +++ b/indra/llmath/lloctree.h @@ -580,19 +580,11 @@ public: } protected: - typedef enum - { - CENTER = 0, - SIZE = 1, - MAX = 2, - MIN = 3 - } eDName; - LLVector4a mCenter; LLVector4a mSize; LLVector4a mMax; LLVector4a mMin; - + oct_node* mParent; U8 mOctant; -- cgit v1.2.3 From 2027eb8c2bfdc7952fc613f0642192e0c807ec07 Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Tue, 12 Apr 2011 12:27:03 -0500 Subject: Backed out changeset: c5a0cc9abf49 --- autobuild.xml | 8 ++++---- indra/llmath/lloctree.h | 10 +++++++++- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index fee61b7f2d..d12bb1d3f7 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1630,9 +1630,9 @@ <key>archive</key> <map> <key>hash</key> - <string>e2e260409cbd9ac95bfbce929d88accb</string> + <string>cf513fc2eec4a414cc804cf408932a45</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-perftools/rev/226424/arch/Linux/installer/google_perftools-1.7-linux-20110412.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google_perftools-1.7-linux-20110315.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -1642,9 +1642,9 @@ <key>archive</key> <map> <key>hash</key> - <string>f68604547012e92db912b324c69fbeac</string> + <string>8308f7bd68bb7083655753b7abe7225f</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-perftools/rev/226424/arch/CYGWIN/installer/google_perftools-1.7-windows-20110412.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-perftools/rev/226287/arch/CYGWIN/installer/google_perftools-1.7-windows-20110411.tar.bz2</string> </map> <key>name</key> <string>windows</string> diff --git a/indra/llmath/lloctree.h b/indra/llmath/lloctree.h index 49e84cf1b4..fdfc24f8b7 100644 --- a/indra/llmath/lloctree.h +++ b/indra/llmath/lloctree.h @@ -580,11 +580,19 @@ public: } protected: + typedef enum + { + CENTER = 0, + SIZE = 1, + MAX = 2, + MIN = 3 + } eDName; + LLVector4a mCenter; LLVector4a mSize; LLVector4a mMax; LLVector4a mMin; - + oct_node* mParent; U8 mOctant; -- cgit v1.2.3 From e0c509d4634960ba33be3ce744110934b381ba4d Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" <vir@lindenlab.com> Date: Tue, 12 Apr 2011 14:39:31 -0400 Subject: updated builds used for pcre, collada on mac --- autobuild.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index d12bb1d3f7..43d297df6d 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -234,9 +234,9 @@ <key>archive</key> <map> <key>hash</key> - <string>d2b666a8eec1cadc81152ae94cad249f</string> + <string>cb307f03a17941333bee13495450107c</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-colladadom/rev/226180/arch/Darwin/installer/colladadom-2.2-darwin-20110408.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-colladadom/rev/226422/arch/Darwin/installer/colladadom-2.2-darwin-20110412.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -1498,9 +1498,9 @@ <key>archive</key> <map> <key>hash</key> - <string>ef430ae3b9cdba518ad9952e99b12367</string> + <string>cb04654cdfe93e3c8d16fef0c475e2bb</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/pcre-7.6-darwin-20101102.tar.bz2</string> + <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-pcre/rev/226370/arch/Darwin/installer/pcre-7.6-darwin-20110411.tar.bz2</string> </map> <key>name</key> <string>darwin</string> -- cgit v1.2.3 From c77d1b3a657061cef70ebb9c5ccabb23ef61b242 Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Tue, 12 Apr 2011 15:59:46 -0500 Subject: Define __tcmalloc to actually use tcmalloc (fixes memory alignment issues). --- indra/newview/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 991669d271..24bd3299f1 100755 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1455,7 +1455,7 @@ if (WINDOWS) PROPERTIES # *TODO -reenable this once we get server usage sorted out #LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:WINDOWS /INCLUDE:\"__tcmalloc\"" - LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:WINDOWS" + LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:WINDOWS /INCLUDE:__tcmalloc" LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\" /INCREMENTAL:NO" LINK_FLAGS_RELEASE "" ) -- cgit v1.2.3 From 241350f8455a262eca8f1195b6abfc167674dca6 Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Tue, 12 Apr 2011 15:06:21 -0700 Subject: SH-1205 Lock out ability to change sculpt stitching type or sculpt map when sculpt stitching type --- indra/newview/llpanelobject.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp index f135fcbed6..64af6c2157 100644 --- a/indra/newview/llpanelobject.cpp +++ b/indra/newview/llpanelobject.cpp @@ -1117,23 +1117,23 @@ void LLPanelObject::getState( ) mSculptTypeRevert = sculpt_params->getSculptType(); } + U8 sculpt_type = sculpt_params->getSculptType(); + U8 sculpt_stitching = sculpt_type & LL_SCULPT_TYPE_MASK; + BOOL sculpt_invert = sculpt_type & LL_SCULPT_FLAG_INVERT; + BOOL sculpt_mirror = sculpt_type & LL_SCULPT_FLAG_MIRROR; + isMesh = (sculpt_stitching == LL_SCULPT_TYPE_MESH); + LLTextureCtrl* mTextureCtrl = getChild<LLTextureCtrl>("sculpt texture control"); if(mTextureCtrl) { mTextureCtrl->setTentative(FALSE); - mTextureCtrl->setEnabled(editable); + mTextureCtrl->setEnabled(editable && !isMesh); if (editable) mTextureCtrl->setImageAssetID(sculpt_params->getSculptTexture()); else mTextureCtrl->setImageAssetID(LLUUID::null); } - U8 sculpt_type = sculpt_params->getSculptType(); - U8 sculpt_stitching = sculpt_type & LL_SCULPT_TYPE_MASK; - BOOL sculpt_invert = sculpt_type & LL_SCULPT_FLAG_INVERT; - BOOL sculpt_mirror = sculpt_type & LL_SCULPT_FLAG_MIRROR; - isMesh = (sculpt_stitching == LL_SCULPT_TYPE_MESH); - mComboBaseType->setEnabled(!isMesh); if (mCtrlSculptType) -- cgit v1.2.3 From 2399b2fca12d916d4de17db45c3a34a6678453d8 Mon Sep 17 00:00:00 2001 From: Monty Brandenberg <monty@lindenlab.com> Date: Tue, 12 Apr 2011 18:11:28 -0400 Subject: Fix gcc 4.2 warning about incomplete case coverage in switch statement for plugin events. This becomes an error in the build so I'm adding a default: case to cover the enumeration. --- indra/test_apps/llplugintest/llmediaplugintest.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/indra/test_apps/llplugintest/llmediaplugintest.cpp b/indra/test_apps/llplugintest/llmediaplugintest.cpp index e9d4d99753..7164934b26 100644 --- a/indra/test_apps/llplugintest/llmediaplugintest.cpp +++ b/indra/test_apps/llplugintest/llmediaplugintest.cpp @@ -4,7 +4,7 @@ * * $LicenseInfo:firstyear=2008&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * Copyright (C) 2011, Linden Research, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -2233,7 +2233,13 @@ void LLMediaPluginTest::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent e case MEDIA_EVENT_LINK_HOVERED: { std::cerr << "Media event: MEDIA_EVENT_LINK_HOVERED, hover text is: " << self->getHoverText() << std::endl; - }; + } + break; + + default: + { + std::cerr << "Media event: <unknown>, code is: " << int(event) << std::endl; + } break; } } -- cgit v1.2.3 From 13e12b2773ebd784281e76a1ec488c532962f765 Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Tue, 12 Apr 2011 17:22:02 -0500 Subject: Fix for bad merge causing crash in llpolymorph.cpp --- indra/newview/llpolymesh.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/indra/newview/llpolymesh.cpp b/indra/newview/llpolymesh.cpp index 90e835cda8..24f84b2ddf 100644 --- a/indra/newview/llpolymesh.cpp +++ b/indra/newview/llpolymesh.cpp @@ -768,9 +768,9 @@ LLPolyMesh::LLPolyMesh(LLPolyMeshSharedData *shared_data, LLPolyMesh *reference_ // Allocate memory without initializing every vector // NOTE: This makes asusmptions about the size of LLVector[234] int nverts = mSharedData->mNumVertices; - int nfloats = nverts * (3*5 + 2 + 4); - //use 16 byte aligned vertex data to make LLPolyMesh SSE friendly - mVertexData = new F32[nfloats]; + int nfloats = nverts * (2*4 + 3*3 + 2 + 4); + //use 16 byte aligned vertex data to make LLPolyMesh SSE friendly + mVertexData = (F32*) malloc(nfloats*4); int offset = 0; mCoords = (LLVector4*)(mVertexData + offset); offset += 4*nverts; mNormals = (LLVector4*)(mVertexData + offset); offset += 4*nverts; @@ -799,7 +799,7 @@ LLPolyMesh::~LLPolyMesh() mJointRenderData[i] = NULL; } - delete [] mVertexData; + free(mVertexData); } -- cgit v1.2.3 From 71f5c1f5e8bbf6b22776cd7f98aabecc7a48918d Mon Sep 17 00:00:00 2001 From: "Debi King (Dessie)" <dessie@lindenlab.com> Date: Tue, 12 Apr 2011 18:46:31 -0400 Subject: Added tag DRTVWR-44_2.6.2-release, 2.6.2-release for changeset 214180ad5714 --- .hgtags | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.hgtags b/.hgtags index 190aaac169..4d6fdbcc1a 100644 --- a/.hgtags +++ b/.hgtags @@ -91,3 +91,5 @@ c9182ed77d427c759cfacf49a7b71a2e20d522aa 2.6.1-release 56b2778c743c2a964d82e1caf11084d76a87de2c 2.6.2-start d1203046bb653b763f835b04d184646949d8dd5c DRTVWR-45_2.6.2-beta1 d1203046bb653b763f835b04d184646949d8dd5c 2.6.2-beta1 +214180ad5714ce8392b82bbebcc92f4babd98300 DRTVWR-44_2.6.2-release +214180ad5714ce8392b82bbebcc92f4babd98300 2.6.2-release -- cgit v1.2.3 From 505e5e403d6439f29d60861553656d01522cb241 Mon Sep 17 00:00:00 2001 From: Merov Linden <merov@lindenlab.com> Date: Tue, 12 Apr 2011 16:06:24 -0700 Subject: EXP-681 : Add MEDIA_EVENT_NAVIGATE_ERROR_PAGE case in LLMediaPluginTest so to pass build on Mac --- indra/test_apps/llplugintest/llmediaplugintest.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/indra/test_apps/llplugintest/llmediaplugintest.cpp b/indra/test_apps/llplugintest/llmediaplugintest.cpp index e9d4d99753..ee65e0aa87 100644 --- a/indra/test_apps/llplugintest/llmediaplugintest.cpp +++ b/indra/test_apps/llplugintest/llmediaplugintest.cpp @@ -2154,6 +2154,10 @@ void LLMediaPluginTest::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent e } break; + case MEDIA_EVENT_NAVIGATE_ERROR_PAGE: + std::cerr << "Media event: MEDIA_EVENT_NAVIGATE_ERROR_PAGE, uri is: " << self->getClickURL() << std::endl; + break; + case MEDIA_EVENT_CLICK_LINK_HREF: { std::cerr << "Media event: MEDIA_EVENT_CLICK_LINK_HREF, uri is " << self->getClickURL() << ", target is " << self->getClickTarget() << std::endl; -- cgit v1.2.3 From c797cf6500a79f361ddfbaec589d64178efafcff Mon Sep 17 00:00:00 2001 From: Paul ProductEngine <pguslisty@productengine.com> Date: Wed, 13 Apr 2011 19:50:51 +0300 Subject: STORM-1136 FIXED LLDateUtil class defines March having 21 days, causing wrong avatar age calculation - Applied patch which fixes typo in enum. --- indra/newview/lldateutil.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/lldateutil.cpp b/indra/newview/lldateutil.cpp index fcc73a07bc..18ae6107e7 100644 --- a/indra/newview/lldateutil.cpp +++ b/indra/newview/lldateutil.cpp @@ -32,9 +32,9 @@ #include "llui.h" static S32 DAYS_PER_MONTH_NOLEAP[] = - { 31, 28, 21, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; + { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; static S32 DAYS_PER_MONTH_LEAP[] = - { 31, 29, 21, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; + { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; static S32 days_from_month(S32 year, S32 month) { -- cgit v1.2.3 From c6da212dc20138599cb945ff77f3c8a59b57e736 Mon Sep 17 00:00:00 2001 From: prep <prep@lindenlab.com> Date: Wed, 13 Apr 2011 14:18:19 -0400 Subject: Fix to allow for clicking again. --- indra/newview/app_settings/settings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 37a9c7304d..73f63458a3 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -7178,7 +7178,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>1.0</integer> + <integer>0</integer> </map> <key>RenderLocalLights</key> -- cgit v1.2.3 From 12f9f521ee6baeb39b403dfe15168de7ecfd9349 Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Wed, 13 Apr 2011 13:43:32 -0500 Subject: Fix for bad default setting and libpng using /GL --- autobuild.xml | 4 ++-- indra/newview/app_settings/settings.xml | 2 +- indra/newview/llpolymesh.cpp | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 43d297df6d..03db2f8d49 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1026,9 +1026,9 @@ <key>archive</key> <map> <key>hash</key> - <string>735a955e6442733e2342ab12c1087488</string> + <string>f194ba857ca8dd86483a3ef24535d0db</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.5.1-windows-20110221.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-libpng/rev/226532/arch/CYGWIN/installer/libpng-1.5.1-windows-20110413.tar.bz2</string> </map> <key>name</key> <string>windows</string> diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 37a9c7304d..73f63458a3 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -7178,7 +7178,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>1.0</integer> + <integer>0</integer> </map> <key>RenderLocalLights</key> diff --git a/indra/newview/llpolymesh.cpp b/indra/newview/llpolymesh.cpp index 24f84b2ddf..4b2c569cc3 100644 --- a/indra/newview/llpolymesh.cpp +++ b/indra/newview/llpolymesh.cpp @@ -768,9 +768,9 @@ LLPolyMesh::LLPolyMesh(LLPolyMeshSharedData *shared_data, LLPolyMesh *reference_ // Allocate memory without initializing every vector // NOTE: This makes asusmptions about the size of LLVector[234] int nverts = mSharedData->mNumVertices; - int nfloats = nverts * (2*4 + 3*3 + 2 + 4); - //use 16 byte aligned vertex data to make LLPolyMesh SSE friendly - mVertexData = (F32*) malloc(nfloats*4); + int nfloats = nverts * (2*4 + 3*3 + 2 + 4); + //use 16 byte aligned vertex data to make LLPolyMesh SSE friendly + mVertexData = (F32*) malloc(nfloats*4); int offset = 0; mCoords = (LLVector4*)(mVertexData + offset); offset += 4*nverts; mNormals = (LLVector4*)(mVertexData + offset); offset += 4*nverts; -- cgit v1.2.3 From efa26485dfa20d138cb654e27cb90e209dd1f395 Mon Sep 17 00:00:00 2001 From: Jonathan Yap <none@none> Date: Wed, 13 Apr 2011 15:09:44 -0400 Subject: STORM-1128 Sort the results of using search in the World Map --- doc/contributions.txt | 2 ++ indra/newview/llfloaterworldmap.cpp | 18 +++++++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/doc/contributions.txt b/doc/contributions.txt index f59539d94c..8faf18a598 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -414,6 +414,7 @@ Jonathan Yap STORM-1020 STORM-1064 STORM-1077 + STORM-1128 Kage Pixel VWR-11 Ken March @@ -644,6 +645,7 @@ Robin Cornelius STORM-422 STORM-960 STORM-1019 + STORM-1128 VWR-2488 VWR-9557 VWR-10579 diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index 03cf0332a9..bf5f569e36 100755 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -96,6 +96,14 @@ enum EPanDirection // Values in pixels per region static const F32 ZOOM_MAX = 128.f; +struct SortRegionNames +{ + inline bool operator ()(std::pair <U64, LLSimInfo*>& _left, std::pair <U64, LLSimInfo*>& _right) + { + return(LLStringUtil::compareInsensitive(_left.second->getName(),_right.second->getName()) < 0); + } +}; + //--------------------------------------------------------------------------- // Globals //--------------------------------------------------------------------------- @@ -1483,10 +1491,14 @@ void LLFloaterWorldMap::updateSims(bool found_null_sim) S32 name_length = mCompletingRegionName.length(); LLSD match; - + S32 num_results = 0; - std::map<U64, LLSimInfo*>::const_iterator it; - for (it = LLWorldMap::getInstance()->getRegionMap().begin(); it != LLWorldMap::getInstance()->getRegionMap().end(); ++it) + + std::vector<std::pair <U64, LLSimInfo*>> simInfoVec(LLWorldMap::getInstance()->getRegionMap().begin(), LLWorldMap::getInstance()->getRegionMap().end()); + std::sort(simInfoVec.begin(), simInfoVec.end(), SortRegionNames()); + + std::vector<std::pair <U64, LLSimInfo*>>::const_iterator it; + for (it = simInfoVec.begin(); it != simInfoVec.end(); ++it) { LLSimInfo* info = it->second; std::string sim_name_lower = info->getName(); -- cgit v1.2.3 From aea35df23ea5d5af403721edffe32124890e6a2b Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Wed, 13 Apr 2011 15:09:55 -0400 Subject: Aesthetic increase of range for breast up/down and in/out bounce. Not a bug or aberrant behavior, but this just looks better if we allow higher range of motion. --- indra/newview/character/avatar_lad.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index 85899603ee..f8460e059d 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -4339,8 +4339,8 @@ wearable="shape" edit_group="driven" value_default="0" - value_min="-2" - value_max="2"> + value_min="-3" + value_max="3"> <param_morph /> </param> @@ -4352,8 +4352,8 @@ wearable="shape" edit_group="driven" value_default="0" - value_min="-1" - value_max="1"> + value_min="-1.5" + value_max="1.5"> <param_morph /> </param> -- cgit v1.2.3 From 435117e8121f09bf43c80900fed13856a3a85825 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Wed, 13 Apr 2011 15:13:10 -0400 Subject: SH-1329 FIXED Physics are "twitchy" for high-FPS machines Fixed bug that was messing up time slices for physics. --- indra/newview/llphysicsmotion.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 67bb139a5e..4f6b155fa0 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -451,7 +451,14 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) // const F32 time_delta = time - mLastTime; - if (time_delta > 3.0 || time_delta <= 0.01) + + // Don't update too frequently, to avoid precision errors from small time slices. + if (time_delta <= .01) + { + return FALSE; + } + + if (time_delta > 3.0) { mLastTime = time; return FALSE; -- cgit v1.2.3 From 137168ce439de8292a297a86061706780901b55b Mon Sep 17 00:00:00 2001 From: Siana Gearz <siana.gearz@googlemail.com> Date: Sun, 17 Apr 2011 08:04:02 -0400 Subject: STORM-1088: fix loading of winmm.dll --- doc/contributions.txt | 1 + indra/media_plugins/winmmshim/forwarding_api.cpp | 173 +++++++++++++++++++++++ indra/media_plugins/winmmshim/forwarding_api.h | 1 + indra/media_plugins/winmmshim/winmm_shim.cpp | 17 ++- 4 files changed, 189 insertions(+), 3 deletions(-) diff --git a/doc/contributions.txt b/doc/contributions.txt index 71c54e8624..c92450acd2 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -703,6 +703,7 @@ Shawn Kaufmat SNOW-240 Siana Gearz STORM-960 + STORM-1088 SignpostMarv Martin VWR-153 VWR-154 diff --git a/indra/media_plugins/winmmshim/forwarding_api.cpp b/indra/media_plugins/winmmshim/forwarding_api.cpp index eff7e20451..495e08942b 100644 --- a/indra/media_plugins/winmmshim/forwarding_api.cpp +++ b/indra/media_plugins/winmmshim/forwarding_api.cpp @@ -389,90 +389,105 @@ void init_function_pointers(HMODULE winmm_handle) extern "C" { LRESULT WINAPI CloseDriver( HDRVR hDriver, LPARAM lParam1, LPARAM lParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"CloseDriver\n"); return CloseDriver_orig( hDriver, lParam1, lParam2); } HDRVR WINAPI OpenDriver( LPCWSTR szDriverName, LPCWSTR szSectionName, LPARAM lParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"OpenDriver\n"); return OpenDriver_orig( szDriverName, szSectionName, lParam2); } LRESULT WINAPI SendDriverMessage( HDRVR hDriver, UINT message, LPARAM lParam1, LPARAM lParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"SendDriverMessage\n"); return SendDriverMessage_orig( hDriver, message, lParam1, lParam2); } HMODULE WINAPI DrvGetModuleHandle( HDRVR hDriver) { + ll_winmm_shim_initialize(); //OutputDebugString(L"DrvGetModuleHandle\n"); return DrvGetModuleHandle_orig( hDriver); } HMODULE WINAPI GetDriverModuleHandle( HDRVR hDriver) { + ll_winmm_shim_initialize(); //OutputDebugString(L"GetDriverModuleHandle\n"); return GetDriverModuleHandle_orig( hDriver); } LRESULT WINAPI DefDriverProc( DWORD_PTR dwDriverIdentifier, HDRVR hdrvr, UINT uMsg, LPARAM lParam1, LPARAM lParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"DefDriverProc\n"); return DefDriverProc_orig( dwDriverIdentifier, hdrvr, uMsg, lParam1, lParam2); } BOOL WINAPI DriverCallback( DWORD dwCallBack, DWORD dwFlags, HDRVR hdrvr, DWORD msg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"DriverCallback\n"); return DriverCallback_orig(dwCallBack, dwFlags, hdrvr, msg, dwUser, dwParam1, dwParam2); } UINT WINAPI mmsystemGetVersion(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmsystemGetVersion\n"); return mmsystemGetVersion_orig(); } BOOL WINAPI sndPlaySoundA( LPCSTR pszSound, UINT fuSound) { + ll_winmm_shim_initialize(); //OutputDebugString(L"sndPlaySoundA\n"); return sndPlaySoundA_orig( pszSound, fuSound); } BOOL WINAPI sndPlaySoundW( LPCWSTR pszSound, UINT fuSound) { + ll_winmm_shim_initialize(); //OutputDebugString(L"sndPlaySoundW\n"); return sndPlaySoundW_orig( pszSound, fuSound); } BOOL WINAPI PlaySoundA( LPCSTR pszSound, HMODULE hmod, DWORD fdwSound) { + ll_winmm_shim_initialize(); //OutputDebugString(L"PlaySoundA\n"); return PlaySoundA_orig( pszSound, hmod, fdwSound); } BOOL WINAPI PlaySoundW( LPCWSTR pszSound, HMODULE hmod, DWORD fdwSound) { + ll_winmm_shim_initialize(); //OutputDebugString(L"PlaySoundW\n"); return PlaySoundW_orig( pszSound, hmod, fdwSound); } UINT WINAPI waveOutGetNumDevs(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetNumDevs\n"); return waveOutGetNumDevs_orig(); } MMRESULT WINAPI waveOutGetDevCapsA( UINT_PTR uDeviceID, LPWAVEOUTCAPSA pwoc, UINT cbwoc) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetDevCapsA\n"); return waveOutGetDevCapsA_orig( uDeviceID, pwoc, cbwoc); } MMRESULT WINAPI waveOutGetDevCapsW( UINT_PTR uDeviceID, LPWAVEOUTCAPSW pwoc, UINT cbwoc) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetDevCapsW\n"); return waveOutGetDevCapsW_orig( uDeviceID, pwoc, cbwoc); } @@ -480,24 +495,28 @@ extern "C" { MMRESULT WINAPI waveOutGetVolume( HWAVEOUT hwo, LPDWORD pdwVolume) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetVolume\n"); return waveOutGetVolume_orig( hwo, pdwVolume); } MMRESULT WINAPI waveOutSetVolume( HWAVEOUT hwo, DWORD dwVolume) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutSetVolume\n"); return waveOutSetVolume_orig( hwo, dwVolume); } MMRESULT WINAPI waveOutGetErrorTextA( MMRESULT mmrError, LPSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetErrorTextA\n"); return waveOutGetErrorTextA_orig( mmrError, pszText, cchText); } MMRESULT WINAPI waveOutGetErrorTextW( MMRESULT mmrError, LPWSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetErrorTextW\n"); return waveOutGetErrorTextW_orig( mmrError, pszText, cchText); } @@ -516,12 +535,14 @@ extern "C" { MMRESULT WINAPI waveOutPrepareHeader( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutPrepareHeader\n"); return waveOutPrepareHeader_orig( hwo, pwh, cbwh); } MMRESULT WINAPI waveOutUnprepareHeader( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutUnprepareHeader\n"); return waveOutUnprepareHeader_orig( hwo, pwh, cbwh); } @@ -535,834 +556,973 @@ extern "C" { MMRESULT WINAPI waveOutPause( HWAVEOUT hwo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutPause\n"); return waveOutPause_orig( hwo); } MMRESULT WINAPI waveOutRestart( HWAVEOUT hwo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutRestart\n"); return waveOutRestart_orig( hwo); } MMRESULT WINAPI waveOutReset( HWAVEOUT hwo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutReset\n"); return waveOutReset_orig( hwo); } MMRESULT WINAPI waveOutBreakLoop( HWAVEOUT hwo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutBreakLoop\n"); return waveOutBreakLoop_orig( hwo); } MMRESULT WINAPI waveOutGetPosition( HWAVEOUT hwo, LPMMTIME pmmt, UINT cbmmt) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetPosition\n"); return waveOutGetPosition_orig( hwo, pmmt, cbmmt); } MMRESULT WINAPI waveOutGetPitch( HWAVEOUT hwo, LPDWORD pdwPitch) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetPitch\n"); return waveOutGetPitch_orig( hwo, pdwPitch); } MMRESULT WINAPI waveOutSetPitch( HWAVEOUT hwo, DWORD dwPitch) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutSetPitch\n"); return waveOutSetPitch_orig( hwo, dwPitch); } MMRESULT WINAPI waveOutGetPlaybackRate( HWAVEOUT hwo, LPDWORD pdwRate) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetPlaybackRate\n"); return waveOutGetPlaybackRate_orig( hwo, pdwRate); } MMRESULT WINAPI waveOutSetPlaybackRate( HWAVEOUT hwo, DWORD dwRate) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutSetPlaybackRate\n"); return waveOutSetPlaybackRate_orig( hwo, dwRate); } MMRESULT WINAPI waveOutGetID( HWAVEOUT hwo, LPUINT puDeviceID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetID\n"); return waveOutGetID_orig( hwo, puDeviceID); } MMRESULT WINAPI waveOutMessage( HWAVEOUT hwo, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutMessage\n"); return waveOutMessage_orig( hwo, uMsg, dw1, dw2); } UINT WINAPI waveInGetNumDevs(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInGetNumDevs\n"); return waveInGetNumDevs_orig(); } MMRESULT WINAPI waveInGetDevCapsA( UINT_PTR uDeviceID, LPWAVEINCAPSA pwic, UINT cbwic) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInGetDevCapsA\n"); return waveInGetDevCapsA_orig( uDeviceID, pwic, cbwic); } MMRESULT WINAPI waveInGetDevCapsW( UINT_PTR uDeviceID, LPWAVEINCAPSW pwic, UINT cbwic) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInGetDevCapsW\n"); return waveInGetDevCapsW_orig( uDeviceID, pwic, cbwic); } MMRESULT WINAPI waveInGetErrorTextA(MMRESULT mmrError, LPSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInGetErrorTextA\n"); return waveInGetErrorTextA_orig(mmrError, pszText, cchText); } MMRESULT WINAPI waveInGetErrorTextW(MMRESULT mmrError, LPWSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInGetErrorTextW\n"); return waveInGetErrorTextW_orig(mmrError, pszText, cchText); } MMRESULT WINAPI waveInOpen( LPHWAVEIN phwi, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInOpen\n"); return waveInOpen_orig(phwi, uDeviceID, pwfx, dwCallback, dwInstance, fdwOpen); } MMRESULT WINAPI waveInClose( HWAVEIN hwi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInClose\n"); return waveInClose_orig( hwi); } MMRESULT WINAPI waveInPrepareHeader( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInPrepareHeader\n"); return waveInPrepareHeader_orig( hwi, pwh, cbwh); } MMRESULT WINAPI waveInUnprepareHeader( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInUnprepareHeader\n"); return waveInUnprepareHeader_orig( hwi, pwh, cbwh); } MMRESULT WINAPI waveInAddBuffer( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInAddBuffer\n"); return waveInAddBuffer_orig( hwi, pwh, cbwh); } MMRESULT WINAPI waveInStart( HWAVEIN hwi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInStart\n"); return waveInStart_orig( hwi); } MMRESULT WINAPI waveInStop( HWAVEIN hwi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInStop\n"); return waveInStop_orig(hwi); } MMRESULT WINAPI waveInReset( HWAVEIN hwi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInReset\n"); return waveInReset_orig(hwi); } MMRESULT WINAPI waveInGetPosition( HWAVEIN hwi, LPMMTIME pmmt, UINT cbmmt) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInGetPosition\n"); return waveInGetPosition_orig( hwi, pmmt, cbmmt); } MMRESULT WINAPI waveInGetID( HWAVEIN hwi, LPUINT puDeviceID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInGetID\n"); return waveInGetID_orig( hwi, puDeviceID); } MMRESULT WINAPI waveInMessage( HWAVEIN hwi, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInMessage\n"); return waveInMessage_orig( hwi, uMsg, dw1, dw2); } UINT WINAPI midiOutGetNumDevs(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutGetNumDevs\n"); return midiOutGetNumDevs_orig(); } MMRESULT WINAPI midiStreamOpen( LPHMIDISTRM phms, LPUINT puDeviceID, DWORD cMidi, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamOpen\n"); return midiStreamOpen_orig( phms, puDeviceID, cMidi, dwCallback, dwInstance, fdwOpen); } MMRESULT WINAPI midiStreamClose( HMIDISTRM hms) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamClose\n"); return midiStreamClose_orig( hms); } MMRESULT WINAPI midiStreamProperty( HMIDISTRM hms, LPBYTE lppropdata, DWORD dwProperty) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamProperty\n"); return midiStreamProperty_orig( hms, lppropdata, dwProperty); } MMRESULT WINAPI midiStreamPosition( HMIDISTRM hms, LPMMTIME lpmmt, UINT cbmmt) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamPosition\n"); return midiStreamPosition_orig( hms, lpmmt, cbmmt); } MMRESULT WINAPI midiStreamOut( HMIDISTRM hms, LPMIDIHDR pmh, UINT cbmh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamOut\n"); return midiStreamOut_orig( hms, pmh, cbmh); } MMRESULT WINAPI midiStreamPause( HMIDISTRM hms) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamPause\n"); return midiStreamPause_orig( hms); } MMRESULT WINAPI midiStreamRestart( HMIDISTRM hms) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamRestart\n"); return midiStreamRestart_orig( hms); } MMRESULT WINAPI midiStreamStop( HMIDISTRM hms) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamStop\n"); return midiStreamStop_orig( hms); } MMRESULT WINAPI midiConnect( HMIDI hmi, HMIDIOUT hmo, LPVOID pReserved) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiConnect\n"); return midiConnect_orig( hmi, hmo, pReserved); } MMRESULT WINAPI midiDisconnect( HMIDI hmi, HMIDIOUT hmo, LPVOID pReserved) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiDisconnect\n"); return midiDisconnect_orig( hmi, hmo, pReserved); } MMRESULT WINAPI midiOutGetDevCapsA( UINT_PTR uDeviceID, LPMIDIOUTCAPSA pmoc, UINT cbmoc) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutGetDevCapsA\n"); return midiOutGetDevCapsA_orig( uDeviceID, pmoc, cbmoc); } MMRESULT WINAPI midiOutGetDevCapsW( UINT_PTR uDeviceID, LPMIDIOUTCAPSW pmoc, UINT cbmoc) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutGetDevCapsW\n"); return midiOutGetDevCapsW_orig( uDeviceID, pmoc, cbmoc); } MMRESULT WINAPI midiOutGetVolume( HMIDIOUT hmo, LPDWORD pdwVolume) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutGetVolume\n"); return midiOutGetVolume_orig( hmo, pdwVolume); } MMRESULT WINAPI midiOutSetVolume( HMIDIOUT hmo, DWORD dwVolume) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutSetVolume\n"); return midiOutSetVolume_orig( hmo, dwVolume); } MMRESULT WINAPI midiOutGetErrorTextA( MMRESULT mmrError, LPSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutGetErrorTextA\n"); return midiOutGetErrorTextA_orig( mmrError, pszText, cchText); } MMRESULT WINAPI midiOutGetErrorTextW( MMRESULT mmrError, LPWSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutGetErrorTextW\n"); return midiOutGetErrorTextW_orig( mmrError, pszText, cchText); } MMRESULT WINAPI midiOutOpen( LPHMIDIOUT phmo, UINT uDeviceID, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutOpen\n"); return midiOutOpen_orig(phmo, uDeviceID, dwCallback, dwInstance, fdwOpen); } MMRESULT WINAPI midiOutClose( HMIDIOUT hmo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutClose\n"); return midiOutClose_orig( hmo); } MMRESULT WINAPI midiOutPrepareHeader( HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutPrepareHeader\n"); return midiOutPrepareHeader_orig( hmo, pmh, cbmh); } MMRESULT WINAPI midiOutUnprepareHeader(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutUnprepareHeader\n"); return midiOutUnprepareHeader_orig(hmo, pmh, cbmh); } MMRESULT WINAPI midiOutShortMsg( HMIDIOUT hmo, DWORD dwMsg) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutShortMsg\n"); return midiOutShortMsg_orig( hmo, dwMsg); } MMRESULT WINAPI midiOutLongMsg(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutLongMsg\n"); return midiOutLongMsg_orig(hmo, pmh, cbmh); } MMRESULT WINAPI midiOutReset( HMIDIOUT hmo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutReset\n"); return midiOutReset_orig( hmo); } MMRESULT WINAPI midiOutCachePatches( HMIDIOUT hmo, UINT uBank, LPWORD pwpa, UINT fuCache) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutCachePatches\n"); return midiOutCachePatches_orig( hmo, uBank, pwpa, fuCache); } MMRESULT WINAPI midiOutCacheDrumPatches( HMIDIOUT hmo, UINT uPatch, LPWORD pwkya, UINT fuCache) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutCacheDrumPatches\n"); return midiOutCacheDrumPatches_orig( hmo, uPatch, pwkya, fuCache); } MMRESULT WINAPI midiOutGetID( HMIDIOUT hmo, LPUINT puDeviceID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutGetID\n"); return midiOutGetID_orig( hmo, puDeviceID); } MMRESULT WINAPI midiOutMessage( HMIDIOUT hmo, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutMessage\n"); return midiOutMessage_orig( hmo, uMsg, dw1, dw2); } UINT WINAPI midiInGetNumDevs(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInGetNumDevs\n"); return midiInGetNumDevs_orig(); } MMRESULT WINAPI midiInGetDevCapsA( UINT_PTR uDeviceID, LPMIDIINCAPSA pmic, UINT cbmic) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInGetDevCapsA\n"); return midiInGetDevCapsA_orig( uDeviceID, pmic, cbmic); } MMRESULT WINAPI midiInGetDevCapsW( UINT_PTR uDeviceID, LPMIDIINCAPSW pmic, UINT cbmic) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInGetDevCapsW\n"); return midiInGetDevCapsW_orig( uDeviceID, pmic, cbmic); } MMRESULT WINAPI midiInGetErrorTextA( MMRESULT mmrError, LPSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInGetErrorTextA\n"); return midiInGetErrorTextA_orig( mmrError, pszText, cchText); } MMRESULT WINAPI midiInGetErrorTextW( MMRESULT mmrError, LPWSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInGetErrorTextW\n"); return midiInGetErrorTextW_orig( mmrError, pszText, cchText); } MMRESULT WINAPI midiInOpen( LPHMIDIIN phmi, UINT uDeviceID, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInOpen\n"); return midiInOpen_orig(phmi, uDeviceID, dwCallback, dwInstance, fdwOpen); } MMRESULT WINAPI midiInClose( HMIDIIN hmi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInClose\n"); return midiInClose_orig( hmi); } MMRESULT WINAPI midiInPrepareHeader( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInPrepareHeader\n"); return midiInPrepareHeader_orig( hmi, pmh, cbmh); } MMRESULT WINAPI midiInUnprepareHeader( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInUnprepareHeader\n"); return midiInUnprepareHeader_orig( hmi, pmh, cbmh); } MMRESULT WINAPI midiInAddBuffer( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInAddBuffer\n"); return midiInAddBuffer_orig( hmi, pmh, cbmh); } MMRESULT WINAPI midiInStart( HMIDIIN hmi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInStart\n"); return midiInStart_orig( hmi); } MMRESULT WINAPI midiInStop( HMIDIIN hmi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInStop\n"); return midiInStop_orig(hmi); } MMRESULT WINAPI midiInReset( HMIDIIN hmi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInReset\n"); return midiInReset_orig( hmi); } MMRESULT WINAPI midiInGetID( HMIDIIN hmi, LPUINT puDeviceID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInGetID\n"); return midiInGetID_orig( hmi, puDeviceID); } MMRESULT WINAPI midiInMessage( HMIDIIN hmi, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInMessage\n"); return midiInMessage_orig( hmi, uMsg, dw1, dw2); } UINT WINAPI auxGetNumDevs(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"auxGetNumDevs\n"); return auxGetNumDevs_orig(); } MMRESULT WINAPI auxGetDevCapsA( UINT_PTR uDeviceID, LPAUXCAPSA pac, UINT cbac) { + ll_winmm_shim_initialize(); //OutputDebugString(L"auxGetDevCapsA\n"); return auxGetDevCapsA_orig( uDeviceID, pac, cbac); } MMRESULT WINAPI auxGetDevCapsW( UINT_PTR uDeviceID, LPAUXCAPSW pac, UINT cbac) { + ll_winmm_shim_initialize(); //OutputDebugString(L"auxGetDevCapsW\n"); return auxGetDevCapsW_orig( uDeviceID, pac, cbac); } MMRESULT WINAPI auxSetVolume( UINT uDeviceID, DWORD dwVolume) { + ll_winmm_shim_initialize(); //OutputDebugString(L"auxSetVolume\n"); return auxSetVolume_orig( uDeviceID, dwVolume); } MMRESULT WINAPI auxGetVolume( UINT uDeviceID, LPDWORD pdwVolume) { + ll_winmm_shim_initialize(); //OutputDebugString(L"auxGetVolume\n"); return auxGetVolume_orig( uDeviceID, pdwVolume); } MMRESULT WINAPI auxOutMessage( UINT uDeviceID, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"auxOutMessage\n"); return auxOutMessage_orig( uDeviceID, uMsg, dw1, dw2); } UINT WINAPI mixerGetNumDevs(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetNumDevs\n"); return mixerGetNumDevs_orig(); } MMRESULT WINAPI mixerGetDevCapsA( UINT_PTR uMxId, LPMIXERCAPSA pmxcaps, UINT cbmxcaps) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetDevCapsA\n"); return mixerGetDevCapsA_orig( uMxId, pmxcaps, cbmxcaps); } MMRESULT WINAPI mixerGetDevCapsW( UINT_PTR uMxId, LPMIXERCAPSW pmxcaps, UINT cbmxcaps) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetDevCapsW\n"); return mixerGetDevCapsW_orig( uMxId, pmxcaps, cbmxcaps); } MMRESULT WINAPI mixerOpen( LPHMIXER phmx, UINT uMxId, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerOpen\n"); return mixerOpen_orig( phmx, uMxId, dwCallback, dwInstance, fdwOpen); } MMRESULT WINAPI mixerClose( HMIXER hmx) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerClose\n"); return mixerClose_orig( hmx); } DWORD WINAPI mixerMessage( HMIXER hmx, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerMessage\n"); return mixerMessage_orig( hmx, uMsg, dwParam1, dwParam2); } MMRESULT WINAPI mixerGetLineInfoA( HMIXEROBJ hmxobj, LPMIXERLINEA pmxl, DWORD fdwInfo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetLineInfoA\n"); return mixerGetLineInfoA_orig( hmxobj, pmxl, fdwInfo); } MMRESULT WINAPI mixerGetLineInfoW( HMIXEROBJ hmxobj, LPMIXERLINEW pmxl, DWORD fdwInfo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetLineInfoW\n"); return mixerGetLineInfoW_orig( hmxobj, pmxl, fdwInfo); } MMRESULT WINAPI mixerGetID( HMIXEROBJ hmxobj, UINT FAR *puMxId, DWORD fdwId) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetID\n"); return mixerGetID_orig( hmxobj, puMxId, fdwId); } MMRESULT WINAPI mixerGetLineControlsA( HMIXEROBJ hmxobj, LPMIXERLINECONTROLSA pmxlc, DWORD fdwControls) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetLineControlsA\n"); return mixerGetLineControlsA_orig( hmxobj, pmxlc, fdwControls); } MMRESULT WINAPI mixerGetLineControlsW( HMIXEROBJ hmxobj, LPMIXERLINECONTROLSW pmxlc, DWORD fdwControls) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetLineControlsW\n"); return mixerGetLineControlsW_orig( hmxobj, pmxlc, fdwControls); } MMRESULT WINAPI mixerGetControlDetailsA( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetControlDetailsA\n"); return mixerGetControlDetailsA_orig( hmxobj, pmxcd, fdwDetails); } MMRESULT WINAPI mixerGetControlDetailsW( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetControlDetailsW\n"); return mixerGetControlDetailsW_orig( hmxobj, pmxcd, fdwDetails); } MMRESULT WINAPI mixerSetControlDetails( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerSetControlDetails\n"); return mixerSetControlDetails_orig( hmxobj, pmxcd, fdwDetails); } DWORD WINAPI mmGetCurrentTask(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmGetCurrentTask\n"); return mmGetCurrentTask_orig(); } void WINAPI mmTaskBlock(DWORD val) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmTaskBlock\n"); return mmTaskBlock_orig(val); } UINT WINAPI mmTaskCreate(LPTASKCALLBACK a, HANDLE* b, DWORD_PTR c) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmTaskCreate\n"); return mmTaskCreate_orig(a, b, c); } BOOL WINAPI mmTaskSignal(DWORD a) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmTaskSignal\n"); return mmTaskSignal_orig(a); } VOID WINAPI mmTaskYield() { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmTaskYield\n"); mmTaskYield_orig(); } MMRESULT WINAPI timeGetSystemTime( LPMMTIME pmmt, UINT cbmmt) { + ll_winmm_shim_initialize(); //OutputDebugString(L"timeGetSystemTime\n"); return timeGetSystemTime_orig( pmmt, cbmmt); } DWORD WINAPI timeGetTime(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"timeGetTime\n"); return timeGetTime_orig(); } MMRESULT WINAPI timeSetEvent( UINT uDelay, UINT uResolution, LPTIMECALLBACK fptc, DWORD_PTR dwUser, UINT fuEvent) { + ll_winmm_shim_initialize(); //OutputDebugString(L"timeSetEvent\n"); return timeSetEvent_orig(uDelay, uResolution, fptc, dwUser, fuEvent); } MMRESULT WINAPI timeKillEvent( UINT uTimerID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"timeKillEvent\n"); return timeKillEvent_orig( uTimerID); } MMRESULT WINAPI timeGetDevCaps( LPTIMECAPS ptc, UINT cbtc) { + ll_winmm_shim_initialize(); //OutputDebugString(L"timeGetDevCaps\n"); return timeGetDevCaps_orig( ptc, cbtc); } MMRESULT WINAPI timeBeginPeriod( UINT uPeriod) { + ll_winmm_shim_initialize(); //OutputDebugString(L"timeBeginPeriod\n"); return timeBeginPeriod_orig( uPeriod); } MMRESULT WINAPI timeEndPeriod( UINT uPeriod) { + ll_winmm_shim_initialize(); //OutputDebugString(L"timeEndPeriod\n"); return timeEndPeriod_orig( uPeriod); } UINT WINAPI joyGetNumDevs(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyGetNumDevs\n"); return joyGetNumDevs_orig(); } MMRESULT WINAPI joyConfigChanged(DWORD dwFlags) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyConfigChanged\n"); return joyConfigChanged_orig(dwFlags); } MMRESULT WINAPI joyGetDevCapsA( UINT_PTR uJoyID, LPJOYCAPSA pjc, UINT cbjc) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyGetDevCapsA\n"); return joyGetDevCapsA_orig( uJoyID, pjc, cbjc); } MMRESULT WINAPI joyGetDevCapsW( UINT_PTR uJoyID, LPJOYCAPSW pjc, UINT cbjc) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyGetDevCapsW\n"); return joyGetDevCapsW_orig( uJoyID, pjc, cbjc); } MMRESULT WINAPI joyGetPos( UINT uJoyID, LPJOYINFO pji) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyGetPos\n"); return joyGetPos_orig( uJoyID, pji); } MMRESULT WINAPI joyGetPosEx( UINT uJoyID, LPJOYINFOEX pji) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyGetPosEx\n"); return joyGetPosEx_orig( uJoyID, pji); } MMRESULT WINAPI joyGetThreshold( UINT uJoyID, LPUINT puThreshold) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyGetThreshold\n"); return joyGetThreshold_orig( uJoyID, puThreshold); } MMRESULT WINAPI joyReleaseCapture( UINT uJoyID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyReleaseCapture\n"); return joyReleaseCapture_orig( uJoyID); } MMRESULT WINAPI joySetCapture( HWND hwnd, UINT uJoyID, UINT uPeriod, BOOL fChanged) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joySetCapture\n"); return joySetCapture_orig(hwnd, uJoyID, uPeriod, fChanged); } MMRESULT WINAPI joySetThreshold( UINT uJoyID, UINT uThreshold) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joySetThreshold\n"); return joySetThreshold_orig( uJoyID, uThreshold); } BOOL WINAPI mciDriverNotify(HWND hwndCallback, UINT uDeviceID, UINT uStatus) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciDriverNotify\n"); return mciDriverNotify_orig(hwndCallback, uDeviceID, uStatus); } UINT WINAPI mciDriverYield(UINT uDeviceID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciDriverYield\n"); return mciDriverYield_orig(uDeviceID); } FOURCC WINAPI mmioStringToFOURCCA( LPCSTR sz, UINT uFlags) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioStringToFOURCCA\n"); return mmioStringToFOURCCA_orig( sz, uFlags); } FOURCC WINAPI mmioStringToFOURCCW( LPCWSTR sz, UINT uFlags) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioStringToFOURCCW\n"); return mmioStringToFOURCCW_orig( sz, uFlags); } LPMMIOPROC WINAPI mmioInstallIOProcA( FOURCC fccIOProc, LPMMIOPROC pIOProc, DWORD dwFlags) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioInstallIOProcA\n"); return mmioInstallIOProcA_orig( fccIOProc, pIOProc, dwFlags); } LPMMIOPROC WINAPI mmioInstallIOProcW( FOURCC fccIOProc, LPMMIOPROC pIOProc, DWORD dwFlags) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioInstallIOProcW\n"); return mmioInstallIOProcW_orig( fccIOProc, pIOProc, dwFlags); } HMMIO WINAPI mmioOpenA( LPSTR pszFileName, LPMMIOINFO pmmioinfo, DWORD fdwOpen) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioOpenA\n"); return mmioOpenA_orig( pszFileName, pmmioinfo, fdwOpen); } HMMIO WINAPI mmioOpenW( LPWSTR pszFileName, LPMMIOINFO pmmioinfo, DWORD fdwOpen) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioOpenW\n"); return mmioOpenW_orig( pszFileName, pmmioinfo, fdwOpen); } MMRESULT WINAPI mmioRenameA( LPCSTR pszFileName, LPCSTR pszNewFileName, LPCMMIOINFO pmmioinfo, DWORD fdwRename) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioRenameA\n"); return mmioRenameA_orig( pszFileName, pszNewFileName, pmmioinfo, fdwRename); } MMRESULT WINAPI mmioRenameW( LPCWSTR pszFileName, LPCWSTR pszNewFileName, LPCMMIOINFO pmmioinfo, DWORD fdwRename) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioRenameW\n"); return mmioRenameW_orig( pszFileName, pszNewFileName, pmmioinfo, fdwRename); } MMRESULT WINAPI mmioClose( HMMIO hmmio, UINT fuClose) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioClose\n"); return mmioClose_orig( hmmio, fuClose); } LONG WINAPI mmioRead( HMMIO hmmio, HPSTR pch, LONG cch) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioRead\n"); return mmioRead_orig( hmmio, pch, cch); } LONG WINAPI mmioWrite( HMMIO hmmio, const char _huge* pch, LONG cch) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioWrite\n"); return mmioWrite_orig( hmmio, pch, cch); } LONG WINAPI mmioSeek( HMMIO hmmio, LONG lOffset, int iOrigin) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioSeek\n"); return mmioSeek_orig(hmmio, lOffset, iOrigin); } MMRESULT WINAPI mmioGetInfo( HMMIO hmmio, LPMMIOINFO pmmioinfo, UINT fuInfo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioGetInfo\n"); return mmioGetInfo_orig( hmmio, pmmioinfo, fuInfo); } MMRESULT WINAPI mmioSetInfo( HMMIO hmmio, LPCMMIOINFO pmmioinfo, UINT fuInfo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioSetInfo\n"); return mmioSetInfo_orig( hmmio, pmmioinfo, fuInfo); } MMRESULT WINAPI mmioSetBuffer( HMMIO hmmio, LPSTR pchBuffer, LONG cchBuffer, UINT fuBuffer) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioSetBuffer\n"); return mmioSetBuffer_orig(hmmio, pchBuffer, cchBuffer, fuBuffer); } MMRESULT WINAPI mmioFlush( HMMIO hmmio, UINT fuFlush) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioFlush\n"); return mmioFlush_orig( hmmio, fuFlush); } MMRESULT WINAPI mmioAdvance( HMMIO hmmio, LPMMIOINFO pmmioinfo, UINT fuAdvance) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioAdvance\n"); return mmioAdvance_orig( hmmio, pmmioinfo, fuAdvance); } LRESULT WINAPI mmioSendMessage( HMMIO hmmio, UINT uMsg, LPARAM lParam1, LPARAM lParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioSendMessage\n"); return mmioSendMessage_orig(hmmio, uMsg, lParam1, lParam2); } MMRESULT WINAPI mmioDescend( HMMIO hmmio, LPMMCKINFO pmmcki, const MMCKINFO FAR* pmmckiParent, UINT fuDescend) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioDescend\n"); return mmioDescend_orig(hmmio, pmmcki, pmmckiParent, fuDescend); } MMRESULT WINAPI mmioAscend( HMMIO hmmio, LPMMCKINFO pmmcki, UINT fuAscend) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioAscend\n"); return mmioAscend_orig( hmmio, pmmcki, fuAscend); } MMRESULT WINAPI mmioCreateChunk(HMMIO hmmio, LPMMCKINFO pmmcki, UINT fuCreate) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioCreateChunk\n"); return mmioCreateChunk_orig(hmmio, pmmcki, fuCreate); } MCIERROR WINAPI mciSendCommandA( MCIDEVICEID mciId, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciSendCommandA\n"); return mciSendCommandA_orig( mciId, uMsg, dwParam1, dwParam2); } MCIERROR WINAPI mciSendCommandW( MCIDEVICEID mciId, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciSendCommandW\n"); return mciSendCommandW_orig( mciId, uMsg, dwParam1, dwParam2); } MCIERROR WINAPI mciSendStringA( LPCSTR lpstrCommand, LPSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciSendStringA\n"); return mciSendStringA_orig( lpstrCommand, lpstrReturnString, uReturnLength, hwndCallback); } MCIERROR WINAPI mciSendStringW( LPCWSTR lpstrCommand, LPWSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciSendStringW\n"); return mciSendStringW_orig( lpstrCommand, lpstrReturnString, uReturnLength, hwndCallback); } @@ -1375,72 +1535,84 @@ extern "C" { MCIDEVICEID WINAPI mciGetDeviceIDW( LPCWSTR pszDevice) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetDeviceIDW\n"); return mciGetDeviceIDW_orig( pszDevice); } MCIDEVICEID WINAPI mciGetDeviceIDFromElementIDA( DWORD dwElementID, LPCSTR lpstrType ) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetDeviceIDFromElementIDA\n"); return mciGetDeviceIDFromElementIDA_orig( dwElementID, lpstrType ); } MCIDEVICEID WINAPI mciGetDeviceIDFromElementIDW( DWORD dwElementID, LPCWSTR lpstrType ) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetDeviceIDFromElementIDW\n"); return mciGetDeviceIDFromElementIDW_orig( dwElementID, lpstrType ); } DWORD_PTR WINAPI mciGetDriverData(UINT uDeviceID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetDriverData\n"); return mciGetDriverData_orig(uDeviceID); } BOOL WINAPI mciGetErrorStringA( MCIERROR mcierr, LPSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetErrorStringA\n"); return mciGetErrorStringA_orig( mcierr, pszText, cchText); } BOOL WINAPI mciGetErrorStringW( MCIERROR mcierr, LPWSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetErrorStringW\n"); return mciGetErrorStringW_orig( mcierr, pszText, cchText); } BOOL WINAPI mciSetDriverData(UINT uDeviceID, DWORD_PTR dwData) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciSetDriverData_type\n"); return mciSetDriverData_orig( uDeviceID, dwData ); } BOOL WINAPI mciSetYieldProc( MCIDEVICEID mciId, YIELDPROC fpYieldProc, DWORD dwYieldData) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciSetYieldProc\n"); return mciSetYieldProc_orig(mciId, fpYieldProc, dwYieldData); } BOOL WINAPI mciFreeCommandResource(UINT uTable) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciFreeCommandResource\n"); return mciFreeCommandResource_orig(uTable); } HTASK WINAPI mciGetCreatorTask( MCIDEVICEID mciId) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetCreatorTask\n"); return mciGetCreatorTask_orig( mciId); } YIELDPROC WINAPI mciGetYieldProc( MCIDEVICEID mciId, LPDWORD pdwYieldData) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetYieldProc\n"); return mciGetYieldProc_orig( mciId, pdwYieldData); } UINT WINAPI mciLoadCommandResource(HINSTANCE hInstance, LPCWSTR lpResName, UINT uType) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciLoadCommandResource"); return mciLoadCommandResource_orig(hInstance, lpResName, uType); } @@ -1448,6 +1620,7 @@ extern "C" { BOOL WINAPI mciExecute(LPCSTR pszCommand) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciExecute\n"); return mciExecute_orig(pszCommand); } diff --git a/indra/media_plugins/winmmshim/forwarding_api.h b/indra/media_plugins/winmmshim/forwarding_api.h index 89a6b347f3..076a08f769 100644 --- a/indra/media_plugins/winmmshim/forwarding_api.h +++ b/indra/media_plugins/winmmshim/forwarding_api.h @@ -30,6 +30,7 @@ #include <mmsystem.h> void init_function_pointers(HMODULE winmm_handle); +void ll_winmm_shim_initialize(); typedef VOID (*LPTASKCALLBACK)(DWORD_PTR dwInst); diff --git a/indra/media_plugins/winmmshim/winmm_shim.cpp b/indra/media_plugins/winmmshim/winmm_shim.cpp index 9563a3b664..6ba95e565e 100644 --- a/indra/media_plugins/winmmshim/winmm_shim.cpp +++ b/indra/media_plugins/winmmshim/winmm_shim.cpp @@ -32,14 +32,21 @@ using std::wstring; static float sVolumeLevel = 1.f; static bool sMute = false; +static CRITICAL_SECTION sCriticalSection; BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { + InitializeCriticalSectionAndSpinCount(&sCriticalSection, 0x00000400); + return TRUE; +} + +void ll_winmm_shim_initialize(){ static bool initialized = false; // do this only once + EnterCriticalSection(&sCriticalSection); if (!initialized) { // bind to original winmm.dll TCHAR system_path[MAX_PATH]; @@ -54,13 +61,14 @@ BOOL APIENTRY DllMain( HMODULE hModule, { // we have a dll, let's get out pointers! initialized = true; init_function_pointers(winmm_handle); - return true; + ::OutputDebugStringA("WINMM_SHIM.DLL: real winmm.dll initialized successfully\n"); + return; } // failed to initialize real winmm.dll - return false; + ::OutputDebugStringA("WINMM_SHIM.DLL: Failed to initialize real winmm.dll\n"); } - return true; + LeaveCriticalSection(&sCriticalSection); } @@ -79,6 +87,7 @@ extern "C" MMRESULT WINAPI waveOutOpen( LPHWAVEOUT phwo, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) { + ll_winmm_shim_initialize(); if (pwfx->wFormatTag != WAVE_FORMAT_PCM || (pwfx->wBitsPerSample != 8 && pwfx->wBitsPerSample != 16)) { // uncompressed 8 and 16 bit sound are the only types we support @@ -97,6 +106,7 @@ extern "C" MMRESULT WINAPI waveOutClose( HWAVEOUT hwo) { + ll_winmm_shim_initialize(); wave_out_map_t::iterator found_it = sWaveOuts.find(hwo); if (found_it != sWaveOuts.end()) { // forget what we know about this handle @@ -108,6 +118,7 @@ extern "C" MMRESULT WINAPI waveOutWrite( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh) { + ll_winmm_shim_initialize(); MMRESULT result = MMSYSERR_NOERROR; if (sMute) -- cgit v1.2.3 From fb4743300ccfeadfb6601e39c808c4f3b90c1150 Mon Sep 17 00:00:00 2001 From: brad kittenbrink <brad@lindenlab.com> Date: Fri, 15 Apr 2011 16:45:19 -0700 Subject: FIX: STORM-1141. Win7: 2.6.3 Beta1 crashes on startup if locale differs from English. Force LLTextureCache::purgeAllTextures to get called in addition to normal cache purging. --- indra/newview/llappviewer.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index cfb5853cfd..4985524f00 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -3500,10 +3500,10 @@ bool LLAppViewer::initCache() LLAppViewer::getTextureCache()->setReadOnly(read_only) ; LLVOCache::getInstance()->setReadOnly(read_only); - BOOL texture_cache_mismatch = FALSE ; + bool texture_cache_mismatch = false; if (gSavedSettings.getS32("LocalCacheVersion") != LLAppViewer::getTextureCacheVersion()) { - texture_cache_mismatch = TRUE ; + texture_cache_mismatch = true; if(!read_only) { gSavedSettings.setS32("LocalCacheVersion", LLAppViewer::getTextureCacheVersion()); @@ -3517,7 +3517,9 @@ bool LLAppViewer::initCache() gSavedSettings.getBOOL("PurgeCacheOnNextStartup")) { gSavedSettings.setBOOL("PurgeCacheOnNextStartup", false); - mPurgeCache = true; + mPurgeCache = true; + // STORM-1141 force purgeAllTextures to get called to prevent a crash here. -brad + texture_cache_mismatch = true; } // We have moved the location of the cache directory over time. -- cgit v1.2.3 From 4438a5ebb2faebc2a3a9de82668d14f870f50d84 Mon Sep 17 00:00:00 2001 From: Siana Gearz <siana.gearz@googlemail.com> Date: Sun, 17 Apr 2011 11:25:00 -0400 Subject: STORM-1088: corrected fix loading of winmm.dll --- indra/media_plugins/winmmshim/winmm_shim.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/indra/media_plugins/winmmshim/winmm_shim.cpp b/indra/media_plugins/winmmshim/winmm_shim.cpp index 6ba95e565e..47a1e5c018 100644 --- a/indra/media_plugins/winmmshim/winmm_shim.cpp +++ b/indra/media_plugins/winmmshim/winmm_shim.cpp @@ -39,7 +39,7 @@ BOOL APIENTRY DllMain( HMODULE hModule, LPVOID lpReserved ) { - InitializeCriticalSectionAndSpinCount(&sCriticalSection, 0x00000400); + InitializeCriticalSection(&sCriticalSection); return TRUE; } @@ -62,11 +62,12 @@ void ll_winmm_shim_initialize(){ initialized = true; init_function_pointers(winmm_handle); ::OutputDebugStringA("WINMM_SHIM.DLL: real winmm.dll initialized successfully\n"); - return; } - - // failed to initialize real winmm.dll - ::OutputDebugStringA("WINMM_SHIM.DLL: Failed to initialize real winmm.dll\n"); + else + { + // failed to initialize real winmm.dll + ::OutputDebugStringA("WINMM_SHIM.DLL: Failed to initialize real winmm.dll\n"); + } } LeaveCriticalSection(&sCriticalSection); } -- cgit v1.2.3 From 21e37069fe723094bbf3b857acc5c1d494ecb942 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Wed, 13 Apr 2011 15:13:10 -0400 Subject: SH-1329 FIXED Physics are "twitchy" for high-FPS machines Fixed bug that was messing up time slices for physics. --- indra/newview/llphysicsmotion.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 1d3c2b72f2..de4ce52351 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -452,7 +452,14 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) // const F32 time_delta = time - mLastTime; - if (time_delta > 3.0 || time_delta <= 0.01) + + // Don't update too frequently, to avoid precision errors from small time slices. + if (time_delta <= .01) + { + return FALSE; + } + + if (time_delta > 3.0) { mLastTime = time; return FALSE; -- cgit v1.2.3 From cf5b96bdededdac0dd00e88ce045ab6f32878869 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Wed, 13 Apr 2011 15:21:16 -0400 Subject: SH-1365 FIXED Avatar Physics don't behave well for less than 100% max effect This change looks more complicated than it actually is. I basically turned max effect into a scaling parameter, versus a clamping parameter. Piece of cake, just moved some code around and made minor logic changes. --- indra/newview/llphysicsmotion.cpp | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 4f6b155fa0..de4ce52351 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -127,7 +127,8 @@ protected: return mCharacter->getVisualParamWeight(param_name.c_str()); } void setParamValue(LLViewerVisualParam *param, - const F32 new_value_local); + const F32 new_value_local, + F32 behavior_maxeffect); F32 toLocal(const LLVector3 &world); F32 calculateVelocity_local(const F32 time_delta); @@ -485,9 +486,6 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) F32 behavior_maxeffect = getParamValue("MaxEffect"); if (physics_test) behavior_maxeffect = 1.0f; - // Maximum effect is [0,1] range. - const F32 min_val = 0.5f-behavior_maxeffect/2.0; - const F32 max_val = 0.5f+behavior_maxeffect/2.0; // mPositon_local should be in normalized 0,1 range already. Just making sure... F32 position_current_local = llclamp(mPosition_local, @@ -585,12 +583,12 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) position_new_local = position_user_local; // Zero out the velocity if the param is being pushed beyond its limits. - if ((position_new_local < min_val && velocity_new_local < 0) || - (position_new_local > max_val && velocity_new_local > 0)) + if ((position_new_local < 0 && velocity_new_local < 0) || + (position_new_local > 1 && velocity_new_local > 0)) { velocity_new_local = 0; } - + // Check for NaN values. A NaN value is detected if the variables doesn't equal itself. // If NaN, then reset everything. if ((mPosition_local != mPosition_local) || @@ -608,8 +606,8 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) } const F32 position_new_local_clamped = llclamp(position_new_local, - min_val, - max_val); + 0.0f, + 1.0f); LLDriverParam *driver_param = dynamic_cast<LLDriverParam *>(mParamDriver); llassert_always(driver_param); @@ -630,7 +628,7 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) { LLDrivenEntry &entry = (*iter); LLViewerVisualParam *driven_param = entry.mParam; - setParamValue(driven_param,position_new_local_clamped); + setParamValue(driven_param,position_new_local_clamped, behavior_maxeffect); } } @@ -712,12 +710,19 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) // Range of new_value_local is assumed to be [0 , 1] normalized. void LLPhysicsMotion::setParamValue(LLViewerVisualParam *param, - F32 new_value_normalized) + F32 new_value_normalized, + F32 behavior_maxeffect) { const F32 value_min_local = param->getMinWeight(); const F32 value_max_local = param->getMaxWeight(); + const F32 min_val = 0.5f-behavior_maxeffect/2.0; + const F32 max_val = 0.5f+behavior_maxeffect/2.0; - const F32 new_value_local = value_min_local + (value_max_local-value_min_local) * new_value_normalized; + // Scale from [0,1] to [min_val,max_val] + const F32 new_value_rescaled = min_val + (max_val-min_val) * new_value_normalized; + + // Scale from [0,1] to [value_min_local,value_max_local] + const F32 new_value_local = value_min_local + (value_max_local-value_min_local) * new_value_rescaled; mCharacter->setVisualParamWeight(param, new_value_local, -- cgit v1.2.3 From a919cc4415308d264007ed5a50abbf3e71be1100 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Wed, 13 Apr 2011 15:21:16 -0400 Subject: SH-1365 FIXED Avatar Physics don't behave well for less than 100% max effect This change looks more complicated than it actually is. I basically turned max effect into a scaling parameter, versus a clamping parameter. Piece of cake, just moved some code around and made minor logic changes. --- indra/newview/llphysicsmotion.cpp | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 67bb139a5e..1d3c2b72f2 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -127,7 +127,8 @@ protected: return mCharacter->getVisualParamWeight(param_name.c_str()); } void setParamValue(LLViewerVisualParam *param, - const F32 new_value_local); + const F32 new_value_local, + F32 behavior_maxeffect); F32 toLocal(const LLVector3 &world); F32 calculateVelocity_local(const F32 time_delta); @@ -478,9 +479,6 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) F32 behavior_maxeffect = getParamValue("MaxEffect"); if (physics_test) behavior_maxeffect = 1.0f; - // Maximum effect is [0,1] range. - const F32 min_val = 0.5f-behavior_maxeffect/2.0; - const F32 max_val = 0.5f+behavior_maxeffect/2.0; // mPositon_local should be in normalized 0,1 range already. Just making sure... F32 position_current_local = llclamp(mPosition_local, @@ -578,12 +576,12 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) position_new_local = position_user_local; // Zero out the velocity if the param is being pushed beyond its limits. - if ((position_new_local < min_val && velocity_new_local < 0) || - (position_new_local > max_val && velocity_new_local > 0)) + if ((position_new_local < 0 && velocity_new_local < 0) || + (position_new_local > 1 && velocity_new_local > 0)) { velocity_new_local = 0; } - + // Check for NaN values. A NaN value is detected if the variables doesn't equal itself. // If NaN, then reset everything. if ((mPosition_local != mPosition_local) || @@ -601,8 +599,8 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) } const F32 position_new_local_clamped = llclamp(position_new_local, - min_val, - max_val); + 0.0f, + 1.0f); LLDriverParam *driver_param = dynamic_cast<LLDriverParam *>(mParamDriver); llassert_always(driver_param); @@ -623,7 +621,7 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) { LLDrivenEntry &entry = (*iter); LLViewerVisualParam *driven_param = entry.mParam; - setParamValue(driven_param,position_new_local_clamped); + setParamValue(driven_param,position_new_local_clamped, behavior_maxeffect); } } @@ -705,12 +703,19 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) // Range of new_value_local is assumed to be [0 , 1] normalized. void LLPhysicsMotion::setParamValue(LLViewerVisualParam *param, - F32 new_value_normalized) + F32 new_value_normalized, + F32 behavior_maxeffect) { const F32 value_min_local = param->getMinWeight(); const F32 value_max_local = param->getMaxWeight(); + const F32 min_val = 0.5f-behavior_maxeffect/2.0; + const F32 max_val = 0.5f+behavior_maxeffect/2.0; - const F32 new_value_local = value_min_local + (value_max_local-value_min_local) * new_value_normalized; + // Scale from [0,1] to [min_val,max_val] + const F32 new_value_rescaled = min_val + (max_val-min_val) * new_value_normalized; + + // Scale from [0,1] to [value_min_local,value_max_local] + const F32 new_value_local = value_min_local + (value_max_local-value_min_local) * new_value_rescaled; mCharacter->setVisualParamWeight(param, new_value_local, -- cgit v1.2.3 From 172bca783f94489fbf3ec68dfdc5f7851910b337 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Wed, 13 Apr 2011 15:23:11 -0400 Subject: SH-1364 FIXED Avatar Physics are not updating smoothly even for high-performance machines. "high" graphics settings now give 100% updates, versus 90%. Changed a simple constant that was acting as a threshold for when physics should be updated (the constant was set way too high, meaning that updates were being skipped). --- indra/newview/featuretable.txt | 2 +- indra/newview/llphysicsmotion.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt index 15ad330418..af2d951bf7 100644 --- a/indra/newview/featuretable.txt +++ b/indra/newview/featuretable.txt @@ -132,7 +132,7 @@ list High RenderAnisotropic 1 1 RenderAvatarCloth 1 0 RenderAvatarLODFactor 1 1.0 -RenderAvatarPhysicsLODFactor 1 0.9 +RenderAvatarPhysicsLODFactor 1 1.0 RenderAvatarVP 1 1 RenderFarClip 1 128 RenderFlexTimeFactor 1 1.0 diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index de4ce52351..09c9e75f2a 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -656,7 +656,7 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) if ((pixel_area > area_for_this_setting) || is_self) { const F32 position_diff_local = llabs(mPositionLastUpdate_local-position_new_local_clamped); - const F32 min_delta = (1.01f-lod_factor)*0.4f; + const F32 min_delta = (1.0001f-lod_factor)*0.4f; if (llabs(position_diff_local) > min_delta) { update_visuals = TRUE; -- cgit v1.2.3 From eaabea67445096d8d6ef6606aa8d06a4bf3913f6 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Wed, 13 Apr 2011 15:23:11 -0400 Subject: SH-1364 FIXED Avatar Physics are not updating smoothly even for high-performance machines. "high" graphics settings now give 100% updates, versus 90%. Changed a simple constant that was acting as a threshold for when physics should be updated (the constant was set way too high, meaning that updates were being skipped). --- indra/newview/featuretable.txt | 2 +- indra/newview/llphysicsmotion.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt index 15ad330418..af2d951bf7 100644 --- a/indra/newview/featuretable.txt +++ b/indra/newview/featuretable.txt @@ -132,7 +132,7 @@ list High RenderAnisotropic 1 1 RenderAvatarCloth 1 0 RenderAvatarLODFactor 1 1.0 -RenderAvatarPhysicsLODFactor 1 0.9 +RenderAvatarPhysicsLODFactor 1 1.0 RenderAvatarVP 1 1 RenderFarClip 1 128 RenderFlexTimeFactor 1 1.0 diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index de4ce52351..09c9e75f2a 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -656,7 +656,7 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) if ((pixel_area > area_for_this_setting) || is_self) { const F32 position_diff_local = llabs(mPositionLastUpdate_local-position_new_local_clamped); - const F32 min_delta = (1.01f-lod_factor)*0.4f; + const F32 min_delta = (1.0001f-lod_factor)*0.4f; if (llabs(position_diff_local) > min_delta) { update_visuals = TRUE; -- cgit v1.2.3 From 7b62a960d102a3e48cd3f21d000f6789b224ae85 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" <vir@lindenlab.com> Date: Wed, 13 Apr 2011 16:50:11 -0400 Subject: merge --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 03db2f8d49..e1e009ab59 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -234,9 +234,9 @@ <key>archive</key> <map> <key>hash</key> - <string>cb307f03a17941333bee13495450107c</string> + <string>4d07ad210dbf4532e145206bd8e89a18</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-colladadom/rev/226422/arch/Darwin/installer/colladadom-2.2-darwin-20110412.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-colladadom/rev/226539/arch/Darwin/installer/colladadom-2.2-darwin-20110413.tar.bz2</string> </map> <key>name</key> <string>darwin</string> -- cgit v1.2.3 From 6db302578a40bba7eaca9f4f22bb7215b77fdc3a Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" <vir@lindenlab.com> Date: Wed, 13 Apr 2011 16:58:04 -0400 Subject: newer glod, colladadom builds on mac --- autobuild.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index e1e009ab59..46b1fa2ff6 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -18,9 +18,9 @@ <key>archive</key> <map> <key>hash</key> - <string>1eea55da1625518390af4c315a0d43c3</string> + <string>7c546f54f6ed654f713c778af3925dd4</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-glod/rev/226145/arch/Darwin/installer/glod-1.0pre4-darwin-20110408.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-glod/rev/226566/arch/Darwin/installer/glod-1.0pre4-darwin-20110413.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -234,9 +234,9 @@ <key>archive</key> <map> <key>hash</key> - <string>4d07ad210dbf4532e145206bd8e89a18</string> + <string>cff08178fc9720ab37646e142edeaa6d</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-colladadom/rev/226539/arch/Darwin/installer/colladadom-2.2-darwin-20110413.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-colladadom/rev/226567/arch/Darwin/installer/colladadom-2.2-darwin-20110413.tar.bz2</string> </map> <key>name</key> <string>darwin</string> -- cgit v1.2.3 From 759d72a46c5d487e6881426f90c54c6ae2da4847 Mon Sep 17 00:00:00 2001 From: Merov Linden <merov@lindenlab.com> Date: Wed, 13 Apr 2011 14:05:31 -0700 Subject: EXP-669 : Refactor code to use correct LLImageFormatted methods to load images of all formats, reviewed by richard --- .../llimage_libtest/llimage_libtest.cpp | 27 +---- indra/llimage/llimage.cpp | 23 +--- indra/newview/llfloaterimagepreview.cpp | 119 +++++---------------- indra/newview/llviewermenufile.cpp | 55 +--------- indra/newview/llviewertexturelist.cpp | 110 +++++-------------- 5 files changed, 59 insertions(+), 275 deletions(-) diff --git a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp index 365f5f758c..03a79532c8 100644 --- a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp +++ b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp @@ -69,31 +69,8 @@ static bool sAllDone = false; // Create an empty formatted image instance of the correct type from the filename LLPointer<LLImageFormatted> create_image(const std::string &filename) { - std::string exten = gDirUtilp->getExtension(filename); - U32 codec = LLImageBase::getCodecFromExtension(exten); - - LLPointer<LLImageFormatted> image; - switch (codec) - { - case IMG_CODEC_BMP: - image = new LLImageBMP(); - break; - case IMG_CODEC_TGA: - image = new LLImageTGA(); - break; - case IMG_CODEC_JPEG: - image = new LLImageJPEG(); - break; - case IMG_CODEC_J2C: - image = new LLImageJ2C(); - break; - case IMG_CODEC_PNG: - image = new LLImagePNG(); - break; - default: - return NULL; - } - + std::string exten = gDirUtilp->getExtension(filename); + LLPointer<LLImageFormatted> image = LLImageFormatted::createFromExtension(exten); return image; } diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp index 39211bf7fa..f0d15d9607 100644 --- a/indra/llimage/llimage.cpp +++ b/indra/llimage/llimage.cpp @@ -1254,28 +1254,7 @@ bool LLImageRaw::createFromFile(const std::string &filename, bool j2c_lowest_mip return false; } - LLPointer<LLImageFormatted> image; - switch(codec) - { - //case IMG_CODEC_RGB: - case IMG_CODEC_BMP: - image = new LLImageBMP(); - break; - case IMG_CODEC_TGA: - image = new LLImageTGA(); - break; - case IMG_CODEC_JPEG: - image = new LLImageJPEG(); - break; - case IMG_CODEC_J2C: - image = new LLImageJ2C(); - break; - case IMG_CODEC_DXT: - image = new LLImageDXT(); - break; - default: - return false; - } + LLPointer<LLImageFormatted> image = LLImageFormatted::createFromType(codec); llassert(image.notNull()); U8 *buffer = image->allocateData(length); diff --git a/indra/newview/llfloaterimagepreview.cpp b/indra/newview/llfloaterimagepreview.cpp index c7fbdd5745..d76e7885bc 100644 --- a/indra/newview/llfloaterimagepreview.cpp +++ b/indra/newview/llfloaterimagepreview.cpp @@ -325,122 +325,51 @@ void LLFloaterImagePreview::draw() bool LLFloaterImagePreview::loadImage(const std::string& src_filename) { std::string exten = gDirUtilp->getExtension(src_filename); - - U32 codec = IMG_CODEC_INVALID; - std::string temp_str; - if( exten == "bmp") - { - codec = IMG_CODEC_BMP; - } - else if( exten == "tga") - { - codec = IMG_CODEC_TGA; - } - else if( exten == "jpg" || exten == "jpeg") - { - codec = IMG_CODEC_JPEG; - } - else if( exten == "png" ) - { - codec = IMG_CODEC_PNG; - } + U32 codec = LLImageBase::getCodecFromExtension(exten); LLImageDimensionsInfo image_info; - if(!image_info.load(src_filename,codec)) + if (!image_info.load(src_filename,codec)) { mImageLoadError = image_info.getLastError(); return false; } S32 max_width = gSavedSettings.getS32("max_texture_dimension_X"); - S32 max_heigh = gSavedSettings.getS32("max_texture_dimension_Y"); + S32 max_height = gSavedSettings.getS32("max_texture_dimension_Y"); - if(image_info.getWidth() > max_width|| image_info.getHeight() > max_heigh) + if ((image_info.getWidth() > max_width) || (image_info.getHeight() > max_height)) { LLStringUtil::format_map_t args; args["WIDTH"] = llformat("%d", max_width); - args["HEIGHT"] = llformat("%d", max_heigh); + args["HEIGHT"] = llformat("%d", max_height); mImageLoadError = LLTrans::getString("texture_load_dimensions_error", args); return false; } - + // Load the image + LLPointer<LLImageFormatted> image = LLImageFormatted::createFromType(codec); + if (image.isNull()) + { + return false; + } + if (!image->load(src_filename)) + { + return false; + } + // Decompress or expand it in a raw image structure LLPointer<LLImageRaw> raw_image = new LLImageRaw; - - switch (codec) + if (!image->decode(raw_image, 0.0f)) { - case IMG_CODEC_BMP: - { - LLPointer<LLImageBMP> bmp_image = new LLImageBMP; - - if (!bmp_image->load(src_filename)) - { - return false; - } - - if (!bmp_image->decode(raw_image, 0.0f)) - { - return false; - } - } - break; - case IMG_CODEC_TGA: - { - LLPointer<LLImageTGA> tga_image = new LLImageTGA; - - if (!tga_image->load(src_filename)) - { - return false; - } - - if (!tga_image->decode(raw_image)) - { - return false; - } - - if( (tga_image->getComponents() != 3) && - (tga_image->getComponents() != 4) ) - { - tga_image->setLastError( "Image files with less than 3 or more than 4 components are not supported." ); - return false; - } - } - break; - case IMG_CODEC_JPEG: - { - LLPointer<LLImageJPEG> jpeg_image = new LLImageJPEG; - - if (!jpeg_image->load(src_filename)) - { - return false; - } - - if (!jpeg_image->decode(raw_image, 0.0f)) - { - return false; - } - } - break; - case IMG_CODEC_PNG: - { - LLPointer<LLImagePNG> png_image = new LLImagePNG; - - if (!png_image->load(src_filename)) - { - return false; - } - - if (!png_image->decode(raw_image, 0.0f)) - { - return false; - } - } - break; - default: return false; } - + // Check the image constraints + if ((image->getComponents() != 3) && (image->getComponents() != 4)) + { + image->setLastError("Image files with less than 3 or more than 4 components are not supported."); + return false; + } + raw_image->biasedScaleToPowerOfTwo(1024); mRawImagep = raw_image; diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index fda291f3c1..2cf8dbec89 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -493,6 +493,7 @@ void upload_new_resource(const std::string& src_filename, std::string name, LLSD args; std::string exten = gDirUtilp->getExtension(src_filename); + U32 codec = LLImageBase::getCodecFromExtension(exten); LLAssetType::EType asset_type = LLAssetType::AT_NONE; std::string error_message; @@ -510,66 +511,20 @@ void upload_new_resource(const std::string& src_filename, std::string name, upload_error(error_message, "NoFileExtension", filename, args); return; } - else if( exten == "bmp") + else if (codec != IMG_CODEC_INVALID) { + // It's an image file, the upload procedure is the same for all asset_type = LLAssetType::AT_TEXTURE; - if (!LLViewerTextureList::createUploadFile(src_filename, - filename, - IMG_CODEC_BMP )) + if (!LLViewerTextureList::createUploadFile(src_filename, filename, codec )) { error_message = llformat( "Problem with file %s:\n\n%s\n", - src_filename.c_str(), LLImage::getLastError().c_str()); + src_filename.c_str(), LLImage::getLastError().c_str()); args["FILE"] = src_filename; args["ERROR"] = LLImage::getLastError(); upload_error(error_message, "ProblemWithFile", filename, args); return; } } - else if( exten == "tga") - { - asset_type = LLAssetType::AT_TEXTURE; - if (!LLViewerTextureList::createUploadFile(src_filename, - filename, - IMG_CODEC_TGA )) - { - error_message = llformat("Problem with file %s:\n\n%s\n", - src_filename.c_str(), LLImage::getLastError().c_str()); - args["FILE"] = src_filename; - args["ERROR"] = LLImage::getLastError(); - upload_error(error_message, "ProblemWithFile", filename, args); - return; - } - } - else if( exten == "jpg" || exten == "jpeg") - { - asset_type = LLAssetType::AT_TEXTURE; - if (!LLViewerTextureList::createUploadFile(src_filename, - filename, - IMG_CODEC_JPEG )) - { - error_message = llformat("Problem with file %s:\n\n%s\n", - src_filename.c_str(), LLImage::getLastError().c_str()); - args["FILE"] = src_filename; - args["ERROR"] = LLImage::getLastError(); - upload_error(error_message, "ProblemWithFile", filename, args); - return; - } - } - else if( exten == "png") - { - asset_type = LLAssetType::AT_TEXTURE; - if (!LLViewerTextureList::createUploadFile(src_filename, - filename, - IMG_CODEC_PNG )) - { - error_message = llformat("Problem with file %s:\n\n%s\n", - src_filename.c_str(), LLImage::getLastError().c_str()); - args["FILE"] = src_filename; - args["ERROR"] = LLImage::getLastError(); - upload_error(error_message, "ProblemWithFile", filename, args); - return; - } - } else if(exten == "wav") { asset_type = LLAssetType::AT_SOUND; // tag it as audio diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 06f6ff23c2..5afed721ac 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -927,99 +927,43 @@ void LLViewerTextureList::decodeAllImages(F32 max_time) BOOL LLViewerTextureList::createUploadFile(const std::string& filename, const std::string& out_filename, const U8 codec) -{ - // First, load the image. +{ + // Load the image + LLPointer<LLImageFormatted> image = LLImageFormatted::createFromType(codec); + if (image.isNull()) + { + return FALSE; + } + if (!image->load(filename)) + { + return FALSE; + } + // Decompress or expand it in a raw image structure LLPointer<LLImageRaw> raw_image = new LLImageRaw; - - switch (codec) + if (!image->decode(raw_image, 0.0f)) { - case IMG_CODEC_BMP: - { - LLPointer<LLImageBMP> bmp_image = new LLImageBMP; - - if (!bmp_image->load(filename)) - { - return FALSE; - } - - if (!bmp_image->decode(raw_image, 0.0f)) - { - return FALSE; - } - } - break; - case IMG_CODEC_TGA: - { - LLPointer<LLImageTGA> tga_image = new LLImageTGA; - - if (!tga_image->load(filename)) - { - return FALSE; - } - - if (!tga_image->decode(raw_image)) - { - return FALSE; - } - - if( (tga_image->getComponents() != 3) && - (tga_image->getComponents() != 4) ) - { - tga_image->setLastError( "Image files with less than 3 or more than 4 components are not supported." ); - return FALSE; - } - } - break; - case IMG_CODEC_JPEG: - { - LLPointer<LLImageJPEG> jpeg_image = new LLImageJPEG; - - if (!jpeg_image->load(filename)) - { - return FALSE; - } - - if (!jpeg_image->decode(raw_image, 0.0f)) - { - return FALSE; - } - } - break; - case IMG_CODEC_PNG: - { - LLPointer<LLImagePNG> png_image = new LLImagePNG; - - if (!png_image->load(filename)) - { - return FALSE; - } - - if (!png_image->decode(raw_image, 0.0f)) - { - return FALSE; - } - } - break; - default: - return FALSE; + return FALSE; } - - LLPointer<LLImageJ2C> compressedImage = convertToUploadFile(raw_image); - - if( !compressedImage->save(out_filename) ) + // Check the image constraints + if ((image->getComponents() != 3) && (image->getComponents() != 4)) { - llinfos << "Couldn't create output file " << out_filename << llendl; + image->setLastError("Image files with less than 3 or more than 4 components are not supported."); return FALSE; } - - // test to see if the encode and save worked. + // Convert to j2c (JPEG2000) and save the file locally + LLPointer<LLImageJ2C> compressedImage = convertToUploadFile(raw_image); + if (!compressedImage->save(out_filename)) + { + llinfos << "Couldn't create output file : " << out_filename << llendl; + return FALSE; + } + // Test to see if the encode and save worked LLPointer<LLImageJ2C> integrity_test = new LLImageJ2C; - if( !integrity_test->loadAndValidate( out_filename ) ) + if (!integrity_test->loadAndValidate( out_filename )) { - llinfos << "Image: " << out_filename << " is corrupt." << llendl; + llinfos << "Image file : " << out_filename << " is corrupt" << llendl; return FALSE; } - return TRUE; } -- cgit v1.2.3 From bf366253328846b60dbe85c49de08dbab96d741f Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Wed, 13 Apr 2011 16:33:41 -0500 Subject: Fix for bad fmod URL's --- autobuild.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 03db2f8d49..9b035eea66 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -452,7 +452,7 @@ <key>hash</key> <string>61ead113e6479452e6b690c84b4e9d30</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/fmod-3.75-darwin-20110222.tar.bz2</string> + <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-fmod-private/rev/221852/arch/Darwin/installer/fmod-3.75-darwin-20110222.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -464,7 +464,7 @@ <key>hash</key> <string>0c61d643db54d2e5999be8254569d8b3</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/fmod-3.75-linux-20110223.tar.bz2</string> + <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-fmod-private/rev/221852/arch/Linux/installer/fmod-3.75-linux-20110223.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -476,7 +476,7 @@ <key>hash</key> <string>d9a9a6ad86895353bcd63374a4c1a91d</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/fmod-3.75-windows-20110222.tar.bz2</string> + <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-fmod-private/rev/221852/arch/CYGWIN/installer/fmod-3.75-windows-20110222.tar.bz2</string> </map> <key>name</key> <string>windows</string> -- cgit v1.2.3 From dbb7cd6910f382eece23321ad4521ea015afe014 Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Wed, 13 Apr 2011 16:40:20 -0500 Subject: Fix for bad kdu URLs --- autobuild.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index eb8f57e467..d1066d473e 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -956,7 +956,7 @@ <key>hash</key> <string>d91e1f483209cd3eba04135c6a59e829</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/kdu-6.4.1-darwin-20110218.tar.bz2</string> + <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-kdu-private/rev/221672/arch/Darwin/installer/kdu-6.4.1-darwin-20110218.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -968,7 +968,7 @@ <key>hash</key> <string>fbf8a4f78dff986d7c16b3a0437e033e</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/kdu-6.4.1-linux-20110311.tar.bz2</string> + <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-kdu-private/rev/223538/arch/Linux/installer/kdu-6.4.1-linux-20110311.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -980,7 +980,7 @@ <key>hash</key> <string>6cd9f36465ef73a3df34bf2b3bba2ced</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/kdu-6.4.1-windows-20110218.tar.bz2</string> + <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-kdu-private/rev/221672/arch/CYGWIN/installer/kdu-6.4.1-windows-20110218.tar.bz2</string> </map> <key>name</key> <string>windows</string> -- cgit v1.2.3 From 7577ec25a066c5bb9b39978e32b8da084b1916d7 Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine <vsavchuk@productengine.com> Date: Thu, 14 Apr 2011 00:52:40 +0300 Subject: STORM-1095 FIX Chat preferences > font size should increase size of input text in the chat box. Submitting on behalf of Jonathan Yap. --- doc/contributions.txt | 2 ++ indra/newview/llfloaterpreference.cpp | 2 ++ indra/newview/llnearbychatbar.cpp | 14 ++++++++++++++ indra/newview/llnearbychatbar.h | 1 + indra/newview/llviewerchat.cpp | 14 ++++++++++++++ indra/newview/llviewerchat.h | 6 ++++++ 6 files changed, 39 insertions(+) diff --git a/doc/contributions.txt b/doc/contributions.txt index e7db8c0ded..9e189d6c75 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -424,6 +424,7 @@ Jonathan Yap STORM-1094 STORM-1077 STORM-953 + STORM-1095 Kage Pixel VWR-11 Ken March @@ -660,6 +661,7 @@ Robin Cornelius STORM-422 STORM-960 STORM-1019 + STORM-1095 VWR-2488 VWR-9557 VWR-10579 diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 1a9d0af9af..10a8585920 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -412,6 +412,8 @@ BOOL LLFloaterPreference::postBuild() gSavedSettings.getControl("ChatFontSize")->getSignal()->connect(boost::bind(&LLNearbyChat::processChatHistoryStyleUpdate, _2)); + gSavedSettings.getControl("ChatFontSize")->getSignal()->connect(boost::bind(&LLViewerChat::signalChatFontChanged)); + gSavedSettings.getControl("ChatBubbleOpacity")->getSignal()->connect(boost::bind(&LLFloaterPreference::onNameTagOpacityChange, this, _2)); LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core"); diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp index 162e465fef..d3fd959152 100644 --- a/indra/newview/llnearbychatbar.cpp +++ b/indra/newview/llnearbychatbar.cpp @@ -47,6 +47,7 @@ #include "llwindow.h" #include "llviewerwindow.h" #include "llrootview.h" +#include "llviewerchat.h" S32 LLNearbyChatBar::sLastSpecialChatChannel = 0; @@ -433,13 +434,26 @@ BOOL LLNearbyChatBar::postBuild() mChatBox->setPassDelete(TRUE); mChatBox->setReplaceNewlinesWithSpaces(FALSE); mChatBox->setEnableLineHistory(TRUE); + mChatBox->setFont(LLViewerChat::getChatFont()); mOutputMonitor = getChild<LLOutputMonitorCtrl>("chat_zone_indicator"); mOutputMonitor->setVisible(FALSE); + // Register for font change notifications + LLViewerChat::setFontChangedCallback(boost::bind(&LLNearbyChatBar::onChatFontChange, this, _1)); + return TRUE; } +void LLNearbyChatBar::onChatFontChange(LLFontGL* fontp) +{ + // Update things with the new font whohoo + if (mChatBox) + { + mChatBox->setFont(fontp); + } +} + //static LLNearbyChatBar* LLNearbyChatBar::getInstance() { diff --git a/indra/newview/llnearbychatbar.h b/indra/newview/llnearbychatbar.h index 96ab45071b..efddec942f 100644 --- a/indra/newview/llnearbychatbar.h +++ b/indra/newview/llnearbychatbar.h @@ -127,6 +127,7 @@ protected: void sendChat( EChatType type ); void onChatBoxCommit(); + void onChatFontChange(LLFontGL* fontp); static LLWString stripChannelNumber(const LLWString &mesg, S32* channel); EChatType processChatTypeTriggers(EChatType type, std::string &str); diff --git a/indra/newview/llviewerchat.cpp b/indra/newview/llviewerchat.cpp index 286b16bab2..f5484ff010 100644 --- a/indra/newview/llviewerchat.cpp +++ b/indra/newview/llviewerchat.cpp @@ -36,6 +36,7 @@ #include "llinstantmessage.h" //SYSTEM_FROM // LLViewerChat +LLViewerChat::font_change_signal_t LLViewerChat::sChatFontChangedSignal; //static void LLViewerChat::getChatColor(const LLChat& chat, LLColor4& r_color) @@ -256,3 +257,16 @@ std::string LLViewerChat::getObjectImSLURL(const LLChat& chat, const LLSD& args) return url; } + +//static +boost::signals2::connection LLViewerChat::setFontChangedCallback(const font_change_signal_t::slot_type& cb) +{ + return sChatFontChangedSignal.connect(cb); +} + +//static +void LLViewerChat::signalChatFontChanged() +{ + // Notify all observers that our font has changed + sChatFontChangedSignal(getChatFont()); +} diff --git a/indra/newview/llviewerchat.h b/indra/newview/llviewerchat.h index 0f15d29f04..c05caf0a95 100644 --- a/indra/newview/llviewerchat.h +++ b/indra/newview/llviewerchat.h @@ -35,6 +35,8 @@ class LLViewerChat { public: + typedef boost::signals2::signal<void (LLFontGL*)> font_change_signal_t; + static void getChatColor(const LLChat& chat, LLColor4& r_color); static void getChatColor(const LLChat& chat, std::string& r_color_name, F32& r_color_alpha); static LLFontGL* getChatFont(); @@ -42,8 +44,12 @@ public: static void formatChatMsg(const LLChat& chat, std::string& formated_msg); static std::string getSenderSLURL(const LLChat& chat, const LLSD& args); + static boost::signals2::connection setFontChangedCallback(const font_change_signal_t::slot_type& cb); + static void signalChatFontChanged(); + private: static std::string getObjectImSLURL(const LLChat& chat, const LLSD& args); + static font_change_signal_t sChatFontChangedSignal; }; -- cgit v1.2.3 From 1a6908a2d97380d8a625bb8d8797599c6f3dce7a Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Wed, 13 Apr 2011 16:31:16 -0700 Subject: SH-1299 and SH-1300 Adding mesh enabled checkbox to region floater --- indra/newview/llfloaterregiondebugconsole.cpp | 7 +- indra/newview/llfloaterregiondebugconsole.h | 5 ++ indra/newview/llfloaterregioninfo.cpp | 81 ++++++++++++++++++++++ indra/newview/llfloaterregioninfo.h | 5 ++ .../skins/default/xui/en/panel_region_general.xml | 15 +++- 5 files changed, 108 insertions(+), 5 deletions(-) diff --git a/indra/newview/llfloaterregiondebugconsole.cpp b/indra/newview/llfloaterregiondebugconsole.cpp index ada0dcf569..c7fab2573f 100644 --- a/indra/newview/llfloaterregiondebugconsole.cpp +++ b/indra/newview/llfloaterregiondebugconsole.cpp @@ -58,8 +58,6 @@ namespace { // Signal used to notify the floater of responses from the asynchronous // API. - typedef boost::signals2::signal< - void (const std::string& output)> console_reply_signal_t; console_reply_signal_t sConsoleReplySignal; const std::string PROMPT("\n\n> "); @@ -132,6 +130,11 @@ namespace }; } +boost::signals2::connection LLFloaterRegionDebugConsole::setConsoleReplyCallback(const console_reply_signal_t::slot_type& cb) +{ + return sConsoleReplySignal.connect(cb); +} + LLFloaterRegionDebugConsole::LLFloaterRegionDebugConsole(LLSD const & key) : LLFloater(key), mOutput(NULL) { diff --git a/indra/newview/llfloaterregiondebugconsole.h b/indra/newview/llfloaterregiondebugconsole.h index 3aa525724e..fd3af4152e 100644 --- a/indra/newview/llfloaterregiondebugconsole.h +++ b/indra/newview/llfloaterregiondebugconsole.h @@ -35,6 +35,9 @@ class LLTextEditor; +typedef boost::signals2::signal< + void (const std::string& output)> console_reply_signal_t; + class LLFloaterRegionDebugConsole : public LLFloater, public LLHTTPClient::Responder { public: @@ -48,6 +51,8 @@ public: LLTextEditor * mOutput; + static boost::signals2::connection setConsoleReplyCallback(const console_reply_signal_t::slot_type& cb); + private: void onReplyReceived(const std::string& output); diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index 7792b3fb40..34fda49375 100644 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -53,6 +53,7 @@ #include "llfloatertopobjects.h" // added to fix SL-32336 #include "llfloatergroups.h" #include "llfloaterreg.h" +#include "llfloaterregiondebugconsole.h" #include "llfloatertelehub.h" #include "llfloaterwindlight.h" #include "llinventorymodel.h" @@ -159,9 +160,30 @@ bool estate_dispatch_initialized = false; //S32 LLFloaterRegionInfo::sRequestSerial = 0; LLUUID LLFloaterRegionInfo::sRequestInvoice; + +void LLFloaterRegionInfo::onConsoleReplyReceived(const std::string& output) +{ + llwarns << "here is what they're giving us: " << output << llendl; + + if (output.find("FALSE") != std::string::npos) + { + getChild<LLUICtrl>("mesh_rez_enabled_check")->setValue(FALSE); + } + else + { + getChild<LLUICtrl>("mesh_rez_enabled_check")->setValue(TRUE); + } +} + + LLFloaterRegionInfo::LLFloaterRegionInfo(const LLSD& seed) : LLFloater(seed) { + mConsoleReplySignalConnection = LLFloaterRegionDebugConsole::setConsoleReplyCallback( + boost::bind( + &LLFloaterRegionInfo::onConsoleReplyReceived, + this, + _1)); } BOOL LLFloaterRegionInfo::postBuild() @@ -211,12 +233,14 @@ BOOL LLFloaterRegionInfo::postBuild() LLFloaterRegionInfo::~LLFloaterRegionInfo() { + mConsoleReplySignalConnection.disconnect(); } void LLFloaterRegionInfo::onOpen(const LLSD& key) { refreshFromRegion(gAgent.getRegion()); requestRegionInfo(); + requestMeshRezInfo(); } // static @@ -584,6 +608,7 @@ BOOL LLPanelRegionGeneralInfo::postBuild() initCtrl("access_combo"); initCtrl("restrict_pushobject"); initCtrl("block_parcel_search_check"); + initCtrl("mesh_rez_enabled_check"); childSetAction("kick_btn", boost::bind(&LLPanelRegionGeneralInfo::onClickKick, this)); childSetAction("kick_all_btn", onClickKickAll, this); @@ -691,7 +716,42 @@ bool LLPanelRegionGeneralInfo::onMessageCommit(const LLSD& notification, const L return false; } +class ConsoleRequestResponder : public LLHTTPClient::Responder +{ +public: + /*virtual*/ + void error(U32 status, const std::string& reason) + { + llwarns << "requesting mesh_rez_enabled failed" << llendl; + } +}; + + +// called if this request times out. +class ConsoleUpdateResponder : public LLHTTPClient::Responder +{ +public: + /* virtual */ + void error(U32 status, const std::string& reason) + { + llwarns << "Updating mesh enabled region setting failed" << llendl; + } +}; + +void LLFloaterRegionInfo::requestMeshRezInfo() +{ + std::string sim_console_url = gAgent.getRegion()->getCapability("SimConsoleAsync"); + if (!sim_console_url.empty()) + { + std::string request_str = "get mesh_rez_enabled"; + + LLHTTPClient::post( + sim_console_url, + LLSD(request_str), + new ConsoleRequestResponder); + } +} // setregioninfo // strings[0] = 'Y' - block terraform, 'N' - not @@ -764,6 +824,27 @@ BOOL LLPanelRegionGeneralInfo::sendUpdate() sendEstateOwnerMessage(gMessageSystem, "setregioninfo", invoice, strings); } + std::string sim_console_url = gAgent.getRegion()->getCapability("SimConsoleAsync"); + + if (!sim_console_url.empty()) + { + std::string update_str = "set mesh_rez_enabled "; + if (getChild<LLUICtrl>("mesh_rez_enabled_check")->getValue().asBoolean()) + { + update_str += "true"; + } + else + { + update_str += "false"; + } + + LLHTTPClient::post( + sim_console_url, + LLSD(update_str), + new ConsoleUpdateResponder); + } + + // if we changed access levels, tell user about it LLViewerRegion* region = gAgent.getRegion(); if (region && (getChild<LLUICtrl>("access_combo")->getValue().asInteger() != region->getSimAccess()) ) diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h index c0758fa92d..2b87c27fcf 100644 --- a/indra/newview/llfloaterregioninfo.h +++ b/indra/newview/llfloaterregioninfo.h @@ -84,11 +84,16 @@ public: virtual void refresh(); void requestRegionInfo(); + void requestMeshRezInfo(); private: LLFloaterRegionInfo(const LLSD& seed); ~LLFloaterRegionInfo(); + + void onConsoleReplyReceived(const std::string& output); + + boost::signals2::connection mConsoleReplySignalConnection;; protected: void refreshFromRegion(LLViewerRegion* region); diff --git a/indra/newview/skins/default/xui/en/panel_region_general.xml b/indra/newview/skins/default/xui/en/panel_region_general.xml index ca9579284b..e0d9f3f714 100644 --- a/indra/newview/skins/default/xui/en/panel_region_general.xml +++ b/indra/newview/skins/default/xui/en/panel_region_general.xml @@ -114,7 +114,7 @@ layout="topleft" left="10" name="allow_land_resell_check" - top="160" + top="150" width="80" /> <check_box height="20" @@ -122,7 +122,7 @@ layout="topleft" left="10" name="allow_parcel_changes_check" - top="180" + top="170" width="80" /> <check_box height="20" @@ -131,7 +131,16 @@ left="10" name="block_parcel_search_check" tool_tip="Let people see this region and its parcels in search results" - top="200" + top="190" + width="80" /> + <check_box + height="20" + label="Allow Mesh Objects" + layout="topleft" + left="10" + name="mesh_rez_enabled_check" + tool_tip="Let people rez mesh objects on this region" + top="210" width="80" /> <spinner decimal_digits="0" -- cgit v1.2.3 From 7dfa297be16716f637f8aaaf5ea53f1a2baf09bc Mon Sep 17 00:00:00 2001 From: Xiaohong Bao <bao@lindenlab.com> Date: Wed, 13 Apr 2011 18:08:21 -0600 Subject: update to use the latest collada lib, which is built on the 32bit pcre lib. --- autobuild.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index d1066d473e..3d5460733d 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -234,9 +234,9 @@ <key>archive</key> <map> <key>hash</key> - <string>cff08178fc9720ab37646e142edeaa6d</string> + <string>2222b901f310c1806847293789d69ac7</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-colladadom/rev/226567/arch/Darwin/installer/colladadom-2.2-darwin-20110413.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-colladadom/rev/226584/arch/Darwin/installer/colladadom-2.2-darwin-20110413.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -246,9 +246,9 @@ <key>archive</key> <map> <key>hash</key> - <string>414a7db51edbbb9e5fabb2dbea4c19a0</string> + <string>fb9765a9774b80e57f841dfad3438b1e</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-colladadom/rev/226180/arch/Linux/installer/colladadom-2.2-linux-20110409.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-colladadom/rev/226584/arch/Linux/installer/colladadom-2.2-linux-20110413.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -258,9 +258,9 @@ <key>archive</key> <map> <key>hash</key> - <string>7d8819dd334ccccc2b82747565fa6077</string> + <string>a9f548eb6f9aaf292508a8b09c7f2f73</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-colladadom/rev/226180/arch/CYGWIN/installer/colladadom-2.2-windows-20110408.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-colladadom/rev/226584/arch/CYGWIN/installer/colladadom-2.2-windows-20110413.tar.bz2</string> </map> <key>name</key> <string>windows</string> -- cgit v1.2.3 From 8c5207c55597913b17a30f2a8c47c3e8d72d473e Mon Sep 17 00:00:00 2001 From: Paul ProductEngine <pguslisty@productengine.com> Date: Thu, 14 Apr 2011 15:38:07 +0300 Subject: Fixed win build --- indra/newview/llfloaterpreference.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index dd7f637a30..ae902f6b94 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -111,6 +111,7 @@ const F32 MAX_USER_FAR_CLIP = 512.f; const F32 MIN_USER_FAR_CLIP = 64.f; +const F32 BANDWIDTH_UPDATER_TIMEOUT = 0.5f; //control value for middle mouse as talk2push button const static std::string MIDDLE_MOUSE_CV = "MiddleMouse"; @@ -1682,7 +1683,7 @@ BOOL LLPanelPreference::postBuild() //////////////////////PanelSetup /////////////////// if (hasChild("max_bandwidth")) { - mBandWidthUpdater = new LLPanelPreference::Updater(boost::bind(&handleBandwidthChanged, _1), 0.3); + mBandWidthUpdater = new LLPanelPreference::Updater(boost::bind(&handleBandwidthChanged, _1), BANDWIDTH_UPDATER_TIMEOUT); gSavedSettings.getControl("ThrottleBandwidthKBPS")->getSignal()->connect(boost::bind(&LLPanelPreference::Updater::update, mBandWidthUpdater, _2)); } -- cgit v1.2.3 From f92d521b46355caa17517b88cc9911179de3b221 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" <vir@lindenlab.com> Date: Thu, 14 Apr 2011 11:08:50 -0400 Subject: fixed windows boost library names --- indra/cmake/LLPrimitive.cmake | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/indra/cmake/LLPrimitive.cmake b/indra/cmake/LLPrimitive.cmake index 4d6a84b29e..b860a09de9 100755 --- a/indra/cmake/LLPrimitive.cmake +++ b/indra/cmake/LLPrimitive.cmake @@ -9,17 +9,16 @@ use_prebuilt_binary(libxml) set(LLPRIMITIVE_INCLUDE_DIRS ${LIBS_OPEN_DIR}/llprimitive ) - if (WINDOWS) set(LLPRIMITIVE_LIBRARIES debug llprimitive optimized llprimitive debug libcollada14dom22-d optimized libcollada14dom22 - debug libboost_filesystem-d - optimized libboost_filesystem - debug libboost_system-d - optimized libboost_system + debug libboost_filesystem-vc100-mt-gd-1_45 + optimized libboost_filesystem-vc100-mt-1_45 + debug libboost_system-vc100-mt-gd-1_45 + optimized libboost_system-vc100-mt-1_45 ) else (WINDOWS) set(LLPRIMITIVE_LIBRARIES -- cgit v1.2.3 From 8785c7077633e8cfe46f4aea2d861bfa813d79b7 Mon Sep 17 00:00:00 2001 From: Paul ProductEngine <pguslisty@productengine.com> Date: Thu, 14 Apr 2011 18:09:49 +0300 Subject: STORM-898 Filter settings do not reset after unchecking 'Since Logoff' checkbox - Corrected logic in inventory filter. Calculation of whether filter is more or less restrictive depending on time parameters was wrong. --- indra/newview/llinventoryfilter.cpp | 10 ++++++++-- indra/newview/llpanelmaininventory.cpp | 22 +--------------------- 2 files changed, 9 insertions(+), 23 deletions(-) diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index e22363c2f6..dee15a1efd 100644 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -510,9 +510,15 @@ void LLInventoryFilter::setHoursAgo(U32 hours) { if (mFilterOps.mHoursAgo != hours) { + bool are_date_limits_valid = mFilterOps.mMinDate == time_min() && mFilterOps.mMaxDate == time_max(); + + bool is_increasing = hours > mFilterOps.mHoursAgo; + bool is_increasing_from_zero = is_increasing && !mFilterOps.mHoursAgo; + // *NOTE: need to cache last filter time, in case filter goes stale - BOOL less_restrictive = (mFilterOps.mMinDate == time_min() && mFilterOps.mMaxDate == time_max() && hours > mFilterOps.mHoursAgo); - BOOL more_restrictive = (mFilterOps.mMinDate == time_min() && mFilterOps.mMaxDate == time_max() && hours <= mFilterOps.mHoursAgo); + BOOL less_restrictive = (are_date_limits_valid && ((is_increasing && mFilterOps.mHoursAgo)) || !hours); + BOOL more_restrictive = (are_date_limits_valid && (!is_increasing && hours) || is_increasing_from_zero); + mFilterOps.mHoursAgo = hours; mFilterOps.mMinDate = time_min(); mFilterOps.mMaxDate = time_max(); diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 0c3f2f3e31..90617b7dc7 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -81,7 +81,6 @@ public: BOOL getCheckSinceLogoff(); static void onTimeAgo(LLUICtrl*, void *); - static void onCheckSinceLogoff(LLUICtrl*, void *); static void onCloseBtn(void* user_data); static void selectAllTypes(void* user_data); static void selectNoTypes(void* user_data); @@ -619,20 +618,6 @@ LLFloaterInventoryFinder::LLFloaterInventoryFinder(LLPanelMainInventory* invento updateElementsFromFilter(); } - -void LLFloaterInventoryFinder::onCheckSinceLogoff(LLUICtrl *ctrl, void *user_data) -{ - LLFloaterInventoryFinder *self = (LLFloaterInventoryFinder *)user_data; - if (!self) return; - - bool since_logoff= self->getChild<LLUICtrl>("check_since_logoff")->getValue(); - - if (!since_logoff && - !( self->mSpinSinceDays->get() || self->mSpinSinceHours->get() ) ) - { - self->mSpinSinceHours->set(1.0f); - } -} BOOL LLFloaterInventoryFinder::postBuild() { const LLRect& viewrect = mPanelMainInventory->getRect(); @@ -647,9 +632,6 @@ BOOL LLFloaterInventoryFinder::postBuild() mSpinSinceDays = getChild<LLSpinCtrl>("spin_days_ago"); childSetCommitCallback("spin_days_ago", onTimeAgo, this); - // mCheckSinceLogoff = getChild<LLSpinCtrl>("check_since_logoff"); - childSetCommitCallback("check_since_logoff", onCheckSinceLogoff, this); - childSetAction("Close", onCloseBtn, this); updateElementsFromFilter(); @@ -660,12 +642,10 @@ void LLFloaterInventoryFinder::onTimeAgo(LLUICtrl *ctrl, void *user_data) LLFloaterInventoryFinder *self = (LLFloaterInventoryFinder *)user_data; if (!self) return; - bool since_logoff=true; if ( self->mSpinSinceDays->get() || self->mSpinSinceHours->get() ) { - since_logoff = false; + self->getChild<LLUICtrl>("check_since_logoff")->setValue(false); } - self->getChild<LLUICtrl>("check_since_logoff")->setValue(since_logoff); } void LLFloaterInventoryFinder::changeFilter(LLInventoryFilter* filter) -- cgit v1.2.3 From 40077972dd96298e24fa663a3bef78e951c5d20d Mon Sep 17 00:00:00 2001 From: seth_productengine <none@none> Date: Thu, 14 Apr 2011 18:42:25 +0300 Subject: STORM-1111 FIXED Disabled re-loging the nearby chat history to file upon processing the chat style update. --- indra/newview/llnearbychat.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp index 572eeb8fc7..03ebc344f1 100644 --- a/indra/newview/llnearbychat.cpp +++ b/indra/newview/llnearbychat.cpp @@ -250,9 +250,13 @@ void LLNearbyChat::getAllowedRect(LLRect& rect) void LLNearbyChat::updateChatHistoryStyle() { mChatHistory->clear(); + + LLSD do_not_log; + do_not_log["do_not_log"] = true; for(std::vector<LLChat>::iterator it = mMessageArchive.begin();it!=mMessageArchive.end();++it) { - addMessage(*it,false); + // Update the messages without re-writing them to a log file. + addMessage(*it,false, do_not_log); } } -- cgit v1.2.3 From 89db32944b1767f3d6805b72f75390327df43560 Mon Sep 17 00:00:00 2001 From: Paul ProductEngine <pguslisty@productengine.com> Date: Thu, 14 Apr 2011 19:24:39 +0300 Subject: STORM-891 FIXED [HARDCODED] - ALL LANGS - Message showing up after setting your home is in English (French viewer) - Added translation of the hardcoded string to the strings.xml --- indra/newview/llviewermessage.cpp | 6 +++++- indra/newview/skins/default/xui/en/strings.xml | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 9641a0901c..d0fdae1e1b 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -5523,7 +5523,11 @@ void process_alert_core(const std::string& message, BOOL modal) { LLSD args; std::string new_msg =LLNotifications::instance().getGlobalString(message); - args["MESSAGE"] = new_msg; + + std::string localized_msg; + bool is_message_localized = LLTrans::findString(localized_msg, new_msg); + + args["MESSAGE"] = is_message_localized ? localized_msg : new_msg; LLNotificationsUtil::add("SystemMessageTip", args); } } diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 27295150c5..b0ede60fa0 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -3214,6 +3214,8 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. The session initialization is timed out </string> + <string name="Home position set.">Home position set.</string> + <string name="voice_morphing_url">http://secondlife.com/landing/voicemorphing</string> <!-- Financial operations strings --> -- cgit v1.2.3 From 8c7d9bbd064c605b756ebf4752eaefad25ee6f4f Mon Sep 17 00:00:00 2001 From: Merov Linden <merov@lindenlab.com> Date: Thu, 14 Apr 2011 09:28:34 -0700 Subject: EXP-663 : Fix memory leak introduced in precincts handling --- indra/llkdu/llimagej2ckdu.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/indra/llkdu/llimagej2ckdu.cpp b/indra/llkdu/llimagej2ckdu.cpp index 8d2ed8f8c4..5b2c045841 100644 --- a/indra/llkdu/llimagej2ckdu.cpp +++ b/indra/llkdu/llimagej2ckdu.cpp @@ -361,17 +361,23 @@ BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco } int discard = (discard_level != -1 ? discard_level : base.getRawDiscardLevel()); + // Apply loading restrictions mCodeStreamp->apply_input_restrictions( first_channel, max_channel_count, discard, 0, region_kdu); + + // Clean-up + if (region_kdu) + { + delete region_kdu; + region_kdu = NULL; + } + // Resize raw_image according to the image to be decoded kdu_dims dims; mCodeStreamp->get_dims(0,dims); S32 channels = base.getComponents() - first_channel; - if (channels > max_channel_count) - { - channels = max_channel_count; - } + channels = llmin(channels,max_channel_count); raw_image.resize(dims.size.x, dims.size.y, channels); + // llinfos << "Resizing raw_image to " << dims.size.x << ":" << dims.size.y << llendl; - // llinfos << "Resizing to " << dims.size.x << ":" << dims.size.y << llendl; if (!mTileIndicesp) { mTileIndicesp = new kdu_dims; -- cgit v1.2.3 From b4b3c4f763bb3d39c91fbabb5d1a9cb2f178aa1a Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Thu, 14 Apr 2011 11:56:33 -0500 Subject: Include glext headers on linux. --- autobuild.xml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/autobuild.xml b/autobuild.xml index 3d5460733d..841c546ae7 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -601,6 +601,18 @@ <key>name</key> <string>windows</string> </map> + <key>linux</key> + <map> + <key>archive</key> + <map> + <key>hash</key> + <string>5de58ca0fe19abf68b25956762ee0d29</string> + <key>url</key> <!-- Just use the windows pakcage for linux since these are cross platform headers --> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glext-68-windows-20110406.tar.bz2</string> + </map> + <key>name</key> + <string>windows</string> + </map> </map> </map> <key>glh_linear</key> -- cgit v1.2.3 From 4d395e9e625c4a65bc30550d921e15c54e3445f3 Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Thu, 14 Apr 2011 12:22:01 -0500 Subject: Linux not windows (whoops) --- autobuild.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/autobuild.xml b/autobuild.xml index 841c546ae7..d68b8270bc 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -611,7 +611,7 @@ <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glext-68-windows-20110406.tar.bz2</string> </map> <key>name</key> - <string>windows</string> + <string>linux</string> </map> </map> </map> -- cgit v1.2.3 From 4f3b3abb87acff98d05a7312c07689a8c8de62e8 Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Thu, 14 Apr 2011 12:36:30 -0500 Subject: autobuild doesn't like comments? --- autobuild.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/autobuild.xml b/autobuild.xml index d68b8270bc..d1bba181f1 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -607,7 +607,7 @@ <map> <key>hash</key> <string>5de58ca0fe19abf68b25956762ee0d29</string> - <key>url</key> <!-- Just use the windows pakcage for linux since these are cross platform headers --> + <key>url</key> <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glext-68-windows-20110406.tar.bz2</string> </map> <key>name</key> -- cgit v1.2.3 From 971b67bf878517ea6817a9e6be382c071c434c4d Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" <vir@lindenlab.com> Date: Thu, 14 Apr 2011 14:06:59 -0400 Subject: disable windows debug builds (temporary) --- BuildParams | 3 +++ 1 file changed, 3 insertions(+) diff --git a/BuildParams b/BuildParams index 9a5a6bdf41..75ee619228 100755 --- a/BuildParams +++ b/BuildParams @@ -11,6 +11,9 @@ Linux.symbolfiles = "newview/secondlife-symbols-linux.tar.bz2" # Use Public Upload Locations public_build = true +# skip windows debug build until we can get a fix in. +build_CYGWIN_Debug = false + # Update Public Inworld Build Status Indicators email_status_this_is_os = false -- cgit v1.2.3 From 6ec5e332fb0830559a4c335619cc77e64db15fc4 Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Thu, 14 Apr 2011 13:24:21 -0500 Subject: Linux build should use 3p-google-perftools build result --- BuildParams | 1 + autobuild.xml | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/BuildParams b/BuildParams index 9a5a6bdf41..c0edb35b09 100755 --- a/BuildParams +++ b/BuildParams @@ -94,6 +94,7 @@ mesh-development.viewer_channel = "Project Viewer - Mesh" mesh-development.login_channel = "Project Viewer - Mesh" mesh-development.viewer_grid = aditi mesh-development.build_debug_release_separately = true +mesh-development.build_CYGWIN_Debug = false mesh-development.build_viewer_update_version_manager = false # ======================================== diff --git a/autobuild.xml b/autobuild.xml index d1bba181f1..28222c8e61 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1642,9 +1642,9 @@ <key>archive</key> <map> <key>hash</key> - <string>cf513fc2eec4a414cc804cf408932a45</string> + <string>dde928cb24d22a267004a8c17669ba65</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google_perftools-1.7-linux-20110315.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-perftools/rev/226426/arch/Linux/installer/google_perftools-1.7-linux-20110412.tar.bz2</string> </map> <key>name</key> <string>linux</string> -- cgit v1.2.3 From b85eb8ce332083adcfe2fe704b78f82695d0e512 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Thu, 14 Apr 2011 14:47:05 -0400 Subject: VWR-25453 FIXED Avatar Physics Spring Needs a Higher Limit Tripled spring limit for all params. Very safe change. --- indra/newview/character/avatar_lad.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index f8460e059d..ec162e3608 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -11916,7 +11916,7 @@ render_pass="bump"> edit_group="physics_breasts_updown" value_default=".1" value_min="0" - value_max="1"> + value_max="3"> <param_driver /> </param> <param @@ -11971,7 +11971,7 @@ render_pass="bump"> edit_group="physics_breasts_inout" value_default=".1" value_min="0" - value_max="1"> + value_max="3"> <param_driver /> </param> <param @@ -12058,7 +12058,7 @@ render_pass="bump"> edit_group="physics_belly_updown" value_default=".1" value_min="0" - value_max="1"> + value_max="3"> <param_driver /> </param> <param @@ -12144,7 +12144,7 @@ render_pass="bump"> edit_group="physics_butt_updown" value_default=".1" value_min="0" - value_max="1"> + value_max="3"> <param_driver /> </param> <param @@ -12193,7 +12193,7 @@ render_pass="bump"> edit_group="physics_butt_leftright" value_default=".1" value_min="0" - value_max="1"> + value_max="3"> <param_driver /> </param> <param @@ -12244,7 +12244,7 @@ render_pass="bump"> edit_group="physics_breasts_leftright" value_default=".1" value_min="0" - value_max="1"> + value_max="3"> <param_driver /> </param> <param -- cgit v1.2.3 From 0d421c0535181e357d6629f1b2ed139ceda0a2e3 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Thu, 14 Apr 2011 14:47:05 -0400 Subject: VWR-25453 FIXED Avatar Physics Spring Needs a Higher Limit Tripled spring limit for all params. Very safe change. --- indra/newview/character/avatar_lad.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index ec162e3608..6acaa75c32 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -11903,7 +11903,7 @@ render_pass="bump"> edit_group="physics_breasts_updown" value_default="0" value_min="0" - value_max="1"> + value_max="3"> <param_driver /> </param> <param @@ -11958,7 +11958,7 @@ render_pass="bump"> edit_group="physics_breasts_inout" value_default="0" value_min="0" - value_max="1"> + value_max="3"> <param_driver /> </param> <param @@ -12046,7 +12046,7 @@ render_pass="bump"> edit_group="physics_belly_updown" value_default="0" value_min="0" - value_max="1"> + value_max="3"> <param_driver /> </param> <param @@ -12132,7 +12132,7 @@ render_pass="bump"> edit_group="physics_butt_updown" value_default="0" value_min="0" - value_max="1"> + value_max="3"> <param_driver /> </param> <param @@ -12181,7 +12181,7 @@ render_pass="bump"> edit_group="physics_butt_leftright" value_default="0" value_min="0" - value_max="1"> + value_max="3"> <param_driver /> </param> <param @@ -12231,7 +12231,7 @@ render_pass="bump"> edit_group="physics_breasts_leftright" value_default="0" value_min="0" - value_max="1"> + value_max="3"> <param_driver /> </param> <param -- cgit v1.2.3 From fa785d9cf4638233586ecd6566a7d78dad51bb35 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Thu, 14 Apr 2011 14:47:05 -0400 Subject: VWR-25453 FIXED Avatar Physics Spring Needs a Higher Limit Tripled spring limit for all params. Very safe change. --- indra/newview/character/avatar_lad.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index f8460e059d..ec162e3608 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -11916,7 +11916,7 @@ render_pass="bump"> edit_group="physics_breasts_updown" value_default=".1" value_min="0" - value_max="1"> + value_max="3"> <param_driver /> </param> <param @@ -11971,7 +11971,7 @@ render_pass="bump"> edit_group="physics_breasts_inout" value_default=".1" value_min="0" - value_max="1"> + value_max="3"> <param_driver /> </param> <param @@ -12058,7 +12058,7 @@ render_pass="bump"> edit_group="physics_belly_updown" value_default=".1" value_min="0" - value_max="1"> + value_max="3"> <param_driver /> </param> <param @@ -12144,7 +12144,7 @@ render_pass="bump"> edit_group="physics_butt_updown" value_default=".1" value_min="0" - value_max="1"> + value_max="3"> <param_driver /> </param> <param @@ -12193,7 +12193,7 @@ render_pass="bump"> edit_group="physics_butt_leftright" value_default=".1" value_min="0" - value_max="1"> + value_max="3"> <param_driver /> </param> <param @@ -12244,7 +12244,7 @@ render_pass="bump"> edit_group="physics_breasts_leftright" value_default=".1" value_min="0" - value_max="1"> + value_max="3"> <param_driver /> </param> <param -- cgit v1.2.3 From 33d0b98b7c5c9d25a2aa93b94e5af8a3a63295bf Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Thu, 14 Apr 2011 11:56:14 -0700 Subject: SH-1343 Change wizard slider labels SH-1344 Remove Physics and Upload from any panel where it's not used --- .../skins/default/xui/en/floater_model_wizard.xml | 36 +++++++++------------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/indra/newview/skins/default/xui/en/floater_model_wizard.xml b/indra/newview/skins/default/xui/en/floater_model_wizard.xml index 4b312c6ce7..03af348a8d 100644 --- a/indra/newview/skins/default/xui/en/floater_model_wizard.xml +++ b/indra/newview/skins/default/xui/en/floater_model_wizard.xml @@ -291,7 +291,7 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se height="388" top_delta="0" name="optimize_panel" - visible="true" + visible="false" width="535" left="0"> <panel @@ -441,10 +441,10 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se follows="all" width="185"> </panel> - <text top="45" left="224" text_color="White" font="SansSerifSmallBold" width="300" height="4">Performance</text> - <text top="65" left="204" halign="center" width="130" word_wrap="true" font="SansSerifSmall" height="80">Faster rendering but less detailed; lowers Resource (prim) cost.</text> - <text top="45" left="384" text_color="White" font="SansSerifSmallBold" width="300" height="4">Accuracy</text> - <text top="65" left="364" halign="center" width="130" word_wrap="true" font="SansSerifSmall" height="80">More detailed model but slower; increases Resource (prim) cost.</text> + <text top="45" left="214" text_color="White" font="SansSerifSmallBold" halign="center" width="110" height="30" wrap="true">Higher Performance</text> + <text top="75" left="204" halign="center" width="130" word_wrap="true" font="SansSerifSmall" height="80">Faster rendering but less detailed; lowers Resource (prim) cost.</text> + <text top="45" left="378" text_color="White" font="SansSerifSmallBold" halign="center" width="90" height="30" wrap="true">Higher Accuracy</text> + <text top="75" left="364" halign="center" width="130" word_wrap="true" font="SansSerifSmall" height="80">More detailed model but slower; increases Resource (prim) cost.</text> <slider follows="left|top" @@ -457,7 +457,7 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se min_val="2" name="accuracy_slider" show_text="false" - top="120" + top="130" width="290" /> <text font="SansSerifSmall" @@ -475,9 +475,8 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se image_name="model_wizard\divider_line.png"/> <text top_delta="20" width="200" text_color="White" left_delta="50" name="streaming cost" height="20">Resource Cost: [COST]</text> - <text top_delta="24" width="100" text_color="White" left_delta="0" height="20">Upload Fee:</text> <text - top_pad="5" + top_pad="15" width="130" height="14" left="10" @@ -572,10 +571,10 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se bg_opaque_color="DkGray2" background_visible="true" background_opaque="true"> - <text top="15" left="30" text_color="White" font="SansSerifSmallBold" width="300" height="4">Performance</text> - <text top="35" left="10" halign="center" width="130" word_wrap="true" font="SansSerifSmall" height="80">Faster rendering but less detailed; lowers Resource (prim) cost.</text> - <text top="15" left="390" text_color="White" font="SansSerifSmallBold" width="300" height="4">Accuracy</text> - <text top="35" left="360" halign="center" width="130" word_wrap="true" font="SansSerifSmall" height="80">More detailed model but slower; increases Resource (prim) cost.</text> + <text top="25" left="30" text_color="White" font="SansSerifSmallBold" width="300" height="4">Performance</text> + <text top="45" left="10" halign="center" width="130" word_wrap="true" font="SansSerifSmall" height="80">Faster rendering but less detailed; lowers Resource (prim) cost.</text> + <text top="25" left="390" text_color="White" font="SansSerifSmallBold" width="300" height="4">Accuracy</text> + <text top="45" left="360" halign="center" width="130" word_wrap="true" font="SansSerifSmall" height="80">More detailed model but slower; increases Resource (prim) cost.</text> <slider follows="left|top" @@ -588,7 +587,7 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se min_val="0" name="physics_slider" show_text="false" - top="80" + top="90" width="440" /> <text font="SansSerifSmall" @@ -608,9 +607,7 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se height="2" image_name="model_wizard\divider_line.png"/> - <text top_delta="20" width="180" text_color="White" left="160" name="streaming cost" height="20">Resource Cost: [COST]</text> - <text top_delta="26" width="180" text_color="White" left_delta="0" name="physics cost" height="20">Physics Cost: [COST]</text> - <text top_delta="26" width="180" text_color="White" left_delta="0" height="20">Upload Fee:</text> + <text top_delta="30" width="180" text_color="White" left="160" name="streaming cost" height="20">Resource Cost: [COST]</text> </panel> </panel> @@ -619,7 +616,7 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se height="388" top_delta="0" name="physics2_panel" - visible="false" + visible="true" width="535" left="0"> <panel @@ -738,10 +735,7 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se height="15" name="dimension_z" left_delta="46"/> - <text top="40" width="180" text_color="White" left="225" name="streaming cost" height="20">Resource Cost: [COST]</text> - <text top_delta="26" width="180" text_color="White" left_delta="0" name="physics cost" height="20">Physics Cost: [COST]</text> - <text top_delta="26" width="180" text_color="White" left_delta="0" height="20">Upload Fee:</text> - + <text top="60" width="180" text_color="White" left="225" name="streaming cost" height="20">Resource Cost: [COST]</text> </panel> </panel> -- cgit v1.2.3 From 5354ad68d3709f9475be7f559942b9124609394c Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Thu, 14 Apr 2011 16:21:49 -0400 Subject: VWR-25445 FIXED breasts... accordions are presented in Edit Physics floater for male avatars Accordions are selectively hidden based on gender. --- indra/newview/llpaneleditwearable.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp index cb8fbd66b5..b73d97e4c4 100644 --- a/indra/newview/llpaneleditwearable.cpp +++ b/indra/newview/llpaneleditwearable.cpp @@ -1133,7 +1133,7 @@ void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show, BOOL dis LLScrollingPanelList *panel_list = getChild<LLScrollingPanelList>(scrolling_panel); LLAccordionCtrlTab *tab = getChild<LLAccordionCtrlTab>(accordion_tab); - + if (!panel_list) { llwarns << "could not get scrolling panel list: " << scrolling_panel << llendl; @@ -1145,7 +1145,18 @@ void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show, BOOL dis llwarns << "could not get llaccordionctrltab from UI with name: " << accordion_tab << llendl; continue; } - + + // Don't show female subparts if you're not female, etc. + if (!(gAgentAvatarp->getSex() & subpart_entry->mSex)) + { + tab->setVisible(FALSE); + continue; + } + else + { + tab->setVisible(TRUE); + } + // what edit group do we want to extract params for? const std::string edit_group = subpart_entry->mEditGroup; -- cgit v1.2.3 From 461802a5c6cfa27bf942e0da8d606cc3bb71dc6c Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Thu, 14 Apr 2011 16:21:49 -0400 Subject: VWR-25445 FIXED breasts... accordions are presented in Edit Physics floater for male avatars Accordions are selectively hidden based on gender. --- indra/newview/llpaneleditwearable.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp index cb8fbd66b5..b73d97e4c4 100644 --- a/indra/newview/llpaneleditwearable.cpp +++ b/indra/newview/llpaneleditwearable.cpp @@ -1133,7 +1133,7 @@ void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show, BOOL dis LLScrollingPanelList *panel_list = getChild<LLScrollingPanelList>(scrolling_panel); LLAccordionCtrlTab *tab = getChild<LLAccordionCtrlTab>(accordion_tab); - + if (!panel_list) { llwarns << "could not get scrolling panel list: " << scrolling_panel << llendl; @@ -1145,7 +1145,18 @@ void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show, BOOL dis llwarns << "could not get llaccordionctrltab from UI with name: " << accordion_tab << llendl; continue; } - + + // Don't show female subparts if you're not female, etc. + if (!(gAgentAvatarp->getSex() & subpart_entry->mSex)) + { + tab->setVisible(FALSE); + continue; + } + else + { + tab->setVisible(TRUE); + } + // what edit group do we want to extract params for? const std::string edit_group = subpart_entry->mEditGroup; -- cgit v1.2.3 From 77575dae62772e3de4edfb98ca3e3328ea2dc6db Mon Sep 17 00:00:00 2001 From: Xiaohong Bao <bao@lindenlab.com> Date: Thu, 14 Apr 2011 14:43:56 -0600 Subject: update to use 32-bit pcre lib for linux. --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 28222c8e61..413d4576ae 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1522,9 +1522,9 @@ <key>archive</key> <map> <key>hash</key> - <string>86195b0680604fe86cfbbfb921c31dff</string> + <string>18854c815c6f960e22add25cf1ff93d4</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/pcre-7.6-linux-20101029.tar.bz2</string> + <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-pcre/rev/226572/arch/Linux/installer/pcre-7.6-linux-20110413.tar.bz2</string> </map> <key>name</key> <string>linux</string> -- cgit v1.2.3 From a1340acb3ceba0e975b844ef85a0603cb7d8ef37 Mon Sep 17 00:00:00 2001 From: "Debi King (Dessie)" <dessie@lindenlab.com> Date: Thu, 14 Apr 2011 16:56:50 -0400 Subject: Updated release-viewer.jira to DRTVWR-46 for v2.6.3 Release --- BuildParams | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BuildParams b/BuildParams index 73ac74e610..6b4bdd0fd3 100644 --- a/BuildParams +++ b/BuildParams @@ -66,7 +66,7 @@ viewer-pre-release.viewer_channel = "Second Life Release" viewer-pre-release.login_channel = "Second Life Release" viewer-pre-release.build_debug_release_separately = true viewer-pre-release.build_viewer_update_version_manager = true -viewer-pre-release.release-viewer.jira = DRTVWR-44 +viewer-pre-release.release-viewer.jira = DRTVWR-46 # ======================================= # brad -- cgit v1.2.3 From 6b49a5f67cce5e08009387e62ffe778709e2cbbf Mon Sep 17 00:00:00 2001 From: Xiaohong Bao <bao@lindenlab.com> Date: Thu, 14 Apr 2011 15:18:49 -0600 Subject: update to the latest glod lib for linux. --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 413d4576ae..c36de32dcc 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -30,9 +30,9 @@ <key>archive</key> <map> <key>hash</key> - <string>5aeb923a0a50023d0b3a6a8a81cc3d06</string> + <string>f09061c7eabcf701b79c883027376ef2</string> <key>url</key> - <string>https://viewer-source-downloads.s3.amazonaws.com/install_pkgs/glod-1.0pre4-linux-20110408.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-glod/rev/226566/arch/Linux/installer/glod-1.0pre4-linux-20110413.tar.bz2</string> </map> <key>name</key> <string>linux</string> -- cgit v1.2.3 From ed2f4797da8a0437c46b26bc213838ef9fa19be8 Mon Sep 17 00:00:00 2001 From: Xiaohong Bao <bao@lindenlab.com> Date: Thu, 14 Apr 2011 17:19:25 -0600 Subject: update linux glod lib to change 226657. --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index c36de32dcc..4e36c1e4d6 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -30,9 +30,9 @@ <key>archive</key> <map> <key>hash</key> - <string>f09061c7eabcf701b79c883027376ef2</string> + <string>18c708163d2a669bc3c030b05b4ebe61</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-glod/rev/226566/arch/Linux/installer/glod-1.0pre4-linux-20110413.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-glod/rev/226657/arch/Linux/installer/glod-1.0pre4-linux-20110414.tar.bz2</string> </map> <key>name</key> <string>linux</string> -- cgit v1.2.3 From d75e8db4d05462c5624bd1295befaf7339478f5a Mon Sep 17 00:00:00 2001 From: Aaron Stone <stone@lindenlab.com> Date: Thu, 14 Apr 2011 16:55:26 -0700 Subject: VWR-25521 Add a Develop menu toggle item for HTTP Inventory. --- indra/newview/skins/default/xui/en/menu_viewer.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 51610c0ae0..a5115b0faa 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -3113,6 +3113,16 @@ function="ToggleControl" parameter="ImagePipelineUseHTTP" /> </menu_item_check> + <menu_item_check + label="HTTP Inventory" + name="HTTP Inventory"> + <menu_item_check.on_check + function="CheckControl" + parameter="UseHTTPInventory" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="UseHTTPInventory" /> + </menu_item_check> <menu_item_call label="Compress Images" name="Compress Images"> -- cgit v1.2.3 From a0359e324130330d72f985ba8804034cf88d4931 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" <vir@lindenlab.com> Date: Fri, 15 Apr 2011 10:34:23 -0400 Subject: updated to new llconvexdecomposition build (now with 100% more vs2010) --- autobuild.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index d1bba181f1..a3ea3e9563 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -589,7 +589,7 @@ <string>glext</string> <key>platforms</key> <map> - <key>windows</key> + <key>linux</key> <map> <key>archive</key> <map> @@ -599,9 +599,9 @@ <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glext-68-windows-20110406.tar.bz2</string> </map> <key>name</key> - <string>windows</string> + <string>linux</string> </map> - <key>linux</key> + <key>windows</key> <map> <key>archive</key> <map> @@ -611,7 +611,7 @@ <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glext-68-windows-20110406.tar.bz2</string> </map> <key>name</key> - <string>linux</string> + <string>windows</string> </map> </map> </map> @@ -1134,9 +1134,9 @@ <key>archive</key> <map> <key>hash</key> - <string>d8ecfc647df41d546b1e8c697571e0ea</string> + <string>1447d72644ad74e74a057483b33dc0d2</string> <key>url</key> - <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-llconvexdecomposition-vir/rev/225838/arch/CYGWIN/installer/llconvexdecomposition-0.1-windows-20110406.tar.bz2</string> + <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-llconvexdecomposition-vir/rev/226659/arch/CYGWIN/installer/llconvexdecomposition-0.1-windows-20110414.tar.bz2</string> </map> <key>name</key> <string>windows</string> -- cgit v1.2.3 From fcfb70f01d46e5a7f7716c81ce7ad9667a99e3ed Mon Sep 17 00:00:00 2001 From: prep linden <prep@lindenlab.com> Date: Fri, 15 Apr 2011 10:47:44 -0400 Subject: License update --- autobuild.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index d12bb1d3f7..8b3f824d39 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -224,7 +224,7 @@ <key>license</key> <string>scea</string> <key>license_file</key> - <string>LICENSES/scea.txt</string> + <string>LICENSES/collada.txt</string> <key>name</key> <string>colladadom</string> <key>platforms</key> @@ -740,7 +740,7 @@ <key>license</key> <string>bsd</string> <key>license_file</key> - <string>LICENSES/gmock.txt</string> + <string>LICENSES/googlemock.txt</string> <key>name</key> <string>googlemock</string> <key>platforms</key> @@ -1488,7 +1488,7 @@ <key>license</key> <string>bsd</string> <key>license_file</key> - <string>LICENSES/bsd.txt</string> + <string>LICENSES/pcre-license.txt</string> <key>name</key> <string>pcre</string> <key>platforms</key> -- cgit v1.2.3 From 298d71b4d9896de9a55a895b7afef307e69a2edc Mon Sep 17 00:00:00 2001 From: prep linden <prep@lindenlab.com> Date: Fri, 15 Apr 2011 11:02:57 -0400 Subject: License update --- autobuild.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/autobuild.xml b/autobuild.xml index ee6737db8b..4020410b0c 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -824,7 +824,7 @@ <key>license</key> <string>lgpl</string> <key>license_file</key> - <string>LICENSES/gtk.txt</string> + <string>LICENSES/gtk-atk-pango-glib.txt</string> <key>name</key> <string>gtk-atk-pango-glib</string> <key>platforms</key> -- cgit v1.2.3 From c81ae1a3fa0021b7452d70171d5b6939e8b9e309 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" <vir@lindenlab.com> Date: Fri, 15 Apr 2011 11:04:09 -0400 Subject: removed separate stub lib, since llconvexdecomposition is going public and includes the stub --- autobuild.xml | 48 ------------------------------------------------ 1 file changed, 48 deletions(-) mode change 100644 => 100755 autobuild.xml diff --git a/autobuild.xml b/autobuild.xml old mode 100644 new mode 100755 index fabf646c74..709ffc859d --- a/autobuild.xml +++ b/autobuild.xml @@ -1143,54 +1143,6 @@ </map> </map> </map> - <key>llconvexdecompositionstub</key> - <map> - <key>license</key> - <string>lgpl</string> - <key>license_file</key> - <string>LICENSES/lgpl.txt</string> - <key>name</key> - <string>llconvexdecompositionstub</string> - <key>platforms</key> - <map> - <key>darwin</key> - <map> - <key>archive</key> - <map> - <key>hash</key> - <string>349fa0e287fb275bbee43ced194a1db1</string> - <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llconvexdecompositionstub-0.3-darwin-20101015.tar.bz2</string> - </map> - <key>name</key> - <string>darwin</string> - </map> - <key>linux</key> - <map> - <key>archive</key> - <map> - <key>hash</key> - <string>dbf4b15e74ce9042e8500720dffc461a</string> - <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llconvexdecompositionstub-0.3-linux-20101015a.tar.bz2</string> - </map> - <key>name</key> - <string>linux</string> - </map> - <key>windows</key> - <map> - <key>archive</key> - <map> - <key>hash</key> - <string>bba9a4dd04fda1b263f34448a044783b</string> - <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llconvexdecompositionstub-0.3-windows-20101015.tar.bz2</string> - </map> - <key>name</key> - <string>windows</string> - </map> - </map> - </map> <key>llqtwebkit</key> <map> <key>license</key> -- cgit v1.2.3 From 38a0dbf04f24fc22f504485cdcd1efb274fc9a46 Mon Sep 17 00:00:00 2001 From: Paul ProductEngine <pguslisty@productengine.com> Date: Fri, 15 Apr 2011 18:50:03 +0300 Subject: STORM-1039 FIXED Bad iterator access in llavatarnamecache.cpp:564 - Replaced 'while' loop by 'for' - Deleted unnecessary 'cur' iterator --- indra/llmessage/llavatarnamecache.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 767001b633..33e6709983 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -553,12 +553,10 @@ void LLAvatarNameCache::eraseUnrefreshed() if (!sLastExpireCheck || sLastExpireCheck < max_unrefreshed) { sLastExpireCheck = now; - cache_t::iterator it = sCache.begin(); - while (it != sCache.end()) + + for (cache_t::iterator it = sCache.begin(); it != sCache.end(); ++it) { - cache_t::iterator cur = it; - ++it; - const LLAvatarName& av_name = cur->second; + const LLAvatarName& av_name = it->second; if (av_name.mExpires < max_unrefreshed) { const LLUUID& agent_id = it->first; @@ -566,7 +564,7 @@ void LLAvatarNameCache::eraseUnrefreshed() << " user '" << av_name.mUsername << "' " << "expired " << now - av_name.mExpires << " secs ago" << LL_ENDL; - sCache.erase(cur); + sCache.erase(it); } } LL_INFOS("AvNameCache") << sCache.size() << " cached avatar names" << LL_ENDL; -- cgit v1.2.3 From 04f79f63589ab35b01ec9e3d8128e68a201ff332 Mon Sep 17 00:00:00 2001 From: Jonathan Yap <none@none> Date: Fri, 15 Apr 2011 13:13:15 -0400 Subject: STORM-956 Ability to mute dialogs by muting object (or object owner) --- doc/contributions.txt | 2 ++ indra/newview/llviewermessage.cpp | 5 ++++- scripts/messages/message_template.msg | 8 +++++++- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/doc/contributions.txt b/doc/contributions.txt index 516760aa5a..51235e0ce5 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -398,6 +398,7 @@ Jonathan Yap STORM-643 STORM-960 STORM-953 + STORM-956 Kage Pixel VWR-11 Ken March @@ -762,6 +763,7 @@ Thickbrick Sleaford VWR-13483 VWR-13947 VWR-24420 + STORM-956 Thraxis Epsilon SVC-371 VWR-383 diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 103989ee80..0da60ed4ab 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -6462,9 +6462,12 @@ void process_script_dialog(LLMessageSystem* msg, void**) LLSD payload; LLUUID object_id; + LLUUID owner_id; + msg->getUUID("Data", "ObjectID", object_id); + msg->getUUID("OwnerData", "OwnerID", owner_id); - if (LLMuteList::getInstance()->isMuted(object_id)) + if (LLMuteList::getInstance()->isMuted(object_id) || LLMuteList::getInstance()->isMuted(owner_id)) { return; } diff --git a/scripts/messages/message_template.msg b/scripts/messages/message_template.msg index 77dc940335..d292653d3f 100644 --- a/scripts/messages/message_template.msg +++ b/scripts/messages/message_template.msg @@ -2966,7 +2966,7 @@ version 2.0 { BillableFactor F32 } { ObjectBonusFactor F32 } { WaterHeight F32 } - { TerrainRaiseLimit F32 } + { TerrainRaiseLimit F32 } { TerrainLowerLimit F32 } { PricePerMeter S32 } { RedirectGridX S32 } @@ -4242,6 +4242,10 @@ version 2.0 Buttons Variable { ButtonLabel Variable 1 } } + { + OwnerData Variable + { OwnerID LLUUID } + } } @@ -6762,6 +6766,8 @@ version 2.0 } // And, the money transfer +// *NOTE: Unused as of 2010-04-06, because all back-end money transactions +// are done with web services via L$ API. JC { MoneyTransferBackend Low 312 Trusted Zerocoded { -- cgit v1.2.3 From bdd8adf5bb2df3da06610575706088507349b605 Mon Sep 17 00:00:00 2001 From: Jonathan Yap <none@none> Date: Fri, 15 Apr 2011 14:30:36 -0400 Subject: STORM-1128 Code cleanup per codereview comments --- indra/newview/llfloaterworldmap.cpp | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index bf5f569e36..a520a848a4 100755 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -96,14 +96,6 @@ enum EPanDirection // Values in pixels per region static const F32 ZOOM_MAX = 128.f; -struct SortRegionNames -{ - inline bool operator ()(std::pair <U64, LLSimInfo*>& _left, std::pair <U64, LLSimInfo*>& _right) - { - return(LLStringUtil::compareInsensitive(_left.second->getName(),_right.second->getName()) < 0); - } -}; - //--------------------------------------------------------------------------- // Globals //--------------------------------------------------------------------------- @@ -1494,11 +1486,18 @@ void LLFloaterWorldMap::updateSims(bool found_null_sim) S32 num_results = 0; - std::vector<std::pair <U64, LLSimInfo*>> simInfoVec(LLWorldMap::getInstance()->getRegionMap().begin(), LLWorldMap::getInstance()->getRegionMap().end()); - std::sort(simInfoVec.begin(), simInfoVec.end(), SortRegionNames()); + struct SortRegionNames + { + inline bool operator ()(std::pair <U64, LLSimInfo*>& _left, std::pair <U64, LLSimInfo*>& _right) + { + return(LLStringUtil::compareInsensitive(_left.second->getName(),_right.second->getName()) < 0); + } + }; + + std::vector<std::pair <U64, LLSimInfo*>> sim_info_vec(LLWorldMap::getInstance()->getRegionMap().begin(), LLWorldMap::getInstance()->getRegionMap().end()); + std::sort(sim_info_vec.begin(), sim_info_vec.end(), SortRegionNames()); - std::vector<std::pair <U64, LLSimInfo*>>::const_iterator it; - for (it = simInfoVec.begin(); it != simInfoVec.end(); ++it) + for (std::vector<std::pair <U64, LLSimInfo*>>::const_iterator it = sim_info_vec.begin(); it != sim_info_vec.end(); ++it) { LLSimInfo* info = it->second; std::string sim_name_lower = info->getName(); -- cgit v1.2.3 From 8275820df01e9918f254f1a2cd373eb723b88715 Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Fri, 15 Apr 2011 14:11:48 -0500 Subject: SH-1301 Add some extra asserts around VBO usage to try and narrow down a crash. --- indra/llrender/llvertexbuffer.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/indra/llrender/llvertexbuffer.h b/indra/llrender/llvertexbuffer.h index 6c0895512e..a9f22193f8 100644 --- a/indra/llrender/llvertexbuffer.h +++ b/indra/llrender/llvertexbuffer.h @@ -56,13 +56,17 @@ protected: virtual GLuint allocateName() { GLuint name; + stop_glerror(); glGenBuffersARB(1, &name); + stop_glerror(); return name; } virtual void releaseName(GLuint name) { + stop_glerror(); glDeleteBuffersARB(1, &name); + stop_glerror(); } }; -- cgit v1.2.3 From 6a491424677086a84d180ace0b91f1eefaeb67ba Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Fri, 15 Apr 2011 14:12:12 -0500 Subject: Remove some asserts that cause the physics shape display to error out on occasion. --- indra/llprimitive/llmodel.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp index 03b893de29..5af1122451 100755 --- a/indra/llprimitive/llmodel.cpp +++ b/indra/llprimitive/llmodel.cpp @@ -2067,7 +2067,7 @@ void LLModel::Decomposition::fromLLSD(LLSD& decomp) std::set<U64> valid; //must have at least 4 points - llassert(count > 3); + //llassert(count > 3); for (U32 j = 0; j < count; ++j) { @@ -2085,7 +2085,7 @@ void LLModel::Decomposition::fromLLSD(LLSD& decomp) } //each hull must contain at least 4 unique points - llassert(valid.size() > 3); + //llassert(valid.size() > 3); } } -- cgit v1.2.3 From f9f84794726ad9a62d1f9750226cab964199fff2 Mon Sep 17 00:00:00 2001 From: Xiaohong Bao <bao@lindenlab.com> Date: Fri, 15 Apr 2011 14:25:32 -0600 Subject: update collada lib for linux to 226716 --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 4e36c1e4d6..ea6e1cf655 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -246,9 +246,9 @@ <key>archive</key> <map> <key>hash</key> - <string>fb9765a9774b80e57f841dfad3438b1e</string> + <string>d05be8fc196e9ce7b6636b931cf13dff</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-colladadom/rev/226584/arch/Linux/installer/colladadom-2.2-linux-20110413.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-colladadom/rev/226716/arch/Linux/installer/colladadom-2.2-linux-20110415.tar.bz2</string> </map> <key>name</key> <string>linux</string> -- cgit v1.2.3 From b6ae8b1156923f3c4d96ffdf96dc881ac4e63be0 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" <vir@lindenlab.com> Date: Fri, 15 Apr 2011 17:12:07 -0400 Subject: moved to public llconvexdecomposition builds --- autobuild.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 93e1684481..2c2ac0ce2c 100755 --- a/autobuild.xml +++ b/autobuild.xml @@ -1110,9 +1110,9 @@ <key>archive</key> <map> <key>hash</key> - <string>3057f3978dff2b8e1216a19c2fa56604</string> + <string>bfa0e1ce006302f6d90b712b20e2d96e</string> <key>url</key> - <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-llconvexdecomposition-vir/rev/225838/arch/Darwin/installer/llconvexdecomposition-0.1-darwin-20110406.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llconvexdecomposition/rev/226714/arch/Darwin/installer/llconvexdecomposition-0.1-darwin-20110415.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -1122,9 +1122,9 @@ <key>archive</key> <map> <key>hash</key> - <string>e92c9d621b034b1bf312c60df48fc798</string> + <string>d6207290496f4b464996924b6319932e</string> <key>url</key> - <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-llconvexdecomposition-vir/rev/225838/arch/Linux/installer/llconvexdecomposition-0.1-linux-20110406.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llconvexdecomposition/rev/226714/arch/Linux/installer/llconvexdecomposition-0.1-linux-20110415.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -1134,9 +1134,9 @@ <key>archive</key> <map> <key>hash</key> - <string>1447d72644ad74e74a057483b33dc0d2</string> + <string>9f8579663eeac8ed5cfc6390560f0e24</string> <key>url</key> - <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-llconvexdecomposition-vir/rev/226659/arch/CYGWIN/installer/llconvexdecomposition-0.1-windows-20110414.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llconvexdecomposition/rev/226714/arch/CYGWIN/installer/llconvexdecomposition-0.1-windows-20110415.tar.bz2</string> </map> <key>name</key> <string>windows</string> -- cgit v1.2.3 From 719e3f1483b3d74174e0d9d62cdd569a03555e66 Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Fri, 15 Apr 2011 17:40:26 -0500 Subject: SH-1374 Integrate bokeh depth of field effect from Tofu, but preserve edge detection. --- .../shaders/class1/deferred/postDeferredF.glsl | 118 +++++++++++---------- 1 file changed, 64 insertions(+), 54 deletions(-) diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl index 7a6b40006b..f377685045 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl @@ -36,86 +36,97 @@ float getDepth(vec2 pos_screen) return p.z/p.w; } -void dofSample(inout vec4 diff, inout float w, float fd, float x, float y) +float calc_cof(float depth) +{ + float sc = abs(depth-focal_distance)/-depth*blur_constant; + + sc /= magnification; + + // tan_pixel_angle = pixel_length/-depth; + float pixel_length = tan_pixel_angle*-focal_distance; + + sc = sc/pixel_length; + sc *= 1.414; + + return sc; +} + +void dofSampleNear(inout vec4 diff, inout float w, float cur_sc, vec2 tc) { - vec2 tc = vary_fragcoord.xy+vec2(x,y); float d = getDepth(tc); + float sc = calc_cof(d); + float wg = 1.0; - //if (d < fd) - //{ - // diff += texture2DRect(diffuseRect, tc); - // w = 1.0; - //} - if (d > fd) - { - wg = max(d/fd, 0.1); - } + + vec4 s = texture2DRect(diffuseRect, tc); + // de-weight dull areas to make highlights 'pop' + wg *= s.r+s.g+s.b; + + diff += wg*s; - diff += texture2DRect(diffuseRect, tc+vec2(0.5,0.5))*wg*0.25; - diff += texture2DRect(diffuseRect, tc+vec2(-0.5,0.5))*wg*0.25; - diff += texture2DRect(diffuseRect, tc+vec2(0.5,-0.5))*wg*0.25; - diff += texture2DRect(diffuseRect, tc+vec2(-0.5,-0.5))*wg*0.25; w += wg; } -void dofSampleNear(inout vec4 diff, inout float w, float x, float y) +void dofSample(inout vec4 diff, inout float w, float min_sc, float cur_depth, vec2 tc) { - vec2 tc = vary_fragcoord.xy+vec2(x,y); + float d = getDepth(tc); + + float sc = calc_cof(d); + + if (sc > min_sc //sampled pixel is more "out of focus" than current sample radius + || d < cur_depth) //sampled pixel is further away than current pixel + { + float wg = 1.0; - diff += texture2DRect(diffuseRect, tc); - w += 1.0; + vec4 s = texture2DRect(diffuseRect, tc); + // de-weight dull areas to make highlights 'pop' + wg *= s.r+s.g+s.b; + + diff += wg*s; + + w += wg; + } } + void main() { vec3 norm = texture2DRect(normalMap, vary_fragcoord.xy).xyz; norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm - - + vec2 tc = vary_fragcoord.xy; - float sc = 0.75; + float depth = getDepth(tc); - float depth; - depth = getDepth(tc); - vec4 diff = texture2DRect(diffuseRect, vary_fragcoord.xy); - { //pixel is behind far focal plane + { float w = 1.0; - sc = (abs(depth-focal_distance)/-depth)*blur_constant; - - sc /= magnification; - - // tan_pixel_angle = pixel_length/-depth; - float pixel_length = tan_pixel_angle*-focal_distance; - - sc = sc/pixel_length; - - //diff.r = sc; - - sc = min(abs(sc), 8.0); - - //sc = 4.0; + float sc = calc_cof(depth); + sc = min(abs(sc), 10.0); float fd = depth*0.5f; - while (sc > 0.5) + float PI = 3.14159265358979323846264; + + // sample quite uniformly spaced points within a circle, for a circular 'bokeh' + //if (depth < focal_distance) { - dofSample(diff,w, fd, sc,sc); - dofSample(diff,w, fd, -sc,sc); - dofSample(diff,w, fd, sc,-sc); - dofSample(diff,w, fd, -sc,-sc); - - sc -= 0.5; - float sc2 = sc*1.414; - dofSample(diff,w, fd, 0,sc2); - dofSample(diff,w, fd, 0,-sc2); - dofSample(diff,w, fd, -sc2,0); - dofSample(diff,w, fd, sc2,0); - sc -= 0.5; + while (sc > 0.5) + { + int its = int(max(1.0,(sc*3.7))); + for (int i=0; i<its; ++i) + { + float ang = sc+i*2*PI/its; // sc is added for rotary perturbance + float samp_x = sc*sin(ang); + float samp_y = sc*cos(ang); + // you could test sample coords against an interesting non-circular aperture shape here, if desired. + dofSample(diff, w, sc, depth, vary_fragcoord.xy + vec2(samp_x,samp_y)); + } + sc -= 1.0; + } } diff /= w; @@ -123,5 +134,4 @@ void main() vec4 bloom = texture2D(bloomMap, vary_fragcoord.xy/screen_res); gl_FragColor = diff + bloom; - } -- cgit v1.2.3 From 0398e611f2cf3c4a6cecbee7b36250f7ca4348bf Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Fri, 15 Apr 2011 17:46:34 -0500 Subject: Fix for flycam not overriding focal point properly for DoF effect. --- indra/newview/llviewerwindow.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index bde35ee33d..b946dbbd0f 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -3746,7 +3746,11 @@ LLViewerObject* LLViewerWindow::cursorIntersect(S32 mouse_x, S32 mouse_y, F32 de LLVector3 mouse_world_start = mouse_point_global; LLVector3 mouse_world_end = mouse_point_global + mouse_direction_global * depth; - gDebugRaycastIntersection = mouse_world_end; + if (!LLViewerJoystick::getInstance()->getOverrideCamera()) + { //always set raycast intersection to mouse_world_end unless + //flycam is on (for DoF effect) + gDebugRaycastIntersection = mouse_world_end; + } if (start) { -- cgit v1.2.3 From dab937ef5b18547ecdaf0abb7a0e86ba0fa0ad0e Mon Sep 17 00:00:00 2001 From: brad kittenbrink <brad@lindenlab.com> Date: Fri, 15 Apr 2011 16:45:19 -0700 Subject: FIX: STORM-1141. Win7: 2.6.3 Beta1 crashes on startup if locale differs from English. Force LLTextureCache::purgeAllTextures to get called in addition to normal cache purging. --- indra/newview/llappviewer.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index cfb5853cfd..4985524f00 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -3500,10 +3500,10 @@ bool LLAppViewer::initCache() LLAppViewer::getTextureCache()->setReadOnly(read_only) ; LLVOCache::getInstance()->setReadOnly(read_only); - BOOL texture_cache_mismatch = FALSE ; + bool texture_cache_mismatch = false; if (gSavedSettings.getS32("LocalCacheVersion") != LLAppViewer::getTextureCacheVersion()) { - texture_cache_mismatch = TRUE ; + texture_cache_mismatch = true; if(!read_only) { gSavedSettings.setS32("LocalCacheVersion", LLAppViewer::getTextureCacheVersion()); @@ -3517,7 +3517,9 @@ bool LLAppViewer::initCache() gSavedSettings.getBOOL("PurgeCacheOnNextStartup")) { gSavedSettings.setBOOL("PurgeCacheOnNextStartup", false); - mPurgeCache = true; + mPurgeCache = true; + // STORM-1141 force purgeAllTextures to get called to prevent a crash here. -brad + texture_cache_mismatch = true; } // We have moved the location of the cache directory over time. -- cgit v1.2.3 From 6f6cebbf5dc37b36c9875b2620259541f5f60aca Mon Sep 17 00:00:00 2001 From: Merov Linden <merov@lindenlab.com> Date: Fri, 15 Apr 2011 17:53:16 -0700 Subject: EXP-672, EXP-673 : Fix bug in encoding small textures (16x16 and under) --- .../llimage_libtest/llimage_libtest.cpp | 23 ++++++++++++++++------ indra/llkdu/llimagej2ckdu.cpp | 23 +++++++++------------- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp index 0151016862..60ddf63b21 100644 --- a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp +++ b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp @@ -70,6 +70,9 @@ static const char USAGE[] = "\n" " be used. Blocks must be smaller than precincts. Like precincts, this option adds\n" " PLT, tile markers and uses RPCL.\n" " Only valid for output j2c images. Default is 64.\n" +" -rev, --reversible\n" +" Set the compression to be lossless (reversible in j2c parlance).\n" +" Only valid for output j2c images.\n" " -log, --logmetrics <metric>\n" " Log performance data for <metric>. Results in <metric>.slp\n" " Note: so far, only ImageCompressionTester has been tested.\n" @@ -144,16 +147,20 @@ LLPointer<LLImageRaw> load_image(const std::string &src_filename, int discard_le } // Save a raw image instance into a file -bool save_image(const std::string &dest_filename, LLPointer<LLImageRaw> raw_image, int blocks_size, int precincts_size, bool output_stats) +bool save_image(const std::string &dest_filename, LLPointer<LLImageRaw> raw_image, int blocks_size, int precincts_size, bool reversible, bool output_stats) { LLPointer<LLImageFormatted> image = create_image(dest_filename); // Set the image codestream parameters on output in the case of a j2c image - if ((image->getCodec() == IMG_CODEC_J2C) && ((blocks_size != -1) || (precincts_size != -1))) + if (image->getCodec() == IMG_CODEC_J2C) { // That method doesn't exist (and likely, doesn't make sense) for any other image file format // hence the required cryptic cast. - ((LLImageJ2C*)(image.get()))->initEncode(*raw_image, blocks_size, precincts_size); + if ((blocks_size != -1) || (precincts_size != -1)) + { + ((LLImageJ2C*)(image.get()))->initEncode(*raw_image, blocks_size, precincts_size); + } + ((LLImageJ2C*)(image.get()))->setReversible(reversible); } if (!image->encode(raw_image, 0.0f)) @@ -299,6 +306,7 @@ int main(int argc, char** argv) int discard_level = -1; int precincts_size = -1; int blocks_size = -1; + bool reversible = false; // Init whatever is necessary ll_init_apr(); @@ -415,6 +423,10 @@ int main(int argc, char** argv) // *TODO: make sure blocks_size is a power of 2 } } + else if (!strcmp(argv[arg], "--reversible") || !strcmp(argv[arg], "-rev")) + { + reversible = true; + } else if (!strcmp(argv[arg], "--logmetrics") || !strcmp(argv[arg], "-log")) { // '--logmetrics' needs to be specified with a named test metric argument @@ -474,7 +486,7 @@ int main(int argc, char** argv) std::list<std::string>::iterator out_file = output_filenames.begin(); std::list<std::string>::iterator in_end = input_filenames.end(); std::list<std::string>::iterator out_end = output_filenames.end(); - for (; in_file != in_end; ++in_file) + for (; in_file != in_end; ++in_file, ++out_file) { // Load file LLPointer<LLImageRaw> raw_image = load_image(*in_file, discard_level, region, image_stats); @@ -487,7 +499,7 @@ int main(int argc, char** argv) // Save file if (out_file != out_end) { - if (!save_image(*out_file, raw_image, blocks_size, precincts_size, image_stats)) + if (!save_image(*out_file, raw_image, blocks_size, precincts_size, reversible, image_stats)) { std::cout << "Error: Image " << *out_file << " could not be saved" << std::endl; } @@ -495,7 +507,6 @@ int main(int argc, char** argv) { std::cout << *in_file << " -> " << *out_file << std::endl; } - ++out_file; } } diff --git a/indra/llkdu/llimagej2ckdu.cpp b/indra/llkdu/llimagej2ckdu.cpp index 5b2c045841..ae456a48be 100644 --- a/indra/llkdu/llimagej2ckdu.cpp +++ b/indra/llkdu/llimagej2ckdu.cpp @@ -545,18 +545,10 @@ BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, co // Construct the `kdu_codestream' object and parse all remaining arguments U32 max_output_size = base.getWidth()*base.getHeight()*base.getComponents(); - if (max_output_size < 1000) - { - max_output_size = 1000; - } + max_output_size = (max_output_size < 1000 ? 1000 : max_output_size); U8 *output_buffer = new U8[max_output_size]; - - U32 output_size = max_output_size; // gets modified - LLKDUMemTarget output(output_buffer, output_size, base.getWidth()*base.getHeight()*base.getComponents()); - if (output_size > max_output_size) - { - llerrs << llformat("LLImageJ2C::encode output_size(%d) > max_output_size(%d)", output_size,max_output_size) << llendl; - } + U32 output_size = 0; // Address updated by LLKDUMemTarget to give the final compressed buffer size + LLKDUMemTarget output(output_buffer, output_size, max_output_size); kdu_codestream codestream; codestream.create(&transformed_siz,&output); @@ -583,10 +575,13 @@ BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, co if (reversible) { - // If we're doing reversible (i.e. lossless compression), assumes we're not using quality layers. - // Yes, I know this is incorrect! - // *TODO: Indeed, this is incorrect and unecessary... Try using the regular layer setting... codestream.access_siz()->parse_string("Creversible=yes"); + // *TODO: we should use yuv in reversible mode and one level since those images are small. + // Don't turn this on now though as both create problems on decoding for the moment + //codestream.access_siz()->parse_string("Clevels=1"); + //codestream.access_siz()->parse_string("Cycc=no"); + // If we're doing reversible (i.e. lossless compression), assumes we're not using quality layers. + // *TODO: this is incorrect and unecessary. Try using the regular layer setting. codestream.access_siz()->parse_string("Clayers=1"); num_layer_specs = 1; layer_bytes[0] = 0; -- cgit v1.2.3 From 09594214f5eb7c41f69d2db7b735f05fd59140b1 Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Fri, 15 Apr 2011 18:11:04 -0700 Subject: EXP-679 As a linden executive, I would like to evaluate the success of basic mode against various metrics --- indra/newview/lllogininstance.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp index abcd8588dc..36c5d12897 100644 --- a/indra/newview/lllogininstance.cpp +++ b/indra/newview/lllogininstance.cpp @@ -558,6 +558,18 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia requested_options.append("buddy-list"); requested_options.append("newuser-config"); requested_options.append("ui-config"); + + //send this info to login.cgi for stats gathering + //since viewerstats isn't reliable enough + if (gSavedSettings.getString("SessionSettingsFile").empty()) + { + requested_options.append("advanced-mode"); + } + else + { + requested_options.append("basic-mode"); + } + #endif requested_options.append("max-agent-groups"); requested_options.append("map-server-url"); -- cgit v1.2.3 From 8c797002cf3900114693786b8816daec6e651680 Mon Sep 17 00:00:00 2001 From: Jonathan Yap <none@none> Date: Sat, 16 Apr 2011 09:21:24 -0400 Subject: STORM-1128 GCC fixes: formatting changes, moved compare routine back to top --- indra/newview/llfloaterworldmap.cpp | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index a520a848a4..3e5842e5f0 100755 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -85,6 +85,16 @@ static const F32 MAP_ZOOM_TIME = 0.2f; // Currently (01/26/09), this value allows the whole grid to be visible in a 1024x1024 window. static const S32 MAX_VISIBLE_REGIONS = 512; +// It would be more logical to have this inside the method where it is used but to compile under gcc this +// struct has to be here. +struct SortRegionNames +{ + inline bool operator ()(const std::pair <U64, LLSimInfo*>& _left, const std::pair <U64, LLSimInfo*>& _right) + { + return(LLStringUtil::compareInsensitive(_left.second->getName(),_right.second->getName()) < 0); + } +}; + enum EPanDirection { PAN_UP, @@ -1486,18 +1496,10 @@ void LLFloaterWorldMap::updateSims(bool found_null_sim) S32 num_results = 0; - struct SortRegionNames - { - inline bool operator ()(std::pair <U64, LLSimInfo*>& _left, std::pair <U64, LLSimInfo*>& _right) - { - return(LLStringUtil::compareInsensitive(_left.second->getName(),_right.second->getName()) < 0); - } - }; - - std::vector<std::pair <U64, LLSimInfo*>> sim_info_vec(LLWorldMap::getInstance()->getRegionMap().begin(), LLWorldMap::getInstance()->getRegionMap().end()); + std::vector<std::pair <U64, LLSimInfo*> > sim_info_vec(LLWorldMap::getInstance()->getRegionMap().begin(), LLWorldMap::getInstance()->getRegionMap().end()); std::sort(sim_info_vec.begin(), sim_info_vec.end(), SortRegionNames()); - for (std::vector<std::pair <U64, LLSimInfo*>>::const_iterator it = sim_info_vec.begin(); it != sim_info_vec.end(); ++it) + for (std::vector<std::pair <U64, LLSimInfo*> >::const_iterator it = sim_info_vec.begin(); it != sim_info_vec.end(); ++it) { LLSimInfo* info = it->second; std::string sim_name_lower = info->getName(); -- cgit v1.2.3 From def000ea49cb4bed7894d1534ce80d6753cbefdc Mon Sep 17 00:00:00 2001 From: Jonathan Yap <none@none> Date: Sat, 16 Apr 2011 16:49:47 -0400 Subject: STORM-1128 Made a few code changes suggested in code review comments. --- indra/newview/llfloaterworldmap.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index 3e5842e5f0..2672747605 100755 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -73,6 +73,7 @@ #include "llslider.h" #include "message.h" #include "llwindow.h" // copyTextToClipboard() +#include <algorithm> //--------------------------------------------------------------------------- // Constants @@ -85,11 +86,11 @@ static const F32 MAP_ZOOM_TIME = 0.2f; // Currently (01/26/09), this value allows the whole grid to be visible in a 1024x1024 window. static const S32 MAX_VISIBLE_REGIONS = 512; -// It would be more logical to have this inside the method where it is used but to compile under gcc this +// It would be more logical to have this inside the method where it is used but to compile under gcc this // struct has to be here. struct SortRegionNames { - inline bool operator ()(const std::pair <U64, LLSimInfo*>& _left, const std::pair <U64, LLSimInfo*>& _right) + inline bool operator ()(std::pair <U64, LLSimInfo*> const& _left, std::pair <U64, LLSimInfo*> const& _right) { return(LLStringUtil::compareInsensitive(_left.second->getName(),_right.second->getName()) < 0); } -- cgit v1.2.3 From 27285f112ac50cf698f0c9b212b0884867be52f8 Mon Sep 17 00:00:00 2001 From: Siana Gearz <siana.gearz@googlemail.com> Date: Sun, 17 Apr 2011 08:04:02 -0400 Subject: STORM-1088: fix loading of winmm.dll --- doc/contributions.txt | 1 + indra/media_plugins/winmmshim/forwarding_api.cpp | 173 +++++++++++++++++++++++ indra/media_plugins/winmmshim/forwarding_api.h | 1 + indra/media_plugins/winmmshim/winmm_shim.cpp | 17 ++- 4 files changed, 189 insertions(+), 3 deletions(-) diff --git a/doc/contributions.txt b/doc/contributions.txt index 71c54e8624..c92450acd2 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -703,6 +703,7 @@ Shawn Kaufmat SNOW-240 Siana Gearz STORM-960 + STORM-1088 SignpostMarv Martin VWR-153 VWR-154 diff --git a/indra/media_plugins/winmmshim/forwarding_api.cpp b/indra/media_plugins/winmmshim/forwarding_api.cpp index eff7e20451..495e08942b 100644 --- a/indra/media_plugins/winmmshim/forwarding_api.cpp +++ b/indra/media_plugins/winmmshim/forwarding_api.cpp @@ -389,90 +389,105 @@ void init_function_pointers(HMODULE winmm_handle) extern "C" { LRESULT WINAPI CloseDriver( HDRVR hDriver, LPARAM lParam1, LPARAM lParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"CloseDriver\n"); return CloseDriver_orig( hDriver, lParam1, lParam2); } HDRVR WINAPI OpenDriver( LPCWSTR szDriverName, LPCWSTR szSectionName, LPARAM lParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"OpenDriver\n"); return OpenDriver_orig( szDriverName, szSectionName, lParam2); } LRESULT WINAPI SendDriverMessage( HDRVR hDriver, UINT message, LPARAM lParam1, LPARAM lParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"SendDriverMessage\n"); return SendDriverMessage_orig( hDriver, message, lParam1, lParam2); } HMODULE WINAPI DrvGetModuleHandle( HDRVR hDriver) { + ll_winmm_shim_initialize(); //OutputDebugString(L"DrvGetModuleHandle\n"); return DrvGetModuleHandle_orig( hDriver); } HMODULE WINAPI GetDriverModuleHandle( HDRVR hDriver) { + ll_winmm_shim_initialize(); //OutputDebugString(L"GetDriverModuleHandle\n"); return GetDriverModuleHandle_orig( hDriver); } LRESULT WINAPI DefDriverProc( DWORD_PTR dwDriverIdentifier, HDRVR hdrvr, UINT uMsg, LPARAM lParam1, LPARAM lParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"DefDriverProc\n"); return DefDriverProc_orig( dwDriverIdentifier, hdrvr, uMsg, lParam1, lParam2); } BOOL WINAPI DriverCallback( DWORD dwCallBack, DWORD dwFlags, HDRVR hdrvr, DWORD msg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"DriverCallback\n"); return DriverCallback_orig(dwCallBack, dwFlags, hdrvr, msg, dwUser, dwParam1, dwParam2); } UINT WINAPI mmsystemGetVersion(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmsystemGetVersion\n"); return mmsystemGetVersion_orig(); } BOOL WINAPI sndPlaySoundA( LPCSTR pszSound, UINT fuSound) { + ll_winmm_shim_initialize(); //OutputDebugString(L"sndPlaySoundA\n"); return sndPlaySoundA_orig( pszSound, fuSound); } BOOL WINAPI sndPlaySoundW( LPCWSTR pszSound, UINT fuSound) { + ll_winmm_shim_initialize(); //OutputDebugString(L"sndPlaySoundW\n"); return sndPlaySoundW_orig( pszSound, fuSound); } BOOL WINAPI PlaySoundA( LPCSTR pszSound, HMODULE hmod, DWORD fdwSound) { + ll_winmm_shim_initialize(); //OutputDebugString(L"PlaySoundA\n"); return PlaySoundA_orig( pszSound, hmod, fdwSound); } BOOL WINAPI PlaySoundW( LPCWSTR pszSound, HMODULE hmod, DWORD fdwSound) { + ll_winmm_shim_initialize(); //OutputDebugString(L"PlaySoundW\n"); return PlaySoundW_orig( pszSound, hmod, fdwSound); } UINT WINAPI waveOutGetNumDevs(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetNumDevs\n"); return waveOutGetNumDevs_orig(); } MMRESULT WINAPI waveOutGetDevCapsA( UINT_PTR uDeviceID, LPWAVEOUTCAPSA pwoc, UINT cbwoc) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetDevCapsA\n"); return waveOutGetDevCapsA_orig( uDeviceID, pwoc, cbwoc); } MMRESULT WINAPI waveOutGetDevCapsW( UINT_PTR uDeviceID, LPWAVEOUTCAPSW pwoc, UINT cbwoc) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetDevCapsW\n"); return waveOutGetDevCapsW_orig( uDeviceID, pwoc, cbwoc); } @@ -480,24 +495,28 @@ extern "C" { MMRESULT WINAPI waveOutGetVolume( HWAVEOUT hwo, LPDWORD pdwVolume) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetVolume\n"); return waveOutGetVolume_orig( hwo, pdwVolume); } MMRESULT WINAPI waveOutSetVolume( HWAVEOUT hwo, DWORD dwVolume) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutSetVolume\n"); return waveOutSetVolume_orig( hwo, dwVolume); } MMRESULT WINAPI waveOutGetErrorTextA( MMRESULT mmrError, LPSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetErrorTextA\n"); return waveOutGetErrorTextA_orig( mmrError, pszText, cchText); } MMRESULT WINAPI waveOutGetErrorTextW( MMRESULT mmrError, LPWSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetErrorTextW\n"); return waveOutGetErrorTextW_orig( mmrError, pszText, cchText); } @@ -516,12 +535,14 @@ extern "C" { MMRESULT WINAPI waveOutPrepareHeader( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutPrepareHeader\n"); return waveOutPrepareHeader_orig( hwo, pwh, cbwh); } MMRESULT WINAPI waveOutUnprepareHeader( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutUnprepareHeader\n"); return waveOutUnprepareHeader_orig( hwo, pwh, cbwh); } @@ -535,834 +556,973 @@ extern "C" { MMRESULT WINAPI waveOutPause( HWAVEOUT hwo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutPause\n"); return waveOutPause_orig( hwo); } MMRESULT WINAPI waveOutRestart( HWAVEOUT hwo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutRestart\n"); return waveOutRestart_orig( hwo); } MMRESULT WINAPI waveOutReset( HWAVEOUT hwo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutReset\n"); return waveOutReset_orig( hwo); } MMRESULT WINAPI waveOutBreakLoop( HWAVEOUT hwo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutBreakLoop\n"); return waveOutBreakLoop_orig( hwo); } MMRESULT WINAPI waveOutGetPosition( HWAVEOUT hwo, LPMMTIME pmmt, UINT cbmmt) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetPosition\n"); return waveOutGetPosition_orig( hwo, pmmt, cbmmt); } MMRESULT WINAPI waveOutGetPitch( HWAVEOUT hwo, LPDWORD pdwPitch) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetPitch\n"); return waveOutGetPitch_orig( hwo, pdwPitch); } MMRESULT WINAPI waveOutSetPitch( HWAVEOUT hwo, DWORD dwPitch) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutSetPitch\n"); return waveOutSetPitch_orig( hwo, dwPitch); } MMRESULT WINAPI waveOutGetPlaybackRate( HWAVEOUT hwo, LPDWORD pdwRate) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetPlaybackRate\n"); return waveOutGetPlaybackRate_orig( hwo, pdwRate); } MMRESULT WINAPI waveOutSetPlaybackRate( HWAVEOUT hwo, DWORD dwRate) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutSetPlaybackRate\n"); return waveOutSetPlaybackRate_orig( hwo, dwRate); } MMRESULT WINAPI waveOutGetID( HWAVEOUT hwo, LPUINT puDeviceID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetID\n"); return waveOutGetID_orig( hwo, puDeviceID); } MMRESULT WINAPI waveOutMessage( HWAVEOUT hwo, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutMessage\n"); return waveOutMessage_orig( hwo, uMsg, dw1, dw2); } UINT WINAPI waveInGetNumDevs(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInGetNumDevs\n"); return waveInGetNumDevs_orig(); } MMRESULT WINAPI waveInGetDevCapsA( UINT_PTR uDeviceID, LPWAVEINCAPSA pwic, UINT cbwic) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInGetDevCapsA\n"); return waveInGetDevCapsA_orig( uDeviceID, pwic, cbwic); } MMRESULT WINAPI waveInGetDevCapsW( UINT_PTR uDeviceID, LPWAVEINCAPSW pwic, UINT cbwic) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInGetDevCapsW\n"); return waveInGetDevCapsW_orig( uDeviceID, pwic, cbwic); } MMRESULT WINAPI waveInGetErrorTextA(MMRESULT mmrError, LPSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInGetErrorTextA\n"); return waveInGetErrorTextA_orig(mmrError, pszText, cchText); } MMRESULT WINAPI waveInGetErrorTextW(MMRESULT mmrError, LPWSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInGetErrorTextW\n"); return waveInGetErrorTextW_orig(mmrError, pszText, cchText); } MMRESULT WINAPI waveInOpen( LPHWAVEIN phwi, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInOpen\n"); return waveInOpen_orig(phwi, uDeviceID, pwfx, dwCallback, dwInstance, fdwOpen); } MMRESULT WINAPI waveInClose( HWAVEIN hwi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInClose\n"); return waveInClose_orig( hwi); } MMRESULT WINAPI waveInPrepareHeader( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInPrepareHeader\n"); return waveInPrepareHeader_orig( hwi, pwh, cbwh); } MMRESULT WINAPI waveInUnprepareHeader( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInUnprepareHeader\n"); return waveInUnprepareHeader_orig( hwi, pwh, cbwh); } MMRESULT WINAPI waveInAddBuffer( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInAddBuffer\n"); return waveInAddBuffer_orig( hwi, pwh, cbwh); } MMRESULT WINAPI waveInStart( HWAVEIN hwi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInStart\n"); return waveInStart_orig( hwi); } MMRESULT WINAPI waveInStop( HWAVEIN hwi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInStop\n"); return waveInStop_orig(hwi); } MMRESULT WINAPI waveInReset( HWAVEIN hwi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInReset\n"); return waveInReset_orig(hwi); } MMRESULT WINAPI waveInGetPosition( HWAVEIN hwi, LPMMTIME pmmt, UINT cbmmt) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInGetPosition\n"); return waveInGetPosition_orig( hwi, pmmt, cbmmt); } MMRESULT WINAPI waveInGetID( HWAVEIN hwi, LPUINT puDeviceID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInGetID\n"); return waveInGetID_orig( hwi, puDeviceID); } MMRESULT WINAPI waveInMessage( HWAVEIN hwi, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInMessage\n"); return waveInMessage_orig( hwi, uMsg, dw1, dw2); } UINT WINAPI midiOutGetNumDevs(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutGetNumDevs\n"); return midiOutGetNumDevs_orig(); } MMRESULT WINAPI midiStreamOpen( LPHMIDISTRM phms, LPUINT puDeviceID, DWORD cMidi, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamOpen\n"); return midiStreamOpen_orig( phms, puDeviceID, cMidi, dwCallback, dwInstance, fdwOpen); } MMRESULT WINAPI midiStreamClose( HMIDISTRM hms) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamClose\n"); return midiStreamClose_orig( hms); } MMRESULT WINAPI midiStreamProperty( HMIDISTRM hms, LPBYTE lppropdata, DWORD dwProperty) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamProperty\n"); return midiStreamProperty_orig( hms, lppropdata, dwProperty); } MMRESULT WINAPI midiStreamPosition( HMIDISTRM hms, LPMMTIME lpmmt, UINT cbmmt) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamPosition\n"); return midiStreamPosition_orig( hms, lpmmt, cbmmt); } MMRESULT WINAPI midiStreamOut( HMIDISTRM hms, LPMIDIHDR pmh, UINT cbmh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamOut\n"); return midiStreamOut_orig( hms, pmh, cbmh); } MMRESULT WINAPI midiStreamPause( HMIDISTRM hms) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamPause\n"); return midiStreamPause_orig( hms); } MMRESULT WINAPI midiStreamRestart( HMIDISTRM hms) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamRestart\n"); return midiStreamRestart_orig( hms); } MMRESULT WINAPI midiStreamStop( HMIDISTRM hms) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamStop\n"); return midiStreamStop_orig( hms); } MMRESULT WINAPI midiConnect( HMIDI hmi, HMIDIOUT hmo, LPVOID pReserved) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiConnect\n"); return midiConnect_orig( hmi, hmo, pReserved); } MMRESULT WINAPI midiDisconnect( HMIDI hmi, HMIDIOUT hmo, LPVOID pReserved) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiDisconnect\n"); return midiDisconnect_orig( hmi, hmo, pReserved); } MMRESULT WINAPI midiOutGetDevCapsA( UINT_PTR uDeviceID, LPMIDIOUTCAPSA pmoc, UINT cbmoc) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutGetDevCapsA\n"); return midiOutGetDevCapsA_orig( uDeviceID, pmoc, cbmoc); } MMRESULT WINAPI midiOutGetDevCapsW( UINT_PTR uDeviceID, LPMIDIOUTCAPSW pmoc, UINT cbmoc) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutGetDevCapsW\n"); return midiOutGetDevCapsW_orig( uDeviceID, pmoc, cbmoc); } MMRESULT WINAPI midiOutGetVolume( HMIDIOUT hmo, LPDWORD pdwVolume) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutGetVolume\n"); return midiOutGetVolume_orig( hmo, pdwVolume); } MMRESULT WINAPI midiOutSetVolume( HMIDIOUT hmo, DWORD dwVolume) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutSetVolume\n"); return midiOutSetVolume_orig( hmo, dwVolume); } MMRESULT WINAPI midiOutGetErrorTextA( MMRESULT mmrError, LPSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutGetErrorTextA\n"); return midiOutGetErrorTextA_orig( mmrError, pszText, cchText); } MMRESULT WINAPI midiOutGetErrorTextW( MMRESULT mmrError, LPWSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutGetErrorTextW\n"); return midiOutGetErrorTextW_orig( mmrError, pszText, cchText); } MMRESULT WINAPI midiOutOpen( LPHMIDIOUT phmo, UINT uDeviceID, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutOpen\n"); return midiOutOpen_orig(phmo, uDeviceID, dwCallback, dwInstance, fdwOpen); } MMRESULT WINAPI midiOutClose( HMIDIOUT hmo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutClose\n"); return midiOutClose_orig( hmo); } MMRESULT WINAPI midiOutPrepareHeader( HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutPrepareHeader\n"); return midiOutPrepareHeader_orig( hmo, pmh, cbmh); } MMRESULT WINAPI midiOutUnprepareHeader(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutUnprepareHeader\n"); return midiOutUnprepareHeader_orig(hmo, pmh, cbmh); } MMRESULT WINAPI midiOutShortMsg( HMIDIOUT hmo, DWORD dwMsg) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutShortMsg\n"); return midiOutShortMsg_orig( hmo, dwMsg); } MMRESULT WINAPI midiOutLongMsg(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutLongMsg\n"); return midiOutLongMsg_orig(hmo, pmh, cbmh); } MMRESULT WINAPI midiOutReset( HMIDIOUT hmo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutReset\n"); return midiOutReset_orig( hmo); } MMRESULT WINAPI midiOutCachePatches( HMIDIOUT hmo, UINT uBank, LPWORD pwpa, UINT fuCache) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutCachePatches\n"); return midiOutCachePatches_orig( hmo, uBank, pwpa, fuCache); } MMRESULT WINAPI midiOutCacheDrumPatches( HMIDIOUT hmo, UINT uPatch, LPWORD pwkya, UINT fuCache) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutCacheDrumPatches\n"); return midiOutCacheDrumPatches_orig( hmo, uPatch, pwkya, fuCache); } MMRESULT WINAPI midiOutGetID( HMIDIOUT hmo, LPUINT puDeviceID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutGetID\n"); return midiOutGetID_orig( hmo, puDeviceID); } MMRESULT WINAPI midiOutMessage( HMIDIOUT hmo, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutMessage\n"); return midiOutMessage_orig( hmo, uMsg, dw1, dw2); } UINT WINAPI midiInGetNumDevs(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInGetNumDevs\n"); return midiInGetNumDevs_orig(); } MMRESULT WINAPI midiInGetDevCapsA( UINT_PTR uDeviceID, LPMIDIINCAPSA pmic, UINT cbmic) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInGetDevCapsA\n"); return midiInGetDevCapsA_orig( uDeviceID, pmic, cbmic); } MMRESULT WINAPI midiInGetDevCapsW( UINT_PTR uDeviceID, LPMIDIINCAPSW pmic, UINT cbmic) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInGetDevCapsW\n"); return midiInGetDevCapsW_orig( uDeviceID, pmic, cbmic); } MMRESULT WINAPI midiInGetErrorTextA( MMRESULT mmrError, LPSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInGetErrorTextA\n"); return midiInGetErrorTextA_orig( mmrError, pszText, cchText); } MMRESULT WINAPI midiInGetErrorTextW( MMRESULT mmrError, LPWSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInGetErrorTextW\n"); return midiInGetErrorTextW_orig( mmrError, pszText, cchText); } MMRESULT WINAPI midiInOpen( LPHMIDIIN phmi, UINT uDeviceID, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInOpen\n"); return midiInOpen_orig(phmi, uDeviceID, dwCallback, dwInstance, fdwOpen); } MMRESULT WINAPI midiInClose( HMIDIIN hmi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInClose\n"); return midiInClose_orig( hmi); } MMRESULT WINAPI midiInPrepareHeader( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInPrepareHeader\n"); return midiInPrepareHeader_orig( hmi, pmh, cbmh); } MMRESULT WINAPI midiInUnprepareHeader( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInUnprepareHeader\n"); return midiInUnprepareHeader_orig( hmi, pmh, cbmh); } MMRESULT WINAPI midiInAddBuffer( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInAddBuffer\n"); return midiInAddBuffer_orig( hmi, pmh, cbmh); } MMRESULT WINAPI midiInStart( HMIDIIN hmi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInStart\n"); return midiInStart_orig( hmi); } MMRESULT WINAPI midiInStop( HMIDIIN hmi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInStop\n"); return midiInStop_orig(hmi); } MMRESULT WINAPI midiInReset( HMIDIIN hmi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInReset\n"); return midiInReset_orig( hmi); } MMRESULT WINAPI midiInGetID( HMIDIIN hmi, LPUINT puDeviceID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInGetID\n"); return midiInGetID_orig( hmi, puDeviceID); } MMRESULT WINAPI midiInMessage( HMIDIIN hmi, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInMessage\n"); return midiInMessage_orig( hmi, uMsg, dw1, dw2); } UINT WINAPI auxGetNumDevs(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"auxGetNumDevs\n"); return auxGetNumDevs_orig(); } MMRESULT WINAPI auxGetDevCapsA( UINT_PTR uDeviceID, LPAUXCAPSA pac, UINT cbac) { + ll_winmm_shim_initialize(); //OutputDebugString(L"auxGetDevCapsA\n"); return auxGetDevCapsA_orig( uDeviceID, pac, cbac); } MMRESULT WINAPI auxGetDevCapsW( UINT_PTR uDeviceID, LPAUXCAPSW pac, UINT cbac) { + ll_winmm_shim_initialize(); //OutputDebugString(L"auxGetDevCapsW\n"); return auxGetDevCapsW_orig( uDeviceID, pac, cbac); } MMRESULT WINAPI auxSetVolume( UINT uDeviceID, DWORD dwVolume) { + ll_winmm_shim_initialize(); //OutputDebugString(L"auxSetVolume\n"); return auxSetVolume_orig( uDeviceID, dwVolume); } MMRESULT WINAPI auxGetVolume( UINT uDeviceID, LPDWORD pdwVolume) { + ll_winmm_shim_initialize(); //OutputDebugString(L"auxGetVolume\n"); return auxGetVolume_orig( uDeviceID, pdwVolume); } MMRESULT WINAPI auxOutMessage( UINT uDeviceID, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"auxOutMessage\n"); return auxOutMessage_orig( uDeviceID, uMsg, dw1, dw2); } UINT WINAPI mixerGetNumDevs(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetNumDevs\n"); return mixerGetNumDevs_orig(); } MMRESULT WINAPI mixerGetDevCapsA( UINT_PTR uMxId, LPMIXERCAPSA pmxcaps, UINT cbmxcaps) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetDevCapsA\n"); return mixerGetDevCapsA_orig( uMxId, pmxcaps, cbmxcaps); } MMRESULT WINAPI mixerGetDevCapsW( UINT_PTR uMxId, LPMIXERCAPSW pmxcaps, UINT cbmxcaps) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetDevCapsW\n"); return mixerGetDevCapsW_orig( uMxId, pmxcaps, cbmxcaps); } MMRESULT WINAPI mixerOpen( LPHMIXER phmx, UINT uMxId, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerOpen\n"); return mixerOpen_orig( phmx, uMxId, dwCallback, dwInstance, fdwOpen); } MMRESULT WINAPI mixerClose( HMIXER hmx) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerClose\n"); return mixerClose_orig( hmx); } DWORD WINAPI mixerMessage( HMIXER hmx, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerMessage\n"); return mixerMessage_orig( hmx, uMsg, dwParam1, dwParam2); } MMRESULT WINAPI mixerGetLineInfoA( HMIXEROBJ hmxobj, LPMIXERLINEA pmxl, DWORD fdwInfo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetLineInfoA\n"); return mixerGetLineInfoA_orig( hmxobj, pmxl, fdwInfo); } MMRESULT WINAPI mixerGetLineInfoW( HMIXEROBJ hmxobj, LPMIXERLINEW pmxl, DWORD fdwInfo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetLineInfoW\n"); return mixerGetLineInfoW_orig( hmxobj, pmxl, fdwInfo); } MMRESULT WINAPI mixerGetID( HMIXEROBJ hmxobj, UINT FAR *puMxId, DWORD fdwId) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetID\n"); return mixerGetID_orig( hmxobj, puMxId, fdwId); } MMRESULT WINAPI mixerGetLineControlsA( HMIXEROBJ hmxobj, LPMIXERLINECONTROLSA pmxlc, DWORD fdwControls) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetLineControlsA\n"); return mixerGetLineControlsA_orig( hmxobj, pmxlc, fdwControls); } MMRESULT WINAPI mixerGetLineControlsW( HMIXEROBJ hmxobj, LPMIXERLINECONTROLSW pmxlc, DWORD fdwControls) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetLineControlsW\n"); return mixerGetLineControlsW_orig( hmxobj, pmxlc, fdwControls); } MMRESULT WINAPI mixerGetControlDetailsA( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetControlDetailsA\n"); return mixerGetControlDetailsA_orig( hmxobj, pmxcd, fdwDetails); } MMRESULT WINAPI mixerGetControlDetailsW( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetControlDetailsW\n"); return mixerGetControlDetailsW_orig( hmxobj, pmxcd, fdwDetails); } MMRESULT WINAPI mixerSetControlDetails( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerSetControlDetails\n"); return mixerSetControlDetails_orig( hmxobj, pmxcd, fdwDetails); } DWORD WINAPI mmGetCurrentTask(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmGetCurrentTask\n"); return mmGetCurrentTask_orig(); } void WINAPI mmTaskBlock(DWORD val) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmTaskBlock\n"); return mmTaskBlock_orig(val); } UINT WINAPI mmTaskCreate(LPTASKCALLBACK a, HANDLE* b, DWORD_PTR c) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmTaskCreate\n"); return mmTaskCreate_orig(a, b, c); } BOOL WINAPI mmTaskSignal(DWORD a) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmTaskSignal\n"); return mmTaskSignal_orig(a); } VOID WINAPI mmTaskYield() { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmTaskYield\n"); mmTaskYield_orig(); } MMRESULT WINAPI timeGetSystemTime( LPMMTIME pmmt, UINT cbmmt) { + ll_winmm_shim_initialize(); //OutputDebugString(L"timeGetSystemTime\n"); return timeGetSystemTime_orig( pmmt, cbmmt); } DWORD WINAPI timeGetTime(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"timeGetTime\n"); return timeGetTime_orig(); } MMRESULT WINAPI timeSetEvent( UINT uDelay, UINT uResolution, LPTIMECALLBACK fptc, DWORD_PTR dwUser, UINT fuEvent) { + ll_winmm_shim_initialize(); //OutputDebugString(L"timeSetEvent\n"); return timeSetEvent_orig(uDelay, uResolution, fptc, dwUser, fuEvent); } MMRESULT WINAPI timeKillEvent( UINT uTimerID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"timeKillEvent\n"); return timeKillEvent_orig( uTimerID); } MMRESULT WINAPI timeGetDevCaps( LPTIMECAPS ptc, UINT cbtc) { + ll_winmm_shim_initialize(); //OutputDebugString(L"timeGetDevCaps\n"); return timeGetDevCaps_orig( ptc, cbtc); } MMRESULT WINAPI timeBeginPeriod( UINT uPeriod) { + ll_winmm_shim_initialize(); //OutputDebugString(L"timeBeginPeriod\n"); return timeBeginPeriod_orig( uPeriod); } MMRESULT WINAPI timeEndPeriod( UINT uPeriod) { + ll_winmm_shim_initialize(); //OutputDebugString(L"timeEndPeriod\n"); return timeEndPeriod_orig( uPeriod); } UINT WINAPI joyGetNumDevs(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyGetNumDevs\n"); return joyGetNumDevs_orig(); } MMRESULT WINAPI joyConfigChanged(DWORD dwFlags) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyConfigChanged\n"); return joyConfigChanged_orig(dwFlags); } MMRESULT WINAPI joyGetDevCapsA( UINT_PTR uJoyID, LPJOYCAPSA pjc, UINT cbjc) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyGetDevCapsA\n"); return joyGetDevCapsA_orig( uJoyID, pjc, cbjc); } MMRESULT WINAPI joyGetDevCapsW( UINT_PTR uJoyID, LPJOYCAPSW pjc, UINT cbjc) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyGetDevCapsW\n"); return joyGetDevCapsW_orig( uJoyID, pjc, cbjc); } MMRESULT WINAPI joyGetPos( UINT uJoyID, LPJOYINFO pji) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyGetPos\n"); return joyGetPos_orig( uJoyID, pji); } MMRESULT WINAPI joyGetPosEx( UINT uJoyID, LPJOYINFOEX pji) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyGetPosEx\n"); return joyGetPosEx_orig( uJoyID, pji); } MMRESULT WINAPI joyGetThreshold( UINT uJoyID, LPUINT puThreshold) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyGetThreshold\n"); return joyGetThreshold_orig( uJoyID, puThreshold); } MMRESULT WINAPI joyReleaseCapture( UINT uJoyID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyReleaseCapture\n"); return joyReleaseCapture_orig( uJoyID); } MMRESULT WINAPI joySetCapture( HWND hwnd, UINT uJoyID, UINT uPeriod, BOOL fChanged) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joySetCapture\n"); return joySetCapture_orig(hwnd, uJoyID, uPeriod, fChanged); } MMRESULT WINAPI joySetThreshold( UINT uJoyID, UINT uThreshold) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joySetThreshold\n"); return joySetThreshold_orig( uJoyID, uThreshold); } BOOL WINAPI mciDriverNotify(HWND hwndCallback, UINT uDeviceID, UINT uStatus) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciDriverNotify\n"); return mciDriverNotify_orig(hwndCallback, uDeviceID, uStatus); } UINT WINAPI mciDriverYield(UINT uDeviceID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciDriverYield\n"); return mciDriverYield_orig(uDeviceID); } FOURCC WINAPI mmioStringToFOURCCA( LPCSTR sz, UINT uFlags) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioStringToFOURCCA\n"); return mmioStringToFOURCCA_orig( sz, uFlags); } FOURCC WINAPI mmioStringToFOURCCW( LPCWSTR sz, UINT uFlags) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioStringToFOURCCW\n"); return mmioStringToFOURCCW_orig( sz, uFlags); } LPMMIOPROC WINAPI mmioInstallIOProcA( FOURCC fccIOProc, LPMMIOPROC pIOProc, DWORD dwFlags) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioInstallIOProcA\n"); return mmioInstallIOProcA_orig( fccIOProc, pIOProc, dwFlags); } LPMMIOPROC WINAPI mmioInstallIOProcW( FOURCC fccIOProc, LPMMIOPROC pIOProc, DWORD dwFlags) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioInstallIOProcW\n"); return mmioInstallIOProcW_orig( fccIOProc, pIOProc, dwFlags); } HMMIO WINAPI mmioOpenA( LPSTR pszFileName, LPMMIOINFO pmmioinfo, DWORD fdwOpen) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioOpenA\n"); return mmioOpenA_orig( pszFileName, pmmioinfo, fdwOpen); } HMMIO WINAPI mmioOpenW( LPWSTR pszFileName, LPMMIOINFO pmmioinfo, DWORD fdwOpen) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioOpenW\n"); return mmioOpenW_orig( pszFileName, pmmioinfo, fdwOpen); } MMRESULT WINAPI mmioRenameA( LPCSTR pszFileName, LPCSTR pszNewFileName, LPCMMIOINFO pmmioinfo, DWORD fdwRename) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioRenameA\n"); return mmioRenameA_orig( pszFileName, pszNewFileName, pmmioinfo, fdwRename); } MMRESULT WINAPI mmioRenameW( LPCWSTR pszFileName, LPCWSTR pszNewFileName, LPCMMIOINFO pmmioinfo, DWORD fdwRename) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioRenameW\n"); return mmioRenameW_orig( pszFileName, pszNewFileName, pmmioinfo, fdwRename); } MMRESULT WINAPI mmioClose( HMMIO hmmio, UINT fuClose) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioClose\n"); return mmioClose_orig( hmmio, fuClose); } LONG WINAPI mmioRead( HMMIO hmmio, HPSTR pch, LONG cch) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioRead\n"); return mmioRead_orig( hmmio, pch, cch); } LONG WINAPI mmioWrite( HMMIO hmmio, const char _huge* pch, LONG cch) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioWrite\n"); return mmioWrite_orig( hmmio, pch, cch); } LONG WINAPI mmioSeek( HMMIO hmmio, LONG lOffset, int iOrigin) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioSeek\n"); return mmioSeek_orig(hmmio, lOffset, iOrigin); } MMRESULT WINAPI mmioGetInfo( HMMIO hmmio, LPMMIOINFO pmmioinfo, UINT fuInfo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioGetInfo\n"); return mmioGetInfo_orig( hmmio, pmmioinfo, fuInfo); } MMRESULT WINAPI mmioSetInfo( HMMIO hmmio, LPCMMIOINFO pmmioinfo, UINT fuInfo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioSetInfo\n"); return mmioSetInfo_orig( hmmio, pmmioinfo, fuInfo); } MMRESULT WINAPI mmioSetBuffer( HMMIO hmmio, LPSTR pchBuffer, LONG cchBuffer, UINT fuBuffer) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioSetBuffer\n"); return mmioSetBuffer_orig(hmmio, pchBuffer, cchBuffer, fuBuffer); } MMRESULT WINAPI mmioFlush( HMMIO hmmio, UINT fuFlush) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioFlush\n"); return mmioFlush_orig( hmmio, fuFlush); } MMRESULT WINAPI mmioAdvance( HMMIO hmmio, LPMMIOINFO pmmioinfo, UINT fuAdvance) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioAdvance\n"); return mmioAdvance_orig( hmmio, pmmioinfo, fuAdvance); } LRESULT WINAPI mmioSendMessage( HMMIO hmmio, UINT uMsg, LPARAM lParam1, LPARAM lParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioSendMessage\n"); return mmioSendMessage_orig(hmmio, uMsg, lParam1, lParam2); } MMRESULT WINAPI mmioDescend( HMMIO hmmio, LPMMCKINFO pmmcki, const MMCKINFO FAR* pmmckiParent, UINT fuDescend) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioDescend\n"); return mmioDescend_orig(hmmio, pmmcki, pmmckiParent, fuDescend); } MMRESULT WINAPI mmioAscend( HMMIO hmmio, LPMMCKINFO pmmcki, UINT fuAscend) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioAscend\n"); return mmioAscend_orig( hmmio, pmmcki, fuAscend); } MMRESULT WINAPI mmioCreateChunk(HMMIO hmmio, LPMMCKINFO pmmcki, UINT fuCreate) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioCreateChunk\n"); return mmioCreateChunk_orig(hmmio, pmmcki, fuCreate); } MCIERROR WINAPI mciSendCommandA( MCIDEVICEID mciId, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciSendCommandA\n"); return mciSendCommandA_orig( mciId, uMsg, dwParam1, dwParam2); } MCIERROR WINAPI mciSendCommandW( MCIDEVICEID mciId, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciSendCommandW\n"); return mciSendCommandW_orig( mciId, uMsg, dwParam1, dwParam2); } MCIERROR WINAPI mciSendStringA( LPCSTR lpstrCommand, LPSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciSendStringA\n"); return mciSendStringA_orig( lpstrCommand, lpstrReturnString, uReturnLength, hwndCallback); } MCIERROR WINAPI mciSendStringW( LPCWSTR lpstrCommand, LPWSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciSendStringW\n"); return mciSendStringW_orig( lpstrCommand, lpstrReturnString, uReturnLength, hwndCallback); } @@ -1375,72 +1535,84 @@ extern "C" { MCIDEVICEID WINAPI mciGetDeviceIDW( LPCWSTR pszDevice) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetDeviceIDW\n"); return mciGetDeviceIDW_orig( pszDevice); } MCIDEVICEID WINAPI mciGetDeviceIDFromElementIDA( DWORD dwElementID, LPCSTR lpstrType ) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetDeviceIDFromElementIDA\n"); return mciGetDeviceIDFromElementIDA_orig( dwElementID, lpstrType ); } MCIDEVICEID WINAPI mciGetDeviceIDFromElementIDW( DWORD dwElementID, LPCWSTR lpstrType ) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetDeviceIDFromElementIDW\n"); return mciGetDeviceIDFromElementIDW_orig( dwElementID, lpstrType ); } DWORD_PTR WINAPI mciGetDriverData(UINT uDeviceID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetDriverData\n"); return mciGetDriverData_orig(uDeviceID); } BOOL WINAPI mciGetErrorStringA( MCIERROR mcierr, LPSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetErrorStringA\n"); return mciGetErrorStringA_orig( mcierr, pszText, cchText); } BOOL WINAPI mciGetErrorStringW( MCIERROR mcierr, LPWSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetErrorStringW\n"); return mciGetErrorStringW_orig( mcierr, pszText, cchText); } BOOL WINAPI mciSetDriverData(UINT uDeviceID, DWORD_PTR dwData) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciSetDriverData_type\n"); return mciSetDriverData_orig( uDeviceID, dwData ); } BOOL WINAPI mciSetYieldProc( MCIDEVICEID mciId, YIELDPROC fpYieldProc, DWORD dwYieldData) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciSetYieldProc\n"); return mciSetYieldProc_orig(mciId, fpYieldProc, dwYieldData); } BOOL WINAPI mciFreeCommandResource(UINT uTable) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciFreeCommandResource\n"); return mciFreeCommandResource_orig(uTable); } HTASK WINAPI mciGetCreatorTask( MCIDEVICEID mciId) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetCreatorTask\n"); return mciGetCreatorTask_orig( mciId); } YIELDPROC WINAPI mciGetYieldProc( MCIDEVICEID mciId, LPDWORD pdwYieldData) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetYieldProc\n"); return mciGetYieldProc_orig( mciId, pdwYieldData); } UINT WINAPI mciLoadCommandResource(HINSTANCE hInstance, LPCWSTR lpResName, UINT uType) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciLoadCommandResource"); return mciLoadCommandResource_orig(hInstance, lpResName, uType); } @@ -1448,6 +1620,7 @@ extern "C" { BOOL WINAPI mciExecute(LPCSTR pszCommand) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciExecute\n"); return mciExecute_orig(pszCommand); } diff --git a/indra/media_plugins/winmmshim/forwarding_api.h b/indra/media_plugins/winmmshim/forwarding_api.h index 89a6b347f3..076a08f769 100644 --- a/indra/media_plugins/winmmshim/forwarding_api.h +++ b/indra/media_plugins/winmmshim/forwarding_api.h @@ -30,6 +30,7 @@ #include <mmsystem.h> void init_function_pointers(HMODULE winmm_handle); +void ll_winmm_shim_initialize(); typedef VOID (*LPTASKCALLBACK)(DWORD_PTR dwInst); diff --git a/indra/media_plugins/winmmshim/winmm_shim.cpp b/indra/media_plugins/winmmshim/winmm_shim.cpp index 9563a3b664..6ba95e565e 100644 --- a/indra/media_plugins/winmmshim/winmm_shim.cpp +++ b/indra/media_plugins/winmmshim/winmm_shim.cpp @@ -32,14 +32,21 @@ using std::wstring; static float sVolumeLevel = 1.f; static bool sMute = false; +static CRITICAL_SECTION sCriticalSection; BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { + InitializeCriticalSectionAndSpinCount(&sCriticalSection, 0x00000400); + return TRUE; +} + +void ll_winmm_shim_initialize(){ static bool initialized = false; // do this only once + EnterCriticalSection(&sCriticalSection); if (!initialized) { // bind to original winmm.dll TCHAR system_path[MAX_PATH]; @@ -54,13 +61,14 @@ BOOL APIENTRY DllMain( HMODULE hModule, { // we have a dll, let's get out pointers! initialized = true; init_function_pointers(winmm_handle); - return true; + ::OutputDebugStringA("WINMM_SHIM.DLL: real winmm.dll initialized successfully\n"); + return; } // failed to initialize real winmm.dll - return false; + ::OutputDebugStringA("WINMM_SHIM.DLL: Failed to initialize real winmm.dll\n"); } - return true; + LeaveCriticalSection(&sCriticalSection); } @@ -79,6 +87,7 @@ extern "C" MMRESULT WINAPI waveOutOpen( LPHWAVEOUT phwo, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) { + ll_winmm_shim_initialize(); if (pwfx->wFormatTag != WAVE_FORMAT_PCM || (pwfx->wBitsPerSample != 8 && pwfx->wBitsPerSample != 16)) { // uncompressed 8 and 16 bit sound are the only types we support @@ -97,6 +106,7 @@ extern "C" MMRESULT WINAPI waveOutClose( HWAVEOUT hwo) { + ll_winmm_shim_initialize(); wave_out_map_t::iterator found_it = sWaveOuts.find(hwo); if (found_it != sWaveOuts.end()) { // forget what we know about this handle @@ -108,6 +118,7 @@ extern "C" MMRESULT WINAPI waveOutWrite( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh) { + ll_winmm_shim_initialize(); MMRESULT result = MMSYSERR_NOERROR; if (sMute) -- cgit v1.2.3 From 26b15973af5f5725e544866a7884bdbe0827c495 Mon Sep 17 00:00:00 2001 From: Siana Gearz <siana.gearz@googlemail.com> Date: Sun, 17 Apr 2011 08:04:02 -0400 Subject: STORM-1088: fix loading of winmm.dll --- doc/contributions.txt | 1 + indra/media_plugins/winmmshim/forwarding_api.cpp | 173 +++++++++++++++++++++++ indra/media_plugins/winmmshim/forwarding_api.h | 1 + indra/media_plugins/winmmshim/winmm_shim.cpp | 17 ++- 4 files changed, 189 insertions(+), 3 deletions(-) diff --git a/doc/contributions.txt b/doc/contributions.txt index 71c54e8624..c92450acd2 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -703,6 +703,7 @@ Shawn Kaufmat SNOW-240 Siana Gearz STORM-960 + STORM-1088 SignpostMarv Martin VWR-153 VWR-154 diff --git a/indra/media_plugins/winmmshim/forwarding_api.cpp b/indra/media_plugins/winmmshim/forwarding_api.cpp index eff7e20451..495e08942b 100644 --- a/indra/media_plugins/winmmshim/forwarding_api.cpp +++ b/indra/media_plugins/winmmshim/forwarding_api.cpp @@ -389,90 +389,105 @@ void init_function_pointers(HMODULE winmm_handle) extern "C" { LRESULT WINAPI CloseDriver( HDRVR hDriver, LPARAM lParam1, LPARAM lParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"CloseDriver\n"); return CloseDriver_orig( hDriver, lParam1, lParam2); } HDRVR WINAPI OpenDriver( LPCWSTR szDriverName, LPCWSTR szSectionName, LPARAM lParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"OpenDriver\n"); return OpenDriver_orig( szDriverName, szSectionName, lParam2); } LRESULT WINAPI SendDriverMessage( HDRVR hDriver, UINT message, LPARAM lParam1, LPARAM lParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"SendDriverMessage\n"); return SendDriverMessage_orig( hDriver, message, lParam1, lParam2); } HMODULE WINAPI DrvGetModuleHandle( HDRVR hDriver) { + ll_winmm_shim_initialize(); //OutputDebugString(L"DrvGetModuleHandle\n"); return DrvGetModuleHandle_orig( hDriver); } HMODULE WINAPI GetDriverModuleHandle( HDRVR hDriver) { + ll_winmm_shim_initialize(); //OutputDebugString(L"GetDriverModuleHandle\n"); return GetDriverModuleHandle_orig( hDriver); } LRESULT WINAPI DefDriverProc( DWORD_PTR dwDriverIdentifier, HDRVR hdrvr, UINT uMsg, LPARAM lParam1, LPARAM lParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"DefDriverProc\n"); return DefDriverProc_orig( dwDriverIdentifier, hdrvr, uMsg, lParam1, lParam2); } BOOL WINAPI DriverCallback( DWORD dwCallBack, DWORD dwFlags, HDRVR hdrvr, DWORD msg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"DriverCallback\n"); return DriverCallback_orig(dwCallBack, dwFlags, hdrvr, msg, dwUser, dwParam1, dwParam2); } UINT WINAPI mmsystemGetVersion(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmsystemGetVersion\n"); return mmsystemGetVersion_orig(); } BOOL WINAPI sndPlaySoundA( LPCSTR pszSound, UINT fuSound) { + ll_winmm_shim_initialize(); //OutputDebugString(L"sndPlaySoundA\n"); return sndPlaySoundA_orig( pszSound, fuSound); } BOOL WINAPI sndPlaySoundW( LPCWSTR pszSound, UINT fuSound) { + ll_winmm_shim_initialize(); //OutputDebugString(L"sndPlaySoundW\n"); return sndPlaySoundW_orig( pszSound, fuSound); } BOOL WINAPI PlaySoundA( LPCSTR pszSound, HMODULE hmod, DWORD fdwSound) { + ll_winmm_shim_initialize(); //OutputDebugString(L"PlaySoundA\n"); return PlaySoundA_orig( pszSound, hmod, fdwSound); } BOOL WINAPI PlaySoundW( LPCWSTR pszSound, HMODULE hmod, DWORD fdwSound) { + ll_winmm_shim_initialize(); //OutputDebugString(L"PlaySoundW\n"); return PlaySoundW_orig( pszSound, hmod, fdwSound); } UINT WINAPI waveOutGetNumDevs(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetNumDevs\n"); return waveOutGetNumDevs_orig(); } MMRESULT WINAPI waveOutGetDevCapsA( UINT_PTR uDeviceID, LPWAVEOUTCAPSA pwoc, UINT cbwoc) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetDevCapsA\n"); return waveOutGetDevCapsA_orig( uDeviceID, pwoc, cbwoc); } MMRESULT WINAPI waveOutGetDevCapsW( UINT_PTR uDeviceID, LPWAVEOUTCAPSW pwoc, UINT cbwoc) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetDevCapsW\n"); return waveOutGetDevCapsW_orig( uDeviceID, pwoc, cbwoc); } @@ -480,24 +495,28 @@ extern "C" { MMRESULT WINAPI waveOutGetVolume( HWAVEOUT hwo, LPDWORD pdwVolume) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetVolume\n"); return waveOutGetVolume_orig( hwo, pdwVolume); } MMRESULT WINAPI waveOutSetVolume( HWAVEOUT hwo, DWORD dwVolume) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutSetVolume\n"); return waveOutSetVolume_orig( hwo, dwVolume); } MMRESULT WINAPI waveOutGetErrorTextA( MMRESULT mmrError, LPSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetErrorTextA\n"); return waveOutGetErrorTextA_orig( mmrError, pszText, cchText); } MMRESULT WINAPI waveOutGetErrorTextW( MMRESULT mmrError, LPWSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetErrorTextW\n"); return waveOutGetErrorTextW_orig( mmrError, pszText, cchText); } @@ -516,12 +535,14 @@ extern "C" { MMRESULT WINAPI waveOutPrepareHeader( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutPrepareHeader\n"); return waveOutPrepareHeader_orig( hwo, pwh, cbwh); } MMRESULT WINAPI waveOutUnprepareHeader( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutUnprepareHeader\n"); return waveOutUnprepareHeader_orig( hwo, pwh, cbwh); } @@ -535,834 +556,973 @@ extern "C" { MMRESULT WINAPI waveOutPause( HWAVEOUT hwo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutPause\n"); return waveOutPause_orig( hwo); } MMRESULT WINAPI waveOutRestart( HWAVEOUT hwo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutRestart\n"); return waveOutRestart_orig( hwo); } MMRESULT WINAPI waveOutReset( HWAVEOUT hwo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutReset\n"); return waveOutReset_orig( hwo); } MMRESULT WINAPI waveOutBreakLoop( HWAVEOUT hwo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutBreakLoop\n"); return waveOutBreakLoop_orig( hwo); } MMRESULT WINAPI waveOutGetPosition( HWAVEOUT hwo, LPMMTIME pmmt, UINT cbmmt) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetPosition\n"); return waveOutGetPosition_orig( hwo, pmmt, cbmmt); } MMRESULT WINAPI waveOutGetPitch( HWAVEOUT hwo, LPDWORD pdwPitch) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetPitch\n"); return waveOutGetPitch_orig( hwo, pdwPitch); } MMRESULT WINAPI waveOutSetPitch( HWAVEOUT hwo, DWORD dwPitch) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutSetPitch\n"); return waveOutSetPitch_orig( hwo, dwPitch); } MMRESULT WINAPI waveOutGetPlaybackRate( HWAVEOUT hwo, LPDWORD pdwRate) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetPlaybackRate\n"); return waveOutGetPlaybackRate_orig( hwo, pdwRate); } MMRESULT WINAPI waveOutSetPlaybackRate( HWAVEOUT hwo, DWORD dwRate) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutSetPlaybackRate\n"); return waveOutSetPlaybackRate_orig( hwo, dwRate); } MMRESULT WINAPI waveOutGetID( HWAVEOUT hwo, LPUINT puDeviceID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetID\n"); return waveOutGetID_orig( hwo, puDeviceID); } MMRESULT WINAPI waveOutMessage( HWAVEOUT hwo, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutMessage\n"); return waveOutMessage_orig( hwo, uMsg, dw1, dw2); } UINT WINAPI waveInGetNumDevs(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInGetNumDevs\n"); return waveInGetNumDevs_orig(); } MMRESULT WINAPI waveInGetDevCapsA( UINT_PTR uDeviceID, LPWAVEINCAPSA pwic, UINT cbwic) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInGetDevCapsA\n"); return waveInGetDevCapsA_orig( uDeviceID, pwic, cbwic); } MMRESULT WINAPI waveInGetDevCapsW( UINT_PTR uDeviceID, LPWAVEINCAPSW pwic, UINT cbwic) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInGetDevCapsW\n"); return waveInGetDevCapsW_orig( uDeviceID, pwic, cbwic); } MMRESULT WINAPI waveInGetErrorTextA(MMRESULT mmrError, LPSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInGetErrorTextA\n"); return waveInGetErrorTextA_orig(mmrError, pszText, cchText); } MMRESULT WINAPI waveInGetErrorTextW(MMRESULT mmrError, LPWSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInGetErrorTextW\n"); return waveInGetErrorTextW_orig(mmrError, pszText, cchText); } MMRESULT WINAPI waveInOpen( LPHWAVEIN phwi, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInOpen\n"); return waveInOpen_orig(phwi, uDeviceID, pwfx, dwCallback, dwInstance, fdwOpen); } MMRESULT WINAPI waveInClose( HWAVEIN hwi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInClose\n"); return waveInClose_orig( hwi); } MMRESULT WINAPI waveInPrepareHeader( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInPrepareHeader\n"); return waveInPrepareHeader_orig( hwi, pwh, cbwh); } MMRESULT WINAPI waveInUnprepareHeader( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInUnprepareHeader\n"); return waveInUnprepareHeader_orig( hwi, pwh, cbwh); } MMRESULT WINAPI waveInAddBuffer( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInAddBuffer\n"); return waveInAddBuffer_orig( hwi, pwh, cbwh); } MMRESULT WINAPI waveInStart( HWAVEIN hwi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInStart\n"); return waveInStart_orig( hwi); } MMRESULT WINAPI waveInStop( HWAVEIN hwi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInStop\n"); return waveInStop_orig(hwi); } MMRESULT WINAPI waveInReset( HWAVEIN hwi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInReset\n"); return waveInReset_orig(hwi); } MMRESULT WINAPI waveInGetPosition( HWAVEIN hwi, LPMMTIME pmmt, UINT cbmmt) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInGetPosition\n"); return waveInGetPosition_orig( hwi, pmmt, cbmmt); } MMRESULT WINAPI waveInGetID( HWAVEIN hwi, LPUINT puDeviceID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInGetID\n"); return waveInGetID_orig( hwi, puDeviceID); } MMRESULT WINAPI waveInMessage( HWAVEIN hwi, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInMessage\n"); return waveInMessage_orig( hwi, uMsg, dw1, dw2); } UINT WINAPI midiOutGetNumDevs(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutGetNumDevs\n"); return midiOutGetNumDevs_orig(); } MMRESULT WINAPI midiStreamOpen( LPHMIDISTRM phms, LPUINT puDeviceID, DWORD cMidi, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamOpen\n"); return midiStreamOpen_orig( phms, puDeviceID, cMidi, dwCallback, dwInstance, fdwOpen); } MMRESULT WINAPI midiStreamClose( HMIDISTRM hms) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamClose\n"); return midiStreamClose_orig( hms); } MMRESULT WINAPI midiStreamProperty( HMIDISTRM hms, LPBYTE lppropdata, DWORD dwProperty) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamProperty\n"); return midiStreamProperty_orig( hms, lppropdata, dwProperty); } MMRESULT WINAPI midiStreamPosition( HMIDISTRM hms, LPMMTIME lpmmt, UINT cbmmt) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamPosition\n"); return midiStreamPosition_orig( hms, lpmmt, cbmmt); } MMRESULT WINAPI midiStreamOut( HMIDISTRM hms, LPMIDIHDR pmh, UINT cbmh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamOut\n"); return midiStreamOut_orig( hms, pmh, cbmh); } MMRESULT WINAPI midiStreamPause( HMIDISTRM hms) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamPause\n"); return midiStreamPause_orig( hms); } MMRESULT WINAPI midiStreamRestart( HMIDISTRM hms) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamRestart\n"); return midiStreamRestart_orig( hms); } MMRESULT WINAPI midiStreamStop( HMIDISTRM hms) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamStop\n"); return midiStreamStop_orig( hms); } MMRESULT WINAPI midiConnect( HMIDI hmi, HMIDIOUT hmo, LPVOID pReserved) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiConnect\n"); return midiConnect_orig( hmi, hmo, pReserved); } MMRESULT WINAPI midiDisconnect( HMIDI hmi, HMIDIOUT hmo, LPVOID pReserved) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiDisconnect\n"); return midiDisconnect_orig( hmi, hmo, pReserved); } MMRESULT WINAPI midiOutGetDevCapsA( UINT_PTR uDeviceID, LPMIDIOUTCAPSA pmoc, UINT cbmoc) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutGetDevCapsA\n"); return midiOutGetDevCapsA_orig( uDeviceID, pmoc, cbmoc); } MMRESULT WINAPI midiOutGetDevCapsW( UINT_PTR uDeviceID, LPMIDIOUTCAPSW pmoc, UINT cbmoc) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutGetDevCapsW\n"); return midiOutGetDevCapsW_orig( uDeviceID, pmoc, cbmoc); } MMRESULT WINAPI midiOutGetVolume( HMIDIOUT hmo, LPDWORD pdwVolume) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutGetVolume\n"); return midiOutGetVolume_orig( hmo, pdwVolume); } MMRESULT WINAPI midiOutSetVolume( HMIDIOUT hmo, DWORD dwVolume) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutSetVolume\n"); return midiOutSetVolume_orig( hmo, dwVolume); } MMRESULT WINAPI midiOutGetErrorTextA( MMRESULT mmrError, LPSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutGetErrorTextA\n"); return midiOutGetErrorTextA_orig( mmrError, pszText, cchText); } MMRESULT WINAPI midiOutGetErrorTextW( MMRESULT mmrError, LPWSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutGetErrorTextW\n"); return midiOutGetErrorTextW_orig( mmrError, pszText, cchText); } MMRESULT WINAPI midiOutOpen( LPHMIDIOUT phmo, UINT uDeviceID, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutOpen\n"); return midiOutOpen_orig(phmo, uDeviceID, dwCallback, dwInstance, fdwOpen); } MMRESULT WINAPI midiOutClose( HMIDIOUT hmo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutClose\n"); return midiOutClose_orig( hmo); } MMRESULT WINAPI midiOutPrepareHeader( HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutPrepareHeader\n"); return midiOutPrepareHeader_orig( hmo, pmh, cbmh); } MMRESULT WINAPI midiOutUnprepareHeader(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutUnprepareHeader\n"); return midiOutUnprepareHeader_orig(hmo, pmh, cbmh); } MMRESULT WINAPI midiOutShortMsg( HMIDIOUT hmo, DWORD dwMsg) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutShortMsg\n"); return midiOutShortMsg_orig( hmo, dwMsg); } MMRESULT WINAPI midiOutLongMsg(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutLongMsg\n"); return midiOutLongMsg_orig(hmo, pmh, cbmh); } MMRESULT WINAPI midiOutReset( HMIDIOUT hmo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutReset\n"); return midiOutReset_orig( hmo); } MMRESULT WINAPI midiOutCachePatches( HMIDIOUT hmo, UINT uBank, LPWORD pwpa, UINT fuCache) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutCachePatches\n"); return midiOutCachePatches_orig( hmo, uBank, pwpa, fuCache); } MMRESULT WINAPI midiOutCacheDrumPatches( HMIDIOUT hmo, UINT uPatch, LPWORD pwkya, UINT fuCache) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutCacheDrumPatches\n"); return midiOutCacheDrumPatches_orig( hmo, uPatch, pwkya, fuCache); } MMRESULT WINAPI midiOutGetID( HMIDIOUT hmo, LPUINT puDeviceID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutGetID\n"); return midiOutGetID_orig( hmo, puDeviceID); } MMRESULT WINAPI midiOutMessage( HMIDIOUT hmo, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutMessage\n"); return midiOutMessage_orig( hmo, uMsg, dw1, dw2); } UINT WINAPI midiInGetNumDevs(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInGetNumDevs\n"); return midiInGetNumDevs_orig(); } MMRESULT WINAPI midiInGetDevCapsA( UINT_PTR uDeviceID, LPMIDIINCAPSA pmic, UINT cbmic) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInGetDevCapsA\n"); return midiInGetDevCapsA_orig( uDeviceID, pmic, cbmic); } MMRESULT WINAPI midiInGetDevCapsW( UINT_PTR uDeviceID, LPMIDIINCAPSW pmic, UINT cbmic) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInGetDevCapsW\n"); return midiInGetDevCapsW_orig( uDeviceID, pmic, cbmic); } MMRESULT WINAPI midiInGetErrorTextA( MMRESULT mmrError, LPSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInGetErrorTextA\n"); return midiInGetErrorTextA_orig( mmrError, pszText, cchText); } MMRESULT WINAPI midiInGetErrorTextW( MMRESULT mmrError, LPWSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInGetErrorTextW\n"); return midiInGetErrorTextW_orig( mmrError, pszText, cchText); } MMRESULT WINAPI midiInOpen( LPHMIDIIN phmi, UINT uDeviceID, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInOpen\n"); return midiInOpen_orig(phmi, uDeviceID, dwCallback, dwInstance, fdwOpen); } MMRESULT WINAPI midiInClose( HMIDIIN hmi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInClose\n"); return midiInClose_orig( hmi); } MMRESULT WINAPI midiInPrepareHeader( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInPrepareHeader\n"); return midiInPrepareHeader_orig( hmi, pmh, cbmh); } MMRESULT WINAPI midiInUnprepareHeader( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInUnprepareHeader\n"); return midiInUnprepareHeader_orig( hmi, pmh, cbmh); } MMRESULT WINAPI midiInAddBuffer( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInAddBuffer\n"); return midiInAddBuffer_orig( hmi, pmh, cbmh); } MMRESULT WINAPI midiInStart( HMIDIIN hmi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInStart\n"); return midiInStart_orig( hmi); } MMRESULT WINAPI midiInStop( HMIDIIN hmi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInStop\n"); return midiInStop_orig(hmi); } MMRESULT WINAPI midiInReset( HMIDIIN hmi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInReset\n"); return midiInReset_orig( hmi); } MMRESULT WINAPI midiInGetID( HMIDIIN hmi, LPUINT puDeviceID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInGetID\n"); return midiInGetID_orig( hmi, puDeviceID); } MMRESULT WINAPI midiInMessage( HMIDIIN hmi, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInMessage\n"); return midiInMessage_orig( hmi, uMsg, dw1, dw2); } UINT WINAPI auxGetNumDevs(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"auxGetNumDevs\n"); return auxGetNumDevs_orig(); } MMRESULT WINAPI auxGetDevCapsA( UINT_PTR uDeviceID, LPAUXCAPSA pac, UINT cbac) { + ll_winmm_shim_initialize(); //OutputDebugString(L"auxGetDevCapsA\n"); return auxGetDevCapsA_orig( uDeviceID, pac, cbac); } MMRESULT WINAPI auxGetDevCapsW( UINT_PTR uDeviceID, LPAUXCAPSW pac, UINT cbac) { + ll_winmm_shim_initialize(); //OutputDebugString(L"auxGetDevCapsW\n"); return auxGetDevCapsW_orig( uDeviceID, pac, cbac); } MMRESULT WINAPI auxSetVolume( UINT uDeviceID, DWORD dwVolume) { + ll_winmm_shim_initialize(); //OutputDebugString(L"auxSetVolume\n"); return auxSetVolume_orig( uDeviceID, dwVolume); } MMRESULT WINAPI auxGetVolume( UINT uDeviceID, LPDWORD pdwVolume) { + ll_winmm_shim_initialize(); //OutputDebugString(L"auxGetVolume\n"); return auxGetVolume_orig( uDeviceID, pdwVolume); } MMRESULT WINAPI auxOutMessage( UINT uDeviceID, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"auxOutMessage\n"); return auxOutMessage_orig( uDeviceID, uMsg, dw1, dw2); } UINT WINAPI mixerGetNumDevs(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetNumDevs\n"); return mixerGetNumDevs_orig(); } MMRESULT WINAPI mixerGetDevCapsA( UINT_PTR uMxId, LPMIXERCAPSA pmxcaps, UINT cbmxcaps) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetDevCapsA\n"); return mixerGetDevCapsA_orig( uMxId, pmxcaps, cbmxcaps); } MMRESULT WINAPI mixerGetDevCapsW( UINT_PTR uMxId, LPMIXERCAPSW pmxcaps, UINT cbmxcaps) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetDevCapsW\n"); return mixerGetDevCapsW_orig( uMxId, pmxcaps, cbmxcaps); } MMRESULT WINAPI mixerOpen( LPHMIXER phmx, UINT uMxId, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerOpen\n"); return mixerOpen_orig( phmx, uMxId, dwCallback, dwInstance, fdwOpen); } MMRESULT WINAPI mixerClose( HMIXER hmx) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerClose\n"); return mixerClose_orig( hmx); } DWORD WINAPI mixerMessage( HMIXER hmx, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerMessage\n"); return mixerMessage_orig( hmx, uMsg, dwParam1, dwParam2); } MMRESULT WINAPI mixerGetLineInfoA( HMIXEROBJ hmxobj, LPMIXERLINEA pmxl, DWORD fdwInfo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetLineInfoA\n"); return mixerGetLineInfoA_orig( hmxobj, pmxl, fdwInfo); } MMRESULT WINAPI mixerGetLineInfoW( HMIXEROBJ hmxobj, LPMIXERLINEW pmxl, DWORD fdwInfo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetLineInfoW\n"); return mixerGetLineInfoW_orig( hmxobj, pmxl, fdwInfo); } MMRESULT WINAPI mixerGetID( HMIXEROBJ hmxobj, UINT FAR *puMxId, DWORD fdwId) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetID\n"); return mixerGetID_orig( hmxobj, puMxId, fdwId); } MMRESULT WINAPI mixerGetLineControlsA( HMIXEROBJ hmxobj, LPMIXERLINECONTROLSA pmxlc, DWORD fdwControls) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetLineControlsA\n"); return mixerGetLineControlsA_orig( hmxobj, pmxlc, fdwControls); } MMRESULT WINAPI mixerGetLineControlsW( HMIXEROBJ hmxobj, LPMIXERLINECONTROLSW pmxlc, DWORD fdwControls) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetLineControlsW\n"); return mixerGetLineControlsW_orig( hmxobj, pmxlc, fdwControls); } MMRESULT WINAPI mixerGetControlDetailsA( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetControlDetailsA\n"); return mixerGetControlDetailsA_orig( hmxobj, pmxcd, fdwDetails); } MMRESULT WINAPI mixerGetControlDetailsW( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetControlDetailsW\n"); return mixerGetControlDetailsW_orig( hmxobj, pmxcd, fdwDetails); } MMRESULT WINAPI mixerSetControlDetails( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerSetControlDetails\n"); return mixerSetControlDetails_orig( hmxobj, pmxcd, fdwDetails); } DWORD WINAPI mmGetCurrentTask(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmGetCurrentTask\n"); return mmGetCurrentTask_orig(); } void WINAPI mmTaskBlock(DWORD val) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmTaskBlock\n"); return mmTaskBlock_orig(val); } UINT WINAPI mmTaskCreate(LPTASKCALLBACK a, HANDLE* b, DWORD_PTR c) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmTaskCreate\n"); return mmTaskCreate_orig(a, b, c); } BOOL WINAPI mmTaskSignal(DWORD a) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmTaskSignal\n"); return mmTaskSignal_orig(a); } VOID WINAPI mmTaskYield() { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmTaskYield\n"); mmTaskYield_orig(); } MMRESULT WINAPI timeGetSystemTime( LPMMTIME pmmt, UINT cbmmt) { + ll_winmm_shim_initialize(); //OutputDebugString(L"timeGetSystemTime\n"); return timeGetSystemTime_orig( pmmt, cbmmt); } DWORD WINAPI timeGetTime(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"timeGetTime\n"); return timeGetTime_orig(); } MMRESULT WINAPI timeSetEvent( UINT uDelay, UINT uResolution, LPTIMECALLBACK fptc, DWORD_PTR dwUser, UINT fuEvent) { + ll_winmm_shim_initialize(); //OutputDebugString(L"timeSetEvent\n"); return timeSetEvent_orig(uDelay, uResolution, fptc, dwUser, fuEvent); } MMRESULT WINAPI timeKillEvent( UINT uTimerID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"timeKillEvent\n"); return timeKillEvent_orig( uTimerID); } MMRESULT WINAPI timeGetDevCaps( LPTIMECAPS ptc, UINT cbtc) { + ll_winmm_shim_initialize(); //OutputDebugString(L"timeGetDevCaps\n"); return timeGetDevCaps_orig( ptc, cbtc); } MMRESULT WINAPI timeBeginPeriod( UINT uPeriod) { + ll_winmm_shim_initialize(); //OutputDebugString(L"timeBeginPeriod\n"); return timeBeginPeriod_orig( uPeriod); } MMRESULT WINAPI timeEndPeriod( UINT uPeriod) { + ll_winmm_shim_initialize(); //OutputDebugString(L"timeEndPeriod\n"); return timeEndPeriod_orig( uPeriod); } UINT WINAPI joyGetNumDevs(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyGetNumDevs\n"); return joyGetNumDevs_orig(); } MMRESULT WINAPI joyConfigChanged(DWORD dwFlags) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyConfigChanged\n"); return joyConfigChanged_orig(dwFlags); } MMRESULT WINAPI joyGetDevCapsA( UINT_PTR uJoyID, LPJOYCAPSA pjc, UINT cbjc) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyGetDevCapsA\n"); return joyGetDevCapsA_orig( uJoyID, pjc, cbjc); } MMRESULT WINAPI joyGetDevCapsW( UINT_PTR uJoyID, LPJOYCAPSW pjc, UINT cbjc) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyGetDevCapsW\n"); return joyGetDevCapsW_orig( uJoyID, pjc, cbjc); } MMRESULT WINAPI joyGetPos( UINT uJoyID, LPJOYINFO pji) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyGetPos\n"); return joyGetPos_orig( uJoyID, pji); } MMRESULT WINAPI joyGetPosEx( UINT uJoyID, LPJOYINFOEX pji) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyGetPosEx\n"); return joyGetPosEx_orig( uJoyID, pji); } MMRESULT WINAPI joyGetThreshold( UINT uJoyID, LPUINT puThreshold) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyGetThreshold\n"); return joyGetThreshold_orig( uJoyID, puThreshold); } MMRESULT WINAPI joyReleaseCapture( UINT uJoyID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyReleaseCapture\n"); return joyReleaseCapture_orig( uJoyID); } MMRESULT WINAPI joySetCapture( HWND hwnd, UINT uJoyID, UINT uPeriod, BOOL fChanged) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joySetCapture\n"); return joySetCapture_orig(hwnd, uJoyID, uPeriod, fChanged); } MMRESULT WINAPI joySetThreshold( UINT uJoyID, UINT uThreshold) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joySetThreshold\n"); return joySetThreshold_orig( uJoyID, uThreshold); } BOOL WINAPI mciDriverNotify(HWND hwndCallback, UINT uDeviceID, UINT uStatus) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciDriverNotify\n"); return mciDriverNotify_orig(hwndCallback, uDeviceID, uStatus); } UINT WINAPI mciDriverYield(UINT uDeviceID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciDriverYield\n"); return mciDriverYield_orig(uDeviceID); } FOURCC WINAPI mmioStringToFOURCCA( LPCSTR sz, UINT uFlags) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioStringToFOURCCA\n"); return mmioStringToFOURCCA_orig( sz, uFlags); } FOURCC WINAPI mmioStringToFOURCCW( LPCWSTR sz, UINT uFlags) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioStringToFOURCCW\n"); return mmioStringToFOURCCW_orig( sz, uFlags); } LPMMIOPROC WINAPI mmioInstallIOProcA( FOURCC fccIOProc, LPMMIOPROC pIOProc, DWORD dwFlags) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioInstallIOProcA\n"); return mmioInstallIOProcA_orig( fccIOProc, pIOProc, dwFlags); } LPMMIOPROC WINAPI mmioInstallIOProcW( FOURCC fccIOProc, LPMMIOPROC pIOProc, DWORD dwFlags) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioInstallIOProcW\n"); return mmioInstallIOProcW_orig( fccIOProc, pIOProc, dwFlags); } HMMIO WINAPI mmioOpenA( LPSTR pszFileName, LPMMIOINFO pmmioinfo, DWORD fdwOpen) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioOpenA\n"); return mmioOpenA_orig( pszFileName, pmmioinfo, fdwOpen); } HMMIO WINAPI mmioOpenW( LPWSTR pszFileName, LPMMIOINFO pmmioinfo, DWORD fdwOpen) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioOpenW\n"); return mmioOpenW_orig( pszFileName, pmmioinfo, fdwOpen); } MMRESULT WINAPI mmioRenameA( LPCSTR pszFileName, LPCSTR pszNewFileName, LPCMMIOINFO pmmioinfo, DWORD fdwRename) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioRenameA\n"); return mmioRenameA_orig( pszFileName, pszNewFileName, pmmioinfo, fdwRename); } MMRESULT WINAPI mmioRenameW( LPCWSTR pszFileName, LPCWSTR pszNewFileName, LPCMMIOINFO pmmioinfo, DWORD fdwRename) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioRenameW\n"); return mmioRenameW_orig( pszFileName, pszNewFileName, pmmioinfo, fdwRename); } MMRESULT WINAPI mmioClose( HMMIO hmmio, UINT fuClose) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioClose\n"); return mmioClose_orig( hmmio, fuClose); } LONG WINAPI mmioRead( HMMIO hmmio, HPSTR pch, LONG cch) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioRead\n"); return mmioRead_orig( hmmio, pch, cch); } LONG WINAPI mmioWrite( HMMIO hmmio, const char _huge* pch, LONG cch) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioWrite\n"); return mmioWrite_orig( hmmio, pch, cch); } LONG WINAPI mmioSeek( HMMIO hmmio, LONG lOffset, int iOrigin) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioSeek\n"); return mmioSeek_orig(hmmio, lOffset, iOrigin); } MMRESULT WINAPI mmioGetInfo( HMMIO hmmio, LPMMIOINFO pmmioinfo, UINT fuInfo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioGetInfo\n"); return mmioGetInfo_orig( hmmio, pmmioinfo, fuInfo); } MMRESULT WINAPI mmioSetInfo( HMMIO hmmio, LPCMMIOINFO pmmioinfo, UINT fuInfo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioSetInfo\n"); return mmioSetInfo_orig( hmmio, pmmioinfo, fuInfo); } MMRESULT WINAPI mmioSetBuffer( HMMIO hmmio, LPSTR pchBuffer, LONG cchBuffer, UINT fuBuffer) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioSetBuffer\n"); return mmioSetBuffer_orig(hmmio, pchBuffer, cchBuffer, fuBuffer); } MMRESULT WINAPI mmioFlush( HMMIO hmmio, UINT fuFlush) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioFlush\n"); return mmioFlush_orig( hmmio, fuFlush); } MMRESULT WINAPI mmioAdvance( HMMIO hmmio, LPMMIOINFO pmmioinfo, UINT fuAdvance) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioAdvance\n"); return mmioAdvance_orig( hmmio, pmmioinfo, fuAdvance); } LRESULT WINAPI mmioSendMessage( HMMIO hmmio, UINT uMsg, LPARAM lParam1, LPARAM lParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioSendMessage\n"); return mmioSendMessage_orig(hmmio, uMsg, lParam1, lParam2); } MMRESULT WINAPI mmioDescend( HMMIO hmmio, LPMMCKINFO pmmcki, const MMCKINFO FAR* pmmckiParent, UINT fuDescend) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioDescend\n"); return mmioDescend_orig(hmmio, pmmcki, pmmckiParent, fuDescend); } MMRESULT WINAPI mmioAscend( HMMIO hmmio, LPMMCKINFO pmmcki, UINT fuAscend) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioAscend\n"); return mmioAscend_orig( hmmio, pmmcki, fuAscend); } MMRESULT WINAPI mmioCreateChunk(HMMIO hmmio, LPMMCKINFO pmmcki, UINT fuCreate) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioCreateChunk\n"); return mmioCreateChunk_orig(hmmio, pmmcki, fuCreate); } MCIERROR WINAPI mciSendCommandA( MCIDEVICEID mciId, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciSendCommandA\n"); return mciSendCommandA_orig( mciId, uMsg, dwParam1, dwParam2); } MCIERROR WINAPI mciSendCommandW( MCIDEVICEID mciId, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciSendCommandW\n"); return mciSendCommandW_orig( mciId, uMsg, dwParam1, dwParam2); } MCIERROR WINAPI mciSendStringA( LPCSTR lpstrCommand, LPSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciSendStringA\n"); return mciSendStringA_orig( lpstrCommand, lpstrReturnString, uReturnLength, hwndCallback); } MCIERROR WINAPI mciSendStringW( LPCWSTR lpstrCommand, LPWSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciSendStringW\n"); return mciSendStringW_orig( lpstrCommand, lpstrReturnString, uReturnLength, hwndCallback); } @@ -1375,72 +1535,84 @@ extern "C" { MCIDEVICEID WINAPI mciGetDeviceIDW( LPCWSTR pszDevice) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetDeviceIDW\n"); return mciGetDeviceIDW_orig( pszDevice); } MCIDEVICEID WINAPI mciGetDeviceIDFromElementIDA( DWORD dwElementID, LPCSTR lpstrType ) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetDeviceIDFromElementIDA\n"); return mciGetDeviceIDFromElementIDA_orig( dwElementID, lpstrType ); } MCIDEVICEID WINAPI mciGetDeviceIDFromElementIDW( DWORD dwElementID, LPCWSTR lpstrType ) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetDeviceIDFromElementIDW\n"); return mciGetDeviceIDFromElementIDW_orig( dwElementID, lpstrType ); } DWORD_PTR WINAPI mciGetDriverData(UINT uDeviceID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetDriverData\n"); return mciGetDriverData_orig(uDeviceID); } BOOL WINAPI mciGetErrorStringA( MCIERROR mcierr, LPSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetErrorStringA\n"); return mciGetErrorStringA_orig( mcierr, pszText, cchText); } BOOL WINAPI mciGetErrorStringW( MCIERROR mcierr, LPWSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetErrorStringW\n"); return mciGetErrorStringW_orig( mcierr, pszText, cchText); } BOOL WINAPI mciSetDriverData(UINT uDeviceID, DWORD_PTR dwData) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciSetDriverData_type\n"); return mciSetDriverData_orig( uDeviceID, dwData ); } BOOL WINAPI mciSetYieldProc( MCIDEVICEID mciId, YIELDPROC fpYieldProc, DWORD dwYieldData) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciSetYieldProc\n"); return mciSetYieldProc_orig(mciId, fpYieldProc, dwYieldData); } BOOL WINAPI mciFreeCommandResource(UINT uTable) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciFreeCommandResource\n"); return mciFreeCommandResource_orig(uTable); } HTASK WINAPI mciGetCreatorTask( MCIDEVICEID mciId) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetCreatorTask\n"); return mciGetCreatorTask_orig( mciId); } YIELDPROC WINAPI mciGetYieldProc( MCIDEVICEID mciId, LPDWORD pdwYieldData) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetYieldProc\n"); return mciGetYieldProc_orig( mciId, pdwYieldData); } UINT WINAPI mciLoadCommandResource(HINSTANCE hInstance, LPCWSTR lpResName, UINT uType) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciLoadCommandResource"); return mciLoadCommandResource_orig(hInstance, lpResName, uType); } @@ -1448,6 +1620,7 @@ extern "C" { BOOL WINAPI mciExecute(LPCSTR pszCommand) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciExecute\n"); return mciExecute_orig(pszCommand); } diff --git a/indra/media_plugins/winmmshim/forwarding_api.h b/indra/media_plugins/winmmshim/forwarding_api.h index 89a6b347f3..076a08f769 100644 --- a/indra/media_plugins/winmmshim/forwarding_api.h +++ b/indra/media_plugins/winmmshim/forwarding_api.h @@ -30,6 +30,7 @@ #include <mmsystem.h> void init_function_pointers(HMODULE winmm_handle); +void ll_winmm_shim_initialize(); typedef VOID (*LPTASKCALLBACK)(DWORD_PTR dwInst); diff --git a/indra/media_plugins/winmmshim/winmm_shim.cpp b/indra/media_plugins/winmmshim/winmm_shim.cpp index 9563a3b664..6ba95e565e 100644 --- a/indra/media_plugins/winmmshim/winmm_shim.cpp +++ b/indra/media_plugins/winmmshim/winmm_shim.cpp @@ -32,14 +32,21 @@ using std::wstring; static float sVolumeLevel = 1.f; static bool sMute = false; +static CRITICAL_SECTION sCriticalSection; BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { + InitializeCriticalSectionAndSpinCount(&sCriticalSection, 0x00000400); + return TRUE; +} + +void ll_winmm_shim_initialize(){ static bool initialized = false; // do this only once + EnterCriticalSection(&sCriticalSection); if (!initialized) { // bind to original winmm.dll TCHAR system_path[MAX_PATH]; @@ -54,13 +61,14 @@ BOOL APIENTRY DllMain( HMODULE hModule, { // we have a dll, let's get out pointers! initialized = true; init_function_pointers(winmm_handle); - return true; + ::OutputDebugStringA("WINMM_SHIM.DLL: real winmm.dll initialized successfully\n"); + return; } // failed to initialize real winmm.dll - return false; + ::OutputDebugStringA("WINMM_SHIM.DLL: Failed to initialize real winmm.dll\n"); } - return true; + LeaveCriticalSection(&sCriticalSection); } @@ -79,6 +87,7 @@ extern "C" MMRESULT WINAPI waveOutOpen( LPHWAVEOUT phwo, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) { + ll_winmm_shim_initialize(); if (pwfx->wFormatTag != WAVE_FORMAT_PCM || (pwfx->wBitsPerSample != 8 && pwfx->wBitsPerSample != 16)) { // uncompressed 8 and 16 bit sound are the only types we support @@ -97,6 +106,7 @@ extern "C" MMRESULT WINAPI waveOutClose( HWAVEOUT hwo) { + ll_winmm_shim_initialize(); wave_out_map_t::iterator found_it = sWaveOuts.find(hwo); if (found_it != sWaveOuts.end()) { // forget what we know about this handle @@ -108,6 +118,7 @@ extern "C" MMRESULT WINAPI waveOutWrite( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh) { + ll_winmm_shim_initialize(); MMRESULT result = MMSYSERR_NOERROR; if (sMute) -- cgit v1.2.3 From 796a94fc6e8162e4e809bb0c0eff97596ef4904d Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Sun, 17 Apr 2011 09:07:01 -0400 Subject: correct build parameters for Oz viewer beta review build --- BuildParams | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/BuildParams b/BuildParams index deaea5e047..7062327f66 100644 --- a/BuildParams +++ b/BuildParams @@ -157,10 +157,11 @@ media.build_viewer_update_version_manager = false oz-viewer-devreview.build_debug_release_separately = true viewer-devreview.build_debug_release_separately = true oz_viewer-poreview.build_debug_release_separately = true -oz-project-1.build_debug_release_separately = true -oz-project-2.build_debug_release_separately = true +oz_project-1.build_debug_release_separately = true +oz_project-2.build_debug_release_separately = true oz-project-3.build_debug_release_separately = true +oz_viewer-beta-review.build_debug_release_separately = true # ======================================== # enus # ======================================== -- cgit v1.2.3 From d1ba34a8ad7031c6e8362c8136366cf24d512d1f Mon Sep 17 00:00:00 2001 From: Siana Gearz <siana.gearz@googlemail.com> Date: Sun, 17 Apr 2011 11:25:00 -0400 Subject: STORM-1088: corrected fix loading of winmm.dll --- indra/media_plugins/winmmshim/winmm_shim.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/indra/media_plugins/winmmshim/winmm_shim.cpp b/indra/media_plugins/winmmshim/winmm_shim.cpp index 6ba95e565e..47a1e5c018 100644 --- a/indra/media_plugins/winmmshim/winmm_shim.cpp +++ b/indra/media_plugins/winmmshim/winmm_shim.cpp @@ -39,7 +39,7 @@ BOOL APIENTRY DllMain( HMODULE hModule, LPVOID lpReserved ) { - InitializeCriticalSectionAndSpinCount(&sCriticalSection, 0x00000400); + InitializeCriticalSection(&sCriticalSection); return TRUE; } @@ -62,11 +62,12 @@ void ll_winmm_shim_initialize(){ initialized = true; init_function_pointers(winmm_handle); ::OutputDebugStringA("WINMM_SHIM.DLL: real winmm.dll initialized successfully\n"); - return; } - - // failed to initialize real winmm.dll - ::OutputDebugStringA("WINMM_SHIM.DLL: Failed to initialize real winmm.dll\n"); + else + { + // failed to initialize real winmm.dll + ::OutputDebugStringA("WINMM_SHIM.DLL: Failed to initialize real winmm.dll\n"); + } } LeaveCriticalSection(&sCriticalSection); } -- cgit v1.2.3 From da8f6c675e9a58d4b808aa0ba2917e767106d7a0 Mon Sep 17 00:00:00 2001 From: Siana Gearz <siana.gearz@googlemail.com> Date: Sun, 17 Apr 2011 11:25:00 -0400 Subject: STORM-1088: corrected fix loading of winmm.dll --- indra/media_plugins/winmmshim/winmm_shim.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/indra/media_plugins/winmmshim/winmm_shim.cpp b/indra/media_plugins/winmmshim/winmm_shim.cpp index 6ba95e565e..47a1e5c018 100644 --- a/indra/media_plugins/winmmshim/winmm_shim.cpp +++ b/indra/media_plugins/winmmshim/winmm_shim.cpp @@ -39,7 +39,7 @@ BOOL APIENTRY DllMain( HMODULE hModule, LPVOID lpReserved ) { - InitializeCriticalSectionAndSpinCount(&sCriticalSection, 0x00000400); + InitializeCriticalSection(&sCriticalSection); return TRUE; } @@ -62,11 +62,12 @@ void ll_winmm_shim_initialize(){ initialized = true; init_function_pointers(winmm_handle); ::OutputDebugStringA("WINMM_SHIM.DLL: real winmm.dll initialized successfully\n"); - return; } - - // failed to initialize real winmm.dll - ::OutputDebugStringA("WINMM_SHIM.DLL: Failed to initialize real winmm.dll\n"); + else + { + // failed to initialize real winmm.dll + ::OutputDebugStringA("WINMM_SHIM.DLL: Failed to initialize real winmm.dll\n"); + } } LeaveCriticalSection(&sCriticalSection); } -- cgit v1.2.3 From b8069d1c250c03e9fffda0a9264bfd04a12f8292 Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Mon, 18 Apr 2011 09:19:05 -0400 Subject: Added tag 2.6.4-start for changeset f632f87bb71b --- .hgtags | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.hgtags b/.hgtags index 55d6567ee8..b982a7eea2 100644 --- a/.hgtags +++ b/.hgtags @@ -102,3 +102,5 @@ ec32f1045e7c2644015245df3a9933620aa194b8 2.6.3-start d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc DRTVWR-47_2.6.3-beta1 d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc 2.6.3-beta1 74cd32a06837b0c2cb793b2e8d4d82f5d49462b2 2.6.4-start +74cd32a06837b0c2cb793b2e8d4d82f5d49462b2 2.6.4-start +f632f87bb71b0f13d21f2f64b0c42cedb008c749 2.6.4-start -- cgit v1.2.3 From d534c8009f2573400a21c19b00691536fc3cc23f Mon Sep 17 00:00:00 2001 From: "Debi King (Dessie)" <dessie@lindenlab.com> Date: Mon, 18 Apr 2011 09:53:19 -0400 Subject: Added tag DRTVWR-48_2.6.3-beta2, 2.6.3-beta2 for changeset 0630e977504a --- .hgtags | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.hgtags b/.hgtags index 2cc1d48575..04dc75d2cb 100644 --- a/.hgtags +++ b/.hgtags @@ -97,3 +97,5 @@ d1203046bb653b763f835b04d184646949d8dd5c 2.6.2-beta1 ec32f1045e7c2644015245df3a9933620aa194b8 2.6.3-start d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc DRTVWR-47_2.6.3-beta1 d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc 2.6.3-beta1 +0630e977504af5ea320c58d33cae4e1ddee793e9 DRTVWR-48_2.6.3-beta2 +0630e977504af5ea320c58d33cae4e1ddee793e9 2.6.3-beta2 -- cgit v1.2.3 From c494e5c0d55b2da2f5aa5ea18fbccb670b2f3107 Mon Sep 17 00:00:00 2001 From: prep <prep@lindenlab.com> Date: Mon, 18 Apr 2011 10:41:32 -0400 Subject: WIP for SH-1281. Rigged assets are critiqued differently based upon whether they're avrigs w/wo joint offets and whether the asset contains a subset of the joints in the visual scene --- indra/newview/llfloatermodelpreview.cpp | 447 ++++++++++++++++++++++++++------ indra/newview/llfloatermodelpreview.h | 52 +++- 2 files changed, 410 insertions(+), 89 deletions(-) diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index a808cc47a2..cdd2bcf8e3 100755 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -340,7 +340,7 @@ BOOL LLFloaterModelPreview::postBuild() mPreviewRect = preview_panel->getRect(); - mModelPreview = new LLModelPreview(512, 512, this); + mModelPreview = new LLModelPreview(512, 512, this ); mModelPreview->setPreviewTarget(16.f); mModelPreview->setDetailsCallback(boost::bind(&LLFloaterModelPreview::setDetails, this, _1, _2, _3, _4, _5)); @@ -383,7 +383,7 @@ LLFloaterModelPreview::~LLFloaterModelPreview() sInstance = NULL; if ( mModelPreview && mModelPreview->getResetJointFlag() ) - { + { gAgentAvatarp->resetJointPositions(); } @@ -994,8 +994,11 @@ void LLFloaterModelPreview::onMouseCaptureLostModelPreview(LLMouseHandler* handl //----------------------------------------------------------------------------- // LLModelLoader //----------------------------------------------------------------------------- -LLModelLoader::LLModelLoader(std::string filename, S32 lod, LLModelPreview* preview) -: LLThread("Model Loader"), mFilename(filename), mLod(lod), mPreview(preview), mFirstTransform(TRUE) +LLModelLoader::LLModelLoader( std::string filename, S32 lod, LLModelPreview* preview, JointTransformMap& jointMap, + std::deque<std::string>& jointsFromNodes ) +: mJointList( jointMap ) +, mJointsFromNode( jointsFromNodes ) +, LLThread("Model Loader"), mFilename(filename), mLod(lod), mPreview(preview), mFirstTransform(TRUE) { mJointMap["mPelvis"] = "mPelvis"; mJointMap["mTorso"] = "mTorso"; @@ -1073,27 +1076,6 @@ LLModelLoader::LLModelLoader(std::string filename, S32 lod, LLModelPreview* prev mJointMap["lShin"] = "mKneeLeft"; mJointMap["lFoot"] = "mFootLeft"; - //move into joint mapper class - mMasterJointList.push_front("mPelvis"); - mMasterJointList.push_front("mTorso"); - mMasterJointList.push_front("mChest"); - mMasterJointList.push_front("mNeck"); - mMasterJointList.push_front("mHead"); - mMasterJointList.push_front("mCollarLeft"); - mMasterJointList.push_front("mShoulderLeft"); - mMasterJointList.push_front("mElbowLeft"); - mMasterJointList.push_front("mWristLeft"); - mMasterJointList.push_front("mCollarRight"); - mMasterJointList.push_front("mShoulderRight"); - mMasterJointList.push_front("mElbowRight"); - mMasterJointList.push_front("mWristRight"); - mMasterJointList.push_front("mHipRight"); - mMasterJointList.push_front("mKneeRight"); - mMasterJointList.push_front("mFootRight"); - mMasterJointList.push_front("mHipLeft"); - mMasterJointList.push_front("mKneeLeft"); - mMasterJointList.push_front("mFootLeft"); - if (mPreview) { //only try to load from slm if viewer is configured to do so and this is the @@ -1356,12 +1338,8 @@ bool LLModelLoader::doLoadModel() skin_info.mBindShapeMatrix = trans; } - - - //The joint transfom map that we'll populate below - std::map<std::string,LLMatrix4> jointTransforms; - jointTransforms.clear(); - + + //Some collada setup for accessing the skeleton daeElement* pElement = 0; dae.getDatabase()->getElement( &pElement, 0, 0, "skeleton" ); @@ -1410,7 +1388,7 @@ bool LLModelLoader::doLoadModel() domNode* pNode = daeSafeCast<domNode>(children[i]); if ( isNodeAJoint( pNode ) ) { - processJointNode( pNode, jointTransforms ); + processJointNode( pNode, mJointList ); } } } @@ -1468,7 +1446,7 @@ bool LLModelLoader::doLoadModel() } //Store the joint transform w/respect to it's name. - jointTransforms[(*jointIt).second.c_str()] = workingTransform; + mJointList[(*jointIt).second.c_str()] = workingTransform; } } @@ -1571,13 +1549,10 @@ bool LLModelLoader::doLoadModel() //Now that we've parsed the joint array, let's determine if we have a full rig //(which means we have all the joints that are required for an avatar versus //a skinned asset attached to a node in a file that contains an entire skeleton, - //but does not use the skeleton). - mPreview->setRigValid( doesJointArrayContainACompleteRig( model->mSkinInfo.mJointNames ) ); - if ( !skeletonWithNoRootNode && !model->mSkinInfo.mJointNames.empty() && mPreview->isRigValid() ) - { - mPreview->setResetJointFlag( true ); - } + //but does not use the skeleton). + mPreview->critiqueRigForUploadApplicability( model->mSkinInfo.mJointNames ); + if ( !missingSkeletonOrScene ) { //Set the joint translations on the avatar - if it's a full mapping @@ -1590,10 +1565,10 @@ bool LLModelLoader::doLoadModel() { std::string lookingForJoint = (*masterJointIt).first.c_str(); - if ( jointTransforms.find( lookingForJoint ) != jointTransforms.end() ) + if ( mJointList.find( lookingForJoint ) != mJointList.end() ) { //llinfos<<"joint "<<lookingForJoint.c_str()<<llendl; - LLMatrix4 jointTransform = jointTransforms[lookingForJoint]; + LLMatrix4 jointTransform = mJointList[lookingForJoint]; LLJoint* pJoint = gAgentAvatarp->getJoint( lookingForJoint ); if ( pJoint ) { @@ -1609,6 +1584,7 @@ bool LLModelLoader::doLoadModel() } } //missingSkeletonOrScene + //We need to construct the alternate bind matrix (which contains the new joint positions) //in the same order as they were stored in the joint buffer. The joints associated //with the skeleton are not stored in the same order as they are in the exported joint buffer. @@ -1620,11 +1596,11 @@ bool LLModelLoader::doLoadModel() std::string lookingForJoint = (*jointIt).c_str(); //Look for the joint xform that we extracted from the skeleton, using the jointIt as the key //and store it in the alternate bind matrix - if ( jointTransforms.find( lookingForJoint ) != jointTransforms.end() ) + if ( mJointList.find( lookingForJoint ) != mJointList.end() ) { - LLMatrix4 jointTransform = jointTransforms[lookingForJoint]; + LLMatrix4 jointTransform = mJointList[lookingForJoint]; LLMatrix4 newInverse = model->mSkinInfo.mInvBindMatrix[i]; - newInverse.setTranslation( jointTransforms[lookingForJoint].getTranslation() ); + newInverse.setTranslation( mJointList[lookingForJoint].getTranslation() ); model->mSkinInfo.mAlternateBindMatrix.push_back( newInverse ); } else @@ -1787,7 +1763,11 @@ bool LLModelLoader::doLoadModel() processElement(scene); handlePivotPoint( root ); + + buildJointToNodeMappingFromScene( root ); + mPreview->critiqueJointToNodeMappingFromScene(); + return true; } @@ -1836,8 +1816,9 @@ bool LLModelLoader::loadFromSLM(const std::string& filename) model[lod].push_back(loaded_model); if (lod == LLModel::LOD_HIGH && !loaded_model->mSkinInfo.mJointNames.empty()) - { //check to see if rig is valid - mPreview->setRigValid( doesJointArrayContainACompleteRig( loaded_model->mSkinInfo.mJointNames ) ); + { + //check to see if rig is valid + mPreview->critiqueRigForUploadApplicability( loaded_model->mSkinInfo.mJointNames ); } } else @@ -1911,7 +1892,52 @@ void LLModelLoader::loadModelCallback() delete this; } - +//----------------------------------------------------------------------------- +// buildJointToNodeMappingFromScene() +//----------------------------------------------------------------------------- +void LLModelLoader::buildJointToNodeMappingFromScene( daeElement* pRoot ) +{ + daeElement* pScene = pRoot->getDescendant("visual_scene"); + if ( pScene ) + { + daeTArray< daeSmartRef<daeElement> > children = pScene->getChildren(); + S32 childCount = children.getCount(); + for (S32 i = 0; i < childCount; ++i) + { + domNode* pNode = daeSafeCast<domNode>(children[i]); + processJointToNodeMapping( pNode ); + } + } +} +//----------------------------------------------------------------------------- +// processJointToNodeMapping() +//----------------------------------------------------------------------------- +void LLModelLoader::processJointToNodeMapping( domNode* pNode ) +{ + if ( isNodeAJoint( pNode ) ) + { + //1.Store the parent + std::string nodeName = pNode->getName(); + if ( !nodeName.empty() ) + { + mJointsFromNode.push_front( pNode->getName() ); + } + //2. Handle the kiddo's + daeTArray< daeSmartRef<daeElement> > childOfChild = pNode->getChildren(); + S32 childOfChildCount = childOfChild.getCount(); + for (S32 i = 0; i < childOfChildCount; ++i) + { + domNode* pChildNode = daeSafeCast<domNode>( childOfChild[i] ); + if ( pChildNode ) + { + processJointToNodeMapping( pChildNode ); + } + } + } +} +//----------------------------------------------------------------------------- +// handlePivotPoint() +//----------------------------------------------------------------------------- void LLModelLoader::handlePivotPoint( daeElement* pRoot ) { //Import an optional pivot point - a pivot point is just a node in the visual scene named "AssetPivot" @@ -1953,37 +1979,157 @@ void LLModelLoader::handlePivotPoint( daeElement* pRoot ) } } -bool LLModelLoader::doesJointArrayContainACompleteRig( const std::vector<std::string> &jointListFromModel ) +//----------------------------------------------------------------------------- +// critiqueRigForUploadApplicability() +//----------------------------------------------------------------------------- +void LLModelPreview::critiqueRigForUploadApplicability( const std::vector<std::string> &jointListFromAsset ) +{ + //Determines the following use cases for a rig: + //1. It is suitable for upload with skin weights & joint positions, or + //2. It is suitable for upload as standard av with just skin weights + + bool isJointPositionUploadOK = isRigSuitableForJointPositionUpload( jointListFromAsset ); + bool isRigLegacyOK = isRigLegacy( jointListFromAsset ); + + //It's OK that both could end up being true, both default to false + if ( isJointPositionUploadOK ) + { + setRigValidForJointPositionUpload( true ); + } + + if ( isRigLegacyOK ) + { + setLegacyRigValid( true ); + } + + if ( isJointPositionUploadOK ) + { + setResetJointFlag( true ); + } +} +//----------------------------------------------------------------------------- +// critiqueJointToNodeMappingFromScene() +//----------------------------------------------------------------------------- +void LLModelPreview::critiqueJointToNodeMappingFromScene( void ) +{ + //Do the actual nodes back the joint listing from the dae? + //if yes then this is a fully rigged asset, otherwise it's just a partial rig + + std::deque<std::string>::iterator jointsFromNodeIt = mJointsFromNode.begin(); + std::deque<std::string>::iterator jointsFromNodeEndIt = mJointsFromNode.end(); + bool result = true; + + if ( !mJointsFromNode.empty() ) + { + for ( ;jointsFromNodeIt!=jointsFromNodeEndIt;++jointsFromNodeIt ) + { + std::string name = *jointsFromNodeIt; + if ( mJointTransformMap.find( name ) != mJointTransformMap.end() ) + { + continue; + } + else + { + llinfos<<"critiqueJointToNodeMappingFromScene is missing a: "<<name<<llendl; + result = false; + } + } + } + else + { + result = false; + } + + //Determines the following use cases for a rig: + //1. Full av rig w/1-1 mapping from the scene and joint array + //2. Partial rig but w/o parity between the scene and joint array + if ( result ) + { + setResetJointFlag( true ); + //llinfos<<"Full"<<llendl; + } + else + { + setResetJointFlag( false ); + //llinfos<<"Partial"<<llendl; + } +} +//----------------------------------------------------------------------------- +// isRigLegacy() +//----------------------------------------------------------------------------- +bool LLModelPreview::isRigLegacy( const std::vector<std::string> &jointListFromAsset ) +{ + //No joints in asset + if ( jointListFromAsset.size() == 0 ) + { + return false; + } + + bool result = false; + + std::deque<std::string> :: const_iterator masterJointIt = mMasterLegacyJointList.begin(); + std::deque<std::string> :: const_iterator masterJointEndIt = mMasterLegacyJointList.end(); + + std::vector<std::string> :: const_iterator modelJointIt = jointListFromAsset.begin(); + std::vector<std::string> :: const_iterator modelJointItEnd = jointListFromAsset.end(); + + for ( ;masterJointIt!=masterJointEndIt;++masterJointIt ) + { + result = false; + modelJointIt = jointListFromAsset.begin(); + + for ( ;modelJointIt!=modelJointItEnd; ++modelJointIt ) + { + if ( *masterJointIt == *modelJointIt ) + { + result = true; + break; + } + } + if ( !result ) + { + llinfos<<" Asset did not contain the joint (if you're u/l a fully rigged asset w/joint positions - it is required)." << *masterJointIt<< llendl; + break; + } + } + return result; +} +//----------------------------------------------------------------------------- +// isRigSuitableForJointPositionUpload() +//----------------------------------------------------------------------------- +bool LLModelPreview::isRigSuitableForJointPositionUpload( const std::vector<std::string> &jointListFromAsset ) { + bool result = false; + std::deque<std::string> :: const_iterator masterJointIt = mMasterJointList.begin(); std::deque<std::string> :: const_iterator masterJointEndIt = mMasterJointList.end(); - std::vector<std::string> :: const_iterator modelJointIt = jointListFromModel.begin(); - std::vector<std::string> :: const_iterator modelJointItEnd = jointListFromModel.end(); + std::vector<std::string> :: const_iterator modelJointIt = jointListFromAsset.begin(); + std::vector<std::string> :: const_iterator modelJointItEnd = jointListFromAsset.end(); - bool found = false; for ( ;masterJointIt!=masterJointEndIt;++masterJointIt ) { - found = false; - modelJointIt = jointListFromModel.begin(); + result = false; + modelJointIt = jointListFromAsset.begin(); + for ( ;modelJointIt!=modelJointItEnd; ++modelJointIt ) { if ( *masterJointIt == *modelJointIt ) { - found = true; + result = true; break; } } - if ( !found ) + if ( !result ) { - llinfos<<" Asset did not contain the joint (if you're u/l a fully rigged asset - it is required)." << *masterJointIt<< llendl; + llinfos<<" Asset did not contain the joint (if you're u/l a fully rigged asset w/joint positions - it is required)." << *masterJointIt<< llendl; break; } - } - - return found; + } + return result; } + //called in the main thread void LLModelLoader::loadTextures() { @@ -2013,6 +2159,9 @@ void LLModelLoader::loadTextures() } } +//----------------------------------------------------------------------------- +// isNodeAJoint() +//----------------------------------------------------------------------------- bool LLModelLoader::isNodeAJoint( domNode* pNode ) { if ( pNode->getName() == NULL) @@ -2027,7 +2176,9 @@ bool LLModelLoader::isNodeAJoint( domNode* pNode ) return false; } - +//----------------------------------------------------------------------------- +// isNodeAPivotPoint() +//----------------------------------------------------------------------------- bool LLModelLoader::isNodeAPivotPoint( domNode* pNode ) { bool result = false; @@ -2046,14 +2197,18 @@ bool LLModelLoader::isNodeAPivotPoint( domNode* pNode ) } return result; } - +//----------------------------------------------------------------------------- +// extractTranslation() +//----------------------------------------------------------------------------- void LLModelLoader::extractTranslation( domTranslate* pTranslate, LLMatrix4& transform ) { domFloat3 jointTrans = pTranslate->getValue(); LLVector3 singleJointTranslation( jointTrans[0], jointTrans[1], jointTrans[2] ); transform.setTranslation( singleJointTranslation ); } - +//----------------------------------------------------------------------------- +// extractTranslationViaElement() +//----------------------------------------------------------------------------- void LLModelLoader::extractTranslationViaElement( daeElement* pTranslateElement, LLMatrix4& transform ) { domTranslate* pTranslateChild = dynamic_cast<domTranslate*>( pTranslateElement ); @@ -2061,8 +2216,10 @@ void LLModelLoader::extractTranslationViaElement( daeElement* pTranslateElement, LLVector3 singleJointTranslation( translateChild[0], translateChild[1], translateChild[2] ); transform.setTranslation( singleJointTranslation ); } - -void LLModelLoader::processJointNode( domNode* pNode, std::map<std::string,LLMatrix4>& jointTransforms ) +//----------------------------------------------------------------------------- +// processJointNode() +//----------------------------------------------------------------------------- +void LLModelLoader::processJointNode( domNode* pNode, JointTransformMap& jointTransforms ) { if (pNode->getName() == NULL) { @@ -2135,7 +2292,9 @@ void LLModelLoader::processJointNode( domNode* pNode, std::map<std::string,LLMat } } } - +//----------------------------------------------------------------------------- +// getChildFromElement() +//----------------------------------------------------------------------------- daeElement* LLModelLoader::getChildFromElement( daeElement* pElement, std::string const & name ) { daeElement* pChildOfElement = pElement->getChild( name.c_str() ); @@ -2456,8 +2615,10 @@ LLColor4 LLModelLoader::getDaeColor(daeElement* element) LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp) : LLViewerDynamicTexture(width, height, 3, ORDER_MIDDLE, FALSE), LLMutex(NULL) , mPelvisZOffset( 0.0f ) -, mRigValid( false ) +, mLegacyRigValid( false ) +, mRigValidJointUpload( false ) , mResetJoints( false ) +, mLastJointUpdate( false ) { mNeedsUpdate = TRUE; mCameraDistance = 0.f; @@ -2491,6 +2652,40 @@ LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp) mModelPivot = LLVector3( 0.0f, 0.0f, 0.0f ); glodInit(); + + //move into joint mapper class + //1. joints for joint offset verification + mMasterJointList.push_front("mPelvis"); + mMasterJointList.push_front("mTorso"); + mMasterJointList.push_front("mChest"); + mMasterJointList.push_front("mNeck"); + mMasterJointList.push_front("mHead"); + mMasterJointList.push_front("mCollarLeft"); + mMasterJointList.push_front("mShoulderLeft"); + mMasterJointList.push_front("mElbowLeft"); + mMasterJointList.push_front("mWristLeft"); + mMasterJointList.push_front("mCollarRight"); + mMasterJointList.push_front("mShoulderRight"); + mMasterJointList.push_front("mElbowRight"); + mMasterJointList.push_front("mWristRight"); + mMasterJointList.push_front("mHipRight"); + mMasterJointList.push_front("mKneeRight"); + mMasterJointList.push_front("mFootRight"); + mMasterJointList.push_front("mHipLeft"); + mMasterJointList.push_front("mKneeLeft"); + mMasterJointList.push_front("mFootLeft"); + //2. legacy joint list - used to verify rigs that will not be using joint offsets + mMasterLegacyJointList.push_front("mPelvis"); + mMasterLegacyJointList.push_front("mTorso"); + mMasterLegacyJointList.push_front("mChest"); + mMasterLegacyJointList.push_front("mNeck"); + mMasterLegacyJointList.push_front("mHead"); + mMasterLegacyJointList.push_front("mHipRight"); + mMasterLegacyJointList.push_front("mKneeRight"); + mMasterLegacyJointList.push_front("mFootRight"); + mMasterLegacyJointList.push_front("mHipLeft"); + mMasterLegacyJointList.push_front("mKneeLeft"); + mMasterLegacyJointList.push_front("mFootLeft"); } LLModelPreview::~LLModelPreview() @@ -2518,14 +2713,20 @@ U32 LLModelPreview::calcResourceCost() } } - //Upload skin is selected BUT the joints coming in from the asset - //were malformed. + //Upload skin is selected BUT check to see if the joints coming in from the asset were malformed. if ( mFMP && mFMP->childGetValue("upload_skin").asBoolean() ) { - if ( !isRigValid() ) + bool uploadingJointPositions = mFMP->childGetValue("upload_joints").asBoolean(); + if ( uploadingJointPositions && !isRigValidForJointPositionUpload() ) + { + mFMP->childDisable("ok_btn"); + } + else + if ( !isLegacyRigValid() ) { mFMP->childDisable("ok_btn"); } + //ok_btn should not have been changed unless something was wrong with joint list } U32 cost = 0; @@ -2858,7 +3059,7 @@ void LLModelPreview::loadModel(std::string filename, S32 lod) clearGLODGroup(); } - mModelLoader = new LLModelLoader(filename, lod, this); + mModelLoader = new LLModelLoader(filename, lod, this, mJointTransformMap, mJointsFromNode ); mModelLoader->start(); @@ -3694,12 +3895,22 @@ void LLModelPreview::updateStatusMessages() bool errorStateFromLoader = getLoadState() >= LLModelLoader::ERROR_PARSING ? true : false; bool skinAndRigOk = true; - bool uploadingSkin = mFMP->childGetValue("upload_skin").asBoolean(); - if ( uploadingSkin && !isRigValid() ) + bool uploadingSkin = mFMP->childGetValue("upload_skin").asBoolean(); + bool uploadingJointPositions = mFMP->childGetValue("upload_joints").asBoolean(); + + if ( uploadingSkin ) { - skinAndRigOk = false; + if ( uploadingJointPositions && !isRigValidForJointPositionUpload() ) + { + skinAndRigOk = false; + } + else + if ( !isLegacyRigValid() ) + { + skinAndRigOk = false; + } } - + if ( upload_ok && !errorStateFromLoader && skinAndRigOk ) { mFMP->childEnable("ok_btn"); @@ -4089,7 +4300,55 @@ void LLModelPreview::update() } } +//----------------------------------------------------------------------------- +// changeAvatarsJointPositions() +//----------------------------------------------------------------------------- +void LLModelPreview::changeAvatarsJointPositions( LLModel* pModel ) +{ + if ( mMasterJointList.empty() ) + { + return; + } + + std::vector<std::string> :: const_iterator jointListItBegin = pModel->mSkinInfo.mJointNames.begin(); + std::vector<std::string> :: const_iterator jointListItEnd = pModel->mSkinInfo.mJointNames.end(); + + S32 index = 0; + for ( ; jointListItBegin!=jointListItEnd; ++jointListItBegin, ++index ) + { + std::string elem = *jointListItBegin; + //llinfos<<"joint "<<elem<<llendl; + + S32 matrixCnt = pModel->mSkinInfo.mAlternateBindMatrix.size(); + if ( matrixCnt < 1 ) + { + llinfos<<"Total WTF moment :"<<matrixCnt<<llendl; + } + else + { + LLMatrix4 jointTransform = pModel->mSkinInfo.mAlternateBindMatrix[index]; + LLJoint* pJoint = gAgentAvatarp->getJoint( elem ); + if ( pJoint ) + { + pJoint->storeCurrentXform( jointTransform.getTranslation() ); + } + } + } +} +//----------------------------------------------------------------------------- +// getTranslationForJointOffset() +//----------------------------------------------------------------------------- +LLVector3 LLModelPreview::getTranslationForJointOffset( std::string joint ) +{ + LLMatrix4 jointTransform; + if ( mJointTransformMap.find( joint ) != mJointTransformMap.end() ) + { + jointTransform = mJointTransformMap[joint]; + return jointTransform.getTranslation(); + } + return LLVector3(0.0f,0.0f,0.0f); +} //----------------------------------------------------------------------------- // render() //----------------------------------------------------------------------------- @@ -4140,9 +4399,21 @@ BOOL LLModelPreview::render() LLFloaterModelPreview* fmp = LLFloaterModelPreview::sInstance; bool has_skin_weights = false; - bool upload_skin = mFMP->childGetValue("upload_skin").asBoolean(); + bool upload_skin = mFMP->childGetValue("upload_skin").asBoolean(); bool upload_joints = mFMP->childGetValue("upload_joints").asBoolean(); + bool resetJoints = false; + if ( upload_joints != mLastJointUpdate ) + { + if ( mLastJointUpdate ) + { + resetJoints = true; + } + + mLastJointUpdate = upload_joints; + + } + for (LLModelLoader::scene::iterator iter = mScene[mPreviewLOD].begin(); iter != mScene[mPreviewLOD].end(); ++iter) { for (LLModelLoader::model_instance_list::iterator model_iter = iter->second.begin(); model_iter != iter->second.end(); ++model_iter) @@ -4187,11 +4458,30 @@ BOOL LLModelPreview::render() if (!upload_skin && upload_joints) { //can't upload joints if not uploading skin weights mFMP->childSetValue("upload_joints", false); - upload_joints = false; - } - + upload_joints = false; + } + mFMP->childSetEnabled("upload_joints", upload_skin); + //poke at avatar when we upload custom joints + /* + if ( upload_joints ) + { + for (LLModelLoader::scene::iterator iter = mScene[mPreviewLOD].begin(); iter != mScene[mPreviewLOD].end(); ++iter) + { + for (LLModelLoader::model_instance_list::iterator model_iter = iter->second.begin(); model_iter != iter->second.end(); ++model_iter) + { + LLModelInstance& instance = *model_iter; + LLModel* model = instance.mModel; + if ( !model->mSkinWeights.empty() ) + { + changeAvatarsJointPositions( model ); + } + } + } + } + */ + F32 explode = mFMP->childGetValue("physics_explode").asReal(); glClear(GL_DEPTH_BUFFER_BIT); @@ -4468,6 +4758,7 @@ BOOL LLModelPreview::render() //quick 'n dirty software vertex skinning //build matrix palette + LLMatrix4 mat[64]; for (U32 j = 0; j < model->mSkinInfo.mJointNames.size(); ++j) { diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h index dc6a33d0ab..186bf114d1 100644 --- a/indra/newview/llfloatermodelpreview.h +++ b/indra/newview/llfloatermodelpreview.h @@ -53,6 +53,9 @@ class domTranslate; class LLMenuButton; class LLToggleableMenu; +typedef std::map<std::string, LLMatrix4> JointTransformMap; +typedef std::map<std::string, LLMatrix4>:: iterator JointTransformMapIt; + const S32 NUM_LOD = 4; class LLModelLoader : public LLThread @@ -94,8 +97,8 @@ public: //queue of models that need a physics rep model_queue mPhysicsQ; - LLModelLoader(std::string filename, S32 lod, LLModelPreview* preview); - + LLModelLoader( std::string filename, S32 lod, LLModelPreview* preview, JointTransformMap& jointMap, + std::deque<std::string>& jointsFromNodes ); virtual void run(); bool doLoadModel(); bool loadFromSLM(const std::string& filename); @@ -115,17 +118,19 @@ public: void extractTranslation( domTranslate* pTranslate, LLMatrix4& transform ); void extractTranslationViaElement( daeElement* pTranslateElement, LLMatrix4& transform ); - bool doesJointArrayContainACompleteRig( const std::vector<std::string> &modelJointList ); - bool checkForCompleteRig( const std::vector<std::string> &jointListFromModel ); - void handlePivotPoint( daeElement* pRoot ); bool isNodeAPivotPoint( domNode* pNode ); void setLoadState(U32 state); + void buildJointToNodeMappingFromScene( daeElement* pRoot ); + void processJointToNodeMapping( domNode* pNode ); + + //map of avatar joints as named in COLLADA assets to internal joint names std::map<std::string, std::string> mJointMap; - std::deque<std::string> mMasterJointList; + JointTransformMap& mJointList; + std::deque<std::string>& mJointsFromNode; }; class LLFloaterModelPreview : public LLFloater @@ -297,12 +302,28 @@ public: void updateStatusMessages(); void clearGLODGroup(); void onLODParamCommit(bool enforce_tri_limit); + const bool getModelPivot( void ) const { return mHasPivot; } void setHasPivot( bool val ) { mHasPivot = val; } void setModelPivot( const LLVector3& pivot ) { mModelPivot = pivot; } - const bool isRigValid( void ) const { return mRigValid; } - void setRigValid( bool rigValid ) { mRigValid = rigValid; } - + + //Sets the current avatars joints to new positions + //Makes in world go to shit, however + void changeAvatarsJointPositions( LLModel* pModel ); + //Determines the viability of an asset to be used as an avatar rig (w or w/o joint upload caps) + void critiqueRigForUploadApplicability( const std::vector<std::string> &jointListFromAsset ); + void critiqueJointToNodeMappingFromScene( void ); + //Is a rig valid so that it can be used as a criteria for allowing for uploading of joint positions + //Accessors for joint position upload friendly rigs + const bool isRigValidForJointPositionUpload( void ) const { return mRigValidJointUpload; } + void setRigValidForJointPositionUpload( bool rigValid ) { mRigValidJointUpload = rigValid; } + bool isRigSuitableForJointPositionUpload( const std::vector<std::string> &jointListFromAsset ); + //Determines if a rig is a legacy from the joint list + bool isRigLegacy( const std::vector<std::string> &jointListFromAsset ); + //Accessors for the legacy rigs + const bool isLegacyRigValid( void ) const { return mLegacyRigValid; } + void setLegacyRigValid( bool rigValid ) { mLegacyRigValid = rigValid; } + static void textureLoadedCallback( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata ); boost::signals2::connection setDetailsCallback( const details_signal_t::slot_type& cb ){ return mDetailsSignal.connect(cb); } @@ -314,6 +335,8 @@ public: void setResetJointFlag( bool state ) { mResetJoints = state; } bool getResetJointFlag( void ) { return mResetJoints; } + LLVector3 getTranslationForJointOffset( std::string joint ); + protected: friend class LLModelLoader; friend class LLFloaterModelPreview; @@ -377,8 +400,15 @@ public: float mPelvisZOffset; - bool mRigValid; -}; + bool mRigValidJointUpload; + bool mLegacyRigValid; + bool mLastJointUpdate; + + std::deque<std::string> mMasterJointList; + std::deque<std::string> mMasterLegacyJointList; + std::deque<std::string> mJointsFromNode; + JointTransformMap mJointTransformMap; +}; #endif // LL_LLFLOATERMODELPREVIEW_H -- cgit v1.2.3 From e9687600140761889c047530e0bc2ec3128e0ab7 Mon Sep 17 00:00:00 2001 From: Xiaohong Bao <bao@lindenlab.com> Date: Mon, 18 Apr 2011 14:09:58 -0600 Subject: more fix for the libminizip issue for linux. --- indra/cmake/LLPrimitive.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/indra/cmake/LLPrimitive.cmake b/indra/cmake/LLPrimitive.cmake index b860a09de9..e68d16ed08 100755 --- a/indra/cmake/LLPrimitive.cmake +++ b/indra/cmake/LLPrimitive.cmake @@ -24,6 +24,7 @@ else (WINDOWS) set(LLPRIMITIVE_LIBRARIES llprimitive collada14dom + minizip xml2 pcrecpp pcre -- cgit v1.2.3 From 130db30b269a04bcf6b3a672056098cccb73efb0 Mon Sep 17 00:00:00 2001 From: "Nyx (Neal Orman)" <nyx@lindenlab.com> Date: Mon, 18 Apr 2011 17:03:46 -0400 Subject: adding collada and minizip to the libraries we package the viewer with. --- indra/cmake/Copy3rdPartyLibs.cmake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index d4c478c3c7..e42a013bde 100755 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -249,6 +249,7 @@ elseif(LINUX) libaprutil-1.so.0 libatk-1.0.so libbreakpad_client.so.0 + libcollada14dom.so libcrypto.so.0.9.8 libdb-5.1.so libexpat.so @@ -259,6 +260,7 @@ elseif(LINUX) libgobject-2.0.so libgtest_main.so libgtest.so.0 + libminizip.so libopenal.so libopenjpeg.so libssl.so -- cgit v1.2.3 From 8d2943c5ddd08ce7a40d42325206f882c99f497a Mon Sep 17 00:00:00 2001 From: Leslie Linden <leslie@lindenlab.com> Date: Mon, 18 Apr 2011 14:08:29 -0700 Subject: Fixed debug information format for mac to allow breakpoints to work under Xcode. --- indra/cmake/Variables.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake index 77dd34d122..b6710300bb 100644 --- a/indra/cmake/Variables.cmake +++ b/indra/cmake/Variables.cmake @@ -102,7 +102,7 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") set(CMAKE_OSX_DEPLOYMENT_TARGET 10.5) set(CMAKE_OSX_SYSROOT /Developer/SDKs/MacOSX10.5.sdk) set(CMAKE_XCODE_ATTRIBUTE_GCC_VERSION "4.2") - set(CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT "DWARF with dSYM File") + set(CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT dwarf-with-dsym) # NOTE: To attempt an i386/PPC Universal build, add this on the configure line: # -DCMAKE_OSX_ARCHITECTURES:STRING='i386;ppc' -- cgit v1.2.3 From 2411a107e717816629817a9f2fe85d3c7cb254ab Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Mon, 18 Apr 2011 14:22:23 -0700 Subject: EXP-628 Inventory floater may be opened by SLApp EXP-630 My appearance floater may be opened by SLApp EXP-633 Search floater can be opened by SLApps --- indra/newview/app_settings/settings.xml | 33 ++++++++++++++++ indra/newview/app_settings/settings_minimal.xml | 33 ++++++++++++++++ indra/newview/llappearancemgr.cpp | 6 +++ indra/newview/llfloatersearch.cpp | 7 ++++ indra/newview/llviewerinventory.cpp | 6 +++ .../newview/skins/default/xui/en/notifications.xml | 44 +++++++++++++++++++++- 6 files changed, 128 insertions(+), 1 deletion(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index b602362cd0..f2a0e5ac19 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -12585,6 +12585,39 @@ <string>Boolean</string> <key>Value</key> <integer>1</integer> + </map> + <key>EnableInventory</key> + <map> + <key>Comment</key> + <string>Enable opening inventory from web link</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>EnableSearch</key> + <map> + <key>Comment</key> + <string>Enable opening search from web link</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>EnableAppearance</key> + <map> + <key>Comment</key> + <string>Enable opening appearance from web link</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> </map> <key>SearchFromAddressBar</key> <map> diff --git a/indra/newview/app_settings/settings_minimal.xml b/indra/newview/app_settings/settings_minimal.xml index 490da2c9d4..bc97ec00e9 100644 --- a/indra/newview/app_settings/settings_minimal.xml +++ b/indra/newview/app_settings/settings_minimal.xml @@ -303,6 +303,39 @@ <key>Value</key> <integer>0</integer> </map> + <key>EnableInventory</key> + <map> + <key>Comment</key> + <string>Enable opening inventory from web link</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>EnableSearch</key> + <map> + <key>Comment</key> + <string>Enable opening search from web link</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>EnableAppearance</key> + <map> + <key>Comment</key> + <string>Enable opening appearance from web link</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>DoubleClickShowWorldMap</key> <map> <key>Comment</key> diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 1cf552e42c..f9e850899a 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -110,6 +110,12 @@ public: { // support secondlife:///app/appearance/show, but for now we just // make all secondlife:///app/appearance SLapps behave this way + if (!LLUI::sSettingGroups["config"]->getBOOL("EnableAppearance")) + { + LLNotificationsUtil::add("NoAppearance", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit")); + return true; + } + LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD()); return true; } diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp index 2041fac8d8..d5806e375c 100644 --- a/indra/newview/llfloatersearch.cpp +++ b/indra/newview/llfloatersearch.cpp @@ -31,6 +31,7 @@ #include "llfloaterreg.h" #include "llfloatersearch.h" #include "llmediactrl.h" +#include "llnotificationsutil.h" #include "lllogininstance.h" #include "lluri.h" #include "llagent.h" @@ -46,6 +47,12 @@ public: LLSearchHandler() : LLCommandHandler("search", UNTRUSTED_THROTTLE) { } bool handle(const LLSD& tokens, const LLSD& query_map, LLMediaCtrl* web) { + if (!LLUI::sSettingGroups["config"]->getBOOL("EnableSearch")) + { + LLNotificationsUtil::add("NoSearch", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit")); + return true; + } + const size_t parts = tokens.size(); // get the (optional) category for the search diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 519514d99c..68011ebf07 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -183,6 +183,12 @@ public: return false; } + if (!LLUI::sSettingGroups["config"]->getBOOL("EnableInventory")) + { + LLNotificationsUtil::add("NoInventory", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit")); + return true; + } + // support secondlife:///app/inventory/show if (params[0].asString() == "show") { diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 8f5a95a504..cd25a2a8dd 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -7213,7 +7213,49 @@ The site at '<nolink>[HOST_NAME]</nolink>' in realm ' yestext="Quit" notext="Don't Quit"/> </notification> - + + <notification + name="NoInventory" + label="" + type="alertmodal" + unique="true"> + <tag>fail</tag> + <tag>confirm</tag> + Viewing inventory is only available in Advanced mode. Would you like to logout and change modes? + <usetemplate + name="okcancelbuttons" + yestext="Quit" + notext="Don't Quit"/> + </notification> + + <notification + name="NoAppearance" + label="" + type="alertmodal" + unique="true"> + <tag>fail</tag> + <tag>confirm</tag> + The appearance editor is only available in Advanced mode. Would you like to logout and change modes? + <usetemplate + name="okcancelbuttons" + yestext="Quit" + notext="Don't Quit"/> + </notification> + + <notification + name="NoSearch" + label="" + type="alertmodal" + unique="true"> + <tag>fail</tag> + <tag>confirm</tag> + Search is only available in Advanced mode. Would you like to logout and change modes? + <usetemplate + name="okcancelbuttons" + yestext="Quit" + notext="Don't Quit"/> + </notification> + <global name="UnsupportedCPU"> - Your CPU speed does not meet the minimum requirements. </global> -- cgit v1.2.3 From a9273b8202f79ccee007e40f7d8214c4a7ade6c2 Mon Sep 17 00:00:00 2001 From: "Nyx (Neal Orman)" <nyx@lindenlab.com> Date: Mon, 18 Apr 2011 18:03:43 -0400 Subject: adding collada and minizip to viewer_manifest.py, as it got clobbered in the merge --- indra/newview/viewer_manifest.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 6f70034624..ddf088ed49 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -954,11 +954,13 @@ class Linux_i686Manifest(LinuxManifest): self.path("libbreakpad_client.so.0.0.0") self.path("libbreakpad_client.so.0") self.path("libbreakpad_client.so") + self.path("libcollada14dom.so") self.path("libdb-5.1.so") self.path("libdb-5.so") self.path("libdb.so") self.path("libcrypto.so.0.9.8") self.path("libexpat.so.1.5.2") + self.path("libminizip.so") self.path("libssl.so.0.9.8") self.path("libuuid.so") self.path("libuuid.so.16") -- cgit v1.2.3 From 3cb97cb4d75c40d9519d796dd52d0741d354fc97 Mon Sep 17 00:00:00 2001 From: "Nyx (Neal Orman)" <nyx@lindenlab.com> Date: Mon, 18 Apr 2011 18:48:43 -0400 Subject: restoring glod to copy3rdpartylibs.cmake and viewer_manifest.py --- indra/cmake/Copy3rdPartyLibs.cmake | 1 + indra/newview/viewer_manifest.py | 1 + 2 files changed, 2 insertions(+) diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index e42a013bde..8e185df191 100755 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -254,6 +254,7 @@ elseif(LINUX) libdb-5.1.so libexpat.so libexpat.so.1 + libglod.so libgmock_main.so libgmock.so.0 libgmodule-2.0.so diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index ddf088ed49..e1c5edf7cb 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -960,6 +960,7 @@ class Linux_i686Manifest(LinuxManifest): self.path("libdb.so") self.path("libcrypto.so.0.9.8") self.path("libexpat.so.1.5.2") + self.path("libglod.so") self.path("libminizip.so") self.path("libssl.so.0.9.8") self.path("libuuid.so") -- cgit v1.2.3 From 838b38d238425c8fd8c0116e14cb0883940bcef5 Mon Sep 17 00:00:00 2001 From: Jonathan Yap <none@none> Date: Tue, 19 Apr 2011 13:24:46 -0400 Subject: STORM-1128 Add space after a comma --- indra/newview/llfloaterworldmap.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index 2672747605..f8a4ce7ad0 100755 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -92,7 +92,7 @@ struct SortRegionNames { inline bool operator ()(std::pair <U64, LLSimInfo*> const& _left, std::pair <U64, LLSimInfo*> const& _right) { - return(LLStringUtil::compareInsensitive(_left.second->getName(),_right.second->getName()) < 0); + return(LLStringUtil::compareInsensitive(_left.second->getName(), _right.second->getName()) < 0); } }; -- cgit v1.2.3 From 4ce6d2d909b2298f0165cb90247b3a59ab286c94 Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Tue, 19 Apr 2011 14:02:29 -0400 Subject: increment viewer version to 2.6.6 --- indra/llcommon/llversionviewer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h index bd6df962a1..df5afcbf1c 100644 --- a/indra/llcommon/llversionviewer.h +++ b/indra/llcommon/llversionviewer.h @@ -29,7 +29,7 @@ const S32 LL_VERSION_MAJOR = 2; const S32 LL_VERSION_MINOR = 6; -const S32 LL_VERSION_PATCH = 5; +const S32 LL_VERSION_PATCH = 6; const S32 LL_VERSION_BUILD = 0; const char * const LL_CHANNEL = "Second Life Developer"; -- cgit v1.2.3 From 64d20b8b745c184464c2a2f0795aeff0124ea3c5 Mon Sep 17 00:00:00 2001 From: Leslie Linden <leslie@lindenlab.com> Date: Tue, 19 Apr 2011 11:13:36 -0700 Subject: EXP-631 FIX -- REGRESSION - Clicking people button in Basic mode does not toggle the People panel to close EXP-640 FIX -- [PUBLIC] Ctrl+I doesn't close side tray LLSideTray::hidePanel now checks if the parent is the side tray or if it is a child to a detached tab to determine what panel to attempt to close. Reviewed by Leyla --- indra/newview/llsidetray.cpp | 99 ++++++++++++++++++++++++++++---------------- indra/newview/llsidetray.h | 2 +- 2 files changed, 64 insertions(+), 37 deletions(-) diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index 4f18ee1da2..e4c2293938 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -1192,6 +1192,38 @@ void LLSideTray::reshape(S32 width, S32 height, BOOL called_from_parent) arrange(); } +// This is just LLView::findChildView specialized to restrict the search to LLPanels. +// Optimization for EXT-4068 to avoid searching down to the individual item level +// when inventories are large. +LLPanel *findChildPanel(LLPanel *panel, const std::string& name, bool recurse) +{ + for (LLView::child_list_const_iter_t child_it = panel->beginChild(); + child_it != panel->endChild(); ++child_it) + { + LLPanel *child_panel = dynamic_cast<LLPanel*>(*child_it); + if (!child_panel) + continue; + if (child_panel->getName() == name) + return child_panel; + } + if (recurse) + { + for (LLView::child_list_const_iter_t child_it = panel->beginChild(); + child_it != panel->endChild(); ++child_it) + { + LLPanel *child_panel = dynamic_cast<LLPanel*>(*child_it); + if (!child_panel) + continue; + LLPanel *found_panel = findChildPanel(child_panel,name,recurse); + if (found_panel) + { + return found_panel; + } + } + } + return NULL; +} + /** * Activate tab with "panel_name" panel * if no such tab - return false, otherwise true. @@ -1221,23 +1253,50 @@ LLPanel* LLSideTray::showPanel (const std::string& panel_name, const LLSD& para return new_panel; } -void LLSideTray::hidePanel(const std::string& panel_name) +bool LLSideTray::hidePanel(const std::string& panel_name) { + bool panelHidden = false; + LLPanel* panelp = getPanel(panel_name); + if (panelp) { - if(isTabAttached(panel_name)) + LLView* parentp = panelp->getParent(); + + // Collapse the side bar if the panel or the panel's parent is an attached tab + if (isTabAttached(panel_name) || (parentp && isTabAttached(parentp->getName()))) { collapseSideBar(); + panelHidden = true; } else { - LLFloaterReg::hideInstance("side_bar_tab", panel_name); + panelHidden = LLFloaterReg::hideInstance("side_bar_tab", panel_name); + + if (!panelHidden) + { + // Look up the panel in the list of detached tabs. + for (child_vector_const_iter_t child_it = mDetachedTabs.begin(); child_it != mDetachedTabs.end(); ++child_it) + { + LLPanel *detached_panel = dynamic_cast<LLPanel*>(*child_it); + + if (detached_panel) + { + // Hide this detached panel if it is a parent of our panel + if (findChildPanel(detached_panel, panel_name, true) != NULL) + { + panelHidden = LLFloaterReg::hideInstance("side_bar_tab", detached_panel->getName()); + break; + } + } + } + } } } + + return panelHidden; } - void LLSideTray::togglePanel(LLPanel* &sub_panel, const std::string& panel_name, const LLSD& params) { if(!sub_panel) @@ -1255,38 +1314,6 @@ void LLSideTray::togglePanel(LLPanel* &sub_panel, const std::string& panel_name, } } -// This is just LLView::findChildView specialized to restrict the search to LLPanels. -// Optimization for EXT-4068 to avoid searching down to the individual item level -// when inventories are large. -LLPanel *findChildPanel(LLPanel *panel, const std::string& name, bool recurse) -{ - for (LLView::child_list_const_iter_t child_it = panel->beginChild(); - child_it != panel->endChild(); ++child_it) - { - LLPanel *child_panel = dynamic_cast<LLPanel*>(*child_it); - if (!child_panel) - continue; - if (child_panel->getName() == name) - return child_panel; - } - if (recurse) - { - for (LLView::child_list_const_iter_t child_it = panel->beginChild(); - child_it != panel->endChild(); ++child_it) - { - LLPanel *child_panel = dynamic_cast<LLPanel*>(*child_it); - if (!child_panel) - continue; - LLPanel *found_panel = findChildPanel(child_panel,name,recurse); - if (found_panel) - { - return found_panel; - } - } - } - return NULL; -} - LLPanel* LLSideTray::getPanel(const std::string& panel_name) { // Look up the panel in the list of detached tabs. diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h index 1dddd9e9bc..46765bfbcc 100644 --- a/indra/newview/llsidetray.h +++ b/indra/newview/llsidetray.h @@ -104,7 +104,7 @@ public: */ LLPanel* showPanel (const std::string& panel_name, const LLSD& params = LLSD()); - void hidePanel (const std::string& panel_name); + bool hidePanel (const std::string& panel_name); /** * Toggling Side Tray tab which contains "sub_panel" child of "panel_name" panel. -- cgit v1.2.3 From e07d21639b9b004154bca8a7e3fbb5c4abb17d62 Mon Sep 17 00:00:00 2001 From: Xiaohong Bao <bao@lindenlab.com> Date: Tue, 19 Apr 2011 13:41:05 -0600 Subject: a try fix for SH-1307: Crash on selection of some meshes. --- indra/newview/llfloatermodelpreview.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index cdd2bcf8e3..c66b2255eb 100755 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -2164,7 +2164,7 @@ void LLModelLoader::loadTextures() //----------------------------------------------------------------------------- bool LLModelLoader::isNodeAJoint( domNode* pNode ) { - if ( pNode->getName() == NULL) + if ( !pNode || pNode->getName() == NULL) { return false; } -- cgit v1.2.3 From 27301aa5461ccc8e1e16edd6438875ecd701065d Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine <vsavchuk@productengine.com> Date: Tue, 19 Apr 2011 23:46:18 +0300 Subject: STORM-1182 FIX Fixed XUI Preview tool not loading XML files from a dev checkout on Linux. The bug seems to be caused by recent switch to Autobuild, which affected the build directory path. --- indra/llvfs/lldir_linux.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/indra/llvfs/lldir_linux.cpp b/indra/llvfs/lldir_linux.cpp index 73f2336f94..ae25ab2f21 100644 --- a/indra/llvfs/lldir_linux.cpp +++ b/indra/llvfs/lldir_linux.cpp @@ -93,11 +93,11 @@ LLDir_Linux::LLDir_Linux() #else mAppRODataDir = tmp_str; #endif - std::string::size_type indra_pos = mExecutableDir.find("/indra"); - if (indra_pos != std::string::npos) + std::string::size_type build_dir_pos = mExecutableDir.find("/build-linux-"); + if (build_dir_pos != std::string::npos) { // ...we're in a dev checkout - mSkinBaseDir = mExecutableDir.substr(0, indra_pos) + "/indra/newview/skins"; + mSkinBaseDir = mExecutableDir.substr(0, build_dir_pos) + "/indra/newview/skins"; llinfos << "Running in dev checkout with mSkinBaseDir " << mSkinBaseDir << llendl; } -- cgit v1.2.3 From 3f37b76a4a00f0696ea5a3881810bd04eccbba18 Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Tue, 19 Apr 2011 13:48:51 -0700 Subject: fixing destination tooltip --- indra/newview/skins/minimal/xui/en/panel_bottomtray.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml index 0145de8be9..a250f95e4f 100644 --- a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml @@ -163,7 +163,7 @@ layout="topleft" left="0" name="destination_btn" - tool_tip="Shows people window" + tool_tip="Shows destinations window" top="5" is_toggle="true" use_ellipses="true" -- cgit v1.2.3 From f9cda66629d372fd3453e6244a381c1f60661931 Mon Sep 17 00:00:00 2001 From: Merov Linden <merov@lindenlab.com> Date: Tue, 19 Apr 2011 14:00:37 -0700 Subject: EXP-728 : Fix crash when taking large unconstrained snapshots + code cleanup --- indra/newview/llviewerwindow.cpp | 154 +++++++++++++++++++-------------------- 1 file changed, 76 insertions(+), 78 deletions(-) diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 8ce15c7dfc..a6404058b0 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -3967,7 +3967,9 @@ BOOL LLViewerWindow::thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 p return rawSnapshot(raw, preview_width, preview_height, FALSE, FALSE, show_ui, do_rebuild, type); } -// Saves the image from the screen to the specified filename and path. +// Saves the image from the screen to a raw image +// Since the required size might be bigger than the available screen, this method rerenders the scene in parts (called subimages) and copy +// the results over to the final raw image. BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height, BOOL keep_window_aspect, BOOL is_texture, BOOL show_ui, BOOL do_rebuild, ESnapshotType type, S32 max_size) { @@ -3985,8 +3987,6 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei // Hide all the UI widgets first and draw a frame BOOL prev_draw_ui = gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI) ? TRUE : FALSE; - show_ui = show_ui ? TRUE : FALSE; - if ( prev_draw_ui != show_ui) { LLPipeline::toggleRenderDebugFeature((void*)LLPipeline::RENDER_DEBUG_FEATURE_UI); @@ -4006,55 +4006,49 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei // from window LLRect window_rect = show_ui ? getWindowRectRaw() : getWorldViewRectRaw(); - S32 snapshot_width = window_rect.getWidth(); + S32 snapshot_width = window_rect.getWidth(); S32 snapshot_height = window_rect.getHeight(); // SNAPSHOT - S32 window_width = snapshot_width; + S32 window_width = snapshot_width; S32 window_height = snapshot_height; + // Note: Scaling of the UI is currently *not* supported so we limit the output size if UI is requested if (show_ui) { - image_width = llmin(image_width, window_width); + // If the user wants the UI, limit the output size to the available screen size + image_width = llmin(image_width, window_width); image_height = llmin(image_height, window_height); } F32 scale_factor = 1.0f ; - if(!keep_window_aspect) //image cropping - { + if (!keep_window_aspect || (image_width > window_width) || (image_height > window_height)) + { + // if image cropping or need to enlarge the scene, compute a scale_factor F32 ratio = llmin( (F32)window_width / image_width , (F32)window_height / image_height) ; - snapshot_width = (S32)(ratio * image_width) ; + snapshot_width = (S32)(ratio * image_width) ; snapshot_height = (S32)(ratio * image_height) ; scale_factor = llmax(1.0f, 1.0f / ratio) ; } - else //the scene(window) proportion needs to be maintained. - { - if(image_width > window_width || image_height > window_height) //need to enlarge the scene - { - F32 ratio = llmin( (F32)window_width / image_width , (F32)window_height / image_height) ; - snapshot_width = (S32)(ratio * image_width) ; - snapshot_height = (S32)(ratio * image_height) ; - scale_factor = llmax(1.0f, 1.0f / ratio) ; - } - } if (show_ui && scale_factor > 1.f) { + // Note: we should never get there... llwarns << "over scaling UI not supported." << llendl; } - S32 buffer_x_offset = llfloor(((window_width - snapshot_width) * scale_factor) / 2.f); + S32 buffer_x_offset = llfloor(((window_width - snapshot_width) * scale_factor) / 2.f); S32 buffer_y_offset = llfloor(((window_height - snapshot_height) * scale_factor) / 2.f); - S32 image_buffer_x = llfloor(snapshot_width*scale_factor) ; - S32 image_buffer_y = llfloor(snapshot_height *scale_factor) ; + S32 image_buffer_x = llfloor(snapshot_width * scale_factor) ; + S32 image_buffer_y = llfloor(snapshot_height * scale_factor) ; - if(image_buffer_x > max_size || image_buffer_y > max_size) //boundary check to avoid memory overflow + if ((image_buffer_x > max_size) || (image_buffer_y > max_size)) // boundary check to avoid memory overflow { scale_factor *= llmin((F32)max_size / image_buffer_x, (F32)max_size / image_buffer_y) ; - image_buffer_x = llfloor(snapshot_width*scale_factor) ; - image_buffer_y = llfloor(snapshot_height *scale_factor) ; + image_buffer_x = llfloor(snapshot_width * scale_factor) ; + image_buffer_y = llfloor(snapshot_height * scale_factor) ; } - if(image_buffer_x > 0 && image_buffer_y > 0) + if ((image_buffer_x > 0) && (image_buffer_y > 0)) { raw->resize(image_buffer_x, image_buffer_y, 3); } @@ -4062,7 +4056,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei { return FALSE ; } - if(raw->isBufferInvalid()) + if (raw->isBufferInvalid()) { return FALSE ; } @@ -4070,6 +4064,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei BOOL high_res = scale_factor >= 2.f; // Font scaling is slow, only do so if rez is much higher if (high_res && show_ui) { + // Note: we should never get there... llwarns << "High res UI snapshot not supported. " << llendl; /*send_agent_pause(); //rescale fonts @@ -4084,6 +4079,8 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei gObjectList.generatePickList(*LLViewerCamera::getInstance()); + // Subimages are in fact partial rendering of the final view. This happens when the final view is bigger than the screen. + // In most common cases, scale_factor is 1 and there's no more than 1 iteration on x and y for (int subimage_y = 0; subimage_y < scale_factor; ++subimage_y) { S32 subimage_y_offset = llclamp(buffer_y_offset - (subimage_y * window_height), 0, window_height);; @@ -4097,69 +4094,70 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei gDisplaySwapBuffers = FALSE; gDepthDirty = TRUE; - const U32 subfield = subimage_x+(subimage_y*llceil(scale_factor)); - - if (LLPipeline::sRenderDeferred) - { - display(do_rebuild, scale_factor, subfield, TRUE); - } - else - { - display(do_rebuild, scale_factor, subfield, TRUE); - // Required for showing the GUI in snapshots and performing bloom composite overlay - // Call even if show_ui is FALSE - render_ui(scale_factor, subfield); - } - S32 subimage_x_offset = llclamp(buffer_x_offset - (subimage_x * window_width), 0, window_width); // handle fractional rows U32 read_width = llmax(0, (window_width - subimage_x_offset) - llmax(0, (window_width * (subimage_x + 1)) - (buffer_x_offset + raw->getWidth()))); - for(U32 out_y = 0; out_y < read_height ; out_y++) + + // Skip rendering and sampling altogether if either width or height is degenerated to 0 (common in cropping cases) + if (read_width && read_height) { - S32 output_buffer_offset = ( - (out_y * (raw->getWidth())) // ...plus iterated y... - + (window_width * subimage_x) // ...plus subimage start in x... - + (raw->getWidth() * window_height * subimage_y) // ...plus subimage start in y... - - output_buffer_offset_x // ...minus buffer padding x... - - (output_buffer_offset_y * (raw->getWidth())) // ...minus buffer padding y... - ) * raw->getComponents(); + const U32 subfield = subimage_x+(subimage_y*llceil(scale_factor)); + display(do_rebuild, scale_factor, subfield, TRUE); - // Ping the wathdog thread every 100 lines to keep us alive (arbitrary number, feel free to change) - if (out_y % 100 == 0) + if (!LLPipeline::sRenderDeferred) { - LLAppViewer::instance()->pingMainloopTimeout("LLViewerWindow::rawSnapshot"); + // Required for showing the GUI in snapshots and performing bloom composite overlay + // Call even if show_ui is FALSE + render_ui(scale_factor, subfield); } - if (type == SNAPSHOT_TYPE_COLOR) + for (U32 out_y = 0; out_y < read_height ; out_y++) { - glReadPixels( - subimage_x_offset, out_y + subimage_y_offset, - read_width, 1, - GL_RGB, GL_UNSIGNED_BYTE, - raw->getData() + output_buffer_offset - ); - } - else // SNAPSHOT_TYPE_DEPTH - { - LLPointer<LLImageRaw> depth_line_buffer = new LLImageRaw(read_width, 1, sizeof(GL_FLOAT)); // need to store floating point values - glReadPixels( - subimage_x_offset, out_y + subimage_y_offset, - read_width, 1, - GL_DEPTH_COMPONENT, GL_FLOAT, - depth_line_buffer->getData()// current output pixel is beginning of buffer... - ); - - for (S32 i = 0; i < (S32)read_width; i++) + S32 output_buffer_offset = ( + (out_y * (raw->getWidth())) // ...plus iterated y... + + (window_width * subimage_x) // ...plus subimage start in x... + + (raw->getWidth() * window_height * subimage_y) // ...plus subimage start in y... + - output_buffer_offset_x // ...minus buffer padding x... + - (output_buffer_offset_y * (raw->getWidth())) // ...minus buffer padding y... + ) * raw->getComponents(); + + // Ping the watchdog thread every 100 lines to keep us alive (arbitrary number, feel free to change) + if (out_y % 100 == 0) { - F32 depth_float = *(F32*)(depth_line_buffer->getData() + (i * sizeof(F32))); - - F32 linear_depth_float = 1.f / (depth_conversion_factor_1 - (depth_float * depth_conversion_factor_2)); - U8 depth_byte = F32_to_U8(linear_depth_float, LLViewerCamera::getInstance()->getNear(), LLViewerCamera::getInstance()->getFar()); - //write converted scanline out to result image - for(S32 j = 0; j < raw->getComponents(); j++) + LLAppViewer::instance()->pingMainloopTimeout("LLViewerWindow::rawSnapshot"); + } + + if (type == SNAPSHOT_TYPE_COLOR) + { + glReadPixels( + subimage_x_offset, out_y + subimage_y_offset, + read_width, 1, + GL_RGB, GL_UNSIGNED_BYTE, + raw->getData() + output_buffer_offset + ); + } + else // SNAPSHOT_TYPE_DEPTH + { + LLPointer<LLImageRaw> depth_line_buffer = new LLImageRaw(read_width, 1, sizeof(GL_FLOAT)); // need to store floating point values + glReadPixels( + subimage_x_offset, out_y + subimage_y_offset, + read_width, 1, + GL_DEPTH_COMPONENT, GL_FLOAT, + depth_line_buffer->getData()// current output pixel is beginning of buffer... + ); + + for (S32 i = 0; i < (S32)read_width; i++) { - *(raw->getData() + output_buffer_offset + (i * raw->getComponents()) + j) = depth_byte; + F32 depth_float = *(F32*)(depth_line_buffer->getData() + (i * sizeof(F32))); + + F32 linear_depth_float = 1.f / (depth_conversion_factor_1 - (depth_float * depth_conversion_factor_2)); + U8 depth_byte = F32_to_U8(linear_depth_float, LLViewerCamera::getInstance()->getNear(), LLViewerCamera::getInstance()->getFar()); + // write converted scanline out to result image + for (S32 j = 0; j < raw->getComponents(); j++) + { + *(raw->getData() + output_buffer_offset + (i * raw->getComponents()) + j) = depth_byte; + } } } } -- cgit v1.2.3 From 2147889a2e6acbcf233692d17a0b638a0e8eaec7 Mon Sep 17 00:00:00 2001 From: seth_productengine <none@none> Date: Wed, 20 Apr 2011 01:17:41 +0300 Subject: STORM-320 FIXED navigation with arrow keys through the text with enabled word-wrapping. --- indra/llui/lltextbase.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 82269282ef..fd7bb699f8 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -2022,11 +2022,10 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round, pos = segment_line_start + offset; break; } - else if (hit_past_end_of_line && segmentp->getEnd() > line_iter->mDocIndexEnd - 1) + else if (hit_past_end_of_line && segmentp->getEnd() >= line_iter->mDocIndexEnd) { // segment wraps to next line, so just set doc pos to the end of the line - // segment wraps to next line, so just set doc pos to start of next line (represented by mDocIndexEnd) - pos = llmin(getLength(), line_iter->mDocIndexEnd); + pos = llclamp(line_iter->mDocIndexEnd - 1, 0, getLength()); break; } start_x += text_width; -- cgit v1.2.3 From 609523d6f7c9b656eada861084bf49f0c5e77e19 Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Tue, 19 Apr 2011 15:35:31 -0700 Subject: EXP-635 Action buttons missing on IM floater --- .../minimal/xui/en/panel_im_control_panel.xml | 64 ++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml index 53def54aca..c3f46f11e0 100644 --- a/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml +++ b/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml @@ -23,5 +23,69 @@ orientation="vertical" top_pad="5" width="145"> + <layout_panel + auto_resize="false" + follows="top|left|right" + height="20" + layout="topleft" + left="2" + min_height="20" + width="140" + name="view_profile_btn_panel" + top="0" + user_resize="false"> + <button + follows="left|top|right" + height="23" + label="Profile" + name="view_profile_btn" + top="0" + width="140" /> + </layout_panel> + <layout_panel + auto_resize="false" + follows="top|left|right" + height="25" + layout="topleft" + min_height="25" + width="140" + name="add_friend_btn_panel" + user_resize="false"> + <button + follows="left|top|right" + height="23" + label="Add Friend" + name="add_friend_btn" + top="5" + width="140" /> + </layout_panel> + <layout_panel + auto_resize="false" + follows="top|left|right" + height="25" + layout="topleft" + min_height="25" + width="140" + name="teleport_btn_panel" + user_resize="false"> + <button + auto_resize="false" + follows="left|top|right" + height="23" + label="Teleport" + name="teleport_btn" + tool_tip = "Offer to teleport this person" + width="140" /> + </layout_panel> + <layout_panel + mouse_opaque="false" + auto_resize="true" + follows="top|left" + height="0" + layout="topleft" + min_height="0" + width="140" + name="spacer" + user_resize="false" /> </layout_stack> </panel> -- cgit v1.2.3 From 1dedd3de05503067b36096007eeb0bb6a6204587 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Tue, 19 Apr 2011 16:16:54 -0700 Subject: EXP-648 FIX As a developer, I want to be able to specify param blocks that use Multiple<LLUIImage> for a sequence of images Factored out param block data classes so that specialized param block types, such as LLUIImage, LLFontGL, LLRect, etc. can be stored in a Multiple<T> context Converted loading_indicator to take image sequence from XUI deprecated name-value pairs for LLUIColor values, and put them in colors.xml --- indra/llui/llloadingindicator.cpp | 67 +- indra/llui/llloadingindicator.h | 30 +- indra/llui/llui.cpp | 103 +- indra/llui/llui.h | 79 +- indra/llui/lluiimage.cpp | 12 +- indra/llui/lluiimage.h | 17 +- indra/llui/tests/llurlentry_stub.cpp | 31 +- indra/llui/tests/llurlentry_test.cpp | 16 + indra/llui/tests/llurlmatch_test.cpp | 49 +- indra/llxuixml/llinitparam.cpp | 101 +- indra/llxuixml/llinitparam.h | 1132 ++++++++++---------- indra/newview/skins/default/colors.xml | 17 + .../default/xui/en/widgets/loading_indicator.xml | 20 +- 13 files changed, 879 insertions(+), 795 deletions(-) diff --git a/indra/llui/llloadingindicator.cpp b/indra/llui/llloadingindicator.cpp index 7b29d92ea0..8a0f875808 100644 --- a/indra/llui/llloadingindicator.cpp +++ b/indra/llui/llloadingindicator.cpp @@ -39,56 +39,24 @@ //static LLDefaultChildRegistry::Register<LLLoadingIndicator> r("loading_indicator"); /////////////////////////////////////////////////////////////////////////////// -// LLLoadingIndicator::Data class +// LLLoadingIndicator class /////////////////////////////////////////////////////////////////////////////// -/** - * Pre-loaded images shared by all instances of the widget - */ -class LLLoadingIndicator::Data: public LLSingleton<LLLoadingIndicator::Data> +LLLoadingIndicator::LLLoadingIndicator(const Params& p) +: LLUICtrl(p), + mImagesPerSec(p.images_per_sec > 0 ? p.images_per_sec : 1.0f), + mCurImageIdx(0) { -public: - /*virtual*/ void initSingleton(); // from LLSingleton - - LLPointer<LLUIImage> getNextImage(S8& idx) const; - U8 getImagesCount() const { return NIMAGES; } -private: - - static const U8 NIMAGES = 12; - LLPointer<LLUIImage> mImages[NIMAGES]; -}; +} -// virtual -// Called right after the instance gets constructed. -void LLLoadingIndicator::Data::initSingleton() +void LLLoadingIndicator::initFromParams(const Params& p) { - // Load images. - for (U8 i = 0; i < NIMAGES; ++i) + for (LLInitParam::ParamIterator<LLUIImage*>::const_iterator it = p.images().image.begin(), end_it = p.images().image.end(); + it != end_it; + ++it) { - std::string img_name = llformat("Progress_%d", i+1); - mImages[i] = LLUI::getUIImage(img_name, 0); - llassert(mImages[i]); + mImages.push_back(it->getValue()); } -} - -LLPointer<LLUIImage> LLLoadingIndicator::Data::getNextImage(S8& idx) const -{ - // Calculate next index, performing array bounds checking. - idx = (idx >= NIMAGES || idx < 0) ? 0 : (idx + 1) % NIMAGES; - return mImages[idx]; -} - -/////////////////////////////////////////////////////////////////////////////// -// LLLoadingIndicator class -/////////////////////////////////////////////////////////////////////////////// - -LLLoadingIndicator::LLLoadingIndicator(const Params& p) -: LLUICtrl(p) - , mRotationsPerSec(p.rotations_per_sec > 0 ? p.rotations_per_sec : 1.0f) - , mCurImageIdx(-1) -{ - // Select initial image. - mCurImagep = Data::instance().getNextImage(mCurImageIdx); // Start timer for switching images. start(); @@ -100,16 +68,21 @@ void LLLoadingIndicator::draw() if (mImageSwitchTimer.getStarted() && mImageSwitchTimer.hasExpired()) { // Switch to the next image. - mCurImagep = Data::instance().getNextImage(mCurImageIdx); + if (!mImages.empty()) + { + mCurImageIdx = (mCurImageIdx + 1) % mImages.size(); + } // Restart timer. start(); } + LLUIImagePtr cur_image = mImages.empty() ? NULL : mImages[mCurImageIdx]; + // Draw current image. - if( mCurImagep.notNull() ) + if( cur_image.notNull() ) { - mCurImagep->draw(getLocalRect(), LLColor4::white % getDrawContext().mAlpha); + cur_image->draw(getLocalRect(), LLColor4::white % getDrawContext().mAlpha); } LLUICtrl::draw(); @@ -123,6 +96,6 @@ void LLLoadingIndicator::stop() void LLLoadingIndicator::start() { mImageSwitchTimer.start(); - F32 period = 1.0f / (Data::instance().getImagesCount() * mRotationsPerSec); + F32 period = 1.0f / (mImages.size() * mImagesPerSec); mImageSwitchTimer.setTimerExpirySec(period); } diff --git a/indra/llui/llloadingindicator.h b/indra/llui/llloadingindicator.h index 4e4a224ef6..c0cb1cc74a 100644 --- a/indra/llui/llloadingindicator.h +++ b/indra/llui/llloadingindicator.h @@ -36,8 +36,8 @@ /** * Perpetual loading indicator (a la MacOSX or YouTube) * - * Number of rotations per second can be overriden - * with the "roations_per_sec" parameter. + * Number of rotations per second can be overridden + * with the "images_per_sec" parameter. * * Can start/stop spinning. * @@ -49,11 +49,24 @@ class LLLoadingIndicator { LOG_CLASS(LLLoadingIndicator); public: + + struct Images : public LLInitParam::Block<Images> + { + Multiple<LLUIImage*> image; + + Images() + : image("image") + {} + }; + struct Params : public LLInitParam::Block<Params, LLUICtrl::Params> { - Optional<F32> rotations_per_sec; + Optional<F32> images_per_sec; + Batch<Images> images; + Params() - : rotations_per_sec("rotations_per_sec", 1.0f) + : images_per_sec("images_per_sec", 1.0f), + images("images") {} }; @@ -74,14 +87,15 @@ public: private: LLLoadingIndicator(const Params&); - friend class LLUICtrlFactory; + void initFromParams(const Params&); - class Data; + friend class LLUICtrlFactory; - F32 mRotationsPerSec; + F32 mImagesPerSec; S8 mCurImageIdx; - LLPointer<LLUIImage> mCurImagep; LLFrameTimer mImageSwitchTimer; + + std::vector<LLUIImagePtr> mImages; }; #endif // LL_LLLOADINGINDICATOR_H diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp index 87669574c2..8020ca802b 100644 --- a/indra/llui/llui.cpp +++ b/indra/llui/llui.cpp @@ -1626,8 +1626,8 @@ void LLUI::cleanupClass() { if(sImageProvider) { - sImageProvider->cleanUp(); - } + sImageProvider->cleanUp(); +} } void LLUI::setPopupFuncs(const add_popup_t& add_popup, const remove_popup_t& remove_popup, const clear_popups_t& clear_popups) @@ -2074,32 +2074,32 @@ const LLView* LLUI::resolvePath(const LLView* context, const std::string& path) namespace LLInitParam { - TypedParam<LLUIColor >::TypedParam(BlockDescriptor& descriptor, const char* name, const LLUIColor& value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count) - : super_t(descriptor, name, value, func, min_count, max_count), + ParamValue<LLUIColor, TypeValues<LLUIColor> >::ParamValue(const LLUIColor& color) + : super_t(color), red("red"), green("green"), blue("blue"), alpha("alpha"), control("") { - setBlockFromValue(); + updateBlockFromValue(); } - void TypedParam<LLUIColor>::setValueFromBlock() const + void ParamValue<LLUIColor, TypeValues<LLUIColor> >::updateValueFromBlock() { if (control.isProvided()) { - mData.mValue = LLUIColorTable::instance().getColor(control); + updateValue(LLUIColorTable::instance().getColor(control)); } else { - mData.mValue = LLColor4(red, green, blue, alpha); + updateValue(LLColor4(red, green, blue, alpha)); } } - void TypedParam<LLUIColor>::setBlockFromValue() + void ParamValue<LLUIColor, TypeValues<LLUIColor> >::updateBlockFromValue() { - LLColor4 color = mData.mValue.get(); + LLColor4 color = getValue(); red.set(color.mV[VRED], false); green.set(color.mV[VGREEN], false); blue.set(color.mV[VBLUE], false); @@ -2107,38 +2107,32 @@ namespace LLInitParam control.set("", false); } - void TypeValues<LLUIColor>::declareValues() - { - declare("white", LLColor4::white); - declare("black", LLColor4::black); - declare("red", LLColor4::red); - declare("green", LLColor4::green); - declare("blue", LLColor4::blue); - } - bool ParamCompare<const LLFontGL*, false>::equals(const LLFontGL* a, const LLFontGL* b) { return !(a->getFontDesc() < b->getFontDesc()) && !(b->getFontDesc() < a->getFontDesc()); } - TypedParam<const LLFontGL*>::TypedParam(BlockDescriptor& descriptor, const char* _name, const LLFontGL*const value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count) - : super_t(descriptor, _name, value, func, min_count, max_count), + ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::ParamValue(const LLFontGL* fontp) + : super_t(fontp), name("name"), size("size"), style("style") { - setBlockFromValue(); + if (!fontp) + { + updateValue(LLFontGL::getFontDefault()); + } addSynonym(name, ""); - setBlockFromValue(); + updateBlockFromValue(); } - void TypedParam<const LLFontGL*>::setValueFromBlock() const + void ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::updateValueFromBlock() { const LLFontGL* res_fontp = LLFontGL::getFontByName(name); if (res_fontp) { - mData.mValue = res_fontp; + updateValue(res_fontp); return; } @@ -2148,22 +2142,26 @@ namespace LLInitParam const LLFontGL* fontp = LLFontGL::getFont(desc); if (fontp) { - mData.mValue = fontp; - } + updateValue(fontp); + } + else + { + updateValue(LLFontGL::getFontDefault()); + } } - void TypedParam<const LLFontGL*>::setBlockFromValue() + void ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::updateBlockFromValue() { - if (mData.mValue) + if (getValue()) { - name.set(LLFontGL::nameFromFont(mData.mValue), false); - size.set(LLFontGL::sizeFromFont(mData.mValue), false); - style.set(LLFontGL::getStringFromStyle(mData.mValue->getFontDesc().getStyle()), false); + name.set(LLFontGL::nameFromFont(getValue()), false); + size.set(LLFontGL::sizeFromFont(getValue()), false); + style.set(LLFontGL::getStringFromStyle(getValue()->getFontDesc().getStyle()), false); } } - TypedParam<LLRect>::TypedParam(BlockDescriptor& descriptor, const char* name, const LLRect& value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count) - : super_t(descriptor, name, value, func, min_count, max_count), + ParamValue<LLRect, TypeValues<LLRect> >::ParamValue(const LLRect& rect) + : super_t(rect), left("left"), top("top"), right("right"), @@ -2171,10 +2169,10 @@ namespace LLInitParam width("width"), height("height") { - setBlockFromValue(); + updateBlockFromValue(); } - void TypedParam<LLRect>::setValueFromBlock() const + void ParamValue<LLRect, TypeValues<LLRect> >::updateValueFromBlock() { LLRect rect; @@ -2235,40 +2233,41 @@ namespace LLInitParam rect.mBottom = bottom; rect.mTop = top; } - mData.mValue = rect; + updateValue(rect); } - void TypedParam<LLRect>::setBlockFromValue() + void ParamValue<LLRect, TypeValues<LLRect> >::updateBlockFromValue() { // because of the ambiguity in specifying a rect by position and/or dimensions // we clear the "provided" flag so that values from xui/etc have priority // over those calculated from the rect object - left.set(mData.mValue.mLeft, false); - right.set(mData.mValue.mRight, false); - bottom.set(mData.mValue.mBottom, false); - top.set(mData.mValue.mTop, false); - width.set(mData.mValue.getWidth(), false); - height.set(mData.mValue.getHeight(), false); + LLRect& value = getValue(); + left.set(value.mLeft, false); + right.set(value.mRight, false); + bottom.set(value.mBottom, false); + top.set(value.mTop, false); + width.set(value.getWidth(), false); + height.set(value.getHeight(), false); } - TypedParam<LLCoordGL>::TypedParam(BlockDescriptor& descriptor, const char* name, LLCoordGL value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count) - : super_t(descriptor, name, value, func, min_count, max_count), + ParamValue<LLCoordGL, TypeValues<LLCoordGL> >::ParamValue(const LLCoordGL& coord) + : super_t(coord), x("x"), y("y") { - setBlockFromValue(); + updateBlockFromValue(); } - void TypedParam<LLCoordGL>::setValueFromBlock() const + void ParamValue<LLCoordGL, TypeValues<LLCoordGL> >::updateValueFromBlock() { - mData.mValue.set(x, y); + updateValue(LLCoordGL(x, y)); } - void TypedParam<LLCoordGL>::setBlockFromValue() + void ParamValue<LLCoordGL, TypeValues<LLCoordGL> >::updateBlockFromValue() { - x.set(mData.mValue.mX, false); - y.set(mData.mValue.mY, false); + x.set(getValue().mX, false); + y.set(getValue().mY, false); } diff --git a/indra/llui/llui.h b/indra/llui/llui.h index 50cb9e6632..6a43477693 100644 --- a/indra/llui/llui.h +++ b/indra/llui/llui.h @@ -398,10 +398,10 @@ public: namespace LLInitParam { template<> - class TypedParam<LLRect> - : public BlockValue<LLRect> + class ParamValue<LLRect, TypeValues<LLRect> > + : public CustomParamValue<LLRect> { - typedef BlockValue<LLRect> super_t; + typedef CustomParamValue<LLRect> super_t; public: Optional<S32> left, top, @@ -410,62 +410,43 @@ namespace LLInitParam width, height; - TypedParam(BlockDescriptor& descriptor, const char* name, const LLRect& value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count); + ParamValue(const LLRect& value); - void setValueFromBlock() const; - void setBlockFromValue(); + void updateValueFromBlock(); + void updateBlockFromValue(); }; template<> - struct TypeValues<LLUIColor> : public TypeValuesHelper<LLUIColor> + class ParamValue<LLUIColor, TypeValues<LLUIColor> > + : public CustomParamValue<LLUIColor> { - static void declareValues(); - }; + typedef CustomParamValue<LLUIColor> super_t; - template<> - class TypedParam<LLUIColor> - : public BlockValue<LLUIColor> - { - typedef BlockValue<LLUIColor> super_t; public: - Optional<F32> red, - green, - blue, - alpha; - Optional<std::string> control; - - TypedParam(BlockDescriptor& descriptor, const char* name, const LLUIColor& value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count); - void setValueFromBlock() const; - void setBlockFromValue(); + Optional<F32> red, + green, + blue, + alpha; + Optional<std::string> control; + + ParamValue(const LLUIColor& color); + void updateValueFromBlock(); + void updateBlockFromValue(); }; - // provide a better default for Optional<const LLFontGL*> than NULL - template <> - struct DefaultInitializer<const LLFontGL*> - { - // return reference to a single default instance of T - // built-in types will be initialized to zero, default constructor otherwise - static const LLFontGL* get() - { - static const LLFontGL* sDefaultFont = LLFontGL::getFontDefault(); - return sDefaultFont; - } - }; - - template<> - class TypedParam<const LLFontGL*> - : public BlockValue<const LLFontGL*> + class ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> > + : public CustomParamValue<const LLFontGL* > { - typedef BlockValue<const LLFontGL*> super_t; + typedef CustomParamValue<const LLFontGL*> super_t; public: Optional<std::string> name, size, style; - TypedParam(BlockDescriptor& descriptor, const char* name, const LLFontGL* const value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count); - void setValueFromBlock() const; - void setBlockFromValue(); + ParamValue(const LLFontGL* value); + void updateValueFromBlock(); + void updateBlockFromValue(); }; template<> @@ -494,17 +475,17 @@ namespace LLInitParam template<> - class TypedParam<LLCoordGL> - : public BlockValue<LLCoordGL> + class ParamValue<LLCoordGL, TypeValues<LLCoordGL> > + : public CustomParamValue<LLCoordGL> { - typedef BlockValue<LLCoordGL> super_t; + typedef CustomParamValue<LLCoordGL> super_t; public: Optional<S32> x, y; - TypedParam(BlockDescriptor& descriptor, const char* name, LLCoordGL value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count); - void setValueFromBlock() const; - void setBlockFromValue(); + ParamValue(const LLCoordGL& val); + void updateValueFromBlock(); + void updateBlockFromValue(); }; } diff --git a/indra/llui/lluiimage.cpp b/indra/llui/lluiimage.cpp index 1ffad4806e..f37947a50b 100644 --- a/indra/llui/lluiimage.cpp +++ b/indra/llui/lluiimage.cpp @@ -155,32 +155,32 @@ void LLUIImage::onImageLoaded() namespace LLInitParam { - void TypedParam<LLUIImage*>::setValueFromBlock() const + void ParamValue<LLUIImage*, TypeValues<LLUIImage*> >::updateValueFromBlock() { // The keyword "none" is specifically requesting a null image // do not default to current value. Used to overwrite template images. if (name() == "none") { - mData.mValue = NULL; + updateValue(NULL); return; } LLUIImage* imagep = LLUI::getUIImage(name()); if (imagep) { - mData.mValue = imagep; + updateValue(imagep); } } - void TypedParam<LLUIImage*>::setBlockFromValue() + void ParamValue<LLUIImage*, TypeValues<LLUIImage*> >::updateBlockFromValue() { - if (mData.mValue == NULL) + if (getValue() == NULL) { name.set("none", false); } else { - name.set(mData.mValue->getName(), false); + name.set(getValue()->getName(), false); } } diff --git a/indra/llui/lluiimage.h b/indra/llui/lluiimage.h index 38107c112d..139d88e0ac 100644 --- a/indra/llui/lluiimage.h +++ b/indra/llui/lluiimage.h @@ -92,22 +92,23 @@ protected: namespace LLInitParam { template<> - class TypedParam<LLUIImage*, TypeValues<LLUIImage*>, false> - : public BlockValue<LLUIImage*> + class ParamValue<LLUIImage*, TypeValues<LLUIImage*> > + : public CustomParamValue<LLUIImage*> { typedef boost::add_reference<boost::add_const<LLUIImage*>::type>::type T_const_ref; - typedef BlockValue<LLUIImage*> super_t; + typedef CustomParamValue<LLUIImage*> super_t; public: Optional<std::string> name; - TypedParam(BlockDescriptor& descriptor, const char* name, super_t::value_assignment_t value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count) - : super_t(descriptor, name, value, func, min_count, max_count) + ParamValue(LLUIImage* const& image) + : super_t(image) { - setBlockFromValue(); + updateBlockFromValue(); + addSynonym(name, "name"); } - void setValueFromBlock() const; - void setBlockFromValue(); + void updateValueFromBlock(); + void updateBlockFromValue(); }; // Need custom comparison function for our test app, which only loads diff --git a/indra/llui/tests/llurlentry_stub.cpp b/indra/llui/tests/llurlentry_stub.cpp index ac2412c928..ce80183842 100644 --- a/indra/llui/tests/llurlentry_stub.cpp +++ b/indra/llui/tests/llurlentry_stub.cpp @@ -114,29 +114,30 @@ namespace LLInitParam const U8* block_addr = reinterpret_cast<const U8*>(enclosing_block); mEnclosingBlockOffset = (U16)(my_addr - block_addr); } - void BaseBlock::setLastChangedParam(const Param& last_param, bool user_provided) {} + void BaseBlock::paramChanged(const Param& last_param, bool user_provided) {} - void BaseBlock::addParam(BlockDescriptor& block_data, const ParamDescriptor& in_param, const char* char_name){} + void BaseBlock::addParam(BlockDescriptor& block_data, const ParamDescriptorPtr in_param, const char* char_name){} + void BaseBlock::addSynonym(Param& param, const std::string& synonym) {} param_handle_t BaseBlock::getHandleFromParam(const Param* param) const {return 0;} void BaseBlock::init(BlockDescriptor& descriptor, BlockDescriptor& base_descriptor, size_t block_size) { descriptor.mCurrentBlockPtr = this; } - bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack){ return true; } - bool BaseBlock::serializeBlock(Parser& parser, Parser::name_stack_t name_stack, const LLInitParam::BaseBlock* diff_block) const { return true; } - bool BaseBlock::inspectBlock(Parser& parser, Parser::name_stack_t name_stack) const { return true; } + bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack, S32 generation){ return true; } + void BaseBlock::serializeBlock(Parser& parser, Parser::name_stack_t name_stack, const LLInitParam::BaseBlock* diff_block) const {} + bool BaseBlock::inspectBlock(Parser& parser, Parser::name_stack_t name_stack, S32 min_value, S32 max_value) const { return true; } bool BaseBlock::merge(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite) { return true; } bool BaseBlock::validateBlock(bool emit_errors) const { return true; } - TypedParam<LLUIColor >::TypedParam(BlockDescriptor& descriptor, const char* name, const LLUIColor& value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count) - : super_t(descriptor, name, value, func, min_count, max_count) + ParamValue<LLUIColor, TypeValues<LLUIColor> >::ParamValue(const LLUIColor& color) + : super_t(color) {} - void TypedParam<LLUIColor>::setValueFromBlock() const + void ParamValue<LLUIColor, TypeValues<LLUIColor> >::updateValueFromBlock() {} - void TypedParam<LLUIColor>::setBlockFromValue() + void ParamValue<LLUIColor, TypeValues<LLUIColor> >::updateBlockFromValue() {} void TypeValues<LLUIColor>::declareValues() @@ -147,14 +148,14 @@ namespace LLInitParam return false; } - TypedParam<const LLFontGL*>::TypedParam(BlockDescriptor& descriptor, const char* _name, const LLFontGL*const value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count) - : super_t(descriptor, _name, value, func, min_count, max_count) + ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::ParamValue(const LLFontGL* fontp) + : super_t(fontp) {} - void TypedParam<const LLFontGL*>::setValueFromBlock() const + void ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::updateValueFromBlock() {} - void TypedParam<const LLFontGL*>::setBlockFromValue() + void ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::updateBlockFromValue() {} void TypeValues<LLFontGL::HAlign>::declareValues() @@ -166,10 +167,10 @@ namespace LLInitParam void TypeValues<LLFontGL::ShadowType>::declareValues() {} - void TypedParam<LLUIImage*>::setValueFromBlock() const + void ParamValue<LLUIImage*, TypeValues<LLUIImage*> >::updateValueFromBlock() {} - void TypedParam<LLUIImage*>::setBlockFromValue() + void ParamValue<LLUIImage*, TypeValues<LLUIImage*> >::updateBlockFromValue() {} diff --git a/indra/llui/tests/llurlentry_test.cpp b/indra/llui/tests/llurlentry_test.cpp index 8f0a48018f..2f814f4200 100644 --- a/indra/llui/tests/llurlentry_test.cpp +++ b/indra/llui/tests/llurlentry_test.cpp @@ -70,6 +70,22 @@ S32 LLUIImage::getHeight() const return 0; } +namespace LLInitParam +{ + S32 Parser::sNextParseGeneration = 0; + BlockDescriptor::BlockDescriptor() {} + ParamDescriptor::ParamDescriptor(param_handle_t p, + merge_func_t merge_func, + deserialize_func_t deserialize_func, + serialize_func_t serialize_func, + validation_func_t validation_func, + inspect_func_t inspect_func, + S32 min_count, + S32 max_count){} + ParamDescriptor::~ParamDescriptor() {} + +} + namespace tut { struct LLUrlEntryData diff --git a/indra/llui/tests/llurlmatch_test.cpp b/indra/llui/tests/llurlmatch_test.cpp index fdaab00f18..439d60b43d 100644 --- a/indra/llui/tests/llurlmatch_test.cpp +++ b/indra/llui/tests/llurlmatch_test.cpp @@ -66,11 +66,25 @@ namespace LLInitParam BaseBlock::BaseBlock() {} BaseBlock::~BaseBlock() {} - void BaseBlock::setLastChangedParam(const Param& last_param, bool user_provided) {} - - void BaseBlock::addParam(BlockDescriptor& block_data, const ParamDescriptor& in_param, const char* char_name){} + S32 Parser::sNextParseGeneration = 0; + + BlockDescriptor::BlockDescriptor() {} + ParamDescriptor::ParamDescriptor(param_handle_t p, + merge_func_t merge_func, + deserialize_func_t deserialize_func, + serialize_func_t serialize_func, + validation_func_t validation_func, + inspect_func_t inspect_func, + S32 min_count, + S32 max_count){} + ParamDescriptor::~ParamDescriptor() {} + + void BaseBlock::paramChanged(const Param& last_param, bool user_provided) {} + + void BaseBlock::addParam(BlockDescriptor& block_data, const ParamDescriptorPtr in_param, const char* char_name){} param_handle_t BaseBlock::getHandleFromParam(const Param* param) const {return 0;} - + void BaseBlock::addSynonym(Param& param, const std::string& synonym) {} + void BaseBlock::init(BlockDescriptor& descriptor, BlockDescriptor& base_descriptor, size_t block_size) { descriptor.mCurrentBlockPtr = this; @@ -84,20 +98,20 @@ namespace LLInitParam mEnclosingBlockOffset = (U16)(my_addr - block_addr); } - bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack){ return true; } - bool BaseBlock::serializeBlock(Parser& parser, Parser::name_stack_t name_stack, const LLInitParam::BaseBlock* diff_block) const { return true; } - bool BaseBlock::inspectBlock(Parser& parser, Parser::name_stack_t name_stack) const { return true; } + bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack, S32 generation){ return true; } + void BaseBlock::serializeBlock(Parser& parser, Parser::name_stack_t name_stack, const LLInitParam::BaseBlock* diff_block) const {} + bool BaseBlock::inspectBlock(Parser& parser, Parser::name_stack_t name_stack, S32 min_count, S32 max_count) const { return true; } bool BaseBlock::merge(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite) { return true; } bool BaseBlock::validateBlock(bool emit_errors) const { return true; } - TypedParam<LLUIColor >::TypedParam(BlockDescriptor& descriptor, const char* name, const LLUIColor& value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count) - : super_t(descriptor, name, value, func, min_count, max_count) + ParamValue<LLUIColor, TypeValues<LLUIColor> >::ParamValue(const LLUIColor& color) + : super_t(color) {} - void TypedParam<LLUIColor>::setValueFromBlock() const + void ParamValue<LLUIColor, TypeValues<LLUIColor> >::updateValueFromBlock() {} - void TypedParam<LLUIColor>::setBlockFromValue() + void ParamValue<LLUIColor, TypeValues<LLUIColor> >::updateBlockFromValue() {} void TypeValues<LLUIColor>::declareValues() @@ -108,14 +122,15 @@ namespace LLInitParam return false; } - TypedParam<const LLFontGL*>::TypedParam(BlockDescriptor& descriptor, const char* _name, const LLFontGL*const value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count) - : super_t(descriptor, _name, value, func, min_count, max_count) + + ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::ParamValue(const LLFontGL* fontp) + : super_t(fontp) {} - void TypedParam<const LLFontGL*>::setValueFromBlock() const + void ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::updateValueFromBlock() {} - void TypedParam<const LLFontGL*>::setBlockFromValue() + void ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::updateBlockFromValue() {} void TypeValues<LLFontGL::HAlign>::declareValues() @@ -127,10 +142,10 @@ namespace LLInitParam void TypeValues<LLFontGL::ShadowType>::declareValues() {} - void TypedParam<LLUIImage*>::setValueFromBlock() const + void ParamValue<LLUIImage*, TypeValues<LLUIImage*> >::updateValueFromBlock() {} - void TypedParam<LLUIImage*>::setBlockFromValue() + void ParamValue<LLUIImage*, TypeValues<LLUIImage*> >::updateBlockFromValue() {} bool ParamCompare<LLUIImage*, false>::equals( diff --git a/indra/llxuixml/llinitparam.cpp b/indra/llxuixml/llinitparam.cpp index fcdbaa4309..3c4eb70a5d 100644 --- a/indra/llxuixml/llinitparam.cpp +++ b/indra/llxuixml/llinitparam.cpp @@ -43,9 +43,52 @@ namespace LLInitParam mEnclosingBlockOffset = (U16)(my_addr - block_addr); } + // + // ParamDescriptor + // + ParamDescriptor::ParamDescriptor(param_handle_t p, + merge_func_t merge_func, + deserialize_func_t deserialize_func, + serialize_func_t serialize_func, + validation_func_t validation_func, + inspect_func_t inspect_func, + S32 min_count, + S32 max_count) + : mParamHandle(p), + mMergeFunc(merge_func), + mDeserializeFunc(deserialize_func), + mSerializeFunc(serialize_func), + mValidationFunc(validation_func), + mInspectFunc(inspect_func), + mMinCount(min_count), + mMaxCount(max_count), + mGeneration(0), + mUserData(NULL) + {} + + ParamDescriptor::ParamDescriptor() + : mParamHandle(0), + mMergeFunc(NULL), + mDeserializeFunc(NULL), + mSerializeFunc(NULL), + mValidationFunc(NULL), + mInspectFunc(NULL), + mMinCount(0), + mMaxCount(0), + mGeneration(0), + mUserData(NULL) + {} + + ParamDescriptor::~ParamDescriptor() + { + delete mUserData; + } + // // Parser // + S32 Parser::sNextParseGeneration = 0; + Parser::~Parser() {} @@ -73,6 +116,12 @@ namespace LLInitParam std::copy(src_block_data.mAllParams.begin(), src_block_data.mAllParams.end(), std::back_inserter(mAllParams)); } + BlockDescriptor::BlockDescriptor() + : mMaxParamOffset(0), + mInitializationState(UNINITIALIZED), + mCurrentBlockPtr(NULL) + {} + // // BaseBlock // @@ -115,7 +164,7 @@ namespace LLInitParam bool BaseBlock::submitValue(const Parser::name_stack_t& name_stack, Parser& p, bool silent) { - if (!deserializeBlock(p, std::make_pair(name_stack.begin(), name_stack.end()))) + if (!deserializeBlock(p, std::make_pair(name_stack.begin(), name_stack.end()), -1)) { if (!silent) { @@ -145,7 +194,7 @@ namespace LLInitParam return true; } - bool BaseBlock::serializeBlock(Parser& parser, Parser::name_stack_t name_stack, const LLInitParam::BaseBlock* diff_block) const + void BaseBlock::serializeBlock(Parser& parser, Parser::name_stack_t name_stack, const LLInitParam::BaseBlock* diff_block) const { // named param is one like LLView::Params::follows // unnamed param is like LLView::Params::rect - implicit @@ -212,11 +261,9 @@ namespace LLInitParam name_stack.pop_back(); } } - - return true; } - bool BaseBlock::inspectBlock(Parser& parser, Parser::name_stack_t name_stack) const + bool BaseBlock::inspectBlock(Parser& parser, Parser::name_stack_t name_stack, S32 min_count, S32 max_count) const { // named param is one like LLView::Params::follows // unnamed param is like LLView::Params::rect - implicit @@ -273,11 +320,13 @@ namespace LLInitParam return true; } - bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack) + bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack, S32 parent_generation) { BlockDescriptor& block_data = mostDerivedBlockDescriptor(); bool names_left = name_stack.first != name_stack.second; + S32 parse_generation = name_stack.first == name_stack.second ? -1 : name_stack.first->second; + if (names_left) { const std::string& top_name = name_stack.first->first; @@ -294,7 +343,7 @@ namespace LLInitParam Parser::name_stack_range_t new_name_stack(name_stack.first, name_stack.second); ++new_name_stack.first; - return deserialize_func(*paramp, p, new_name_stack, name_stack.first == name_stack.second ? -1 : name_stack.first->second); + return deserialize_func(*paramp, p, new_name_stack, parse_generation); } } @@ -306,7 +355,7 @@ namespace LLInitParam Param* paramp = getParamFromHandle((*it)->mParamHandle); ParamDescriptor::deserialize_func_t deserialize_func = (*it)->mDeserializeFunc; - if (deserialize_func && deserialize_func(*paramp, p, name_stack, name_stack.first == name_stack.second ? -1 : name_stack.first->second)) + if (deserialize_func && deserialize_func(*paramp, p, name_stack, parse_generation)) { return true; } @@ -324,32 +373,32 @@ namespace LLInitParam } //static - void BaseBlock::addParam(BlockDescriptor& block_data, const ParamDescriptor& in_param, const char* char_name) + void BaseBlock::addParam(BlockDescriptor& block_data, const ParamDescriptorPtr in_param, const char* char_name) { // create a copy of the paramdescriptor in allparams // so other data structures can store a pointer to it block_data.mAllParams.push_back(in_param); - ParamDescriptor& param(block_data.mAllParams.back()); + ParamDescriptorPtr param(block_data.mAllParams.back()); std::string name(char_name); - if ((size_t)param.mParamHandle > block_data.mMaxParamOffset) + if ((size_t)param->mParamHandle > block_data.mMaxParamOffset) { llerrs << "Attempted to register param with block defined for parent class, make sure to derive from LLInitParam::Block<YOUR_CLASS, PARAM_BLOCK_BASE_CLASS>" << llendl; } if (name.empty()) { - block_data.mUnnamedParams.push_back(¶m); + block_data.mUnnamedParams.push_back(param); } else { // don't use insert, since we want to overwrite existing entries - block_data.mNamedParams[name] = ¶m; + block_data.mNamedParams[name] = param; } - if (param.mValidationFunc) + if (param->mValidationFunc) { - block_data.mValidationList.push_back(std::make_pair(param.mParamHandle, param.mValidationFunc)); + block_data.mValidationList.push_back(std::make_pair(param->mParamHandle, param->mValidationFunc)); } } @@ -367,7 +416,7 @@ namespace LLInitParam llerrs << "Attempted to register param with block defined for parent class, make sure to derive from LLInitParam::Block<YOUR_CLASS, PARAM_BLOCK_BASE_CLASS>" << llendl; } - ParamDescriptor* param_descriptor = findParamDescriptor(handle); + ParamDescriptorPtr param_descriptor = findParamDescriptor(param); if (param_descriptor) { if (synonym.empty()) @@ -382,7 +431,7 @@ namespace LLInitParam } } - void BaseBlock::setLastChangedParam(const Param& last_param, bool user_provided) + void BaseBlock::paramChanged(const Param& changed_param, bool user_provided) { if (user_provided) { @@ -404,17 +453,18 @@ namespace LLInitParam return LLStringUtil::null; } - ParamDescriptor* BaseBlock::findParamDescriptor(param_handle_t handle) + ParamDescriptorPtr BaseBlock::findParamDescriptor(const Param& param) { + param_handle_t handle = getHandleFromParam(¶m); BlockDescriptor& descriptor = mostDerivedBlockDescriptor(); BlockDescriptor::all_params_list_t::iterator end_it = descriptor.mAllParams.end(); for (BlockDescriptor::all_params_list_t::iterator it = descriptor.mAllParams.begin(); it != end_it; ++it) { - if (it->mParamHandle == handle) return &(*it); + if ((*it)->mParamHandle == handle) return *it; } - return NULL; + return ParamDescriptorPtr(); } // take all provided params from other and apply to self @@ -427,19 +477,14 @@ namespace LLInitParam it != end_it; ++it) { - const Param* other_paramp = other.getParamFromHandle(it->mParamHandle); - ParamDescriptor::merge_func_t merge_func = it->mMergeFunc; + const Param* other_paramp = other.getParamFromHandle((*it)->mParamHandle); + ParamDescriptor::merge_func_t merge_func = (*it)->mMergeFunc; if (merge_func) { - Param* paramp = getParamFromHandle(it->mParamHandle); + Param* paramp = getParamFromHandle((*it)->mParamHandle); some_param_changed |= merge_func(*paramp, *other_paramp, overwrite); } } return some_param_changed; } - - bool ParamCompare<LLSD, false>::equals(const LLSD &a, const LLSD &b) - { - return false; - } } diff --git a/indra/llxuixml/llinitparam.h b/indra/llxuixml/llinitparam.h index 1f9045754a..39ba32e537 100644 --- a/indra/llxuixml/llinitparam.h +++ b/indra/llxuixml/llinitparam.h @@ -1,5 +1,5 @@ /** -f * @file llinitparam.h + * @file llinitparam.h * @brief parameter block abstraction for creating complex objects and * parsing construction parameters from xml and LLSD * @@ -29,18 +29,14 @@ f * @file llinitparam.h #define LL_LLPARAM_H #include <vector> - -#include <stddef.h> #include <boost/function.hpp> -#include <boost/bind.hpp> #include <boost/type_traits/is_convertible.hpp> #include <boost/unordered_map.hpp> -#include "llregistry.h" -#include "llmemory.h" - +#include <boost/shared_ptr.hpp> namespace LLInitParam { + template<typename T> const T& defaultValue() { static T value; return value; } template <typename T, bool IS_BOOST_FUNCTION = boost::is_convertible<T, boost::function_base>::value > struct ParamCompare @@ -61,122 +57,119 @@ namespace LLInitParam } }; - // default constructor adaptor for InitParam Values - // constructs default instances of the given type, returned by const reference - template <typename T> - struct DefaultInitializer + template<> + struct ParamCompare<LLSD, false> { - typedef const T& T_const_ref; - // return reference to a single default instance of T - // built-in types will be initialized to zero, default constructor otherwise - static T_const_ref get() { static T t = T(); return t; } + static bool equals(const LLSD &a, const LLSD &b) { return false; } }; // helper functions and classes typedef ptrdiff_t param_handle_t; + // empty default implementation of key cache + // leverages empty base class optimization template <typename T> class TypeValues { public: - // empty default implemenation of key cache - class KeyCache + typedef std::map<std::string, T> value_name_map_t; + + void setValueName(const std::string& key) {} + std::string getValueName() const { return ""; } + void clearValueName() const {} + + static bool getValueFromName(const std::string& name, T& value) { - public: - void setKey(const std::string& key) {} - std::string getKey() const { return ""; } - void clearKey(){} - }; + return false; + } - static bool get(const std::string& name, T& value) + static bool valueNamesExist() { return false; } - static bool empty() + static std::vector<std::string>* getPossibleValues() { - return true; + return NULL; } - static std::vector<std::string>* getPossibleValues() { return NULL; } + static value_name_map_t* getValueNames() {return NULL;} }; template <typename T, typename DERIVED_TYPE = TypeValues<T> > class TypeValuesHelper - : public LLRegistrySingleton<std::string, T, DERIVED_TYPE > { - typedef LLRegistrySingleton<std::string, T, DERIVED_TYPE> super_t; - typedef LLSingleton<DERIVED_TYPE> singleton_t; public: + typedef std::map<std::string, T> value_name_map_t; //TODO: cache key by index to save on param block size - class KeyCache + void setValueName(const std::string& value_name) { - public: - void setKey(const std::string& key) - { - mKey = key; - } - - void clearKey() - { - mKey = ""; - } + mValueName = value_name; + } - std::string getKey() const - { - return mKey; - } + std::string getValueName() const + { + return mValueName; + } - private: - std::string mKey; - }; + void clearValueName() const + { + mValueName.clear(); + } - static bool get(const std::string& name, T& value) + static bool getValueFromName(const std::string& name, T& value) { - if (!singleton_t::instance().exists(name)) return false; + value_name_map_t* map = getValueNames(); + value_name_map_t::iterator found_it = map->find(name); + if (found_it == map->end()) return false; - value = *singleton_t::instance().getValue(name); + value = found_it->second; return true; } - static bool empty() + static bool valueNamesExist() { - return singleton_t::instance().LLRegistry<std::string, T>::empty(); + return !getValueNames()->empty(); } - //override this to add name value pairs - static void declareValues() {} - - void initSingleton() + static value_name_map_t* getValueNames() { - DERIVED_TYPE::declareValues(); - } + static value_name_map_t sMap; + static bool sInitialized = false; - static const std::vector<std::string>* getPossibleValues() - { - // in order to return a pointer to a member, we lazily - // evaluate the result and store it in mValues here - if (singleton_t::instance().mValues.empty()) + if (!sInitialized) { - typename super_t::Registrar::registry_map_t::const_iterator it; - for (it = super_t::defaultRegistrar().beginItems(); it != super_t::defaultRegistrar().endItems(); ++it) - { - singleton_t::instance().mValues.push_back(it->first); - } + sInitialized = true; + DERIVED_TYPE::declareValues(); } - return &singleton_t::instance().mValues; + return &sMap; } + static std::vector<std::string>* getPossibleValues() + { + static std::vector<std::string> sValues; + + value_name_map_t* map = getValueNames(); + for (value_name_map_t::iterator it = map->begin(), end_it = map->end(); + it != end_it; + ++it) + { + sValues.push_back(it->first); + } + return &sValues; + } - protected: static void declare(const std::string& name, const T& value) { - super_t::defaultRegistrar().add(name, value); + (*getValueNames())[name] = value; } - private: - std::vector<std::string> mValues; + protected: + static void getName(const std::string& name, const T& value) + {} + + mutable std::string mValueName; }; class Parser @@ -193,9 +186,9 @@ namespace LLInitParam } }; - typedef std::vector<std::pair<std::string, S32> > name_stack_t; + typedef std::vector<std::pair<std::string, S32> > name_stack_t; typedef std::pair<name_stack_t::const_iterator, name_stack_t::const_iterator> name_stack_range_t; - typedef std::vector<std::string> possible_values_t; + typedef std::vector<std::string> possible_values_t; typedef bool (*parser_read_func_t)(Parser& parser, void* output); typedef bool (*parser_write_func_t)(Parser& parser, const void*, const name_stack_t&); @@ -207,7 +200,7 @@ namespace LLInitParam Parser(parser_read_func_map_t& read_map, parser_write_func_map_t& write_map, parser_inspect_func_map_t& inspect_map) : mParseSilently(false), - mParseGeneration(0), + mParseGeneration(sNextParseGeneration), mParserReadFuncs(&read_map), mParserWriteFuncs(&write_map), mParserInspectFuncs(&inspect_map) @@ -252,7 +245,7 @@ namespace LLInitParam void setParseSilently(bool silent) { mParseSilently = silent; } S32 getParseGeneration() { return mParseGeneration; } - S32 newParseGeneration() { return ++mParseGeneration; } + S32 newParseGeneration() { return mParseGeneration = ++sNextParseGeneration; } protected: @@ -276,6 +269,8 @@ namespace LLInitParam parser_write_func_map_t* mParserWriteFuncs; parser_inspect_func_map_t* mParserInspectFuncs; S32 mParseGeneration; + + static S32 sNextParseGeneration; }; // used to indicate no matching value to a given name when parsing @@ -295,12 +290,13 @@ namespace LLInitParam Param(class BaseBlock* enclosing_block); // store pointer to enclosing block as offset to reduce space and allow for quick copying - BaseBlock& enclosingBlock() const + class BaseBlock& enclosingBlock() const { const U8* my_addr = reinterpret_cast<const U8*>(this); // get address of enclosing BLOCK class using stored offset to enclosing BaseBlock class - return *const_cast<BaseBlock*>( - reinterpret_cast<const BaseBlock*>(my_addr - (ptrdiff_t)(S32)mEnclosingBlockOffset)); + return *const_cast<class BaseBlock*> + (reinterpret_cast<const class BaseBlock*> + (my_addr - (ptrdiff_t)(S32)mEnclosingBlockOffset)); } private: @@ -313,7 +309,11 @@ namespace LLInitParam // various callbacks and constraints associated with an individual param struct ParamDescriptor { - public: + struct UserData + { + virtual ~UserData() {} + }; + typedef bool(*merge_func_t)(Param&, const Param&, bool); typedef bool(*deserialize_func_t)(Param&, Parser&, const Parser::name_stack_range_t&, S32); typedef void(*serialize_func_t)(const Param&, Parser&, Parser::name_stack_t&, const Param* diff_param); @@ -321,40 +321,18 @@ namespace LLInitParam typedef bool(*validation_func_t)(const Param*); ParamDescriptor(param_handle_t p, - merge_func_t merge_func, - deserialize_func_t deserialize_func, - serialize_func_t serialize_func, - validation_func_t validation_func, - inspect_func_t inspect_func, - S32 min_count, - S32 max_count) - : mParamHandle(p), - mMergeFunc(merge_func), - mDeserializeFunc(deserialize_func), - mSerializeFunc(serialize_func), - mValidationFunc(validation_func), - mInspectFunc(inspect_func), - mMinCount(min_count), - mMaxCount(max_count), - mGeneration(0), - mNumRefs(0) - {} + merge_func_t merge_func, + deserialize_func_t deserialize_func, + serialize_func_t serialize_func, + validation_func_t validation_func, + inspect_func_t inspect_func, + S32 min_count, + S32 max_count); - ParamDescriptor() - : mParamHandle(0), - mMergeFunc(NULL), - mDeserializeFunc(NULL), - mSerializeFunc(NULL), - mValidationFunc(NULL), - mInspectFunc(NULL), - mMinCount(0), - mMaxCount(0), - mGeneration(0), - mNumRefs(0) - {} + ParamDescriptor(); + ~ParamDescriptor(); param_handle_t mParamHandle; - merge_func_t mMergeFunc; deserialize_func_t mDeserializeFunc; serialize_func_t mSerializeFunc; @@ -364,17 +342,16 @@ namespace LLInitParam S32 mMaxCount; S32 mGeneration; S32 mNumRefs; + UserData* mUserData; }; + typedef boost::shared_ptr<ParamDescriptor> ParamDescriptorPtr; + // each derived Block class keeps a static data structure maintaining offsets to various params class BlockDescriptor { public: - BlockDescriptor() - : mMaxParamOffset(0), - mInitializationState(UNINITIALIZED), - mCurrentBlockPtr(NULL) - {} + BlockDescriptor(); typedef enum e_initialization_state { @@ -385,12 +362,10 @@ namespace LLInitParam void aggregateBlockData(BlockDescriptor& src_block_data); - public: - typedef boost::unordered_map<const std::string, ParamDescriptor*> param_map_t; // references param descriptors stored in mAllParams - typedef std::vector<ParamDescriptor*> param_list_t; - - typedef std::list<ParamDescriptor> all_params_list_t;// references param descriptors stored in mAllParams - typedef std::vector<std::pair<param_handle_t, ParamDescriptor::validation_func_t> > param_validation_list_t; + typedef boost::unordered_map<const std::string, ParamDescriptorPtr> param_map_t; + typedef std::vector<ParamDescriptorPtr> param_list_t; + typedef std::list<ParamDescriptorPtr> all_params_list_t; + typedef std::vector<std::pair<param_handle_t, ParamDescriptor::validation_func_t> > param_validation_list_t; param_map_t mNamedParams; // parameters with associated names param_list_t mUnnamedParams; // parameters with_out_ associated names @@ -456,6 +431,7 @@ namespace LLInitParam Param* getParamFromHandle(const param_handle_t param_handle) { if (param_handle == 0) return NULL; + U8* baseblock_address = reinterpret_cast<U8*>(this); return reinterpret_cast<Param*>(baseblock_address + param_handle); } @@ -469,14 +445,13 @@ namespace LLInitParam void addSynonym(Param& param, const std::string& synonym); // Blocks can override this to do custom tracking of changes - virtual void setLastChangedParam(const Param& last_param, bool user_provided); + virtual void paramChanged(const Param& changed_param, bool user_provided); S32 getLastChangeVersion() const { return mChangeVersion; } - bool isDefault() const { return mChangeVersion == 0; } - bool deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack); - bool serializeBlock(Parser& p, Parser::name_stack_t name_stack = Parser::name_stack_t(), const BaseBlock* diff_block = NULL) const; - bool inspectBlock(Parser& p, Parser::name_stack_t name_stack = Parser::name_stack_t()) const; + bool deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack, S32 generation); + void serializeBlock(Parser& p, Parser::name_stack_t name_stack = Parser::name_stack_t(), const BaseBlock* diff_block = NULL) const; + bool inspectBlock(Parser& p, Parser::name_stack_t name_stack = Parser::name_stack_t(), S32 min_count = 0, S32 max_count = S32_MAX) const; virtual const BlockDescriptor& mostDerivedBlockDescriptor() const { return selfBlockDescriptor(); } virtual BlockDescriptor& mostDerivedBlockDescriptor() { return selfBlockDescriptor(); } @@ -493,7 +468,10 @@ namespace LLInitParam return false; } - static void addParam(BlockDescriptor& block_data, const ParamDescriptor& param, const char* name); + static void addParam(BlockDescriptor& block_data, ParamDescriptorPtr param, const char* name); + + ParamDescriptorPtr findParamDescriptor(const Param& param); + protected: void init(BlockDescriptor& descriptor, BlockDescriptor& base_descriptor, size_t block_size); @@ -512,63 +490,132 @@ namespace LLInitParam private: const std::string& getParamName(const BlockDescriptor& block_data, const Param* paramp) const; - ParamDescriptor* findParamDescriptor(param_handle_t handle); - }; - - - template<typename T> - struct ParamIterator - { - typedef typename std::vector<T>::const_iterator const_iterator; - typedef typename std::vector<T>::iterator iterator; }; // these templates allow us to distinguish between template parameters // that derive from BaseBlock and those that don't - // this is supposedly faster than boost::is_convertible and its ilk template<typename T, typename Void = void> - struct IsBaseBlock + struct IsBlock { static const bool value = false; }; template<typename T> - struct IsBaseBlock<T, typename T::baseblock_base_class_t> + struct IsBlock<T, typename T::baseblock_base_class_t> { static const bool value = true; }; + template<typename T, typename NAME_VALUE_LOOKUP, bool VALUE_IS_BLOCK = IsBlock<T>::value> + class ParamValue : public NAME_VALUE_LOOKUP + { + public: + typedef const T& value_assignment_t; + + ParamValue(): mValue() {} + ParamValue(const T& other) : mValue(other) {} + + void setValue(value_assignment_t val) + { + mValue = val; + } + + value_assignment_t getValue() const + { + return mValue; + } + + T& getValue() + { + return mValue; + } + + private: + T mValue; + }; + + template<typename T, typename NAME_VALUE_LOOKUP> + class ParamValue<T, NAME_VALUE_LOOKUP, true> + : public T, + public NAME_VALUE_LOOKUP + { + public: + typedef const T& value_assignment_t; + + S32 mKeyVersion; + mutable S32 mValidatedVersion; + mutable bool mValidated; // lazy validation flag + + ParamValue() + : T(), + mKeyVersion(0), + mValidatedVersion(-1), + mValidated(false) + {} + + ParamValue(const T& other) + : T(other), + mKeyVersion(0), + mValidatedVersion(-1), + mValidated(false) + { + } + + void setValue(value_assignment_t val) + { + *this = val; + } + + value_assignment_t getValue() const + { + return *this; + } + + T& getValue() + { + return *this; + } + }; + + template<typename T, typename NAME_VALUE_LOOKUP = TypeValues<T> > + struct ParamIterator + { + typedef typename std::vector<ParamValue<T, NAME_VALUE_LOOKUP> >::const_iterator const_iterator; + typedef typename std::vector<ParamValue<T, NAME_VALUE_LOOKUP> >::iterator iterator; + }; + // specialize for custom parsing/decomposition of specific classes // e.g. TypedParam<LLRect> has left, top, right, bottom, etc... template<typename T, typename NAME_VALUE_LOOKUP = TypeValues<T>, bool HAS_MULTIPLE_VALUES = false, - bool VALUE_IS_BLOCK = IsBaseBlock<T>::value> + bool VALUE_IS_BLOCK = IsBlock<ParamValue<T, NAME_VALUE_LOOKUP> >::value> class TypedParam - : public Param + : public Param, + public ParamValue<T, NAME_VALUE_LOOKUP> { public: - typedef const T& value_const_ref_t; - typedef value_const_ref_t value_assignment_t; - typedef typename NAME_VALUE_LOOKUP::KeyCache key_cache_t; + typedef const T& value_assignment_t; typedef TypedParam<T, NAME_VALUE_LOOKUP, HAS_MULTIPLE_VALUES, VALUE_IS_BLOCK> self_t; + typedef NAME_VALUE_LOOKUP name_value_lookup_t; TypedParam(BlockDescriptor& block_descriptor, const char* name, value_assignment_t value, ParamDescriptor::validation_func_t validate_func, S32 min_count, S32 max_count) : Param(block_descriptor.mCurrentBlockPtr) { if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING)) { - ParamDescriptor param_descriptor(block_descriptor.mCurrentBlockPtr->getHandleFromParam(this), + ParamDescriptorPtr param_descriptor = ParamDescriptorPtr(new ParamDescriptor( + block_descriptor.mCurrentBlockPtr->getHandleFromParam(this), &mergeWith, &deserializeParam, &serializeParam, validate_func, &inspectParam, - min_count, max_count); + min_count, max_count)); BaseBlock::addParam(block_descriptor, param_descriptor, name); } - mData.mValue = value; + setValue(value); } bool isProvided() const { return Param::anyProvided(); } @@ -579,27 +626,27 @@ namespace LLInitParam // no further names in stack, attempt to parse value now if (name_stack.first == name_stack.second) { - if (parser.readValue(typed_param.mData.mValue)) + if (parser.readValue(typed_param.getValue())) { - typed_param.mData.clearKey(); + typed_param.clearValueName(); typed_param.setProvided(true); - typed_param.enclosingBlock().setLastChangedParam(param, true); + typed_param.enclosingBlock().paramChanged(param, true); return true; } // try to parse a known named value - if(!NAME_VALUE_LOOKUP::empty()) + if(name_value_lookup_t::valueNamesExist()) { // try to parse a known named value std::string name; if (parser.readValue(name)) { // try to parse a per type named value - if (NAME_VALUE_LOOKUP::get(name, typed_param.mData.mValue)) + if (name_value_lookup_t::getValueFromName(name, typed_param.getValue())) { - typed_param.mData.setKey(name); + typed_param.setValueName(name); typed_param.setProvided(true); - typed_param.enclosingBlock().setLastChangedParam(param, true); + typed_param.enclosingBlock().paramChanged(param, true); return true; } @@ -619,13 +666,13 @@ namespace LLInitParam name_stack.back().second = parser.newParseGeneration(); } - std::string key = typed_param.mData.getKey(); + std::string key = typed_param.getValueName(); // first try to write out name of name/value pair if (!key.empty()) { - if (!diff_param || !ParamCompare<std::string>::equals(static_cast<const self_t*>(diff_param)->mData.getKey(), key)) + if (!diff_param || !ParamCompare<std::string>::equals(static_cast<const self_t*>(diff_param)->getValueName(), key)) { if (!parser.writeValue(key, name_stack)) { @@ -634,8 +681,9 @@ namespace LLInitParam } } // then try to serialize value directly - else if (!diff_param || !ParamCompare<T>::equals(typed_param.get(), static_cast<const self_t*>(diff_param)->get())) { - if (!parser.writeValue(typed_param.mData.mValue, name_stack)) + else if (!diff_param || !ParamCompare<T>::equals(typed_param.getValue(), static_cast<const self_t*>(diff_param)->getValue())) + { + if (!parser.writeValue(typed_param.getValue(), name_stack)) { return; } @@ -647,18 +695,18 @@ namespace LLInitParam // tell parser about our actual type parser.inspectValue<T>(name_stack, min_count, max_count, NULL); // then tell it about string-based alternatives ("red", "blue", etc. for LLColor4) - if (NAME_VALUE_LOOKUP::getPossibleValues()) + if (name_value_lookup_t::getPossibleValues()) { - parser.inspectValue<std::string>(name_stack, min_count, max_count, NAME_VALUE_LOOKUP::getPossibleValues()); + parser.inspectValue<std::string>(name_stack, min_count, max_count, name_value_lookup_t::getPossibleValues()); } } void set(value_assignment_t val, bool flag_as_provided = true) { - mData.mValue = val; - mData.clearKey(); + setValue(val); + clearValueName(); setProvided(flag_as_provided); - Param::enclosingBlock().setLastChangedParam(*this, flag_as_provided); + Param::enclosingBlock().paramChanged(*this, flag_as_provided); } void setIfNotProvided(value_assignment_t val, bool flag_as_provided = true) @@ -670,65 +718,55 @@ namespace LLInitParam } // implicit conversion - operator value_assignment_t() const { return get(); } + operator value_assignment_t() const { return getValue(); } // explicit conversion - value_assignment_t operator()() const { return get(); } + value_assignment_t operator()() const { return getValue(); } protected: - value_assignment_t get() const - { - return mData.mValue; - } static bool mergeWith(Param& dst, const Param& src, bool overwrite) { const self_t& src_typed_param = static_cast<const self_t&>(src); self_t& dst_typed_param = static_cast<self_t&>(dst); + if (src_typed_param.isProvided() && (overwrite || !dst_typed_param.isProvided())) { - dst_typed_param.mData.clearKey(); - dst_typed_param.set(src_typed_param.get()); + dst_typed_param.clearValueName(); + dst_typed_param.set(src_typed_param.getValue()); return true; } return false; } - - struct Data : public key_cache_t - { - T mValue; - }; - - Data mData; }; // parameter that is a block template <typename T, typename NAME_VALUE_LOOKUP> class TypedParam<T, NAME_VALUE_LOOKUP, false, true> - : public T, - public Param + : public Param, + public ParamValue<T, NAME_VALUE_LOOKUP> { public: typedef const T value_const_t; typedef T value_t; - typedef value_const_t& value_const_ref_t; - typedef value_const_ref_t value_assignment_t; - typedef typename NAME_VALUE_LOOKUP::KeyCache key_cache_t; + typedef value_const_t& value_assignment_t; typedef TypedParam<T, NAME_VALUE_LOOKUP, false, true> self_t; + typedef NAME_VALUE_LOOKUP name_value_lookup_t; TypedParam(BlockDescriptor& block_descriptor, const char* name, value_assignment_t value, ParamDescriptor::validation_func_t validate_func, S32 min_count, S32 max_count) : Param(block_descriptor.mCurrentBlockPtr), - T(value) + ParamValue(value) { if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING)) { - ParamDescriptor param_descriptor(block_descriptor.mCurrentBlockPtr->getHandleFromParam(this), + ParamDescriptorPtr param_descriptor = ParamDescriptorPtr(new ParamDescriptor( + block_descriptor.mCurrentBlockPtr->getHandleFromParam(this), &mergeWith, &deserializeParam, &serializeParam, validate_func, &inspectParam, - min_count, max_count); + min_count, max_count)); BaseBlock::addParam(block_descriptor, param_descriptor, name); } } @@ -737,25 +775,27 @@ namespace LLInitParam { self_t& typed_param = static_cast<self_t&>(param); // attempt to parse block... - if(typed_param.deserializeBlock(parser, name_stack)) + if(typed_param.deserializeBlock(parser, name_stack, generation)) { - typed_param.mData.clearKey(); - typed_param.enclosingBlock().setLastChangedParam(param, true); + typed_param.clearValueName(); + typed_param.enclosingBlock().paramChanged(param, true); + typed_param.setProvided(true); return true; } - if(!NAME_VALUE_LOOKUP::empty()) + if(name_value_lookup_t::valueNamesExist()) { // try to parse a known named value std::string name; if (parser.readValue(name)) { // try to parse a per type named value - if (NAME_VALUE_LOOKUP::get(name, typed_param)) + if (name_value_lookup_t::getValueFromName(name, typed_param.getValue())) { - typed_param.enclosingBlock().setLastChangedParam(param, true); - typed_param.mData.setKey(name); - typed_param.mData.mKeyVersion = typed_param.getLastChangeVersion(); + typed_param.enclosingBlock().paramChanged(param, true); + typed_param.setValueName(name); + typed_param.setProvided(true); + typed_param.mKeyVersion = typed_param.getLastChangeVersion(); return true; } @@ -767,13 +807,15 @@ namespace LLInitParam static void serializeParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, const Param* diff_param) { const self_t& typed_param = static_cast<const self_t&>(param); + if (!typed_param.isProvided()) return; + if (!name_stack.empty()) { name_stack.back().second = parser.newParseGeneration(); } - std::string key = typed_param.mData.getKey(); - if (!key.empty() && typed_param.mData.mKeyVersion == typed_param.getLastChangeVersion()) + std::string key = typed_param.getValueName(); + if (!key.empty() && typed_param.mKeyVersion == typed_param.getLastChangeVersion()) { if (!parser.writeValue(key, name_stack)) { @@ -790,33 +832,33 @@ namespace LLInitParam { // I am a param that is also a block, so just recurse into my contents const self_t& typed_param = static_cast<const self_t&>(param); - typed_param.inspectBlock(parser, name_stack); + typed_param.inspectBlock(parser, name_stack, min_count, max_count); } // a param-that-is-a-block is provided when the user has set one of its child params // *and* the block as a whole validates bool isProvided() const { - // only validate block when it hasn't already passed validation and user has supplied *some* value - if (Param::anyProvided() && mData.mValidatedVersion < T::getLastChangeVersion()) + // only validate block when it hasn't already passed validation with current data + if (Param::anyProvided() && mValidatedVersion < getLastChangeVersion()) { // a sub-block is "provided" when it has been filled in enough to be valid - mData.mValidated = T::validateBlock(false); - mData.mValidatedVersion = T::getLastChangeVersion(); + mValidated = validateBlock(false); + mValidatedVersion = getLastChangeVersion(); } - return Param::anyProvided() && mData.mValidated; + return Param::anyProvided() && mValidated; } // assign block contents to this param-that-is-a-block void set(value_assignment_t val, bool flag_as_provided = true) { - value_t::operator=(val); - mData.clearKey(); + setValue(val); + clearValueName(); // force revalidation of block by clearing known provided version // next call to isProvided() will update provision status based on validity - mData.mValidatedVersion = 0; + mValidatedVersion = -1; setProvided(flag_as_provided); - Param::enclosingBlock().setLastChangedParam(*this, flag_as_provided); + Param::enclosingBlock().paramChanged(*this, flag_as_provided); } void setIfNotProvided(value_assignment_t val, bool flag_as_provided = true) @@ -828,10 +870,10 @@ namespace LLInitParam } // propagate changed status up to enclosing block - /*virtual*/ void setLastChangedParam(const Param& last_param, bool user_provided) + /*virtual*/ void paramChanged(const Param& changed_param, bool user_provided) { - T::setLastChangedParam(last_param, user_provided); - Param::enclosingBlock().setLastChangedParam(*this, user_provided); + ParamValue<T, NAME_VALUE_LOOKUP>::paramChanged(changed_param, user_provided); + Param::enclosingBlock().paramChanged(*this, user_provided); if (user_provided) { // a child param has been explicitly changed @@ -841,41 +883,28 @@ namespace LLInitParam } // implicit conversion - operator value_assignment_t() const { return get(); } + operator value_assignment_t() const { return getValue(); } // explicit conversion - value_assignment_t operator()() const { return get(); } + value_assignment_t operator()() const { return getValue(); } protected: - value_assignment_t get() const - { - return *this; - } static bool mergeWith(Param& dst, const Param& src, bool overwrite) { const self_t& src_typed_param = static_cast<const self_t&>(src); self_t& dst_typed_param = static_cast<self_t&>(dst); - if (dst_typed_param.T::merge(T::selfBlockDescriptor(), src_typed_param, overwrite)) + + if (src_typed_param.isProvided() + && (overwrite || !dst_typed_param.isProvided())) { - dst_typed_param.mData.clearKey(); - return true; + if (dst_typed_param.merge(selfBlockDescriptor(), src_typed_param, overwrite)) + { + dst_typed_param.clearValueName(); + return true; + } } return false; } - - struct Data : public key_cache_t - { - S32 mKeyVersion; - mutable S32 mValidatedVersion; - mutable bool mValidated; // lazy validation flag - - Data() - : mKeyVersion(0), - mValidatedVersion(0), - mValidated(false) - {} - }; - Data mData; }; // container of non-block parameters @@ -885,29 +914,27 @@ namespace LLInitParam { public: typedef TypedParam<VALUE_TYPE, NAME_VALUE_LOOKUP, true, false> self_t; - typedef typename std::vector<VALUE_TYPE> container_t; + typedef typename std::vector<ParamValue<VALUE_TYPE, NAME_VALUE_LOOKUP> > container_t; typedef const container_t& value_assignment_t; typedef VALUE_TYPE value_t; - typedef value_t& value_ref_t; - typedef const value_t& value_const_ref_t; + typedef NAME_VALUE_LOOKUP name_value_lookup_t; - typedef typename NAME_VALUE_LOOKUP::KeyCache key_cache_t; - TypedParam(BlockDescriptor& block_descriptor, const char* name, value_assignment_t value, ParamDescriptor::validation_func_t validate_func, S32 min_count, S32 max_count) : Param(block_descriptor.mCurrentBlockPtr), - mValues(value) { - mCachedKeys.resize(mValues.size()); + std::copy(value.begin(), value.end(), std::back_inserter(mValues)); + if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING)) { - ParamDescriptor param_descriptor(block_descriptor.mCurrentBlockPtr->getHandleFromParam(this), + ParamDescriptorPtr param_descriptor = ParamDescriptorPtr(new ParamDescriptor( + block_descriptor.mCurrentBlockPtr->getHandleFromParam(this), &mergeWith, &deserializeParam, &serializeParam, validate_func, &inspectParam, - min_count, max_count); + min_count, max_count)); BaseBlock::addParam(block_descriptor, param_descriptor, name); } } @@ -924,29 +951,22 @@ namespace LLInitParam // attempt to read value directly if (parser.readValue(value)) { - typed_param.mValues.push_back(value); - // save an empty name/value key as a placeholder - typed_param.mCachedKeys.push_back(key_cache_t()); - typed_param.enclosingBlock().setLastChangedParam(param, true); - typed_param.setProvided(true); + typed_param.add(value); return true; } // try to parse a known named value - if(!NAME_VALUE_LOOKUP::empty()) + if(name_value_lookup_t::valueNamesExist()) { // try to parse a known named value std::string name; if (parser.readValue(name)) { // try to parse a per type named value - if (NAME_VALUE_LOOKUP::get(name, typed_param.mValues)) + if (name_value_lookup_t::getValueFromName(name, typed_param.mValues)) { - typed_param.mValues.push_back(value); - typed_param.mCachedKeys.push_back(key_cache_t()); - typed_param.mCachedKeys.back().setKey(name); - typed_param.enclosingBlock().setLastChangedParam(param, true); - typed_param.setProvided(true); + typed_param.add(value); + typed_param.mValues.back().setValueName(name); return true; } @@ -961,25 +981,27 @@ namespace LLInitParam const self_t& typed_param = static_cast<const self_t&>(param); if (!typed_param.isProvided() || name_stack.empty()) return; - const_iterator it = typed_param.mValues.begin(); - for (typename std::vector<key_cache_t>::const_iterator key_it = typed_param.mCachedKeys.begin(); - it != typed_param.mValues.end(); - ++key_it, ++it) + for (const_iterator it = typed_param.mValues.begin(), end_it = typed_param.mValues.end(); + it != end_it; + ++it) { - std::string key = key_it->get(); + std::string key = it->getValue(); name_stack.back().second = parser.newParseGeneration(); - if(!key.empty()) + if(key.empty()) + // not parsed via name values, write out value directly { - if(!parser.writeValue(key, name_stack)) + if (!parser.writeValue(*it, name_stack)) { - return; + break; } } - // not parse via name values, write out value directly - else if (!parser.writeValue(*it, name_stack)) + else { - return; + if(!parser.writeValue(key, name_stack)) + { + break; + } } } } @@ -987,19 +1009,17 @@ namespace LLInitParam static void inspectParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, S32 min_count, S32 max_count) { parser.inspectValue<VALUE_TYPE>(name_stack, min_count, max_count, NULL); - if (NAME_VALUE_LOOKUP::getPossibleValues()) + if (name_value_lookup_t::getPossibleValues()) { - parser.inspectValue<std::string>(name_stack, min_count, max_count, NAME_VALUE_LOOKUP::getPossibleValues()); + parser.inspectValue<std::string>(name_stack, min_count, max_count, name_value_lookup_t::getPossibleValues()); } } void set(value_assignment_t val, bool flag_as_provided = true) { mValues = val; - mCachedKeys.clear(); - mCachedKeys.resize(mValues.size()); setProvided(flag_as_provided); - Param::enclosingBlock().setLastChangedParam(*this, flag_as_provided); + Param::enclosingBlock().paramChanged(*this, flag_as_provided); } @@ -1011,23 +1031,23 @@ namespace LLInitParam } } - value_ref_t add() + value_t& add() { - mValues.push_back(value_t()); - mCachedKeys.push_back(key_cache_t()); + mValues.push_back(ParamValue(value_t())); setProvided(true); + Param::enclosingBlock().paramChanged(*this, true); return mValues.back(); } - void add(value_const_ref_t item) + void add(const value_t& item) { - mValues.push_back(item); - mCachedKeys.push_back(key_cache_t()); + mValues.push_back(ParamValue(item)); setProvided(true); + Param::enclosingBlock().paramChanged(*this, true); } // implicit conversion - operator value_assignment_t() const { return self_t::get(); } + operator value_assignment_t() const { return mValues; } typedef typename container_t::iterator iterator; typedef typename container_t::const_iterator const_iterator; @@ -1044,27 +1064,25 @@ namespace LLInitParam } protected: - value_assignment_t get() const - { - return mValues; - } - static bool mergeWith(Param& dst, const Param& src, bool overwrite) { const self_t& src_typed_param = static_cast<const self_t&>(src); self_t& dst_typed_param = static_cast<self_t&>(dst); - if (src_typed_param.isProvided() - && (overwrite || !dst_typed_param.isProvided())) + if (overwrite) { - dst_typed_param.set(src_typed_param.get()); - return true; + std::copy(src_typed_param.begin(), src_typed_param.end(), std::back_inserter(dst_typed_param.mValues)); } - return false; + else + { + container_t new_values(src_typed_param.mValues); + std::copy(dst_typed_param.begin(), dst_typed_param.end(), std::back_inserter(new_values)); + std::swap(dst_typed_param.mValues, new_values); + } + return true; } container_t mValues; - std::vector<key_cache_t> mCachedKeys; }; // container of block parameters @@ -1074,80 +1092,76 @@ namespace LLInitParam { public: typedef TypedParam<VALUE_TYPE, NAME_VALUE_LOOKUP, true, true> self_t; - typedef typename std::vector<VALUE_TYPE> container_t; + typedef ParamValue<VALUE_TYPE, NAME_VALUE_LOOKUP> param_value_t; + typedef typename std::vector<param_value_t> container_t; typedef const container_t& value_assignment_t; - typedef VALUE_TYPE value_t; - typedef value_t& value_ref_t; - typedef const value_t& value_const_ref_t; - - typedef typename NAME_VALUE_LOOKUP::KeyCache key_cache_t; + typedef NAME_VALUE_LOOKUP name_value_lookup_t; TypedParam(BlockDescriptor& block_descriptor, const char* name, value_assignment_t value, ParamDescriptor::validation_func_t validate_func, S32 min_count, S32 max_count) : Param(block_descriptor.mCurrentBlockPtr), - mValues(value), - mLastParamGeneration(0) + mLastParseGeneration(0) { - mCachedKeys.resize(mValues.size()); + std::copy(value.begin(), value.end(), back_inserter(mValues)); + if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING)) { - ParamDescriptor param_descriptor(block_descriptor.mCurrentBlockPtr->getHandleFromParam(this), + ParamDescriptorPtr param_descriptor = ParamDescriptorPtr(new ParamDescriptor( + block_descriptor.mCurrentBlockPtr->getHandleFromParam(this), &mergeWith, &deserializeParam, &serializeParam, validate_func, &inspectParam, - min_count, max_count); + min_count, max_count)); BaseBlock::addParam(block_descriptor, param_descriptor, name); } } bool isProvided() const { return Param::anyProvided(); } - value_ref_t operator[](S32 index) { return mValues[index]; } - value_const_ref_t operator[](S32 index) const { return mValues[index]; } - static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack, S32 generation) { self_t& typed_param = static_cast<self_t&>(param); bool new_value = false; - if (generation != typed_param.mLastParamGeneration || typed_param.mValues.empty()) + + if (generation != typed_param.mLastParseGeneration + || typed_param.mValues.empty()) { new_value = true; typed_param.mValues.push_back(value_t()); - typed_param.mCachedKeys.push_back(Data()); } - value_ref_t value = typed_param.mValues.back(); + param_value_t& value = typed_param.mValues.back(); // attempt to parse block... - if(value.deserializeBlock(parser, name_stack)) + if(value.deserializeBlock(parser, name_stack, generation)) { if (new_value) { // successfully parsed new value, let's keep it - typed_param.mLastParamGeneration = generation; + typed_param.mLastParseGeneration = generation; } - typed_param.enclosingBlock().setLastChangedParam(param, true); + typed_param.enclosingBlock().paramChanged(param, true); typed_param.setProvided(true); return true; } - else if(!NAME_VALUE_LOOKUP::empty()) + else if(name_value_lookup_t::valueNamesExist()) { // try to parse a known named value std::string name; if (parser.readValue(name)) { // try to parse a per type named value - if (NAME_VALUE_LOOKUP::get(name, value)) + if (name_value_lookup_t::getValueFromName(name, value.getValue())) { if (new_value) { // successfully parsed new value, let's keep it - typed_param.mLastParamGeneration = generation; + typed_param.mLastParseGeneration = generation; } - typed_param.mCachedKeys.back().setKey(name); - typed_param.mCachedKeys.back().mKeyVersion = value.getLastChangeVersion(); - typed_param.enclosingBlock().setLastChangedParam(param, true); + typed_param.mValues.back().setValueName(name); + typed_param.mValues.back().mKeyVersion = value.getLastChangeVersion(); + typed_param.enclosingBlock().paramChanged(param, true); typed_param.setProvided(true); return true; } @@ -1158,7 +1172,6 @@ namespace LLInitParam if (new_value) { // failed to parse new value, pop it off typed_param.mValues.pop_back(); - typed_param.mCachedKeys.pop_back(); } return false; @@ -1169,26 +1182,22 @@ namespace LLInitParam const self_t& typed_param = static_cast<const self_t&>(param); if (!typed_param.isProvided() || name_stack.empty()) return; - const_iterator it = typed_param.mValues.begin(); - for (typename std::vector<Data>::const_iterator key_it = typed_param.mCachedKeys.begin(); - it != typed_param.mValues.end(); - ++key_it, ++it) + for (const_iterator it = typed_param.mValues.begin(), end_it = typed_param.mValues.end(); + it != end_it; + ++it) { name_stack.back().second = parser.newParseGeneration(); - std::string key = key_it->getKey(); - if (!key.empty() && key_it->mKeyVersion == it->getLastChangeVersion()) + std::string key = it->getValueName(); + if (!key.empty() && it->mKeyVersion == it->getLastChangeVersion()) { - if(!parser.writeValue(key, name_stack)) - { - return; - } + parser.writeValue(key, name_stack); } // Not parsed via named values, write out value directly // NOTE: currently we don't worry about removing default values in Multiple - else if (!it->serializeBlock(parser, name_stack, NULL)) + else { - return; + it->serializeBlock(parser, name_stack, NULL); } } } @@ -1196,16 +1205,14 @@ namespace LLInitParam static void inspectParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, S32 min_count, S32 max_count) { // I am a vector of blocks, so describe my contents recursively - value_t().inspectBlock(parser, name_stack); + param_value_t(value_t()).inspectBlock(parser, name_stack, min_count, max_count); } void set(value_assignment_t val, bool flag_as_provided = true) { mValues = val; - mCachedKeys.clear(); - mCachedKeys.resize(mValues.size()); setProvided(flag_as_provided); - Param::enclosingBlock().setLastChangedParam(*this, flag_as_provided); + Param::enclosingBlock().paramChanged(*this, flag_as_provided); } void setIfNotProvided(value_assignment_t val, bool flag_as_provided = true) @@ -1216,23 +1223,23 @@ namespace LLInitParam } } - value_ref_t add() + value_t& add() { mValues.push_back(value_t()); - mCachedKeys.push_back(Data()); setProvided(true); + Param::enclosingBlock().paramChanged(*this, true); return mValues.back(); } - void add(value_const_ref_t item) + void add(const value_t& item) { mValues.push_back(item); - mCachedKeys.push_back(Data()); setProvided(true); + Param::enclosingBlock().paramChanged(*this, true); } // implicit conversion - operator value_assignment_t() const { return self_t::get(); } + operator value_assignment_t() const { return mValues; } typedef typename container_t::iterator iterator; typedef typename container_t::const_iterator const_iterator; @@ -1246,8 +1253,8 @@ namespace LLInitParam U32 numValidElements() const { U32 count = 0; - for (const_iterator it = mValues.begin(); - it != mValues.end(); + for (const_iterator it = mValues.begin(), end_it = mValues.end(); + it != end_it; ++it) { if(it->validateBlock(false)) count++; @@ -1256,43 +1263,35 @@ namespace LLInitParam } protected: - value_assignment_t get() const - { - return mValues; - } static bool mergeWith(Param& dst, const Param& src, bool overwrite) { const self_t& src_typed_param = static_cast<const self_t&>(src); self_t& dst_typed_param = static_cast<self_t&>(dst); - if (src_typed_param.isProvided() - && (overwrite || !dst_typed_param.isProvided())) + if (overwrite) { - dst_typed_param.set(src_typed_param.get()); - return true; + std::copy(src_typed_param.begin(), src_typed_param.end(), std::back_inserter(dst_typed_param.mValues)); } - return false; + else + { + container_t new_values(src_typed_param.mValues); + std::copy(dst_typed_param.begin(), dst_typed_param.end(), std::back_inserter(new_values)); + std::swap(dst_typed_param.mValues, new_values); + } + return true; } - struct Data : public key_cache_t - { - S32 mKeyVersion; // version of block for which key was last valid - - Data() : mKeyVersion(0) {} - }; - container_t mValues; - std::vector<Data> mCachedKeys; - S32 mLastParamGeneration; + S32 mLastParseGeneration; }; template <typename DERIVED_BLOCK> class Choice : public BaseBlock { - typedef Choice<DERIVED_BLOCK> self_t; - typedef Choice<DERIVED_BLOCK> enclosing_block_t; + typedef Choice<DERIVED_BLOCK> self_t; + typedef Choice<DERIVED_BLOCK> enclosing_block_t; LOG_CLASS(self_t); public: @@ -1321,9 +1320,9 @@ namespace LLInitParam } // clear out old choice when param has changed - /*virtual*/ void setLastChangedParam(const Param& last_param, bool user_provided) + /*virtual*/ void paramChanged(const Param& changed_param, bool user_provided) { - param_handle_t changed_param_handle = BaseBlock::getHandleFromParam(&last_param); + param_handle_t changed_param_handle = BaseBlock::getHandleFromParam(&changed_param); // if we have a new choice... if (changed_param_handle != mCurChoice) { @@ -1335,7 +1334,7 @@ namespace LLInitParam } mCurChoice = changed_param_handle; } - BaseBlock::setLastChangedParam(last_param, user_provided); + BaseBlock::paramChanged(changed_param, user_provided); } virtual const BlockDescriptor& mostDerivedBlockDescriptor() const { return selfBlockDescriptor(); } @@ -1358,20 +1357,21 @@ namespace LLInitParam friend class Choice<DERIVED_BLOCK>; typedef Alternative<T, NAME_VALUE_LOOKUP> self_t; - typedef TypedParam<T, NAME_VALUE_LOOKUP, false, IsBaseBlock<T>::value> super_t; + typedef TypedParam<T, NAME_VALUE_LOOKUP, false, IsBlock<ParamValue<T, NAME_VALUE_LOOKUP> >::value> super_t; typedef typename super_t::value_assignment_t value_assignment_t; - explicit Alternative(const char* name, value_assignment_t val = DefaultInitializer<T>::get()) + explicit Alternative(const char* name, value_assignment_t val = defaultValue<T>()) : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, val, NULL, 0, 1), mOriginalValue(val) { // assign initial choice to first declared option DERIVED_BLOCK* blockp = ((DERIVED_BLOCK*)DERIVED_BLOCK::selfBlockDescriptor().mCurrentBlockPtr); - if (LL_UNLIKELY( - DERIVED_BLOCK::selfBlockDescriptor().mInitializationState == BlockDescriptor::INITIALIZING - && blockp->mCurChoice == 0)) + if (LL_UNLIKELY(DERIVED_BLOCK::selfBlockDescriptor().mInitializationState == BlockDescriptor::INITIALIZING)) { - blockp->mCurChoice = Param::enclosingBlock().getHandleFromParam(this); + if(blockp->mCurChoice == 0) + { + blockp->mCurChoice = Param::enclosingBlock().getHandleFromParam(this); + } } } @@ -1390,7 +1390,7 @@ namespace LLInitParam { if (static_cast<enclosing_block_t&>(Param::enclosingBlock()).getCurrentChoice() == this) { - return super_t::get(); + return super_t::getValue(); } return mOriginalValue; } @@ -1399,7 +1399,7 @@ namespace LLInitParam { if (static_cast<enclosing_block_t&>(Param::enclosingBlock()).getCurrentChoice() == this) { - return super_t::get(); + return super_t::getValue(); } return mOriginalValue; } @@ -1433,8 +1433,8 @@ namespace LLInitParam class Block : public BASE_BLOCK { - typedef Block<DERIVED_BLOCK, BASE_BLOCK> self_t; - typedef Block<DERIVED_BLOCK, BASE_BLOCK> block_t; + typedef Block<DERIVED_BLOCK, BASE_BLOCK> self_t; + typedef Block<DERIVED_BLOCK, BASE_BLOCK> block_t; public: typedef BASE_BLOCK base_block_t; @@ -1442,13 +1442,13 @@ namespace LLInitParam // take all provided params from other and apply to self bool overwriteFrom(const self_t& other) { - return BaseBlock::merge(selfBlockDescriptor(), other, true); + return static_cast<DERIVED_BLOCK*>(this)->merge(selfBlockDescriptor(), other, true); } // take all provided params that are not already provided, and apply to self bool fillFrom(const self_t& other) { - return BaseBlock::merge(selfBlockDescriptor(), other, false); + return static_cast<DERIVED_BLOCK*>(this)->merge(selfBlockDescriptor(), other, false); } virtual const BlockDescriptor& mostDerivedBlockDescriptor() const { return selfBlockDescriptor(); } @@ -1468,10 +1468,10 @@ namespace LLInitParam class Optional : public TypedParam<T, NAME_VALUE_LOOKUP, false> { public: - typedef TypedParam<T, NAME_VALUE_LOOKUP, false, IsBaseBlock<T>::value> super_t; + typedef TypedParam<T, NAME_VALUE_LOOKUP, false, IsBlock<ParamValue<T, NAME_VALUE_LOOKUP> >::value> super_t; typedef typename super_t::value_assignment_t value_assignment_t; - explicit Optional(const char* name = "", value_assignment_t val = DefaultInitializer<T>::get()) + explicit Optional(const char* name = "", value_assignment_t val = defaultValue<T>()) : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, val, NULL, 0, 1) { //#pragma message("Parsing LLInitParam::Block::Optional") @@ -1483,7 +1483,7 @@ namespace LLInitParam return *this; } - DERIVED_BLOCK& operator()(typename super_t::value_assignment_t val) + DERIVED_BLOCK& operator()(value_assignment_t val) { super_t::set(val); return static_cast<DERIVED_BLOCK&>(Param::enclosingBlock()); @@ -1495,12 +1495,12 @@ namespace LLInitParam class Mandatory : public TypedParam<T, NAME_VALUE_LOOKUP, false> { public: - typedef TypedParam<T, NAME_VALUE_LOOKUP, false, IsBaseBlock<T>::value> super_t; + typedef TypedParam<T, NAME_VALUE_LOOKUP, false, IsBlock<ParamValue<T, NAME_VALUE_LOOKUP> >::value> super_t; typedef Mandatory<T, NAME_VALUE_LOOKUP> self_t; typedef typename super_t::value_assignment_t value_assignment_t; // mandatory parameters require a name to be parseable - explicit Mandatory(const char* name = "", value_assignment_t val = DefaultInitializer<T>::get()) + explicit Mandatory(const char* name = "", value_assignment_t val = defaultValue<T>()) : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, val, &validate, 1, 1) {} @@ -1529,15 +1529,15 @@ namespace LLInitParam class Multiple : public TypedParam<T, NAME_VALUE_LOOKUP, true> { public: - typedef TypedParam<T, NAME_VALUE_LOOKUP, true, IsBaseBlock<T>::value> super_t; + typedef TypedParam<T, NAME_VALUE_LOOKUP, true, IsBlock<ParamValue<T, NAME_VALUE_LOOKUP> >::value> super_t; typedef Multiple<T, RANGE, NAME_VALUE_LOOKUP> self_t; typedef typename super_t::container_t container_t; typedef typename super_t::value_assignment_t value_assignment_t; typedef typename super_t::iterator iterator; typedef typename super_t::const_iterator const_iterator; - explicit Multiple(const char* name = "", value_assignment_t val = DefaultInitializer<container_t>::get()) - : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, val, &validate, RANGE::minCount(), RANGE::maxCount()) + explicit Multiple(const char* name = "") + : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, container_t(), &validate, RANGE::minCount(), RANGE::maxCount()) {} Multiple& operator=(value_assignment_t val) @@ -1545,7 +1545,7 @@ namespace LLInitParam set(val); return *this; } - + DERIVED_BLOCK& operator()(typename super_t::value_assignment_t val) { super_t::set(val); @@ -1559,6 +1559,95 @@ namespace LLInitParam } }; + template <typename T, typename RANGE = BaseBlock::AnyAmount, typename NAME_VALUE_LOOKUP = TypeValues<T> > + class Batch : private TypedParam<T, NAME_VALUE_LOOKUP, false> + { + public: + typedef ParamValue<T, NAME_VALUE_LOOKUP> param_value_t; + typedef TypedParam<T, NAME_VALUE_LOOKUP, false, IsBlock<param_value_t>::value> super_t; + typedef Batch<T, RANGE, NAME_VALUE_LOOKUP> self_t; + typedef typename super_t::value_assignment_t value_assignment_t; + + struct BatchDefaultValue : public ParamDescriptor::UserData + { + BatchDefaultValue(const T& value) + : mValue(value) + {} + + T mValue; + }; + + explicit Batch(const char* name, value_assignment_t val) + : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, val, NULL, 0, 1), + mLastParseGeneration(-1) + { + BlockDescriptor& block_descriptor = DERIVED_BLOCK::selfBlockDescriptor(); + if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING)) + { + ParamDescriptorPtr param_descriptorp = block_descriptor.mCurrentBlockPtr->findParamDescriptor(*this); + + if (param_descriptorp) + { + param_descriptorp->mDeserializeFunc = &deserializeParam; + param_descriptorp->mUserData = new BatchDefaultValue(new _value_t(val)); + } + } + } + + explicit Batch(const char* name = "") + : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, defaultValue<T>(), NULL, 0, 1), + mLastParseGeneration(-1) + { + BlockDescriptor& block_descriptor = DERIVED_BLOCK::selfBlockDescriptor(); + if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING)) + { + ParamDescriptorPtr param_descriptorp = block_descriptor.mCurrentBlockPtr->findParamDescriptor(*this); + + if (param_descriptorp) + { + param_descriptorp->mDeserializeFunc = &deserializeParam; + } + } + } + + Batch& operator=(value_assignment_t val) + { + set(val); + return *this; + } + + DERIVED_BLOCK& operator()(value_assignment_t val) + { + super_t::set(val); + return static_cast<DERIVED_BLOCK&>(Param::enclosingBlock()); + } + + using super_t::operator(); + + private: + static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack, S32 generation) + { + self_t& typed_param = static_cast<self_t&>(param); + + if (generation != typed_param.mLastParseGeneration) + { + ParamDescriptorPtr descriptor = typed_param.enclosingBlock().findParamDescriptor(param); + if (descriptor && static_cast<BatchDefaultValue*>(descriptor->mUserData)) + { + static_cast<param_value_t&>(typed_param) = (static_cast<BatchDefaultValue*>(descriptor->mUserData))->mValue; + } + else + { + static_cast<param_value_t&>(typed_param) = param_value_t(value_t()); + } + typed_param.mLastParseGeneration = generation; + } + return super_t::deserializeParam(param, parser, name_stack, generation); + } + + S32 mLastParseGeneration; + }; + class Deprecated : public Param { public: @@ -1568,13 +1657,14 @@ namespace LLInitParam BlockDescriptor& block_descriptor = DERIVED_BLOCK::selfBlockDescriptor(); if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING)) { - ParamDescriptor param_descriptor(block_descriptor.mCurrentBlockPtr->getHandleFromParam(this), + ParamDescriptorPtr param_descriptor = ParamDescriptorPtr(new ParamDescriptor( + block_descriptor.mCurrentBlockPtr->getHandleFromParam(this), NULL, &deserializeParam, NULL, NULL, NULL, - 0, S32_MAX); + 0, S32_MAX)); BaseBlock::addParam(block_descriptor, param_descriptor, name); } } @@ -1602,137 +1692,91 @@ namespace LLInitParam } }; - template<typename T, typename DERIVED = TypedParam<T> > - class BlockValue - : public Block<TypedParam<T, TypeValues<T>, false> >, - public Param + template<typename T> + class CustomParamValue + : public Block<ParamValue<T, TypeValues<T> > >, + public TypeValues<T> { public: typedef enum e_value_age { - OLDER_THAN_BLOCK, // mData.mValue needs to be refreshed from the block parameters - NEWER_THAN_BLOCK, // mData.mValue holds the authoritative value (which has been replicated to the block parameters via setBlockFromValue) - SAME_AS_BLOCK // mData.mValue is derived from the block parameters, which are authoritative + VALUE_NEEDS_UPDATE, // mValue needs to be refreshed from the block parameters + VALUE_AUTHORITATIVE, // mValue holds the authoritative value (which has been replicated to the block parameters via updateBlockFromValue) + BLOCK_AUTHORITATIVE // mValue is derived from the block parameters, which are authoritative } EValueAge; - typedef BlockValue<T> self_t; - typedef Block<TypedParam<T, TypeValues<T>, false> > block_t; - typedef const T& value_const_ref_t; - typedef value_const_ref_t value_assignment_t; - typedef typename TypeValues<T>::KeyCache key_cache_t; + typedef ParamValue<T, TypeValues<T> > derived_t; + typedef CustomParamValue<T> self_t; + typedef Block<typename derived_t> block_t; + typedef const T& value_assignment_t; - BlockValue(BlockDescriptor& block_descriptor, const char* name, value_assignment_t value, ParamDescriptor::validation_func_t validate_func, S32 min_count, S32 max_count) - : Param(block_descriptor.mCurrentBlockPtr), - mData(value, NEWER_THAN_BLOCK) - { - if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING)) - { - ParamDescriptor param_descriptor(block_descriptor.mCurrentBlockPtr->getHandleFromParam(this), - &mergeWith, - &deserializeParam, - &serializeParam, - validate_func, - &inspectParam, - min_count, max_count); - BaseBlock::addParam(block_descriptor, param_descriptor, name); - } - } - - // implicit conversion - operator value_assignment_t() const { return get(); } - // explicit conversion - value_assignment_t operator()() const { return get(); } + CustomParamValue(const T& value = T()) + : mValue(value), + mValueAge(VALUE_AUTHORITATIVE), + mKeyVersion(0), + mValidatedVersion(-1) + {} - static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack, S32 generation) + bool deserializeBlock(Parser& parser, Parser::name_stack_range_t name_stack, S32 generation) { - DERIVED& typed_param = static_cast<DERIVED&>(param); + derived_t& typed_param = static_cast<derived_t&>(*this); // type to apply parse direct value T if (name_stack.first == name_stack.second) { - if(parser.readValue(typed_param.mData.mValue)) + if(parser.readValue(typed_param.mValue)) { - typed_param.enclosingBlock().setLastChangedParam(param, true); - typed_param.setProvided(true); - typed_param.mData.clearKey(); - typed_param.mData.mValueAge = NEWER_THAN_BLOCK; - typed_param.setBlockFromValue(); + typed_param.clearValueName(); + typed_param.mValueAge = VALUE_AUTHORITATIVE; + typed_param.updateBlockFromValue(); return true; } - - if(!TypeValues<T>::empty()) - { - // try to parse a known named value - std::string name; - if (parser.readValue(name)) - { - // try to parse a per type named value - if (TypeValues<T>::get(name, typed_param.mData.mValue)) - { - typed_param.mData.setKey(name); - typed_param.enclosingBlock().setLastChangedParam(param, true); - typed_param.setProvided(true); - typed_param.mData.mValueAge = NEWER_THAN_BLOCK; - typed_param.setBlockFromValue(); - - return true; - } - } - } } // fall back on parsing block components for T // if we deserialized at least one component... - if (typed_param.BaseBlock::deserializeBlock(parser, name_stack)) + if (typed_param.BaseBlock::deserializeBlock(parser, name_stack, generation)) { - // ...our block is provided, and considered changed - typed_param.enclosingBlock().setLastChangedParam(param, true); - typed_param.setProvided(true); return true; } + return false; } - static void serializeParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, const Param* diff_param) + void serializeBlock(Parser& parser, Parser::name_stack_t name_stack = Parser::name_stack_t(), const BaseBlock* diff_block = NULL) const { - const self_t& typed_param = static_cast<const self_t&>(param); + const self_t& typed_param = static_cast<const self_t&>(*this); + const self_t* diff_param = static_cast<const self_t*>(diff_block); - if (!typed_param.isProvided()) return; - - std::string key = typed_param.mData.getKey(); + std::string key = typed_param.getValueName(); // first try to write out name of name/value pair if (!key.empty()) { - if (!diff_param || !ParamCompare<std::string>::equals(static_cast<const self_t*>(diff_param)->mData.getKey(), key)) + if (!diff_param || !ParamCompare<std::string>::equals(diff_param->getValueName(), key)) { - if (!parser.writeValue(key, name_stack)) - { - return; - } + parser.writeValue(key, name_stack); } } // then try to serialize value directly - else if (!diff_param || !ParamCompare<T>::equals(typed_param.get(), (static_cast<const self_t*>(diff_param))->get())) + else if (!diff_param || !ParamCompare<T>::equals(typed_param.getValue(), diff_param->getValue())) { - if (parser.writeValue(typed_param.mData.mValue, name_stack)) + if (!parser.writeValue(typed_param.getValue(), name_stack)) { - return; + //RN: *always* serialize provided components of BlockValue (don't pass diff_param on), + // since these tend to be viewed as the constructor arguments for the value T. It seems + // cleaner to treat the uniqueness of a BlockValue according to the generated value, and + // not the individual components. This way <color red="0" green="1" blue="0"/> will not + // be exported as <color green="1"/>, since it was probably the intent of the user to + // be specific about the RGB color values. This also fixes an issue where we distinguish + // between rect.left not being provided and rect.left being explicitly set to 0 (same as default) + block_t::serializeBlock(parser, name_stack, NULL); } - - //RN: *always* serialize provided components of BlockValue (don't pass diff_param on), - // since these tend to be viewed as the constructor arguments for the value T. It seems - // cleaner to treat the uniqueness of a BlockValue according to the generated value, and - // not the individual components. This way <color red="0" green="1" blue="0"/> will not - // be exported as <color green="1"/>, since it was probably the intent of the user to - // be specific about the RGB color values. This also fixes an issue where we distinguish - // between rect.left not being provided and rect.left being explicitly set to 0 (same as default) - typed_param.BaseBlock::serializeBlock(parser, name_stack, NULL); } } - static void inspectParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, S32 min_count, S32 max_count) + bool inspectBlock(Parser& parser, Parser::name_stack_t name_stack = Parser::name_stack_t(), S32 min_count = 0, S32 max_count = S32_MAX) const { // first, inspect with actual type... parser.inspectValue<T>(name_stack, min_count, max_count, NULL); @@ -1742,25 +1786,19 @@ namespace LLInitParam parser.inspectValue<std::string>(name_stack, min_count, max_count, TypeValues<T>::getPossibleValues()); } // then recursively inspect contents... - const self_t& typed_param = static_cast<const self_t&>(param); - typed_param.inspectBlock(parser, name_stack); + return block_t::inspectBlock(parser, name_stack, min_count, max_count); } - - bool isProvided() const + bool validateBlock(bool emit_errors = true) const { - if (!Param::anyProvided()) return false; - - // block has an updated parameter - // if cached value is stale, regenerate from params - if (mData.mValueAge == OLDER_THAN_BLOCK) + if (mValueAge == VALUE_NEEDS_UPDATE) { - if (block_t::validateBlock(false)) + if (block_t::validateBlock(emit_errors)) { - static_cast<const DERIVED*>(this)->setValueFromBlock(); // clear stale keyword associated with old value - mData.clearKey(); - mData.mValueAge = SAME_AS_BLOCK; + clearValueName(); + mValueAge = BLOCK_AUTHORITATIVE; + static_cast<derived_t*>(const_cast<self_t*>(this))->updateValueFromBlock(); return true; } else @@ -1777,104 +1815,74 @@ namespace LLInitParam } } - void set(value_assignment_t val, bool flag_as_provided = true) - { - Param::enclosingBlock().setLastChangedParam(*this, flag_as_provided); - - // set param version number to be up to date, so we ignore block contents - mData.mValueAge = NEWER_THAN_BLOCK; - - mData.mValue = val; - mData.clearKey(); - setProvided(flag_as_provided); - static_cast<DERIVED*>(this)->setBlockFromValue(); - } - - void setIfNotProvided(value_assignment_t val, bool flag_as_provided = true) - { - // don't override any user provided value - if (!isProvided()) - { - set(val, flag_as_provided); - } - } - // propagate change status up to enclosing block - /*virtual*/ void setLastChangedParam(const Param& last_param, bool user_provided) + /*virtual*/ void paramChanged(const Param& changed_param, bool user_provided) { - BaseBlock::setLastChangedParam(last_param, user_provided); - Param::enclosingBlock().setLastChangedParam(*this, user_provided); + BaseBlock::paramChanged(changed_param, user_provided); if (user_provided) - { - setProvided(true); // some component provided + { // a parameter changed, so our value is out of date - mData.mValueAge = OLDER_THAN_BLOCK; + mValueAge = VALUE_NEEDS_UPDATE; } } - - protected: - value_assignment_t get() const + + void setValue(value_assignment_t val) { - // if some parameters were provided, issue warnings on invalid blocks - if (Param::anyProvided() && (mData.mValueAge == OLDER_THAN_BLOCK)) - { - // go ahead and issue warnings at this point if any param is invalid - if(block_t::validateBlock(true)) - { - static_cast<const DERIVED*>(this)->setValueFromBlock(); - mData.clearKey(); - mData.mValueAge = SAME_AS_BLOCK; - } - } - - return mData.mValue; + // set param version number to be up to date, so we ignore block contents + mValueAge = VALUE_AUTHORITATIVE; + mValue = val; + clearValueName(); + static_cast<derived_t*>(const_cast<self_t*>(this))->updateBlockFromValue(); } + value_assignment_t getValue() const + { + validateBlock(true); + return mValue; + } - struct Data : public key_cache_t + T& getValue() { - Data(const T& value, EValueAge age) - : mValue(value), - mValueAge(age) - {} + validateBlock(true); + return mValue; + } - T mValue; - EValueAge mValueAge; - }; + S32 mKeyVersion; - // mutable to allow lazy updates on get - mutable Data mData; + protected: - private: - static bool mergeWith(Param& dst, const Param& src, bool overwrite) + // use this from within updateValueFromBlock() to set the value without making it authoritative + void updateValue(value_assignment_t value) { - const DERIVED& src_typed_param = static_cast<const DERIVED&>(src); - DERIVED& dst_typed_param = static_cast<DERIVED&>(dst); + mValue = value; + } - if (src_typed_param.isProvided() - && (overwrite || !dst_typed_param.isProvided())) + bool merge(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite) + { + const derived_t& src_typed_param = static_cast<const derived_t&>(other); + + if (src_typed_param.mValueAge == VALUE_AUTHORITATIVE) { - if (src_typed_param.mData.mValueAge == NEWER_THAN_BLOCK) - { - // copy value over - dst_typed_param.set(src_typed_param.get()); - } - else - { - // merge individual parameters into destination - dst_typed_param.merge(block_t::selfBlockDescriptor(), src_typed_param, overwrite); - } + // copy value over + setValue(src_typed_param.getValue()); return true; } - return false; + else + { + // merge individual parameters into destination + return block_t::merge(block_t::selfBlockDescriptor(), src_typed_param, overwrite); + } } - }; - template<> - struct ParamCompare<LLSD, false> - { - static bool equals(const LLSD &a, const LLSD &b); + mutable S32 mValidatedVersion; + mutable bool mValidated; // lazy validation flag + + private: + + mutable T mValue; + mutable EValueAge mValueAge; }; } + #endif // LL_LLPARAM_H diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml index 75aec21f93..48fa01f0d9 100644 --- a/indra/newview/skins/default/colors.xml +++ b/indra/newview/skins/default/colors.xml @@ -763,4 +763,21 @@ <color name="MenuBarProjectBgColor" reference="MdBlue" /> + + <!-- Generic color names (legacy) --> + <color + name="white" + value="1 1 1 1"/> + <color + name="black" + value="0 0 0 1"/> + <color + name="red" + value="1 0 0 1"/> + <color + name="green" + value="0 1 0 1"/> + <color + name="blue" + value="0 0 1 1"/> </colors> diff --git a/indra/newview/skins/default/xui/en/widgets/loading_indicator.xml b/indra/newview/skins/default/xui/en/widgets/loading_indicator.xml index 6040d24128..ea1d89c975 100644 --- a/indra/newview/skins/default/xui/en/widgets/loading_indicator.xml +++ b/indra/newview/skins/default/xui/en/widgets/loading_indicator.xml @@ -3,6 +3,20 @@ follows="left|top" mouse_opaque="false" name="loading_indicator" - rotations_per_sec="1.0" - tab_stop="false" -/> + images_per_sec="1.0" + tab_stop="false"> + <images> + <image name="Progress_1"/> + <image name="Progress_2"/> + <image name="Progress_3"/> + <image name="Progress_4"/> + <image name="Progress_5"/> + <image name="Progress_6"/> + <image name="Progress_7"/> + <image name="Progress_8"/> + <image name="Progress_9"/> + <image name="Progress_10"/> + <image name="Progress_11"/> + <image name="Progress_12"/> + </images> +</loading_indicator> \ No newline at end of file -- cgit v1.2.3 From 2866e1d9e1a39a07c872486332e3301eddf17acb Mon Sep 17 00:00:00 2001 From: Nat Goodspeed <nat@lindenlab.com> Date: Tue, 19 Apr 2011 21:32:10 -0400 Subject: Update freetype package: previous one had no actual library. Evidently the only reason builds have been succeeding is because the link is picking up the system freetype library. This could be tricky if it goes out of sync with the freetype package's header files. --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index a31d280b6f..057ffa5b7d 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -510,9 +510,9 @@ <key>archive</key> <map> <key>hash</key> - <string>9b58d1a9c15807a1301e42a313641010</string> + <string>9f8a9dc39fd7c3da0fb3533782d1fddf</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.4.4-linux-20110310.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-freetype/rev/226814/arch/Linux/installer/freetype-2.3.9-linux-20110418.tar.bz2</string> </map> <key>name</key> <string>linux</string> -- cgit v1.2.3 From c7721b86c6df55cbfcdb51970944b79ed8674f4e Mon Sep 17 00:00:00 2001 From: Nat Goodspeed <nat@lindenlab.com> Date: Tue, 19 Apr 2011 21:43:13 -0400 Subject: New openssl package solves permissions problems with Linux build. The original Linux openssl tarball includes libcrypto.so and libssl.so files with r-xr-xr-x permissions: not even the owning user can modify them. This causes problems when the Release build tries to 'strip' the viewer and all associated libraries. Newer openssl tarball fixes permission problems. The newer openssl package also updates from 0.9.8 to 1.0.0, so have to fix version numbers in Copy3rdPartyLibs.cmake and viewer_manifest.py too. :-P Presumably the only reason this hasn't been causing trouble with TC builds is that the link has been picking up system libraries instead of the ones from the openssl package. --- autobuild.xml | 4 ++-- indra/cmake/Copy3rdPartyLibs.cmake | 4 ++-- indra/newview/viewer_manifest.py | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 057ffa5b7d..d04166f72c 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1242,9 +1242,9 @@ <key>archive</key> <map> <key>hash</key> - <string>cc159598ef3fcd34fd33a8a0ef846165</string> + <string>3d40be8566fa4b9df9a38e2a0f9ea467</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-openssl/rev/223711/arch/Linux/installer/openssl-0.9.8q-linux-20110314.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-openssl/rev/226882/arch/Linux/installer/openssl-1.0.0d-linux-20110418.tar.bz2</string> </map> <key>name</key> <string>linux</string> diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index 4698116022..1c43c4ce12 100644 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -243,7 +243,7 @@ elseif(LINUX) libaprutil-1.so.0 libatk-1.0.so libbreakpad_client.so.0 - libcrypto.so.0.9.8 + libcrypto.so.1.0.0 libdb-5.1.so libexpat.so libexpat.so.1 @@ -259,7 +259,7 @@ elseif(LINUX) libtcmalloc.so libuuid.so.16 libuuid.so.16.0.22 - libssl.so.0.9.8 + libssl.so.1.0.0 libfontconfig.so.1.4.4 ) diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index f0b1973fdf..f671c770ea 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -939,9 +939,9 @@ class Linux_i686Manifest(LinuxManifest): self.path("libdb-5.1.so") self.path("libdb-5.so") self.path("libdb.so") - self.path("libcrypto.so.0.9.8") + self.path("libcrypto.so.1.0.0") self.path("libexpat.so.1.5.2") - self.path("libssl.so.0.9.8") + self.path("libssl.so.1.0.0") self.path("libuuid.so") self.path("libuuid.so.16") self.path("libuuid.so.16.0.22") -- cgit v1.2.3 From 6b47a5ec782257b1aba31b0c9bec8c6f3709ba6f Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Tue, 19 Apr 2011 20:14:34 -0700 Subject: fixed build --- indra/llui/tests/llurlentry_stub.cpp | 3 --- indra/llui/tests/llurlmatch_test.cpp | 3 --- 2 files changed, 6 deletions(-) diff --git a/indra/llui/tests/llurlentry_stub.cpp b/indra/llui/tests/llurlentry_stub.cpp index ce80183842..75946b2416 100644 --- a/indra/llui/tests/llurlentry_stub.cpp +++ b/indra/llui/tests/llurlentry_stub.cpp @@ -140,9 +140,6 @@ namespace LLInitParam void ParamValue<LLUIColor, TypeValues<LLUIColor> >::updateBlockFromValue() {} - void TypeValues<LLUIColor>::declareValues() - {} - bool ParamCompare<const LLFontGL*, false>::equals(const LLFontGL* a, const LLFontGL* b) { return false; diff --git a/indra/llui/tests/llurlmatch_test.cpp b/indra/llui/tests/llurlmatch_test.cpp index 439d60b43d..aea605c9f2 100644 --- a/indra/llui/tests/llurlmatch_test.cpp +++ b/indra/llui/tests/llurlmatch_test.cpp @@ -114,9 +114,6 @@ namespace LLInitParam void ParamValue<LLUIColor, TypeValues<LLUIColor> >::updateBlockFromValue() {} - void TypeValues<LLUIColor>::declareValues() - {} - bool ParamCompare<const LLFontGL*, false>::equals(const LLFontGL* a, const LLFontGL* b) { return false; -- cgit v1.2.3 From 47b8d252ff542cbbd9669718b70da80a8e4ba3ab Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Wed, 20 Apr 2011 07:13:53 -0400 Subject: corrected issue in doc/contributions.txt --- doc/contributions.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/contributions.txt b/doc/contributions.txt index e7db8c0ded..716b030d4e 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -588,7 +588,7 @@ Nicholaz Beresford VWR-2684 Nicky Perian OPEN-1 - OPEN-1087 + STORM-1087 STORM-1090 Nounouch Hapmouche VWR-238 -- cgit v1.2.3 From f836f67092362e92eb16dd3f20b9616557c26058 Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Wed, 20 Apr 2011 09:19:13 -0400 Subject: correct license headers --- indra/newview/llsidetraylistener.cpp | 21 +++++++++++++++++++-- indra/newview/llsidetraylistener.h | 21 +++++++++++++++++++-- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/indra/newview/llsidetraylistener.cpp b/indra/newview/llsidetraylistener.cpp index 6db13e517d..cd6fa28948 100644 --- a/indra/newview/llsidetraylistener.cpp +++ b/indra/newview/llsidetraylistener.cpp @@ -4,8 +4,25 @@ * @date 2011-02-15 * @brief Implementation for llsidetraylistener. * - * $LicenseInfo:firstyear=2011&license=lgpl$ - * Copyright (c) 2011, Linden Research, Inc. + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ diff --git a/indra/newview/llsidetraylistener.h b/indra/newview/llsidetraylistener.h index 0dd2067433..51e2137762 100644 --- a/indra/newview/llsidetraylistener.h +++ b/indra/newview/llsidetraylistener.h @@ -4,8 +4,25 @@ * @date 2011-02-15 * @brief * - * $LicenseInfo:firstyear=2011&license=lgpl$ - * Copyright (c) 2011, Linden Research, Inc. + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ -- cgit v1.2.3 From f00eb3e161fbed92733efa14d837b3722ac4797c Mon Sep 17 00:00:00 2001 From: Seth ProductEngine <slitovchuk@productengine.com> Date: Wed, 20 Apr 2011 17:31:57 +0300 Subject: STORM-229 ADDITIONAL FIX Disabled updating text segments during indenting the selected lines with TAB or SHIFT+TAB to prevent the viewer from stalling. --- indra/llui/lltexteditor.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index 5a46c7c98e..9bd445988d 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -592,6 +592,10 @@ void LLTextEditor::indentSelectedLines( S32 spaces ) } } + // Disabling parsing on the fly to avoid updating text segments + // until all indentation commands are executed. + mParseOnTheFly = FALSE; + // Find each start-of-line and indent it do { @@ -617,6 +621,8 @@ void LLTextEditor::indentSelectedLines( S32 spaces ) } while( cur < right ); + mParseOnTheFly = TRUE; + if( (right < getLength()) && (text[right] == '\n') ) { right++; -- cgit v1.2.3 From 6715603b6a991f822274b000e5d8fb9b8d405464 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Wed, 20 Apr 2011 10:42:58 -0400 Subject: cosmetic variable name change --- indra/newview/llphysicsmotion.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 09c9e75f2a..23b41a6db0 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -49,7 +49,7 @@ typedef std::map<std::string, std::string> controller_map_t; typedef std::map<std::string, F32> default_controller_map_t; -#define MIN_REQUIRED_PIXEL_AREA_BREAST_MOTION 0.f; +#define MIN_REQUIRED_PIXEL_AREA_AVATAR_PHYSICS_MOTION 0.f; inline F64 llsgn(const F64 a) { @@ -370,7 +370,7 @@ void LLPhysicsMotionController::addMotion(LLPhysicsMotion *motion) F32 LLPhysicsMotionController::getMinPixelArea() { - return MIN_REQUIRED_PIXEL_AREA_BREAST_MOTION; + return MIN_REQUIRED_PIXEL_AREA_AVATAR_PHYSICS_MOTION; } // Local space means "parameter space". -- cgit v1.2.3 From 469bcbcd8bec6b8e2ffec105083319f088e99719 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Wed, 20 Apr 2011 10:42:58 -0400 Subject: cosmetic variable name change --- indra/newview/llphysicsmotion.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 09c9e75f2a..23b41a6db0 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -49,7 +49,7 @@ typedef std::map<std::string, std::string> controller_map_t; typedef std::map<std::string, F32> default_controller_map_t; -#define MIN_REQUIRED_PIXEL_AREA_BREAST_MOTION 0.f; +#define MIN_REQUIRED_PIXEL_AREA_AVATAR_PHYSICS_MOTION 0.f; inline F64 llsgn(const F64 a) { @@ -370,7 +370,7 @@ void LLPhysicsMotionController::addMotion(LLPhysicsMotion *motion) F32 LLPhysicsMotionController::getMinPixelArea() { - return MIN_REQUIRED_PIXEL_AREA_BREAST_MOTION; + return MIN_REQUIRED_PIXEL_AREA_AVATAR_PHYSICS_MOTION; } // Local space means "parameter space". -- cgit v1.2.3 From 958a0601729dc154dfeb0bd3d54c7aa8e2d5379a Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Wed, 20 Apr 2011 11:30:00 -0400 Subject: SH-1384 FIXED AvatarPhysicsTest debug setting does not work Took out setting, no longer needed. Was formely restricted to gods. --- indra/newview/app_settings/settings.xml | 11 ----------- indra/newview/llphysicsmotion.cpp | 2 +- 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index d98f0da1c2..cac7df56e4 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -652,17 +652,6 @@ <key>Value</key> <integer>1</integer> </map> - <key>AvatarPhysicsTest</key> - <map> - <key>Comment</key> - <string>Simulate continuous physics behavior on all nearby avatars.</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>0</integer> - </map> <key>AvatarSex</key> <map> <key>Comment</key> diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 6c2c4e5b10..5c4d006288 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -475,7 +475,7 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) const F32 behavior_gain = getParamValue("Gain"); const F32 behavior_damping = getParamValue("Damping"); const F32 behavior_drag = getParamValue("Drag"); - const BOOL physics_test = gSavedSettings.getBOOL("AvatarPhysicsTest") && gAgent.isGodlike(); + const BOOL physics_test = FALSE; // Enable this to simulate bouncing on all parts. F32 behavior_maxeffect = getParamValue("MaxEffect"); if (physics_test) -- cgit v1.2.3 From f4683a11bb4026b8b52f4ad9504824523e4a0827 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Wed, 20 Apr 2011 11:30:00 -0400 Subject: SH-1384 FIXED AvatarPhysicsTest debug setting does not work Took out setting, no longer needed. Was formely restricted to gods. --- indra/newview/app_settings/settings.xml | 11 ----------- indra/newview/llphysicsmotion.cpp | 2 +- 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index dd85c5cb86..898d89b17d 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -652,17 +652,6 @@ <key>Value</key> <integer>1</integer> </map> - <key>AvatarPhysicsTest</key> - <map> - <key>Comment</key> - <string>Simulate continuous physics behavior on all nearby avatars.</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>0</integer> - </map> <key>AvatarSex</key> <map> <key>Comment</key> diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 23b41a6db0..6a7c28357e 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -481,7 +481,7 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) const F32 behavior_gain = getParamValue("Gain"); const F32 behavior_damping = getParamValue("Damping"); const F32 behavior_drag = getParamValue("Drag"); - const BOOL physics_test = gSavedSettings.getBOOL("AvatarPhysicsTest") && gAgent.isGodlike(); + const BOOL physics_test = FALSE; // Enable this to simulate bouncing on all parts. F32 behavior_maxeffect = getParamValue("MaxEffect"); if (physics_test) -- cgit v1.2.3 From abc3558f18189e1bda7016ef39ddcd9b17075266 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Wed, 20 Apr 2011 11:33:14 -0400 Subject: SH-1380 FIXED User can wear several physics objects Changed this to be expected behavior, where top wearable's characteristics are used. --- indra/newview/llwearabletype.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llwearabletype.cpp b/indra/newview/llwearabletype.cpp index 9e95604712..c090ab5c3d 100644 --- a/indra/newview/llwearabletype.cpp +++ b/indra/newview/llwearabletype.cpp @@ -80,7 +80,7 @@ LLWearableDictionary::LLWearableDictionary() addEntry(LLWearableType::WT_ALPHA, new WearableEntry("alpha", "New Alpha", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_ALPHA, FALSE, TRUE)); addEntry(LLWearableType::WT_TATTOO, new WearableEntry("tattoo", "New Tattoo", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_TATTOO, FALSE, TRUE)); - addEntry(LLWearableType::WT_PHYSICS, new WearableEntry("physics", "New Physics", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_PHYSICS, TRUE, FALSE)); + addEntry(LLWearableType::WT_PHYSICS, new WearableEntry("physics", "New Physics", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_PHYSICS, TRUE, TRUE)); addEntry(LLWearableType::WT_INVALID, new WearableEntry("invalid", "Invalid Wearable", LLAssetType::AT_NONE, LLInventoryIcon::ICONNAME_NONE, FALSE, FALSE)); addEntry(LLWearableType::WT_NONE, new WearableEntry("none", "Invalid Wearable", LLAssetType::AT_NONE, LLInventoryIcon::ICONNAME_NONE, FALSE, FALSE)); -- cgit v1.2.3 From 943d3e902c6c83a0f141896fd8c8057e237627ff Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Wed, 20 Apr 2011 11:33:14 -0400 Subject: SH-1380 FIXED User can wear several physics objects Changed this to be expected behavior, where top wearable's characteristics are used. --- indra/newview/llwearabletype.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llwearabletype.cpp b/indra/newview/llwearabletype.cpp index 9e95604712..c090ab5c3d 100644 --- a/indra/newview/llwearabletype.cpp +++ b/indra/newview/llwearabletype.cpp @@ -80,7 +80,7 @@ LLWearableDictionary::LLWearableDictionary() addEntry(LLWearableType::WT_ALPHA, new WearableEntry("alpha", "New Alpha", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_ALPHA, FALSE, TRUE)); addEntry(LLWearableType::WT_TATTOO, new WearableEntry("tattoo", "New Tattoo", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_TATTOO, FALSE, TRUE)); - addEntry(LLWearableType::WT_PHYSICS, new WearableEntry("physics", "New Physics", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_PHYSICS, TRUE, FALSE)); + addEntry(LLWearableType::WT_PHYSICS, new WearableEntry("physics", "New Physics", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_PHYSICS, TRUE, TRUE)); addEntry(LLWearableType::WT_INVALID, new WearableEntry("invalid", "Invalid Wearable", LLAssetType::AT_NONE, LLInventoryIcon::ICONNAME_NONE, FALSE, FALSE)); addEntry(LLWearableType::WT_NONE, new WearableEntry("none", "Invalid Wearable", LLAssetType::AT_NONE, LLInventoryIcon::ICONNAME_NONE, FALSE, FALSE)); -- cgit v1.2.3 From 91409d40cb4171815b7ef9f767dc5c5e8d5f3e44 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Wed, 20 Apr 2011 11:36:49 -0400 Subject: SH-1388 FIXED Graphics Quality slider has no effect on avatar physics SH-1387 Class0 video cards default avatar physics to high Added appropriate featuretable entries. --- indra/newview/featuretable_linux.txt | 5 +++++ indra/newview/featuretable_mac.txt | 5 +++++ indra/newview/featuretable_xp.txt | 5 +++++ 3 files changed, 15 insertions(+) diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt index a2cd4b834c..5da1495da9 100644 --- a/indra/newview/featuretable_linux.txt +++ b/indra/newview/featuretable_linux.txt @@ -26,6 +26,7 @@ list all RenderAnisotropic 1 1 RenderAvatarCloth 1 1 RenderAvatarLODFactor 1 1.0 +RenderAvatarPhysicsLODFactor 1 1.0 RenderAvatarMaxVisible 1 12 RenderAvatarVP 1 1 RenderCubeMap 1 1 @@ -70,6 +71,7 @@ list Low RenderAnisotropic 1 0 RenderAvatarCloth 1 0 RenderAvatarLODFactor 1 0 +RenderAvatarPhysicsLODFactor 1 0 RenderAvatarMaxVisible 1 3 RenderAvatarVP 1 0 RenderFarClip 1 64 @@ -100,6 +102,7 @@ list Mid RenderAnisotropic 1 0 RenderAvatarCloth 1 0 RenderAvatarLODFactor 1 0.5 +RenderAvatarPhysicsLODFactor 1 0.75 RenderAvatarVP 1 1 RenderFarClip 1 96 RenderFlexTimeFactor 1 1.0 @@ -128,6 +131,7 @@ list High RenderAnisotropic 1 1 RenderAvatarCloth 1 0 RenderAvatarLODFactor 1 1.0 +RenderAvatarPhysicsLODFactor 1 1.0 RenderAvatarVP 1 1 RenderFarClip 1 128 RenderFlexTimeFactor 1 1.0 @@ -156,6 +160,7 @@ list Ultra RenderAnisotropic 1 1 RenderAvatarCloth 1 1 RenderAvatarLODFactor 1 1.0 +RenderAvatarPhysicsLODFactor 1 1.0 RenderAvatarVP 1 1 RenderFarClip 1 256 RenderFlexTimeFactor 1 1.0 diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt index 3ad7f4e892..421f9c0973 100644 --- a/indra/newview/featuretable_mac.txt +++ b/indra/newview/featuretable_mac.txt @@ -26,6 +26,7 @@ list all RenderAnisotropic 1 0 RenderAvatarCloth 0 0 RenderAvatarLODFactor 1 1.0 +RenderAvatarPhysicsLODFactor 1 1.0 RenderAvatarMaxVisible 1 12 RenderAvatarVP 1 0 RenderCubeMap 1 1 @@ -70,6 +71,7 @@ list Low RenderAnisotropic 1 0 RenderAvatarCloth 1 0 RenderAvatarLODFactor 1 0 +RenderAvatarPhysicsLODFactor 1 0 RenderAvatarMaxVisible 1 3 RenderAvatarVP 1 0 RenderFarClip 1 64 @@ -99,6 +101,7 @@ list Mid RenderAnisotropic 1 0 RenderAvatarCloth 1 0 RenderAvatarLODFactor 1 0.5 +RenderAvatarPhysicsLODFactor 1 0.75 RenderAvatarVP 1 1 RenderFarClip 1 96 RenderFlexTimeFactor 1 1.0 @@ -126,6 +129,7 @@ list High RenderAnisotropic 1 1 RenderAvatarCloth 1 0 RenderAvatarLODFactor 1 1.0 +RenderAvatarPhysicsLODFactor 1 1.0 RenderAvatarVP 1 1 RenderFarClip 1 128 RenderFlexTimeFactor 1 1.0 @@ -153,6 +157,7 @@ list Ultra RenderAnisotropic 1 1 RenderAvatarCloth 1 1 RenderAvatarLODFactor 1 1.0 +RenderAvatarPhysicsLODFactor 1 1.0 RenderAvatarVP 1 1 RenderFarClip 1 256 RenderFlexTimeFactor 1 1.0 diff --git a/indra/newview/featuretable_xp.txt b/indra/newview/featuretable_xp.txt index 38e6bb1e5e..c2e5dfff9f 100644 --- a/indra/newview/featuretable_xp.txt +++ b/indra/newview/featuretable_xp.txt @@ -26,6 +26,7 @@ list all RenderAnisotropic 1 1 RenderAvatarCloth 1 1 RenderAvatarLODFactor 1 1.0 +RenderAvatarPhysicsLODFactor 1 1.0 RenderAvatarMaxVisible 1 12 RenderAvatarVP 1 1 RenderCubeMap 1 1 @@ -71,6 +72,7 @@ list Low RenderAnisotropic 1 0 RenderAvatarCloth 1 0 RenderAvatarLODFactor 1 0 +RenderAvatarPhysicsLODFactor 1 0 RenderAvatarMaxVisible 1 3 RenderAvatarVP 1 0 RenderFarClip 1 64 @@ -101,6 +103,7 @@ list Mid RenderAnisotropic 1 0 RenderAvatarCloth 1 0 RenderAvatarLODFactor 1 0.5 +RenderAvatarPhysicsLODFactor 1 0.75 RenderAvatarVP 1 1 RenderFarClip 1 96 RenderFlexTimeFactor 1 1.0 @@ -129,6 +132,7 @@ list High RenderAnisotropic 1 1 RenderAvatarCloth 1 0 RenderAvatarLODFactor 1 1.0 +RenderAvatarPhysicsLODFactor 1 1.0 RenderAvatarVP 1 1 RenderFarClip 1 128 RenderFlexTimeFactor 1 1.0 @@ -157,6 +161,7 @@ list Ultra RenderAnisotropic 1 1 RenderAvatarCloth 1 1 RenderAvatarLODFactor 1 1.0 +RenderAvatarPhysicsLODFactor 1 1.0 RenderAvatarVP 1 1 RenderFarClip 1 256 RenderFlexTimeFactor 1 1.0 -- cgit v1.2.3 From fd97e6dcba7e856e2e018222d9b5aa628de5ab87 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Wed, 20 Apr 2011 11:36:49 -0400 Subject: SH-1388 FIXED Graphics Quality slider has no effect on avatar physics SH-1387 Class0 video cards default avatar physics to high Added appropriate featuretable entries. --- indra/newview/featuretable_linux.txt | 5 +++++ indra/newview/featuretable_mac.txt | 5 +++++ indra/newview/featuretable_xp.txt | 5 +++++ 3 files changed, 15 insertions(+) diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt index a2cd4b834c..5da1495da9 100644 --- a/indra/newview/featuretable_linux.txt +++ b/indra/newview/featuretable_linux.txt @@ -26,6 +26,7 @@ list all RenderAnisotropic 1 1 RenderAvatarCloth 1 1 RenderAvatarLODFactor 1 1.0 +RenderAvatarPhysicsLODFactor 1 1.0 RenderAvatarMaxVisible 1 12 RenderAvatarVP 1 1 RenderCubeMap 1 1 @@ -70,6 +71,7 @@ list Low RenderAnisotropic 1 0 RenderAvatarCloth 1 0 RenderAvatarLODFactor 1 0 +RenderAvatarPhysicsLODFactor 1 0 RenderAvatarMaxVisible 1 3 RenderAvatarVP 1 0 RenderFarClip 1 64 @@ -100,6 +102,7 @@ list Mid RenderAnisotropic 1 0 RenderAvatarCloth 1 0 RenderAvatarLODFactor 1 0.5 +RenderAvatarPhysicsLODFactor 1 0.75 RenderAvatarVP 1 1 RenderFarClip 1 96 RenderFlexTimeFactor 1 1.0 @@ -128,6 +131,7 @@ list High RenderAnisotropic 1 1 RenderAvatarCloth 1 0 RenderAvatarLODFactor 1 1.0 +RenderAvatarPhysicsLODFactor 1 1.0 RenderAvatarVP 1 1 RenderFarClip 1 128 RenderFlexTimeFactor 1 1.0 @@ -156,6 +160,7 @@ list Ultra RenderAnisotropic 1 1 RenderAvatarCloth 1 1 RenderAvatarLODFactor 1 1.0 +RenderAvatarPhysicsLODFactor 1 1.0 RenderAvatarVP 1 1 RenderFarClip 1 256 RenderFlexTimeFactor 1 1.0 diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt index 3ad7f4e892..421f9c0973 100644 --- a/indra/newview/featuretable_mac.txt +++ b/indra/newview/featuretable_mac.txt @@ -26,6 +26,7 @@ list all RenderAnisotropic 1 0 RenderAvatarCloth 0 0 RenderAvatarLODFactor 1 1.0 +RenderAvatarPhysicsLODFactor 1 1.0 RenderAvatarMaxVisible 1 12 RenderAvatarVP 1 0 RenderCubeMap 1 1 @@ -70,6 +71,7 @@ list Low RenderAnisotropic 1 0 RenderAvatarCloth 1 0 RenderAvatarLODFactor 1 0 +RenderAvatarPhysicsLODFactor 1 0 RenderAvatarMaxVisible 1 3 RenderAvatarVP 1 0 RenderFarClip 1 64 @@ -99,6 +101,7 @@ list Mid RenderAnisotropic 1 0 RenderAvatarCloth 1 0 RenderAvatarLODFactor 1 0.5 +RenderAvatarPhysicsLODFactor 1 0.75 RenderAvatarVP 1 1 RenderFarClip 1 96 RenderFlexTimeFactor 1 1.0 @@ -126,6 +129,7 @@ list High RenderAnisotropic 1 1 RenderAvatarCloth 1 0 RenderAvatarLODFactor 1 1.0 +RenderAvatarPhysicsLODFactor 1 1.0 RenderAvatarVP 1 1 RenderFarClip 1 128 RenderFlexTimeFactor 1 1.0 @@ -153,6 +157,7 @@ list Ultra RenderAnisotropic 1 1 RenderAvatarCloth 1 1 RenderAvatarLODFactor 1 1.0 +RenderAvatarPhysicsLODFactor 1 1.0 RenderAvatarVP 1 1 RenderFarClip 1 256 RenderFlexTimeFactor 1 1.0 diff --git a/indra/newview/featuretable_xp.txt b/indra/newview/featuretable_xp.txt index 38e6bb1e5e..c2e5dfff9f 100644 --- a/indra/newview/featuretable_xp.txt +++ b/indra/newview/featuretable_xp.txt @@ -26,6 +26,7 @@ list all RenderAnisotropic 1 1 RenderAvatarCloth 1 1 RenderAvatarLODFactor 1 1.0 +RenderAvatarPhysicsLODFactor 1 1.0 RenderAvatarMaxVisible 1 12 RenderAvatarVP 1 1 RenderCubeMap 1 1 @@ -71,6 +72,7 @@ list Low RenderAnisotropic 1 0 RenderAvatarCloth 1 0 RenderAvatarLODFactor 1 0 +RenderAvatarPhysicsLODFactor 1 0 RenderAvatarMaxVisible 1 3 RenderAvatarVP 1 0 RenderFarClip 1 64 @@ -101,6 +103,7 @@ list Mid RenderAnisotropic 1 0 RenderAvatarCloth 1 0 RenderAvatarLODFactor 1 0.5 +RenderAvatarPhysicsLODFactor 1 0.75 RenderAvatarVP 1 1 RenderFarClip 1 96 RenderFlexTimeFactor 1 1.0 @@ -129,6 +132,7 @@ list High RenderAnisotropic 1 1 RenderAvatarCloth 1 0 RenderAvatarLODFactor 1 1.0 +RenderAvatarPhysicsLODFactor 1 1.0 RenderAvatarVP 1 1 RenderFarClip 1 128 RenderFlexTimeFactor 1 1.0 @@ -157,6 +161,7 @@ list Ultra RenderAnisotropic 1 1 RenderAvatarCloth 1 1 RenderAvatarLODFactor 1 1.0 +RenderAvatarPhysicsLODFactor 1 1.0 RenderAvatarVP 1 1 RenderFarClip 1 256 RenderFlexTimeFactor 1 1.0 -- cgit v1.2.3 From 8b0640704d58984efd0d54e3350d21e9f5845c85 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Wed, 20 Apr 2011 12:37:44 -0400 Subject: SH-1381 FIXED avatar physics behavior is tightly tied to viewer framerate Breaking up physics into smaller integration steps. --- indra/newview/llphysicsmotion.cpp | 354 ++++++++++++++++++++------------------ 1 file changed, 184 insertions(+), 170 deletions(-) diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 5c4d006288..e4335d968f 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -43,7 +43,8 @@ typedef std::map<std::string, std::string> controller_map_t; typedef std::map<std::string, F32> default_controller_map_t; -#define MIN_REQUIRED_PIXEL_AREA_AVATAR_PHYSICS_MOTION 0.f; +#define MIN_REQUIRED_PIXEL_AREA_AVATAR_PHYSICS_MOTION 0.f +#define TIME_ITERATION_STEP 0.1f inline F64 llsgn(const F64 a) { @@ -453,7 +454,8 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) return FALSE; } - if (time_delta > 3.0) + // If less than 1FPS, we don't want to be spending time updating physics at all. + if (time_delta > 1.0) { mLastTime = time; return FALSE; @@ -481,195 +483,207 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) if (physics_test) behavior_maxeffect = 1.0f; - // mPositon_local should be in normalized 0,1 range already. Just making sure... - F32 position_current_local = llclamp(mPosition_local, - 0.0f, - 1.0f); - - // Normalize the param position to be from [0,1]. - // We have to use normalized values because there may be more than one driven param, - // and each of these driven params may have its own range. - // This means we'll do all our calculations in normalized [0,1] local coordinates. - F32 position_user_local = mParamDriver->getWeight(); - position_user_local = (position_user_local - mParamDriver->getMinWeight()) / (mParamDriver->getMaxWeight() - mParamDriver->getMinWeight()); - - // If the effect is turned off then don't process unless we need one more update - // to set the position to the default (i.e. user) position. - if ((behavior_maxeffect == 0) && (position_current_local == position_user_local)) - { - return FALSE; - } - - // - // End parameters and settings - //////////////////////////////////////////////////////////////////////////////// - - - //////////////////////////////////////////////////////////////////////////////// - // Calculate velocity and acceleration in parameter space. - // + BOOL update_visuals = FALSE; + // Break up the physics into a bunch of iterations so that differing framerates will show + // roughly the same behavior. + for (F32 time_iteration = 0; time_iteration <= time_delta; time_iteration += TIME_ITERATION_STEP) + { + F32 time_iteration_step = TIME_ITERATION_STEP; + if (time_iteration + TIME_ITERATION_STEP > time_delta) + { + time_iteration_step = time_delta; + } + + + // mPositon_local should be in normalized 0,1 range already. Just making sure... + F32 position_current_local = llclamp(mPosition_local, + 0.0f, + 1.0f); + + // Normalize the param position to be from [0,1]. + // We have to use normalized values because there may be more than one driven param, + // and each of these driven params may have its own range. + // This means we'll do all our calculations in normalized [0,1] local coordinates. + F32 position_user_local = mParamDriver->getWeight(); + position_user_local = (position_user_local - mParamDriver->getMinWeight()) / (mParamDriver->getMaxWeight() - mParamDriver->getMinWeight()); + + // If the effect is turned off then don't process unless we need one more update + // to set the position to the default (i.e. user) position. + if ((behavior_maxeffect == 0) && (position_current_local == position_user_local)) + { + return FALSE; + } + + // + // End parameters and settings + //////////////////////////////////////////////////////////////////////////////// + + + //////////////////////////////////////////////////////////////////////////////// + // Calculate velocity and acceleration in parameter space. + // - const F32 velocity_joint_local = calculateVelocity_local(time_delta); - const F32 acceleration_joint_local = calculateAcceleration_local(velocity_joint_local, time_delta); + const F32 velocity_joint_local = calculateVelocity_local(time_iteration_step); + const F32 acceleration_joint_local = calculateAcceleration_local(velocity_joint_local, time_iteration_step); - // - // End velocity and acceleration - //////////////////////////////////////////////////////////////////////////////// + // + // End velocity and acceleration + //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - // Calculate the total force - // + //////////////////////////////////////////////////////////////////////////////// + // Calculate the total force + // - // Spring force is a restoring force towards the original user-set breast position. - // F = kx - const F32 spring_length = position_current_local - position_user_local; - const F32 force_spring = -spring_length * behavior_spring; + // Spring force is a restoring force towards the original user-set breast position. + // F = kx + const F32 spring_length = position_current_local - position_user_local; + const F32 force_spring = -spring_length * behavior_spring; - // Acceleration is the force that comes from the change in velocity of the torso. - // F = ma - const F32 force_accel = behavior_gain * (acceleration_joint_local * behavior_mass); + // Acceleration is the force that comes from the change in velocity of the torso. + // F = ma + const F32 force_accel = behavior_gain * (acceleration_joint_local * behavior_mass); - // Gravity always points downward in world space. - // F = mg - const LLVector3 gravity_world(0,0,1); - const F32 force_gravity = behavior_gain * (toLocal(gravity_world) * behavior_gravity * behavior_mass); + // Gravity always points downward in world space. + // F = mg + const LLVector3 gravity_world(0,0,1); + const F32 force_gravity = behavior_gain * (toLocal(gravity_world) * behavior_gravity * behavior_mass); - // Damping is a restoring force that opposes the current velocity. - // F = -kv - const F32 force_damping = -behavior_damping * mVelocity_local; + // Damping is a restoring force that opposes the current velocity. + // F = -kv + const F32 force_damping = -behavior_damping * mVelocity_local; - // Drag is a force imparted by velocity (intuitively it is similar to wind resistance) - // F = .5kv^2 - const F32 force_drag = .5*behavior_drag*velocity_joint_local*velocity_joint_local*llsgn(velocity_joint_local); + // Drag is a force imparted by velocity (intuitively it is similar to wind resistance) + // F = .5kv^2 + const F32 force_drag = .5*behavior_drag*velocity_joint_local*velocity_joint_local*llsgn(velocity_joint_local); - const F32 force_net = (force_accel + - force_gravity + - force_spring + - force_damping + - force_drag); + const F32 force_net = (force_accel + + force_gravity + + force_spring + + force_damping + + force_drag); - // - // End total force - //////////////////////////////////////////////////////////////////////////////// + // + // End total force + //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - // Calculate new params - // - - // Calculate the new acceleration based on the net force. - // a = F/m - const F32 acceleration_new_local = force_net / behavior_mass; - static const F32 max_acceleration = 10.0f; // magic number, used to be customizable. - F32 velocity_new_local = mVelocity_local + acceleration_new_local; - velocity_new_local = llclamp(velocity_new_local, - -max_acceleration, max_acceleration); + //////////////////////////////////////////////////////////////////////////////// + // Calculate new params + // + + // Calculate the new acceleration based on the net force. + // a = F/m + const F32 acceleration_new_local = force_net / behavior_mass; + static const F32 max_acceleration = 10.0f; // magic number, used to be customizable. + F32 velocity_new_local = mVelocity_local + acceleration_new_local; + velocity_new_local = llclamp(velocity_new_local, + -max_acceleration, max_acceleration); - // Temporary debugging setting to cause all avatars to move, for profiling purposes. - if (physics_test) - { - velocity_new_local = sin(time*4.0); - } - // Calculate the new parameters, or remain unchanged if max speed is 0. - F32 position_new_local = position_current_local + velocity_new_local*time_delta; - if (behavior_maxeffect == 0) - position_new_local = position_user_local; - - // Zero out the velocity if the param is being pushed beyond its limits. - if ((position_new_local < 0 && velocity_new_local < 0) || - (position_new_local > 1 && velocity_new_local > 0)) - { - velocity_new_local = 0; - } + // Temporary debugging setting to cause all avatars to move, for profiling purposes. + if (physics_test) + { + velocity_new_local = sin(time*4.0); + } + // Calculate the new parameters, or remain unchanged if max speed is 0. + F32 position_new_local = position_current_local + velocity_new_local*time_iteration_step; + if (behavior_maxeffect == 0) + position_new_local = position_user_local; + + // Zero out the velocity if the param is being pushed beyond its limits. + if ((position_new_local < 0 && velocity_new_local < 0) || + (position_new_local > 1 && velocity_new_local > 0)) + { + velocity_new_local = 0; + } - // Check for NaN values. A NaN value is detected if the variables doesn't equal itself. - // If NaN, then reset everything. - if ((mPosition_local != mPosition_local) || - (mVelocity_local != mVelocity_local) || - (position_new_local != position_new_local)) - { - position_new_local = 0; - position_current_local = 0; - position_user_local = 0; - mVelocity_local = 0; - mVelocityJoint_local = 0; - mAccelerationJoint_local = 0; - mPosition_local = 0; - mPosition_world = LLVector3(0,0,0); - } - - const F32 position_new_local_clamped = llclamp(position_new_local, - 0.0f, - 1.0f); - - LLDriverParam *driver_param = dynamic_cast<LLDriverParam *>(mParamDriver); - llassert_always(driver_param); - if (driver_param) - { - // If this is one of our "hidden" driver params, then make sure it's - // the default value. - if ((driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) && - (driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT)) - { - mCharacter->setVisualParamWeight(driver_param, - 0, - FALSE); - } - for (LLDriverParam::entry_list_t::iterator iter = driver_param->mDriven.begin(); - iter != driver_param->mDriven.end(); - ++iter) - { - LLDrivenEntry &entry = (*iter); - LLViewerVisualParam *driven_param = entry.mParam; - setParamValue(driven_param,position_new_local_clamped, behavior_maxeffect); - } - } + // Check for NaN values. A NaN value is detected if the variables doesn't equal itself. + // If NaN, then reset everything. + if ((mPosition_local != mPosition_local) || + (mVelocity_local != mVelocity_local) || + (position_new_local != position_new_local)) + { + position_new_local = 0; + position_current_local = 0; + position_user_local = 0; + mVelocity_local = 0; + mVelocityJoint_local = 0; + mAccelerationJoint_local = 0; + mPosition_local = 0; + mPosition_world = LLVector3(0,0,0); + } + + const F32 position_new_local_clamped = llclamp(position_new_local, + 0.0f, + 1.0f); + + LLDriverParam *driver_param = dynamic_cast<LLDriverParam *>(mParamDriver); + llassert_always(driver_param); + if (driver_param) + { + // If this is one of our "hidden" driver params, then make sure it's + // the default value. + if ((driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) && + (driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT)) + { + mCharacter->setVisualParamWeight(driver_param, + 0, + FALSE); + } + for (LLDriverParam::entry_list_t::iterator iter = driver_param->mDriven.begin(); + iter != driver_param->mDriven.end(); + ++iter) + { + LLDrivenEntry &entry = (*iter); + LLViewerVisualParam *driven_param = entry.mParam; + setParamValue(driven_param,position_new_local_clamped, behavior_maxeffect); + } + } - // - // End calculate new params - //////////////////////////////////////////////////////////////////////////////// + // + // End calculate new params + //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - // Conditionally update the visual params - // + //////////////////////////////////////////////////////////////////////////////// + // Conditionally update the visual params + // - // Updating the visual params (i.e. what the user sees) is fairly expensive. - // So only update if the params have changed enough, and also take into account - // the graphics LOD settings. + // Updating the visual params (i.e. what the user sees) is fairly expensive. + // So only update if the params have changed enough, and also take into account + // the graphics LOD settings. - BOOL update_visuals = FALSE; - - // For non-self, if the avatar is small enough visually, then don't update. - const F32 area_for_max_settings = 0.0; - const F32 area_for_min_settings = 1400.0; - const F32 area_for_this_setting = area_for_max_settings + (area_for_min_settings-area_for_max_settings)*(1.0-lod_factor); - const F32 pixel_area = fsqrtf(mCharacter->getPixelArea()); + // For non-self, if the avatar is small enough visually, then don't update. + const F32 area_for_max_settings = 0.0; + const F32 area_for_min_settings = 1400.0; + const F32 area_for_this_setting = area_for_max_settings + (area_for_min_settings-area_for_max_settings)*(1.0-lod_factor); + const F32 pixel_area = fsqrtf(mCharacter->getPixelArea()); - const BOOL is_self = (dynamic_cast<LLVOAvatarSelf *>(mCharacter) != NULL); - if ((pixel_area > area_for_this_setting) || is_self) - { - const F32 position_diff_local = llabs(mPositionLastUpdate_local-position_new_local_clamped); - const F32 min_delta = (1.0001f-lod_factor)*0.4f; - if (llabs(position_diff_local) > min_delta) - { - update_visuals = TRUE; - mPositionLastUpdate_local = position_new_local; - } - } + const BOOL is_self = (dynamic_cast<LLVOAvatarSelf *>(mCharacter) != NULL); + if ((pixel_area > area_for_this_setting) || is_self) + { + const F32 position_diff_local = llabs(mPositionLastUpdate_local-position_new_local_clamped); + const F32 min_delta = (1.0001f-lod_factor)*0.4f; + if (llabs(position_diff_local) > min_delta) + { + update_visuals = TRUE; + mPositionLastUpdate_local = position_new_local; + } + } + + // + // End update visual params + //////////////////////////////////////////////////////////////////////////////// + + mVelocityJoint_local = velocity_joint_local; + + mVelocity_local = velocity_new_local; + mAccelerationJoint_local = acceleration_joint_local; + mPosition_local = position_new_local; + + mPosition_world = joint->getWorldPosition(); - // - // End update visual params - //////////////////////////////////////////////////////////////////////////////// - - mVelocityJoint_local = velocity_joint_local; - - mVelocity_local = velocity_new_local; - mAccelerationJoint_local = acceleration_joint_local; - mPosition_local = position_new_local; - - mPosition_world = joint->getWorldPosition(); - mLastTime = time; + } + mLastTime = time; /* // Write out debugging info into a spreadsheet. -- cgit v1.2.3 From dcb79b5b6e8a79ef171e09de8972433bc7489978 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Wed, 20 Apr 2011 12:37:44 -0400 Subject: SH-1381 FIXED avatar physics behavior is tightly tied to viewer framerate Breaking up physics into smaller integration steps. --- indra/newview/llphysicsmotion.cpp | 354 ++++++++++++++++++++------------------ 1 file changed, 184 insertions(+), 170 deletions(-) diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 6a7c28357e..c9d355b3b5 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -49,7 +49,8 @@ typedef std::map<std::string, std::string> controller_map_t; typedef std::map<std::string, F32> default_controller_map_t; -#define MIN_REQUIRED_PIXEL_AREA_AVATAR_PHYSICS_MOTION 0.f; +#define MIN_REQUIRED_PIXEL_AREA_AVATAR_PHYSICS_MOTION 0.f +#define TIME_ITERATION_STEP 0.1f inline F64 llsgn(const F64 a) { @@ -459,7 +460,8 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) return FALSE; } - if (time_delta > 3.0) + // If less than 1FPS, we don't want to be spending time updating physics at all. + if (time_delta > 1.0) { mLastTime = time; return FALSE; @@ -487,195 +489,207 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) if (physics_test) behavior_maxeffect = 1.0f; - // mPositon_local should be in normalized 0,1 range already. Just making sure... - F32 position_current_local = llclamp(mPosition_local, - 0.0f, - 1.0f); - - // Normalize the param position to be from [0,1]. - // We have to use normalized values because there may be more than one driven param, - // and each of these driven params may have its own range. - // This means we'll do all our calculations in normalized [0,1] local coordinates. - F32 position_user_local = mParamDriver->getWeight(); - position_user_local = (position_user_local - mParamDriver->getMinWeight()) / (mParamDriver->getMaxWeight() - mParamDriver->getMinWeight()); - - // If the effect is turned off then don't process unless we need one more update - // to set the position to the default (i.e. user) position. - if ((behavior_maxeffect == 0) && (position_current_local == position_user_local)) - { - return FALSE; - } - - // - // End parameters and settings - //////////////////////////////////////////////////////////////////////////////// - - - //////////////////////////////////////////////////////////////////////////////// - // Calculate velocity and acceleration in parameter space. - // + BOOL update_visuals = FALSE; + // Break up the physics into a bunch of iterations so that differing framerates will show + // roughly the same behavior. + for (F32 time_iteration = 0; time_iteration <= time_delta; time_iteration += TIME_ITERATION_STEP) + { + F32 time_iteration_step = TIME_ITERATION_STEP; + if (time_iteration + TIME_ITERATION_STEP > time_delta) + { + time_iteration_step = time_delta; + } + + + // mPositon_local should be in normalized 0,1 range already. Just making sure... + F32 position_current_local = llclamp(mPosition_local, + 0.0f, + 1.0f); + + // Normalize the param position to be from [0,1]. + // We have to use normalized values because there may be more than one driven param, + // and each of these driven params may have its own range. + // This means we'll do all our calculations in normalized [0,1] local coordinates. + F32 position_user_local = mParamDriver->getWeight(); + position_user_local = (position_user_local - mParamDriver->getMinWeight()) / (mParamDriver->getMaxWeight() - mParamDriver->getMinWeight()); + + // If the effect is turned off then don't process unless we need one more update + // to set the position to the default (i.e. user) position. + if ((behavior_maxeffect == 0) && (position_current_local == position_user_local)) + { + return FALSE; + } + + // + // End parameters and settings + //////////////////////////////////////////////////////////////////////////////// + + + //////////////////////////////////////////////////////////////////////////////// + // Calculate velocity and acceleration in parameter space. + // - const F32 velocity_joint_local = calculateVelocity_local(time_delta); - const F32 acceleration_joint_local = calculateAcceleration_local(velocity_joint_local, time_delta); + const F32 velocity_joint_local = calculateVelocity_local(time_iteration_step); + const F32 acceleration_joint_local = calculateAcceleration_local(velocity_joint_local, time_iteration_step); - // - // End velocity and acceleration - //////////////////////////////////////////////////////////////////////////////// + // + // End velocity and acceleration + //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - // Calculate the total force - // + //////////////////////////////////////////////////////////////////////////////// + // Calculate the total force + // - // Spring force is a restoring force towards the original user-set breast position. - // F = kx - const F32 spring_length = position_current_local - position_user_local; - const F32 force_spring = -spring_length * behavior_spring; + // Spring force is a restoring force towards the original user-set breast position. + // F = kx + const F32 spring_length = position_current_local - position_user_local; + const F32 force_spring = -spring_length * behavior_spring; - // Acceleration is the force that comes from the change in velocity of the torso. - // F = ma - const F32 force_accel = behavior_gain * (acceleration_joint_local * behavior_mass); + // Acceleration is the force that comes from the change in velocity of the torso. + // F = ma + const F32 force_accel = behavior_gain * (acceleration_joint_local * behavior_mass); - // Gravity always points downward in world space. - // F = mg - const LLVector3 gravity_world(0,0,1); - const F32 force_gravity = behavior_gain * (toLocal(gravity_world) * behavior_gravity * behavior_mass); + // Gravity always points downward in world space. + // F = mg + const LLVector3 gravity_world(0,0,1); + const F32 force_gravity = behavior_gain * (toLocal(gravity_world) * behavior_gravity * behavior_mass); - // Damping is a restoring force that opposes the current velocity. - // F = -kv - const F32 force_damping = -behavior_damping * mVelocity_local; + // Damping is a restoring force that opposes the current velocity. + // F = -kv + const F32 force_damping = -behavior_damping * mVelocity_local; - // Drag is a force imparted by velocity (intuitively it is similar to wind resistance) - // F = .5kv^2 - const F32 force_drag = .5*behavior_drag*velocity_joint_local*velocity_joint_local*llsgn(velocity_joint_local); + // Drag is a force imparted by velocity (intuitively it is similar to wind resistance) + // F = .5kv^2 + const F32 force_drag = .5*behavior_drag*velocity_joint_local*velocity_joint_local*llsgn(velocity_joint_local); - const F32 force_net = (force_accel + - force_gravity + - force_spring + - force_damping + - force_drag); + const F32 force_net = (force_accel + + force_gravity + + force_spring + + force_damping + + force_drag); - // - // End total force - //////////////////////////////////////////////////////////////////////////////// + // + // End total force + //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - // Calculate new params - // - - // Calculate the new acceleration based on the net force. - // a = F/m - const F32 acceleration_new_local = force_net / behavior_mass; - static const F32 max_acceleration = 10.0f; // magic number, used to be customizable. - F32 velocity_new_local = mVelocity_local + acceleration_new_local; - velocity_new_local = llclamp(velocity_new_local, - -max_acceleration, max_acceleration); + //////////////////////////////////////////////////////////////////////////////// + // Calculate new params + // + + // Calculate the new acceleration based on the net force. + // a = F/m + const F32 acceleration_new_local = force_net / behavior_mass; + static const F32 max_acceleration = 10.0f; // magic number, used to be customizable. + F32 velocity_new_local = mVelocity_local + acceleration_new_local; + velocity_new_local = llclamp(velocity_new_local, + -max_acceleration, max_acceleration); - // Temporary debugging setting to cause all avatars to move, for profiling purposes. - if (physics_test) - { - velocity_new_local = sin(time*4.0); - } - // Calculate the new parameters, or remain unchanged if max speed is 0. - F32 position_new_local = position_current_local + velocity_new_local*time_delta; - if (behavior_maxeffect == 0) - position_new_local = position_user_local; - - // Zero out the velocity if the param is being pushed beyond its limits. - if ((position_new_local < 0 && velocity_new_local < 0) || - (position_new_local > 1 && velocity_new_local > 0)) - { - velocity_new_local = 0; - } + // Temporary debugging setting to cause all avatars to move, for profiling purposes. + if (physics_test) + { + velocity_new_local = sin(time*4.0); + } + // Calculate the new parameters, or remain unchanged if max speed is 0. + F32 position_new_local = position_current_local + velocity_new_local*time_iteration_step; + if (behavior_maxeffect == 0) + position_new_local = position_user_local; + + // Zero out the velocity if the param is being pushed beyond its limits. + if ((position_new_local < 0 && velocity_new_local < 0) || + (position_new_local > 1 && velocity_new_local > 0)) + { + velocity_new_local = 0; + } - // Check for NaN values. A NaN value is detected if the variables doesn't equal itself. - // If NaN, then reset everything. - if ((mPosition_local != mPosition_local) || - (mVelocity_local != mVelocity_local) || - (position_new_local != position_new_local)) - { - position_new_local = 0; - position_current_local = 0; - position_user_local = 0; - mVelocity_local = 0; - mVelocityJoint_local = 0; - mAccelerationJoint_local = 0; - mPosition_local = 0; - mPosition_world = LLVector3(0,0,0); - } - - const F32 position_new_local_clamped = llclamp(position_new_local, - 0.0f, - 1.0f); - - LLDriverParam *driver_param = dynamic_cast<LLDriverParam *>(mParamDriver); - llassert_always(driver_param); - if (driver_param) - { - // If this is one of our "hidden" driver params, then make sure it's - // the default value. - if ((driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) && - (driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT)) - { - mCharacter->setVisualParamWeight(driver_param, - 0, - FALSE); - } - for (LLDriverParam::entry_list_t::iterator iter = driver_param->mDriven.begin(); - iter != driver_param->mDriven.end(); - ++iter) - { - LLDrivenEntry &entry = (*iter); - LLViewerVisualParam *driven_param = entry.mParam; - setParamValue(driven_param,position_new_local_clamped, behavior_maxeffect); - } - } + // Check for NaN values. A NaN value is detected if the variables doesn't equal itself. + // If NaN, then reset everything. + if ((mPosition_local != mPosition_local) || + (mVelocity_local != mVelocity_local) || + (position_new_local != position_new_local)) + { + position_new_local = 0; + position_current_local = 0; + position_user_local = 0; + mVelocity_local = 0; + mVelocityJoint_local = 0; + mAccelerationJoint_local = 0; + mPosition_local = 0; + mPosition_world = LLVector3(0,0,0); + } + + const F32 position_new_local_clamped = llclamp(position_new_local, + 0.0f, + 1.0f); + + LLDriverParam *driver_param = dynamic_cast<LLDriverParam *>(mParamDriver); + llassert_always(driver_param); + if (driver_param) + { + // If this is one of our "hidden" driver params, then make sure it's + // the default value. + if ((driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) && + (driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT)) + { + mCharacter->setVisualParamWeight(driver_param, + 0, + FALSE); + } + for (LLDriverParam::entry_list_t::iterator iter = driver_param->mDriven.begin(); + iter != driver_param->mDriven.end(); + ++iter) + { + LLDrivenEntry &entry = (*iter); + LLViewerVisualParam *driven_param = entry.mParam; + setParamValue(driven_param,position_new_local_clamped, behavior_maxeffect); + } + } - // - // End calculate new params - //////////////////////////////////////////////////////////////////////////////// + // + // End calculate new params + //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - // Conditionally update the visual params - // + //////////////////////////////////////////////////////////////////////////////// + // Conditionally update the visual params + // - // Updating the visual params (i.e. what the user sees) is fairly expensive. - // So only update if the params have changed enough, and also take into account - // the graphics LOD settings. + // Updating the visual params (i.e. what the user sees) is fairly expensive. + // So only update if the params have changed enough, and also take into account + // the graphics LOD settings. - BOOL update_visuals = FALSE; - - // For non-self, if the avatar is small enough visually, then don't update. - const F32 area_for_max_settings = 0.0; - const F32 area_for_min_settings = 1400.0; - const F32 area_for_this_setting = area_for_max_settings + (area_for_min_settings-area_for_max_settings)*(1.0-lod_factor); - const F32 pixel_area = fsqrtf(mCharacter->getPixelArea()); + // For non-self, if the avatar is small enough visually, then don't update. + const F32 area_for_max_settings = 0.0; + const F32 area_for_min_settings = 1400.0; + const F32 area_for_this_setting = area_for_max_settings + (area_for_min_settings-area_for_max_settings)*(1.0-lod_factor); + const F32 pixel_area = fsqrtf(mCharacter->getPixelArea()); - const BOOL is_self = (dynamic_cast<LLVOAvatarSelf *>(mCharacter) != NULL); - if ((pixel_area > area_for_this_setting) || is_self) - { - const F32 position_diff_local = llabs(mPositionLastUpdate_local-position_new_local_clamped); - const F32 min_delta = (1.0001f-lod_factor)*0.4f; - if (llabs(position_diff_local) > min_delta) - { - update_visuals = TRUE; - mPositionLastUpdate_local = position_new_local; - } - } + const BOOL is_self = (dynamic_cast<LLVOAvatarSelf *>(mCharacter) != NULL); + if ((pixel_area > area_for_this_setting) || is_self) + { + const F32 position_diff_local = llabs(mPositionLastUpdate_local-position_new_local_clamped); + const F32 min_delta = (1.0001f-lod_factor)*0.4f; + if (llabs(position_diff_local) > min_delta) + { + update_visuals = TRUE; + mPositionLastUpdate_local = position_new_local; + } + } + + // + // End update visual params + //////////////////////////////////////////////////////////////////////////////// + + mVelocityJoint_local = velocity_joint_local; + + mVelocity_local = velocity_new_local; + mAccelerationJoint_local = acceleration_joint_local; + mPosition_local = position_new_local; + + mPosition_world = joint->getWorldPosition(); - // - // End update visual params - //////////////////////////////////////////////////////////////////////////////// - - mVelocityJoint_local = velocity_joint_local; - - mVelocity_local = velocity_new_local; - mAccelerationJoint_local = acceleration_joint_local; - mPosition_local = position_new_local; - - mPosition_world = joint->getWorldPosition(); - mLastTime = time; + } + mLastTime = time; /* // Write out debugging info into a spreadsheet. -- cgit v1.2.3 From ecb8c4e718067b1fb567aa1182f213408ea8b463 Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Wed, 20 Apr 2011 15:37:50 -0500 Subject: SH-1411 Fix for shadows from large objects flickering at odd angles at certain times of day. --- indra/newview/app_settings/settings.xml | 2 +- indra/newview/pipeline.cpp | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 6d80a21483..80dfe16ee9 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -8048,7 +8048,7 @@ <key>Type</key> <string>F32</string> <key>Value</key> - <real>1.1</real> + <real>0.8</real> </map> <key>RenderShadowGaussian</key> diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index a533be675c..ec1f9173ff 100755 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -9110,11 +9110,6 @@ void LLPipeline::generateSunShadow(LLCamera& camera) fovx = acos(fovx); fovz = acos(fovz); - if (fovx > cutoff || llround(fovz, 0.01f) > cutoff) - { - // llerrs << "WTF?" << llendl; - } - mShadowFOV.mV[j] = cutoff; } -- cgit v1.2.3 From 4bbfdd4c1fc18162960ba61fbdad40940a4cdd89 Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Wed, 20 Apr 2011 17:13:42 -0500 Subject: SH-1417 Disable occlusion culling for reflection map for now. --- indra/newview/pipeline.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index ec1f9173ff..df1e8d87af 100755 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -7881,6 +7881,10 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in) if (!LLViewerCamera::getInstance()->cameraUnderWater()) { //generate planar reflection map + + //disable occlusion culling for reflection map for now + S32 occlusion = LLPipeline::sUseOcclusion; + LLPipeline::sUseOcclusion = 0; gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); glClearColor(0,0,0,0); mWaterRef.bindTarget(); @@ -7984,6 +7988,7 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in) glPopMatrix(); mWaterRef.flush(); glh_set_current_modelview(current); + LLPipeline::sUseOcclusion = occlusion; } camera.setOrigin(camera_in.getOrigin()); -- cgit v1.2.3 From 87512a6e5d13b1c3840d299708da85f8e3ac1955 Mon Sep 17 00:00:00 2001 From: "Nyx (Neal Orman)" <nyx@lindenlab.com> Date: Wed, 20 Apr 2011 18:22:02 -0400 Subject: re-applying fix from previous mesh-dev merge branch SH-1062 FIX Flexi sculpts is a mess until you zoom in. --- indra/newview/llflexibleobject.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/indra/newview/llflexibleobject.cpp b/indra/newview/llflexibleobject.cpp index bd939d8636..3d1650d2f5 100644 --- a/indra/newview/llflexibleobject.cpp +++ b/indra/newview/llflexibleobject.cpp @@ -366,7 +366,7 @@ void LLVolumeImplFlexible::doFlexibleUpdate() LLFastTimer ftm(FTM_DO_FLEXIBLE_UPDATE); LLVolume* volume = mVO->getVolume(); LLPath *path = &volume->getPath(); - if ((mSimulateRes == 0 || !mInitialized) && mVO->mDrawable->isVisible()) + if ((mSimulateRes == 0 || !mInitialized) && mVO->mDrawable->isVisible()) // if its uninitialized but not visible, what then? - Nyx { mVO->markForUpdate(TRUE); if (!doIdleUpdate(gAgent, *LLWorld::getInstance(), 0.0)) @@ -375,11 +375,6 @@ void LLVolumeImplFlexible::doFlexibleUpdate() } } - if (!mVO->mDrawable->isVisible()) - { - return; - } - llassert_always(mInitialized); S32 num_sections = 1 << mSimulateRes; -- cgit v1.2.3 From b2abe18ea59424ce5ed19f96c6486c8498094bfa Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Wed, 20 Apr 2011 16:39:20 -0700 Subject: EXP-629 Clicking on ground while sitting results in avatar walking to last click point when standing up in basic mode --- indra/newview/lltoolpie.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index 95bd210ae3..06e0d17b8c 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -639,6 +639,7 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask) if (click_action == CLICK_ACTION_NONE // not doing 1-click action && gSavedSettings.getBOOL("ClickToWalk") // click to walk enabled && !gAgent.getFlying() // don't auto-navigate while flying until that works + && !gAgentAvatarp->isSitting() && !mBlockClickToWalk // another behavior hasn't cancelled click to walk && !mPick.mPosGlobal.isExactlyZero() // valid coordinates for pick && (mPick.mPickType == LLPickInfo::PICK_LAND // we clicked on land -- cgit v1.2.3 From 0bc8b0fd5bd230ce11b47fd4a41ebfa1dc9c27c7 Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Wed, 20 Apr 2011 16:39:44 -0700 Subject: EXP-670 As a resident I want to be able to communicate with other residents using my voice, while still enjoying the streamlined experience of basic mode --- indra/newview/app_settings/settings_minimal.xml | 8 +- .../skins/default/xui/en/panel_bottomtray.xml | 605 ++++++++++----------- .../minimal/xui/en/panel_adhoc_control_panel.xml | 35 ++ .../skins/minimal/xui/en/panel_bottomtray.xml | 38 ++ .../minimal/xui/en/panel_im_control_panel.xml | 33 ++ 5 files changed, 408 insertions(+), 311 deletions(-) diff --git a/indra/newview/app_settings/settings_minimal.xml b/indra/newview/app_settings/settings_minimal.xml index bc97ec00e9..60aecb279c 100644 --- a/indra/newview/app_settings/settings_minimal.xml +++ b/indra/newview/app_settings/settings_minimal.xml @@ -52,7 +52,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>0</integer> + <integer>1</integer> </map> <key>HelpURLFormat</key> <map> @@ -124,7 +124,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>1</integer> + <integer>0</integer> </map> <key>VoiceDisableMic</key> <map> @@ -133,7 +133,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>1</integer> + <integer>0</integer> </map> <key>ScriptsCanShowUI</key> <map> @@ -290,7 +290,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>0</integer> + <integer>1</integer> </map> <key>EnableAvatarShare</key> <map> diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index a92cc886e7..b1c17e402e 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -5,23 +5,23 @@ bg_opaque_color="DkGray" chrome="true" follows="left|bottom|right" - focus_root="true" height="33" layout="topleft" left="0" name="bottom_tray" + focus_root="true" top="28" width="1310"> - <string + <string name="DragIndicationImageName" value="Accordion_ArrowOpened_Off" /> - <string + <string name="SpeakBtnToolTip" value="Turns microphone on/off" /> - <string + <string name="VoiceControlBtnToolTip" value="Shows/hides voice control panel" /> - <layout_stack + <layout_stack border_size="0" clip="false" follows="all" @@ -33,93 +33,71 @@ orientation="horizontal" top="0" width="1310"> - <layout_panel + <layout_panel auto_resize="false" - user_resize="false" + user_resize="false" min_width="2" width="2" /> - <layout_panel + <layout_panel auto_resize="false" layout="topleft" max_width="320" min_width="214" - height="28" + height="28" mouse_opaque="false" - name="chat_bar_layout_panel" + name="chat_bar_layout_panel" user_resize="true" - width="310" > - <panel - name="chat_bar" - filename="panel_nearby_chat_bar.xml" - left="0" - height="28" - width="308" - top="0" - mouse_opaque="false" - follows="left|right" + width="308" > + <panel + name="chat_bar" + filename="panel_nearby_chat_bar.xml" + left="0" + height="28" + width="306" + top="0" + mouse_opaque="false" + follows="left|right" /> - </layout_panel> - <!-- - This 5px Panel is an indicator of where the resize handle is. - The panel provides a gap between the resize handle icon and a button to the right. - --> - <layout_panel - auto_resize="false" - layout="topleft" - max_width="5" - min_width="5" - name="chat_bar_resize_handle_panel" - user_resize="false" - width="5"> - <icon - follows="top|right" - height="25" - image_name="ChatBarHandle" - layout="topleft" - left="-7" - name="resize_handle" - top="4" - width="5" /> - </layout_panel> - <layout_panel - auto_resize="false" - follows="left|right" - height="28" - layout="topleft" - min_height="28" - min_width="59" - mouse_opaque="false" - name="speak_panel" - top_delta="0" - user_resize="false" - width="108"> - <talk_button - follows="left|right" - height="23" - layout="topleft" - left="0" - name="talk" - top="5" - width="105"> - <show_button - tab_stop="true"> - <init_callback - function="Button.SetDockableFloaterToggle" - parameter="voice_controls" /> - </show_button> - <!-- do not remove halign attribute with default value. otherwise it can't be overridden in other locales. + </layout_panel> + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_height="28" + min_width="59" + mouse_opaque="false" + name="speak_panel" + top_delta="0" + user_resize="false" + width="108"> + <talk_button + follows="left|right" + height="23" + layout="topleft" + left="0" + name="talk" + top="5" + width="105"> + <show_button + tab_stop="true"> + <init_callback + function="Button.SetDockableFloaterToggle" + parameter="voice_controls" /> + </show_button> + <!-- do not remove halign attribute with default value. otherwise it can't be overridden in other locales. & pad_right is default value for long label which can be right aligned. See EXT-6318 --> - <speak_button - halign="center" - label="Speak" - label_selected="Speak" - name="speak_btn" - pad_right="20" - tab_stop="true" - use_ellipses="true" /> - </talk_button> - </layout_panel> - <layout_panel + <speak_button + halign="center" + label="Speak" + label_selected="Speak" + name="speak_btn" + pad_right="20" + tab_stop="true" + use_ellipses="true" /> + </talk_button> + </layout_panel> + <layout_panel auto_resize="false" follows="right" height="28" @@ -131,55 +109,27 @@ top_delta="0" user_resize="false" width="85"> - <gesture_combo_list + <gesture_combo_list follows="left|right" height="23" label="Gesture" layout="topleft" + get_more="false" + view_all="false" left="0" name="Gesture" tool_tip="Shows/hides gestures" top="5" width="82"> - <combo_button + <combo_button pad_right="10" + can_drag="false" use_ellipses="true" /> - <combo_list + <combo_list page_lines="17" /> - </gesture_combo_list> - </layout_panel> - <layout_panel - auto_resize="false" - follows="right" - height="28" - layout="topleft" - min_height="28" - min_width="52" - mouse_opaque="false" - name="movement_panel" - user_resize="false" - width="83"> - <bottomtray_button - follows="left|right" - height="23" - image_pressed="PushButton_Press" - image_pressed_selected="PushButton_Selected_Press" - image_selected="PushButton_Selected_Press" - is_toggle="true" - label="Move" - layout="topleft" - name="movement_btn" - tool_tip="Shows/hides movement controls" - top="5" - use_ellipses="true" - width="80"> - <init_callback - function="Button.SetDockableFloaterToggle" - parameter="moveview" /> - </bottomtray_button> - - </layout_panel> - <layout_panel + </gesture_combo_list> + </layout_panel> + <layout_panel auto_resize="false" follows="left|right" height="28" @@ -190,7 +140,8 @@ name="cam_panel" user_resize="false" width="83"> - <bottomtray_button + <bottomtray_button + can_drag="false" follows="left|right" height="23" image_pressed="PushButton_Press" @@ -205,180 +156,220 @@ top="5" use_ellipses="true" width="80"> - <init_callback + <init_callback function="Button.SetDockableFloaterToggle" parameter="camera" /> - </bottomtray_button> - </layout_panel> - <layout_panel + </bottomtray_button> + </layout_panel> + <layout_panel auto_resize="false" follows="left|right" height="28" layout="topleft" - min_width="40" - mouse_opaque="false" - name="snapshot_panel" + min_width="17" + name="splitter_panel" user_resize="false" - width="39"> - <bottomtray_button - follows="left|right" - height="23" - image_overlay="Snapshot_Off" - image_pressed="PushButton_Press" - image_pressed_selected="PushButton_Selected_Press" - image_selected="PushButton_Selected_Press" - is_toggle="true" - layout="topleft" - left="0" - name="snapshots" - tool_tip="Take snapshot" - top="5" - width="36"> - <init_callback - function="Button.SetFloaterToggle" - parameter="snapshot" /> - </bottomtray_button> - </layout_panel> - <layout_panel + width="17"> + <icon + follows="left|bottom" + height="18" + width="2" + left="6" + image_name="Button_Separator" + name="separator" + top="7"/> + </layout_panel> + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_height="28" + min_width="83" + mouse_opaque="false" + name="avatar_and_destinations_panel" + user_resize="false" + width="103"> + <bottomtray_button + can_drag="false" + follows="left|right" + height="23" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + label="Destinations" + layout="topleft" + left="0" + name="destination_btn" + tool_tip="Shows destinations window" + top="5" + is_toggle="true" + use_ellipses="true" + width="100"> + <bottomtray_button.commit_callback + function="Destination.show" /> + </bottomtray_button> + </layout_panel> + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_height="28" + min_width="73" + mouse_opaque="false" + name="avatar_and_destinations_panel" + user_resize="false" + width="103"> + <bottomtray_button + can_drag="false" + follows="left|right" + height="23" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + label="My Avatar" + layout="topleft" + left="0" + name="avatar_btn" + top="5" + is_toggle="true" + use_ellipses="true" + width="100"> + <bottomtray_button.commit_callback + function="Avatar.show" /> + </bottomtray_button> + </layout_panel> + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_width="17" + name="splitter_panel" + user_resize="false" + width="17"> + <icon + follows="left|bottom" + height="18" + width="2" + left="6" + image_name="Button_Separator" + name="separator" + top="7"/> + </layout_panel> + <layout_panel auto_resize="false" - follows="left|right" - height="28" - layout="topleft" - min_height="28" - min_width="52" - mouse_opaque="false" - name="build_btn_panel" - user_resize="false" - width="83"> -<!--*FIX: Build Floater is not opened with default registration. Will be fixed soon. -Disabled for now. ---> - <bottomtray_button - follows="left|right" - height="23" - image_pressed="PushButton_Press" - image_pressed_selected="PushButton_Selected_Press" - image_selected="PushButton_Selected_Press" - is_toggle="true" - label="Build" - layout="topleft" - left="0" - name="build_btn" - tool_tip="Shows/hides Build Tools" - top="5" - use_ellipses="true" - width="80"> - <commit_callback - function="Build.Toggle" - parameter="build" /> - </bottomtray_button> - </layout_panel> - <layout_panel - auto_resize="false" - follows="left|right" - height="28" - layout="topleft" - min_height="28" - min_width="52" - mouse_opaque="false" - name="search_btn_panel" - user_resize="false" - width="83"> - <bottomtray_button - follows="left|right" - height="23" - image_pressed="PushButton_Press" - image_pressed_selected="PushButton_Selected_Press" - image_selected="PushButton_Selected_Press" - is_toggle="true" - label="Search" - layout="topleft" - left="0" - name="search_btn" - tool_tip="Shows/hides Search" - top="5" - use_ellipses="true" - width="80"> - <init_callback - function="Button.SetFloaterToggle" - parameter="search" /> - </bottomtray_button> - </layout_panel> - <layout_panel - auto_resize="false" - follows="left|right" - height="28" - layout="topleft" - min_height="28" - min_width="52" - mouse_opaque="false" - name="world_map_btn_panel" - user_resize="false" - width="83"> - <bottomtray_button - follows="left|right" - height="23" - image_pressed="PushButton_Press" - image_pressed_selected="PushButton_Selected_Press" - image_selected="PushButton_Selected_Press" - is_toggle="true" - label="Map" - layout="topleft" - left="0" - name="world_map_btn" - tool_tip="Shows/hides World Map" - top="5" - use_ellipses="true" - width="80"> - <init_callback - function="Button.SetFloaterToggle" - parameter="world_map" /> - </bottomtray_button> - </layout_panel> - <layout_panel - auto_resize="false" - follows="left|right" + follows="right" height="28" layout="topleft" min_height="28" - min_width="52" - mouse_opaque="false" - name="mini_map_btn_panel" - user_resize="false" - width="83"> - <bottomtray_button - follows="left|right" - height="23" - image_pressed="PushButton_Press" - image_pressed_selected="PushButton_Selected_Press" - image_selected="PushButton_Selected_Press" - is_toggle="true" - label="Mini-Map" - layout="topleft" - left="0" - name="mini_map_btn" - tool_tip="Shows/hides Mini-Map" - top="5" - use_ellipses="true" - width="80"> - <init_callback - function="Button.SetFloaterToggle" - parameter="mini_map" /> - </bottomtray_button> - </layout_panel> - <layout_panel - follows="left|right" - height="30" - layout="topleft" - min_width="95" + min_width="65" mouse_opaque="false" - name="chiclet_list_panel" - top="0" + name="people_panel" + top_delta="0" user_resize="false" - width="189"> -<!--*NOTE: min_width of the chiclet_panel (chiclet_list) must be the same + width="105"> + <bottomtray_button + can_drag="false" + follows="left|right" + height="23" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + label="People" + layout="topleft" + left="0" + name="show_people_button" + tool_tip="Shows people window" + top="5" + is_toggle="true" + use_ellipses="true" + width="100"> + <bottomtray_button.commit_callback + function="ShowSidetrayPanel" + parameter="panel_people" /> + </bottomtray_button> + </layout_panel> + <layout_panel + auto_resize="false" + follows="right" + height="28" + layout="topleft" + min_height="28" + min_width="65" + mouse_opaque="false" + name="profile_panel" + top_delta="0" + user_resize="false" + width="105"> + <bottomtray_button + can_drag="false" + follows="left|right" + height="23" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + label="Profile" + layout="topleft" + left="0" + name="show_profile_btn" + tool_tip="Shows profile window" + is_toggle="true" + top="5" + use_ellipses="true" + width="100"> + <bottomtray_button.commit_callback + function="ToggleAgentProfile" + parameter="agent"/> + </bottomtray_button> + </layout_panel> + <layout_panel + auto_resize="false" + follows="right" + height="28" + layout="topleft" + min_height="28" + min_width="65" + mouse_opaque="false" + name="howto_panel" + top_delta="0" + user_resize="false" + width="105"> + <bottomtray_button + can_drag="false" + follows="left|right" + height="23" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + label="How To" + layout="topleft" + left="0" + name="show_help_btn" + tool_tip="Open Second Life How To topics" + is_toggle="true" + top="5" + use_ellipses="true" + width="100"> + <bottomtray_button.commit_callback + function="ToggleHelp" + parameter="f1_help" /> + </bottomtray_button> + </layout_panel> + <layout_panel + follows="left|right" + height="30" + layout="topleft" + min_width="95" + mouse_opaque="false" + name="chiclet_list_panel" + top="0" + user_resize="false" + width="189"> + <!--*NOTE: min_width of the chiclet_panel (chiclet_list) must be the same as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. EXT-991--> - <chiclet_panel + <chiclet_panel chiclet_padding="4" follows="left|right" height="24" @@ -389,7 +380,7 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. name="chiclet_list" top="7" width="189"> - <button + <button auto_resize="true" follows="right" height="29" @@ -406,7 +397,7 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. top="-28" visible="false" width="7" /> - <button + <button auto_resize="true" follows="right" height="29" @@ -423,13 +414,13 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. top="-28" visible="false" width="7" /> - </chiclet_panel> - </layout_panel> - <layout_panel auto_resize="false" - user_resize="false" + </chiclet_panel> + </layout_panel> + <layout_panel auto_resize="false" + user_resize="false" width="4" min_width="4"/> - <layout_panel + <layout_panel auto_resize="false" follows="right" height="28" @@ -440,7 +431,7 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. top="0" user_resize="false" width="37"> - <chiclet_im_well + <chiclet_im_well follows="right" height="28" layout="topleft" @@ -449,7 +440,7 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. name="im_well" top="0" width="35"> - <!-- + <!-- Emulate 4 states of button by background images, see details in EXT-3147. The same should be for notification_well button xml attribute Description image_unselected "Unlit" - there are no new messages @@ -457,7 +448,7 @@ image_selected "Unlit" + "Selected" - there are no new messages and the image_pressed "Lit" - there are new messages image_pressed_selected "Lit" + "Selected" - there are new messages and the Well is open --> - <button + <button auto_resize="true" follows="right" halign="center" @@ -472,13 +463,13 @@ image_pressed_selected "Lit" + "Selected" - there are new messages and the Well name="Unread IM messages" tool_tip="Conversations" width="34"> - <init_callback + <init_callback function="Button.SetDockableFloaterToggle" parameter="im_well_window" /> - </button> - </chiclet_im_well> - </layout_panel> - <layout_panel + </button> + </chiclet_im_well> + </layout_panel> + <layout_panel auto_resize="false" follows="right" height="28" @@ -489,7 +480,7 @@ image_pressed_selected "Lit" + "Selected" - there are new messages and the Well top="0" user_resize="false" width="37"> - <chiclet_notification + <chiclet_notification follows="right" height="23" layout="topleft" @@ -498,7 +489,7 @@ image_pressed_selected "Lit" + "Selected" - there are new messages and the Well name="notification_well" top="5" width="35"> - <button + <button auto_resize="true" bottom_pad="3" follows="right" @@ -514,17 +505,17 @@ image_pressed_selected "Lit" + "Selected" - there are new messages and the Well name="Unread" tool_tip="Notifications" width="34"> - <init_callback + <init_callback function="Button.SetDockableFloaterToggle" parameter="notification_well_window" /> - </button> - </chiclet_notification> - </layout_panel> - <layout_panel - auto_resize="false" - user_resize="false" - min_width="4" - name="DUMMY2" - width="8" /> - </layout_stack> + </button> + </chiclet_notification> + </layout_panel> + <layout_panel + auto_resize="false" + user_resize="false" + min_width="4" + name="DUMMY2" + width="8" /> + </layout_stack> </panel> diff --git a/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml index 5730adab8a..39d1a90850 100644 --- a/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml +++ b/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml @@ -42,5 +42,40 @@ show_speaking_indicator="false" width="147" /> </layout_panel> + <layout_panel + auto_resize="false" + follows="top|left|right" + height="25" + layout="topleft" + min_height="25" + width="130" + name="call_btn_panel" + user_resize="false" + visible="false"> + <button + follows="all" + height="20" + label="Call" + name="call_btn" + width="130" + top="5" /> + </layout_panel> + <layout_panel + auto_resize="false" + follows="top|left|right" + height="25" + layout="topleft" + min_height="25" + width="130" + name="end_call_btn_panel" + user_resize="false" + visible="false"> + <button + follows="all" + height="20" + label="Leave Call" + name="end_call_btn" + top="5"/> + </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml index a250f95e4f..95f2010e44 100644 --- a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml @@ -59,6 +59,44 @@ follows="left|right" /> </layout_panel> + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_height="28" + min_width="59" + mouse_opaque="false" + name="speak_panel" + top_delta="0" + user_resize="false" + width="108"> + <talk_button + follows="left|right" + height="23" + layout="topleft" + left="0" + name="talk" + top="5" + width="105"> + <show_button + tab_stop="true"> + <init_callback + function="Button.SetDockableFloaterToggle" + parameter="voice_controls" /> + </show_button> + <!-- do not remove halign attribute with default value. otherwise it can't be overridden in other locales. + & pad_right is default value for long label which can be right aligned. See EXT-6318 --> + <speak_button + halign="center" + label="Speak" + label_selected="Speak" + name="speak_btn" + pad_right="20" + tab_stop="true" + use_ellipses="true" /> + </talk_button> + </layout_panel> <layout_panel auto_resize="false" follows="right" diff --git a/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml index c3f46f11e0..be13bc1bb7 100644 --- a/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml +++ b/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml @@ -77,6 +77,39 @@ tool_tip = "Offer to teleport this person" width="140" /> </layout_panel> + <layout_panel + auto_resize="false" + follows="top|left|right" + height="25" + layout="topleft" + min_height="25" + width="140" + name="call_btn_panel" + user_resize="false"> + <button + follows="left|top|right" + height="23" + label="Call" + name="call_btn" + width="140" /> + </layout_panel> + <layout_panel + auto_resize="false" + follows="top|left|right" + height="25" + layout="topleft" + min_height="25" + width="140" + name="end_call_btn_panel" + user_resize="false" + visible="false"> + <button + follows="left|top|right" + height="23" + label="End Call" + name="end_call_btn" + width="140" /> + </layout_panel> <layout_panel mouse_opaque="false" auto_resize="true" -- cgit v1.2.3 From a357815604757eede6489ae81387abe5d866d7cf Mon Sep 17 00:00:00 2001 From: Xiaohong Bao <bao@lindenlab.com> Date: Wed, 20 Apr 2011 18:10:33 -0600 Subject: update the collada lib of Mac to the rev 227230 to fix the missed minizip problem. --- autobuild.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index c79701adfd..7d63aa9209 100755 --- a/autobuild.xml +++ b/autobuild.xml @@ -234,9 +234,9 @@ <key>archive</key> <map> <key>hash</key> - <string>2222b901f310c1806847293789d69ac7</string> + <string>480b27a0cb39a4adfcdeabef895de3e1</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-colladadom/rev/226584/arch/Darwin/installer/colladadom-2.2-darwin-20110413.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-colladadom/rev/227230/arch/Darwin/installer/colladadom-2.2-darwin-20110420.tar.bz2</string> </map> <key>name</key> <string>darwin</string> -- cgit v1.2.3 From c82219934dfc20d8e4401ed875f9c59c16ab922c Mon Sep 17 00:00:00 2001 From: Leslie Linden <leslie@lindenlab.com> Date: Wed, 20 Apr 2011 17:30:06 -0700 Subject: mac and linux build fixes --- indra/llui/llloadingindicator.cpp | 2 +- indra/llxuixml/llinitparam.h | 53 +++++++++++++++++++++------------------ 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/indra/llui/llloadingindicator.cpp b/indra/llui/llloadingindicator.cpp index 8a0f875808..c4eec1835c 100644 --- a/indra/llui/llloadingindicator.cpp +++ b/indra/llui/llloadingindicator.cpp @@ -77,7 +77,7 @@ void LLLoadingIndicator::draw() start(); } - LLUIImagePtr cur_image = mImages.empty() ? NULL : mImages[mCurImageIdx]; + LLUIImagePtr cur_image = mImages.empty() ? LLUIImagePtr(NULL) : mImages[mCurImageIdx]; // Draw current image. if( cur_image.notNull() ) diff --git a/indra/llxuixml/llinitparam.h b/indra/llxuixml/llinitparam.h index 39ba32e537..858f8405b4 100644 --- a/indra/llxuixml/llinitparam.h +++ b/indra/llxuixml/llinitparam.h @@ -100,7 +100,7 @@ namespace LLInitParam class TypeValuesHelper { public: - typedef std::map<std::string, T> value_name_map_t; + typedef typename std::map<std::string, T> value_name_map_t; //TODO: cache key by index to save on param block size void setValueName(const std::string& value_name) @@ -121,7 +121,7 @@ namespace LLInitParam static bool getValueFromName(const std::string& name, T& value) { value_name_map_t* map = getValueNames(); - value_name_map_t::iterator found_it = map->find(name); + typename value_name_map_t::iterator found_it = map->find(name); if (found_it == map->end()) return false; value = found_it->second; @@ -151,7 +151,7 @@ namespace LLInitParam static std::vector<std::string> sValues; value_name_map_t* map = getValueNames(); - for (value_name_map_t::iterator it = map->begin(), end_it = map->end(); + for (typename value_name_map_t::iterator it = map->begin(), end_it = map->end(); it != end_it; ++it) { @@ -598,6 +598,7 @@ namespace LLInitParam typedef const T& value_assignment_t; typedef TypedParam<T, NAME_VALUE_LOOKUP, HAS_MULTIPLE_VALUES, VALUE_IS_BLOCK> self_t; typedef NAME_VALUE_LOOKUP name_value_lookup_t; + typedef ParamValue<T, NAME_VALUE_LOOKUP> param_value_t; TypedParam(BlockDescriptor& block_descriptor, const char* name, value_assignment_t value, ParamDescriptor::validation_func_t validate_func, S32 min_count, S32 max_count) : Param(block_descriptor.mCurrentBlockPtr) @@ -704,7 +705,7 @@ namespace LLInitParam void set(value_assignment_t val, bool flag_as_provided = true) { setValue(val); - clearValueName(); + param_value_t::clearValueName(); setProvided(flag_as_provided); Param::enclosingBlock().paramChanged(*this, flag_as_provided); } @@ -718,9 +719,9 @@ namespace LLInitParam } // implicit conversion - operator value_assignment_t() const { return getValue(); } + operator value_assignment_t() const { return param_value_t::getValue(); } // explicit conversion - value_assignment_t operator()() const { return getValue(); } + value_assignment_t operator()() const { return param_value_t::getValue(); } protected: @@ -752,10 +753,11 @@ namespace LLInitParam typedef value_const_t& value_assignment_t; typedef TypedParam<T, NAME_VALUE_LOOKUP, false, true> self_t; typedef NAME_VALUE_LOOKUP name_value_lookup_t; + typedef ParamValue<T, NAME_VALUE_LOOKUP> param_value_t; TypedParam(BlockDescriptor& block_descriptor, const char* name, value_assignment_t value, ParamDescriptor::validation_func_t validate_func, S32 min_count, S32 max_count) : Param(block_descriptor.mCurrentBlockPtr), - ParamValue(value) + param_value_t(value) { if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING)) { @@ -840,23 +842,23 @@ namespace LLInitParam bool isProvided() const { // only validate block when it hasn't already passed validation with current data - if (Param::anyProvided() && mValidatedVersion < getLastChangeVersion()) + if (Param::anyProvided() && param_value_t::mValidatedVersion < param_value_t::getLastChangeVersion()) { // a sub-block is "provided" when it has been filled in enough to be valid - mValidated = validateBlock(false); - mValidatedVersion = getLastChangeVersion(); + param_value_t::mValidated = param_value_t::validateBlock(false); + param_value_t::mValidatedVersion = param_value_t::getLastChangeVersion(); } - return Param::anyProvided() && mValidated; + return Param::anyProvided() && param_value_t::mValidated; } // assign block contents to this param-that-is-a-block void set(value_assignment_t val, bool flag_as_provided = true) { setValue(val); - clearValueName(); + param_value_t::clearValueName(); // force revalidation of block by clearing known provided version // next call to isProvided() will update provision status based on validity - mValidatedVersion = -1; + param_value_t::mValidatedVersion = -1; setProvided(flag_as_provided); Param::enclosingBlock().paramChanged(*this, flag_as_provided); } @@ -883,9 +885,9 @@ namespace LLInitParam } // implicit conversion - operator value_assignment_t() const { return getValue(); } + operator value_assignment_t() const { return param_value_t::getValue(); } // explicit conversion - value_assignment_t operator()() const { return getValue(); } + value_assignment_t operator()() const { return param_value_t::getValue(); } protected: @@ -897,7 +899,7 @@ namespace LLInitParam if (src_typed_param.isProvided() && (overwrite || !dst_typed_param.isProvided())) { - if (dst_typed_param.merge(selfBlockDescriptor(), src_typed_param, overwrite)) + if (dst_typed_param.merge(param_value_t::selfBlockDescriptor(), src_typed_param, overwrite)) { dst_typed_param.clearValueName(); return true; @@ -914,14 +916,15 @@ namespace LLInitParam { public: typedef TypedParam<VALUE_TYPE, NAME_VALUE_LOOKUP, true, false> self_t; - typedef typename std::vector<ParamValue<VALUE_TYPE, NAME_VALUE_LOOKUP> > container_t; + typedef ParamValue<VALUE_TYPE, NAME_VALUE_LOOKUP> param_value_t; + typedef typename std::vector<param_value_t> container_t; typedef const container_t& value_assignment_t; typedef VALUE_TYPE value_t; typedef NAME_VALUE_LOOKUP name_value_lookup_t; TypedParam(BlockDescriptor& block_descriptor, const char* name, value_assignment_t value, ParamDescriptor::validation_func_t validate_func, S32 min_count, S32 max_count) - : Param(block_descriptor.mCurrentBlockPtr), + : Param(block_descriptor.mCurrentBlockPtr) { std::copy(value.begin(), value.end(), std::back_inserter(mValues)); @@ -1033,7 +1036,7 @@ namespace LLInitParam value_t& add() { - mValues.push_back(ParamValue(value_t())); + mValues.push_back(param_value_t(value_t())); setProvided(true); Param::enclosingBlock().paramChanged(*this, true); return mValues.back(); @@ -1041,7 +1044,7 @@ namespace LLInitParam void add(const value_t& item) { - mValues.push_back(ParamValue(item)); + mValues.push_back(param_value_t(item)); setProvided(true); Param::enclosingBlock().paramChanged(*this, true); } @@ -1567,6 +1570,7 @@ namespace LLInitParam typedef TypedParam<T, NAME_VALUE_LOOKUP, false, IsBlock<param_value_t>::value> super_t; typedef Batch<T, RANGE, NAME_VALUE_LOOKUP> self_t; typedef typename super_t::value_assignment_t value_assignment_t; + typedef typename super_t::value_t value_t; struct BatchDefaultValue : public ParamDescriptor::UserData { @@ -1589,7 +1593,7 @@ namespace LLInitParam if (param_descriptorp) { param_descriptorp->mDeserializeFunc = &deserializeParam; - param_descriptorp->mUserData = new BatchDefaultValue(new _value_t(val)); + param_descriptorp->mUserData = new BatchDefaultValue(new param_value_t(val)); } } } @@ -1707,7 +1711,7 @@ namespace LLInitParam typedef ParamValue<T, TypeValues<T> > derived_t; typedef CustomParamValue<T> self_t; - typedef Block<typename derived_t> block_t; + typedef Block<derived_t> block_t; typedef const T& value_assignment_t; CustomParamValue(const T& value = T()) @@ -1796,7 +1800,7 @@ namespace LLInitParam if (block_t::validateBlock(emit_errors)) { // clear stale keyword associated with old value - clearValueName(); + TypeValues<T>::clearValueName(); mValueAge = BLOCK_AUTHORITATIVE; static_cast<derived_t*>(const_cast<self_t*>(this))->updateValueFromBlock(); return true; @@ -1828,10 +1832,11 @@ namespace LLInitParam void setValue(value_assignment_t val) { + derived_t& typed_param = static_cast<derived_t&>(*this); // set param version number to be up to date, so we ignore block contents mValueAge = VALUE_AUTHORITATIVE; mValue = val; - clearValueName(); + typed_param.clearValueName(); static_cast<derived_t*>(const_cast<self_t*>(this))->updateBlockFromValue(); } -- cgit v1.2.3 From 968a26799be75df68527594a727a6ca12d9530f7 Mon Sep 17 00:00:00 2001 From: Merov Linden <merov@lindenlab.com> Date: Wed, 20 Apr 2011 20:32:57 -0700 Subject: EXP-737 : Fix texture dimensions display in image preview --- indra/newview/llpreviewtexture.cpp | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index 6cfb708112..18d6731fcb 100644 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -143,10 +143,7 @@ void LLPreviewTexture::onSaveAsBtn(void* data) void LLPreviewTexture::draw() { - if (mUpdateDimensions) - { - updateDimensions(); - } + updateDimensions(); LLPreview::draw(); @@ -396,27 +393,32 @@ void LLPreviewTexture::onFileLoadedForSave(BOOL success, void LLPreviewTexture::updateDimensions() { if (!mImage) + { return; - - if(mImage->getFullWidth() == 0 || mImage->getFullHeight() == 0) + } + if ((mImage->getFullWidth() * mImage->getFullHeight()) == 0) { return; } - mUpdateDimensions = FALSE; - - getChild<LLUICtrl>("dimensions")->setTextArg("[WIDTH]", llformat("%d", mImage->getFullWidth())); + // Update the width/height display every time + getChild<LLUICtrl>("dimensions")->setTextArg("[WIDTH]", llformat("%d", mImage->getFullWidth())); getChild<LLUICtrl>("dimensions")->setTextArg("[HEIGHT]", llformat("%d", mImage->getFullHeight())); - - //reshape floater - reshape(getRect().getWidth(), getRect().getHeight()); + // Reshape the floater only when required + if (mUpdateDimensions) + { + mUpdateDimensions = FALSE; + + //reshape floater + reshape(getRect().getWidth(), getRect().getHeight()); - gFloaterView->adjustToFitScreen(this, FALSE); + gFloaterView->adjustToFitScreen(this, FALSE); - LLRect dim_rect(getChildView("dimensions")->getRect()); - LLRect aspect_label_rect(getChildView("aspect_ratio")->getRect()); - getChildView("aspect_ratio")->setVisible( dim_rect.mRight < aspect_label_rect.mLeft); + LLRect dim_rect(getChildView("dimensions")->getRect()); + LLRect aspect_label_rect(getChildView("aspect_ratio")->getRect()); + getChildView("aspect_ratio")->setVisible( dim_rect.mRight < aspect_label_rect.mLeft); + } } -- cgit v1.2.3 From d9c7c925dac3441cd2a05d0055e009693af5b087 Mon Sep 17 00:00:00 2001 From: Xiaohong Bao <bao@lindenlab.com> Date: Wed, 20 Apr 2011 22:35:06 -0600 Subject: adding collada and minizip to the libraries we package the viewer with for mac. --- indra/cmake/Copy3rdPartyLibs.cmake | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index 8e185df191..6c12dfb862 100755 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -207,10 +207,12 @@ elseif(DARWIN) libapr-1.dylib libaprutil-1.0.dylib libaprutil-1.dylib + libcollada14dom.dylib libexpat.1.5.2.dylib libexpat.dylib libGLOD.dylib - libllqtwebkit.dylib + libllqtwebkit.dylib + libminizip.a libndofdev.dylib libexception_handler.dylib libcollada14dom.dylib -- cgit v1.2.3 From a604bc27e50f2f46e66cc492a90afc6b001cacab Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Thu, 21 Apr 2011 10:12:36 -0400 Subject: restore use of proprietary libs (merge error) in Release builds --- autobuild.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/autobuild.xml b/autobuild.xml index 80be16322a..a8aa9371d6 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1672,7 +1672,6 @@ <string>-DCMAKE_BUILD_TYPE:STRING=Release</string> <string>-DWORD_SIZE:STRING=32</string> <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> <string>-DUSE_PRECOMPILED_HEADERS=ON</string> <string>-DLL_RELEASE_FOR_DOWNLOAD:BOOL=TRUE</string> </array> -- cgit v1.2.3 From 6183ba22ff016637fea3b95dc842aa26559f2467 Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine <vsavchuk@productengine.com> Date: Thu, 21 Apr 2011 21:46:38 +0300 Subject: STORM-640 FIX Disabled highlighting URLs in object name inside the BUY CONTENTS floater. Enclosed object name with <nolink>...</nolink> tags to disable URL parsing. --- indra/newview/skins/default/xui/en/floater_buy_contents.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/skins/default/xui/en/floater_buy_contents.xml b/indra/newview/skins/default/xui/en/floater_buy_contents.xml index babbf0f5ca..92001534e7 100644 --- a/indra/newview/skins/default/xui/en/floater_buy_contents.xml +++ b/indra/newview/skins/default/xui/en/floater_buy_contents.xml @@ -34,7 +34,7 @@ layout="topleft" name="contains_text" width="276"> - [NAME] contains: + <nolink>[NAME]</nolink> contains: </text> <scroll_list background_visible="true" -- cgit v1.2.3 From a4decda79b0123fdb5638415239b8666a987b984 Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Thu, 21 Apr 2011 16:40:16 -0400 Subject: explicitly enable INSTALL_PROPRIETARY in the Linden configurations --- autobuild.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/autobuild.xml b/autobuild.xml index a8aa9371d6..bd98d59766 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1592,6 +1592,7 @@ <string>-DCMAKE_BUILD_TYPE:STRING=Debug</string> <string>-DWORD_SIZE:STRING=32</string> <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> + <string>-DINSTALL_PROPRIETARY=TRUE</string> </array> </map> <key>name</key> @@ -1632,6 +1633,7 @@ <string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string> <string>-DWORD_SIZE:STRING=32</string> <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> + <string>-DINSTALL_PROPRIETARY=TRUE</string> </array> </map> <key>name</key> @@ -1674,6 +1676,7 @@ <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> <string>-DUSE_PRECOMPILED_HEADERS=ON</string> <string>-DLL_RELEASE_FOR_DOWNLOAD:BOOL=TRUE</string> + <string>-DINSTALL_PROPRIETARY=TRUE</string> </array> </map> <key>name</key> -- cgit v1.2.3 From ec43b68b223ce7d1178c2ed3d5e17e4a9c21dc0a Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Thu, 21 Apr 2011 13:47:31 -0700 Subject: fixing bottomtray for advanced viewer --- .../skins/default/xui/en/panel_bottomtray.xml | 1051 ++++++++++---------- 1 file changed, 530 insertions(+), 521 deletions(-) diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index b1c17e402e..c57f09c32f 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -1,521 +1,530 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel - background_visible="true" - bg_alpha_color="DkGray" - bg_opaque_color="DkGray" - chrome="true" - follows="left|bottom|right" - height="33" - layout="topleft" - left="0" - name="bottom_tray" - focus_root="true" - top="28" - width="1310"> - <string - name="DragIndicationImageName" - value="Accordion_ArrowOpened_Off" /> - <string - name="SpeakBtnToolTip" - value="Turns microphone on/off" /> - <string - name="VoiceControlBtnToolTip" - value="Shows/hides voice control panel" /> - <layout_stack - border_size="0" - clip="false" - follows="all" - height="28" - layout="topleft" - left="0" - mouse_opaque="false" - name="toolbar_stack" - orientation="horizontal" - top="0" - width="1310"> - <layout_panel - auto_resize="false" - user_resize="false" - min_width="2" - width="2" /> - <layout_panel - auto_resize="false" - layout="topleft" - max_width="320" - min_width="214" - height="28" - mouse_opaque="false" - name="chat_bar_layout_panel" - user_resize="true" - width="308" > - <panel - name="chat_bar" - filename="panel_nearby_chat_bar.xml" - left="0" - height="28" - width="306" - top="0" - mouse_opaque="false" - follows="left|right" - /> - </layout_panel> - <layout_panel - auto_resize="false" - follows="left|right" - height="28" - layout="topleft" - min_height="28" - min_width="59" - mouse_opaque="false" - name="speak_panel" - top_delta="0" - user_resize="false" - width="108"> - <talk_button - follows="left|right" - height="23" - layout="topleft" - left="0" - name="talk" - top="5" - width="105"> - <show_button - tab_stop="true"> - <init_callback - function="Button.SetDockableFloaterToggle" - parameter="voice_controls" /> - </show_button> - <!-- do not remove halign attribute with default value. otherwise it can't be overridden in other locales. - & pad_right is default value for long label which can be right aligned. See EXT-6318 --> - <speak_button - halign="center" - label="Speak" - label_selected="Speak" - name="speak_btn" - pad_right="20" - tab_stop="true" - use_ellipses="true" /> - </talk_button> - </layout_panel> - <layout_panel - auto_resize="false" - follows="right" - height="28" - layout="topleft" - min_height="28" - min_width="65" - mouse_opaque="false" - name="gesture_panel" - top_delta="0" - user_resize="false" - width="85"> - <gesture_combo_list - follows="left|right" - height="23" - label="Gesture" - layout="topleft" - get_more="false" - view_all="false" - left="0" - name="Gesture" - tool_tip="Shows/hides gestures" - top="5" - width="82"> - <combo_button - pad_right="10" - can_drag="false" - use_ellipses="true" /> - <combo_list - page_lines="17" /> - </gesture_combo_list> - </layout_panel> - <layout_panel - auto_resize="false" - follows="left|right" - height="28" - layout="topleft" - min_height="28" - min_width="52" - mouse_opaque="false" - name="cam_panel" - user_resize="false" - width="83"> - <bottomtray_button - can_drag="false" - follows="left|right" - height="23" - image_pressed="PushButton_Press" - image_pressed_selected="PushButton_Selected_Press" - image_selected="PushButton_Selected_Press" - is_toggle="true" - label="View" - layout="topleft" - left="0" - name="camera_btn" - tool_tip="Shows/hides camera controls" - top="5" - use_ellipses="true" - width="80"> - <init_callback - function="Button.SetDockableFloaterToggle" - parameter="camera" /> - </bottomtray_button> - </layout_panel> - <layout_panel - auto_resize="false" - follows="left|right" - height="28" - layout="topleft" - min_width="17" - name="splitter_panel" - user_resize="false" - width="17"> - <icon - follows="left|bottom" - height="18" - width="2" - left="6" - image_name="Button_Separator" - name="separator" - top="7"/> - </layout_panel> - <layout_panel - auto_resize="false" - follows="left|right" - height="28" - layout="topleft" - min_height="28" - min_width="83" - mouse_opaque="false" - name="avatar_and_destinations_panel" - user_resize="false" - width="103"> - <bottomtray_button - can_drag="false" - follows="left|right" - height="23" - image_pressed="PushButton_Press" - image_pressed_selected="PushButton_Selected_Press" - image_selected="PushButton_Selected_Press" - label="Destinations" - layout="topleft" - left="0" - name="destination_btn" - tool_tip="Shows destinations window" - top="5" - is_toggle="true" - use_ellipses="true" - width="100"> - <bottomtray_button.commit_callback - function="Destination.show" /> - </bottomtray_button> - </layout_panel> - <layout_panel - auto_resize="false" - follows="left|right" - height="28" - layout="topleft" - min_height="28" - min_width="73" - mouse_opaque="false" - name="avatar_and_destinations_panel" - user_resize="false" - width="103"> - <bottomtray_button - can_drag="false" - follows="left|right" - height="23" - image_pressed="PushButton_Press" - image_pressed_selected="PushButton_Selected_Press" - image_selected="PushButton_Selected_Press" - label="My Avatar" - layout="topleft" - left="0" - name="avatar_btn" - top="5" - is_toggle="true" - use_ellipses="true" - width="100"> - <bottomtray_button.commit_callback - function="Avatar.show" /> - </bottomtray_button> - </layout_panel> - <layout_panel - auto_resize="false" - follows="left|right" - height="28" - layout="topleft" - min_width="17" - name="splitter_panel" - user_resize="false" - width="17"> - <icon - follows="left|bottom" - height="18" - width="2" - left="6" - image_name="Button_Separator" - name="separator" - top="7"/> - </layout_panel> - <layout_panel - auto_resize="false" - follows="right" - height="28" - layout="topleft" - min_height="28" - min_width="65" - mouse_opaque="false" - name="people_panel" - top_delta="0" - user_resize="false" - width="105"> - <bottomtray_button - can_drag="false" - follows="left|right" - height="23" - image_pressed="PushButton_Press" - image_pressed_selected="PushButton_Selected_Press" - image_selected="PushButton_Selected_Press" - label="People" - layout="topleft" - left="0" - name="show_people_button" - tool_tip="Shows people window" - top="5" - is_toggle="true" - use_ellipses="true" - width="100"> - <bottomtray_button.commit_callback - function="ShowSidetrayPanel" - parameter="panel_people" /> - </bottomtray_button> - </layout_panel> - <layout_panel - auto_resize="false" - follows="right" - height="28" - layout="topleft" - min_height="28" - min_width="65" - mouse_opaque="false" - name="profile_panel" - top_delta="0" - user_resize="false" - width="105"> - <bottomtray_button - can_drag="false" - follows="left|right" - height="23" - image_pressed="PushButton_Press" - image_pressed_selected="PushButton_Selected_Press" - image_selected="PushButton_Selected_Press" - label="Profile" - layout="topleft" - left="0" - name="show_profile_btn" - tool_tip="Shows profile window" - is_toggle="true" - top="5" - use_ellipses="true" - width="100"> - <bottomtray_button.commit_callback - function="ToggleAgentProfile" - parameter="agent"/> - </bottomtray_button> - </layout_panel> - <layout_panel - auto_resize="false" - follows="right" - height="28" - layout="topleft" - min_height="28" - min_width="65" - mouse_opaque="false" - name="howto_panel" - top_delta="0" - user_resize="false" - width="105"> - <bottomtray_button - can_drag="false" - follows="left|right" - height="23" - image_pressed="PushButton_Press" - image_pressed_selected="PushButton_Selected_Press" - image_selected="PushButton_Selected_Press" - label="How To" - layout="topleft" - left="0" - name="show_help_btn" - tool_tip="Open Second Life How To topics" - is_toggle="true" - top="5" - use_ellipses="true" - width="100"> - <bottomtray_button.commit_callback - function="ToggleHelp" - parameter="f1_help" /> - </bottomtray_button> - </layout_panel> - <layout_panel - follows="left|right" - height="30" - layout="topleft" - min_width="95" - mouse_opaque="false" - name="chiclet_list_panel" - top="0" - user_resize="false" - width="189"> - <!--*NOTE: min_width of the chiclet_panel (chiclet_list) must be the same -as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. EXT-991--> - <chiclet_panel - chiclet_padding="4" - follows="left|right" - height="24" - layout="topleft" - left="1" - min_width="95" - mouse_opaque="false" - name="chiclet_list" - top="7" - width="189"> - <button - auto_resize="true" - follows="right" - height="29" - image_hover_selected="SegmentedBtn_Left_Over" - image_hover_unselected="SegmentedBtn_Left_Over" - image_overlay="Arrow_Small_Left" - image_pressed="SegmentedBtn_Left_Press" - image_pressed_selected="SegmentedBtn_Left_Press" - image_selected="SegmentedBtn_Left_Off" - image_unselected="SegmentedBtn_Left_Off" - layout="topleft" - name="chicklet_left_scroll_button" - tab_stop="false" - top="-28" - visible="false" - width="7" /> - <button - auto_resize="true" - follows="right" - height="29" - image_hover_selected="SegmentedBtn_Right_Over" - image_hover_unselected="SegmentedBtn_Right_Over" - image_overlay="Arrow_Small_Right" - image_pressed="SegmentedBtn_Right_Press" - image_pressed_selected="SegmentedBtn_Right_Press" - image_selected="SegmentedBtn_Right_Off" - image_unselected="SegmentedBtn_Right_Off" - layout="topleft" - name="chicklet_right_scroll_button" - tab_stop="false" - top="-28" - visible="false" - width="7" /> - </chiclet_panel> - </layout_panel> - <layout_panel auto_resize="false" - user_resize="false" - width="4" - min_width="4"/> - <layout_panel - auto_resize="false" - follows="right" - height="28" - layout="topleft" - min_height="28" - min_width="37" - name="im_well_panel" - top="0" - user_resize="false" - width="37"> - <chiclet_im_well - follows="right" - height="28" - layout="topleft" - left="0" - max_displayed_count="99" - name="im_well" - top="0" - width="35"> - <!-- -Emulate 4 states of button by background images, see details in EXT-3147. The same should be for notification_well button -xml attribute Description -image_unselected "Unlit" - there are no new messages -image_selected "Unlit" + "Selected" - there are no new messages and the Well is open -image_pressed "Lit" - there are new messages -image_pressed_selected "Lit" + "Selected" - there are new messages and the Well is open - --> - <button - auto_resize="true" - follows="right" - halign="center" - height="23" - image_overlay="Unread_IM" - image_overlay_alignment="center" - image_pressed="WellButton_Lit" - image_pressed_selected="WellButton_Lit_Selected" - image_selected="PushButton_Press" - label_color="Black" - left="0" - name="Unread IM messages" - tool_tip="Conversations" - width="34"> - <init_callback - function="Button.SetDockableFloaterToggle" - parameter="im_well_window" /> - </button> - </chiclet_im_well> - </layout_panel> - <layout_panel - auto_resize="false" - follows="right" - height="28" - layout="topleft" - min_height="28" - min_width="37" - name="notification_well_panel" - top="0" - user_resize="false" - width="37"> - <chiclet_notification - follows="right" - height="23" - layout="topleft" - left="0" - max_displayed_count="99" - name="notification_well" - top="5" - width="35"> - <button - auto_resize="true" - bottom_pad="3" - follows="right" - halign="center" - height="23" - image_overlay="Notices_Unread" - image_overlay_alignment="center" - image_pressed="WellButton_Lit" - image_pressed_selected="WellButton_Lit_Selected" - image_selected="PushButton_Press" - label_color="Black" - left="0" - name="Unread" - tool_tip="Notifications" - width="34"> - <init_callback - function="Button.SetDockableFloaterToggle" - parameter="notification_well_window" /> - </button> - </chiclet_notification> - </layout_panel> - <layout_panel - auto_resize="false" - user_resize="false" - min_width="4" - name="DUMMY2" - width="8" /> - </layout_stack> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + background_visible="true" + bg_alpha_color="DkGray" + bg_opaque_color="DkGray" + chrome="true" + follows="left|bottom|right" + focus_root="true" + height="33" + layout="topleft" + left="0" + name="bottom_tray" + top="28" + width="1310"> + <string + name="DragIndicationImageName" + value="Accordion_ArrowOpened_Off" /> + <string + name="SpeakBtnToolTip" + value="Turns microphone on/off" /> + <string + name="VoiceControlBtnToolTip" + value="Shows/hides voice control panel" /> + <layout_stack + border_size="0" + clip="false" + follows="all" + height="28" + layout="topleft" + left="0" + mouse_opaque="false" + name="toolbar_stack" + orientation="horizontal" + top="0" + width="1310"> + <layout_panel + auto_resize="false" + user_resize="false" + min_width="2" + width="2" /> + <layout_panel + auto_resize="false" + layout="topleft" + max_width="320" + min_width="214" + height="28" + mouse_opaque="false" + name="chat_bar_layout_panel" + user_resize="true" + width="310" > + <panel + name="chat_bar" + filename="panel_nearby_chat_bar.xml" + left="0" + height="28" + width="308" + top="0" + mouse_opaque="false" + follows="left|right" + /> + </layout_panel> + <!-- + This 5px Panel is an indicator of where the resize handle is. + The panel provides a gap between the resize handle icon and a button to the right. + --> + <layout_panel + auto_resize="false" + layout="topleft" + max_width="5" + min_width="5" + name="chat_bar_resize_handle_panel" + user_resize="false" + width="5"> + <icon + follows="top|right" + height="25" + image_name="ChatBarHandle" + layout="topleft" + left="-7" + name="resize_handle" + top="4" + width="5" /> + </layout_panel> + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_height="28" + min_width="59" + mouse_opaque="false" + name="speak_panel" + top_delta="0" + user_resize="false" + width="108"> + <talk_button + follows="left|right" + height="23" + layout="topleft" + left="0" + name="talk" + top="5" + width="105"> + <show_button + tab_stop="true"> + <init_callback + function="Button.SetDockableFloaterToggle" + parameter="voice_controls" /> + </show_button> + <!-- do not remove halign attribute with default value. otherwise it can't be overridden in other locales. + & pad_right is default value for long label which can be right aligned. See EXT-6318 --> + <speak_button + halign="center" + label="Speak" + label_selected="Speak" + name="speak_btn" + pad_right="20" + tab_stop="true" + use_ellipses="true" /> + </talk_button> + </layout_panel> + <layout_panel + auto_resize="false" + follows="right" + height="28" + layout="topleft" + min_height="28" + min_width="65" + mouse_opaque="false" + name="gesture_panel" + top_delta="0" + user_resize="false" + width="85"> + <gesture_combo_list + follows="left|right" + height="23" + label="Gesture" + layout="topleft" + left="0" + name="Gesture" + tool_tip="Shows/hides gestures" + top="5" + width="82"> + <combo_button + pad_right="10" + use_ellipses="true" /> + <combo_list + page_lines="17" /> + </gesture_combo_list> + </layout_panel> + <layout_panel + auto_resize="false" + follows="right" + height="28" + layout="topleft" + min_height="28" + min_width="52" + mouse_opaque="false" + name="movement_panel" + user_resize="false" + width="83"> + <bottomtray_button + follows="left|right" + height="23" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + is_toggle="true" + label="Move" + layout="topleft" + name="movement_btn" + tool_tip="Shows/hides movement controls" + top="5" + use_ellipses="true" + width="80"> + <init_callback + function="Button.SetDockableFloaterToggle" + parameter="moveview" /> + </bottomtray_button> + + </layout_panel> + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_height="28" + min_width="52" + mouse_opaque="false" + name="cam_panel" + user_resize="false" + width="83"> + <bottomtray_button + follows="left|right" + height="23" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + is_toggle="true" + label="View" + layout="topleft" + left="0" + name="camera_btn" + tool_tip="Shows/hides camera controls" + top="5" + use_ellipses="true" + width="80"> + <init_callback + function="Button.SetDockableFloaterToggle" + parameter="camera" /> + </bottomtray_button> + </layout_panel> + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_width="40" + mouse_opaque="false" + name="snapshot_panel" + user_resize="false" + width="39"> + <bottomtray_button + follows="left|right" + height="23" + image_overlay="Snapshot_Off" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + is_toggle="true" + layout="topleft" + left="0" + name="snapshots" + tool_tip="Take snapshot" + top="5" + width="36"> + <init_callback + function="Button.SetFloaterToggle" + parameter="snapshot" /> + </bottomtray_button> + </layout_panel> + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_height="28" + min_width="52" + mouse_opaque="false" + name="build_btn_panel" + user_resize="false" + width="83"> + <!--*FIX: Build Floater is not opened with default registration. Will be fixed soon. +Disabled for now. +--> + <bottomtray_button + follows="left|right" + height="23" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + is_toggle="true" + label="Build" + layout="topleft" + left="0" + name="build_btn" + tool_tip="Shows/hides Build Tools" + top="5" + use_ellipses="true" + width="80"> + <commit_callback + function="Build.Toggle" + parameter="build" /> + </bottomtray_button> + </layout_panel> + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_height="28" + min_width="52" + mouse_opaque="false" + name="search_btn_panel" + user_resize="false" + width="83"> + <bottomtray_button + follows="left|right" + height="23" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + is_toggle="true" + label="Search" + layout="topleft" + left="0" + name="search_btn" + tool_tip="Shows/hides Search" + top="5" + use_ellipses="true" + width="80"> + <init_callback + function="Button.SetFloaterToggle" + parameter="search" /> + </bottomtray_button> + </layout_panel> + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_height="28" + min_width="52" + mouse_opaque="false" + name="world_map_btn_panel" + user_resize="false" + width="83"> + <bottomtray_button + follows="left|right" + height="23" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + is_toggle="true" + label="Map" + layout="topleft" + left="0" + name="world_map_btn" + tool_tip="Shows/hides World Map" + top="5" + use_ellipses="true" + width="80"> + <init_callback + function="Button.SetFloaterToggle" + parameter="world_map" /> + </bottomtray_button> + </layout_panel> + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_height="28" + min_width="52" + mouse_opaque="false" + name="mini_map_btn_panel" + user_resize="false" + width="83"> + <bottomtray_button + follows="left|right" + height="23" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + is_toggle="true" + label="Mini-Map" + layout="topleft" + left="0" + name="mini_map_btn" + tool_tip="Shows/hides Mini-Map" + top="5" + use_ellipses="true" + width="80"> + <init_callback + function="Button.SetFloaterToggle" + parameter="mini_map" /> + </bottomtray_button> + </layout_panel> + <layout_panel + follows="left|right" + height="30" + layout="topleft" + min_width="95" + mouse_opaque="false" + name="chiclet_list_panel" + top="0" + user_resize="false" + width="189"> + <!--*NOTE: min_width of the chiclet_panel (chiclet_list) must be the same +as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. EXT-991--> + <chiclet_panel + chiclet_padding="4" + follows="left|right" + height="24" + layout="topleft" + left="1" + min_width="95" + mouse_opaque="false" + name="chiclet_list" + top="7" + width="189"> + <button + auto_resize="true" + follows="right" + height="29" + image_hover_selected="SegmentedBtn_Left_Over" + image_hover_unselected="SegmentedBtn_Left_Over" + image_overlay="Arrow_Small_Left" + image_pressed="SegmentedBtn_Left_Press" + image_pressed_selected="SegmentedBtn_Left_Press" + image_selected="SegmentedBtn_Left_Off" + image_unselected="SegmentedBtn_Left_Off" + layout="topleft" + name="chicklet_left_scroll_button" + tab_stop="false" + top="-28" + visible="false" + width="7" /> + <button + auto_resize="true" + follows="right" + height="29" + image_hover_selected="SegmentedBtn_Right_Over" + image_hover_unselected="SegmentedBtn_Right_Over" + image_overlay="Arrow_Small_Right" + image_pressed="SegmentedBtn_Right_Press" + image_pressed_selected="SegmentedBtn_Right_Press" + image_selected="SegmentedBtn_Right_Off" + image_unselected="SegmentedBtn_Right_Off" + layout="topleft" + name="chicklet_right_scroll_button" + tab_stop="false" + top="-28" + visible="false" + width="7" /> + </chiclet_panel> + </layout_panel> + <layout_panel auto_resize="false" + user_resize="false" + width="4" + min_width="4"/> + <layout_panel + auto_resize="false" + follows="right" + height="28" + layout="topleft" + min_height="28" + min_width="37" + name="im_well_panel" + top="0" + user_resize="false" + width="37"> + <chiclet_im_well + follows="right" + height="28" + layout="topleft" + left="0" + max_displayed_count="99" + name="im_well" + top="0" + width="35"> + <!-- +Emulate 4 states of button by background images, see details in EXT-3147. The same should be for notification_well button +xml attribute Description +image_unselected "Unlit" - there are no new messages +image_selected "Unlit" + "Selected" - there are no new messages and the Well is open +image_pressed "Lit" - there are new messages +image_pressed_selected "Lit" + "Selected" - there are new messages and the Well is open + --> + <button + auto_resize="true" + follows="right" + halign="center" + height="23" + image_overlay="Unread_IM" + image_overlay_alignment="center" + image_pressed="WellButton_Lit" + image_pressed_selected="WellButton_Lit_Selected" + image_selected="PushButton_Press" + label_color="Black" + left="0" + name="Unread IM messages" + tool_tip="Conversations" + width="34"> + <init_callback + function="Button.SetDockableFloaterToggle" + parameter="im_well_window" /> + </button> + </chiclet_im_well> + </layout_panel> + <layout_panel + auto_resize="false" + follows="right" + height="28" + layout="topleft" + min_height="28" + min_width="37" + name="notification_well_panel" + top="0" + user_resize="false" + width="37"> + <chiclet_notification + follows="right" + height="23" + layout="topleft" + left="0" + max_displayed_count="99" + name="notification_well" + top="5" + width="35"> + <button + auto_resize="true" + bottom_pad="3" + follows="right" + halign="center" + height="23" + image_overlay="Notices_Unread" + image_overlay_alignment="center" + image_pressed="WellButton_Lit" + image_pressed_selected="WellButton_Lit_Selected" + image_selected="PushButton_Press" + label_color="Black" + left="0" + name="Unread" + tool_tip="Notifications" + width="34"> + <init_callback + function="Button.SetDockableFloaterToggle" + parameter="notification_well_window" /> + </button> + </chiclet_notification> + </layout_panel> + <layout_panel + auto_resize="false" + user_resize="false" + min_width="4" + name="DUMMY2" + width="8" /> + </layout_stack> +</panel> \ No newline at end of file -- cgit v1.2.3 From 4906f4644f7b8e8348f67ea7fde0909f58338ff1 Mon Sep 17 00:00:00 2001 From: Ima Mechanique <none@none> Date: Thu, 21 Apr 2011 22:11:48 +0100 Subject: OPEN-61 Adding locations that redistributable package installs msvc* files. --- doc/contributions.txt | 2 ++ indra/cmake/Copy3rdPartyLibs.cmake | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/doc/contributions.txt b/doc/contributions.txt index 2e6b01abc2..ed42e8fe5a 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -361,6 +361,8 @@ Ian Kas [NO JIRA] (Ukranian localization) CT-322 CT-325 +Ima Mechanique + OPEN-61 Irene Muni CT-324 CT-352 diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index 1c43c4ce12..4202b54f94 100644 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -127,7 +127,8 @@ elseif (MSVC_VERSION EQUAL 1600) # VisualStudio 2010 PATHS ${MSVC_DEBUG_REDIST_PATH} [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\10.0\\Setup\\VC;ProductDir]/redist/Debug_NonRedist/x86/Microsoft.VC100.DebugCRT - NO_DEFAULT_PATH + [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Windows;Directory]/SysWOW64 + [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Windows;Directory]/System32 NO_DEFAULT_PATH ) @@ -151,7 +152,8 @@ elseif (MSVC_VERSION EQUAL 1600) # VisualStudio 2010 PATHS ${MSVC_REDIST_PATH} [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\10.0\\Setup\\VC;ProductDir]/redist/x86/Microsoft.VC100.CRT - NO_DEFAULT_PATH + [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Windows;Directory]/SysWOW64 + [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Windows;Directory]/System32 NO_DEFAULT_PATH ) -- cgit v1.2.3 From 58b48137ca1f414286836d567b9f0651880c5995 Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Thu, 21 Apr 2011 16:35:09 -0500 Subject: Touch up autobuild xml from merge. --- autobuild.xml | 1464 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 715 insertions(+), 749 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 83405a8e0a..5fdd0a7f3b 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1736,771 +1736,737 @@ </map> </map> </map> - <key>package_description</key> + <key>package_description</key> + <map> + <key>name</key> + <string>viewer_development</string> + <key>platforms</key> <map> - <key>name</key> - <string>viewer_development</string> - <key>platforms</key> + <key>common</key> <map> - <key>common</key> + <key>configurations</key> <map> - <key>configurations</key> - <map> - <key>Debug</key> - <map> - <key>build</key> - <map> - </map> - <key>configure</key> - <map> - <key>command</key> - <string>cmake</string> - <key>options</key> - <array> - <string>-DCMAKE_BUILD_TYPE:STRING=Debug</string> - <string>-DWORD_SIZE:STRING=32</string> - <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> - </array> - </map> - <key>name</key> - <string>Debug</string> - </map> - <key>DebugOS</key> - <map> - <key>configure</key> - <map> - <key>command</key> - <string>cmake</string> - <key>options</key> - <array> - <string>-DCMAKE_BUILD_TYPE:STRING=Debug</string> - <string>-DWORD_SIZE:STRING=32</string> - <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - </array> - <key>arguments</key> - <array> - <string>../indra</string> - </array> - </map> - <key>name</key> - <string>DebugOS</string> - </map> - <key>RelWithDebInfo</key> - <map> - <key>build</key> - <map> - </map> - <key>configure</key> - <map> - <key>command</key> - <string>cmake</string> - <key>options</key> - <array> - <string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string> - <string>-DWORD_SIZE:STRING=32</string> - <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> - </array> - </map> - <key>name</key> - <string>RelWithDebInfo</string> - </map> - <key>RelWithDebInfoOS</key> - <map> - <key>configure</key> - <map> - <key>command</key> - <string>cmake</string> - <key>options</key> - <array> - <string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string> - <string>-DWORD_SIZE:STRING=32</string> - <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - </array> - <key>arguments</key> - <array> - <string>../indra</string> - </array> - </map> - <key>name</key> - <string>RelWithDebInfoOS</string> - </map> - <key>Release</key> - <map> - <key>build</key> - <map> - </map> - <key>configure</key> - <map> - <key>command</key> - <string>cmake</string> - <key>options</key> - <array> - <string>-DCMAKE_BUILD_TYPE:STRING=Release</string> - <string>-DWORD_SIZE:STRING=32</string> - <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DUSE_PRECOMPILED_HEADERS=ON</string> - <string>-DLL_RELEASE_FOR_DOWNLOAD:BOOL=TRUE</string> - </array> - </map> - <key>name</key> - <string>Release</string> - </map> - <key>VC10msbuildRelWithDebInfo</key> - <map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> - <key>command</key> - <string>cmake</string> - <key>options</key> - <array> - <string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string> - <string>-DUNATTENDED:BOOL=OFF</string> - <string>-DWORD_SIZE:STRING=32</string> - <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> - </array> - </map> - <key>name</key> - <string>VC10msbuildRelWithDebInfo</string> - </map> - <key>VC10msbuildRelease</key> - <map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> - <key>command</key> - <string>cmake</string> - <key>options</key> - <array> - <string>-DCMAKE_BUILD_TYPE:STRING=Release</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DLL_RELEASE_FOR_DOWNLOAD:BOOL=YES</string> - </map> - <key>name</key> - <string>VC10msbuildRelease</string> - </map> - <key>VCexpressRelWithDebInfo</key> - <string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string> - <string>VCexpressRelWithDebInfo</string> - </map> - <key>name</key> - <string>common</string> + <key>Debug</key> + <map> + <key>build</key> + <map> + </map> + <key>configure</key> + <map> + <key>command</key> + <string>cmake</string> + <key>options</key> + <array> + <string>-DCMAKE_BUILD_TYPE:STRING=Debug</string> + <string>-DWORD_SIZE:STRING=32</string> + <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> + </array> + </map> + <key>name</key> + <string>Debug</string> + </map> + <key>DebugOS</key> + <map> + <key>configure</key> + <map> + <key>command</key> + <string>cmake</string> + <key>options</key> + <array> + <string>-DCMAKE_BUILD_TYPE:STRING=Debug</string> + <string>-DWORD_SIZE:STRING=32</string> + <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> + <string>-DINSTALL_PROPRIETARY=FALSE</string> + </array> + <key>arguments</key> + <array> + <string>../indra</string> + </array> + </map> + <key>name</key> + <string>DebugOS</string> + </map> + <key>RelWithDebInfo</key> + <map> + <key>build</key> + <map> + </map> + <key>configure</key> + <map> + <key>command</key> + <string>cmake</string> + <key>options</key> + <array> + <string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string> + <string>-DWORD_SIZE:STRING=32</string> + <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> + </array> + </map> + <key>name</key> + <string>RelWithDebInfo</string> + </map> + <key>RelWithDebInfoOS</key> + <map> + <key>configure</key> + <map> + <key>command</key> + <string>cmake</string> + <key>options</key> + <array> + <string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string> + <string>-DWORD_SIZE:STRING=32</string> + <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> + <string>-DINSTALL_PROPRIETARY=FALSE</string> + </array> + <key>arguments</key> + <array> + <string>../indra</string> + </array> + </map> + <key>name</key> + <string>RelWithDebInfoOS</string> + </map> + <key>Release</key> + <map> + <key>build</key> + <map> + </map> + <key>configure</key> + <map> + <key>command</key> + <string>cmake</string> + <key>options</key> + <array> + <string>-DCMAKE_BUILD_TYPE:STRING=Release</string> + <string>-DWORD_SIZE:STRING=32</string> + <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> + <string>-DINSTALL_PROPRIETARY=FALSE</string> + <string>-DUSE_PRECOMPILED_HEADERS=ON</string> + <string>-DLL_RELEASE_FOR_DOWNLOAD:BOOL=TRUE</string> + </array> + </map> + <key>name</key> + <string>Release</string> + </map> + <key>ReleaseOS</key> + <map> + <key>configure</key> + <map> + <key>command</key> + <string>cmake</string> + <key>options</key> + <array> + <string>-DCMAKE_BUILD_TYPE:STRING=Release</string> + <string>-DWORD_SIZE:STRING=32</string> + <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> + <string>-DINSTALL_PROPRIETARY=FALSE</string> + <string>-DLL_RELEASE_FOR_DOWNLOAD:BOOL=YES</string> + </array> + <key>arguments</key> + <array> + <string>../indra</string> + </array> + </map> + <key>name</key> + <string>ReleaseOS</string> + </map> </map> - <key>darwin</key> + <key>name</key> + <string>common</string> + </map> + <key>darwin</key> + <map> + <key>build_directory</key> + <string>build-darwin-i386</string> + <key>configurations</key> <map> - <key>build_directory</key> - <string>build-darwin-i386</string> - <key>configurations</key> - <map> - <key>Debug</key> - <map> - <key>build</key> - <map> - <key>arguments</key> - <array> - <string>|</string> - <string>grep</string> - <string>-v</string> - <string>setenv</string> - </array> - <key>command</key> - <string>xcodebuild</string> - <key>options</key> - <array> - <string>-configuration Debug</string> - <string>-project SecondLife.xcodeproj</string> - </array> - </map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> - <key>options</key> - <array> - <string>-G</string> - <string>'Xcode'</string> - </array> - </map> - <key>name</key> - <string>Debug</string> - </map> - <key>DebugOS</key> - <map> - <key>build</key> - <map> - <key>command</key> - <string>xcodebuild</string> - <key>options</key> - <array> - <string>-configuration Debug</string> - <string>-project SecondLife.xcodeproj</string> - </array> - </map> - <key>configure</key> - <map> - <key>options</key> - <array> - <string>-G</string> - <string>'Xcode'</string> - </array> - </map> - <key>name</key> - <string>DebugOS</string> - </map> - <key>RelWithDebInfo</key> - <map> - <key>build</key> - <map> - <key>arguments</key> - <array> - <string>|</string> - <string>grep</string> - <string>-v</string> - <string>setenv</string> - </array> - <key>command</key> - <string>xcodebuild</string> - <key>options</key> - <array> - <string>-configuration RelWithDebInfo</string> - <string>-project SecondLife.xcodeproj</string> - </array> - </map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> - <key>options</key> - <array> - <string>-G</string> - <string>'Xcode'</string> - </array> - </map> - <key>default</key> - <string>True</string> - <key>name</key> - <string>RelWithDebInfo</string> - </map> - <key>RelWithDebInfoOS</key> - <map> - <key>build</key> - <map> - <key>command</key> - <string>xcodebuild</string> - <key>options</key> - <array> - <string>-configuration RelWithDebInfo</string> - <string>-project SecondLife.xcodeproj</string> - </array> - </map> - <key>configure</key> - <map> - <key>options</key> - <array> - <string>-G</string> - <string>'Xcode'</string> - </array> - </map> - <key>name</key> - <string>RelWithDebInfoOS</string> - </map> - <key>Release</key> - <map> - <key>build</key> - <map> - <key>arguments</key> - <array> - <string>|</string> - <string>grep</string> - <string>-v</string> - <string>setenv</string> - </array> - <key>command</key> - <string>xcodebuild</string> - <key>options</key> - <array> - <string>-configuration Release</string> - <string>-project SecondLife.xcodeproj</string> - </array> - </map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> - <key>options</key> - <array> - <string>-G</string> - <string>'Xcode'</string> - </array> - </map> - <key>name</key> - <string>Release</string> - </map> - <key>ReleaseOS</key> - <map> - <key>build</key> - <map> - <key>command</key> - <string>xcodebuild</string> - <key>options</key> - <array> - <string>-configuration Release</string> - <string>-project SecondLife.xcodeproj</string> - </array> - </map> - <key>configure</key> - <map> - <key>options</key> - <array> - <string>-G</string> - <string>'Xcode'</string> - </array> - </map> - <key>name</key> - <string>ReleaseOS</string> - </map> - </map> - <key>name</key> - <string>darwin</string> + <key>Debug</key> + <map> + <key>build</key> + <map> + <key>arguments</key> + <array> + <string>|</string> + <string>grep</string> + <string>-v</string> + <string>setenv</string> + </array> + <key>command</key> + <string>xcodebuild</string> + <key>options</key> + <array> + <string>-configuration Debug</string> + <string>-project SecondLife.xcodeproj</string> + </array> + </map> + <key>configure</key> + <map> + <key>arguments</key> + <array> + <string>../indra</string> + </array> + <key>options</key> + <array> + <string>-G</string> + <string>'Xcode'</string> + </array> + </map> + <key>name</key> + <string>Debug</string> + </map> + <key>DebugOS</key> + <map> + <key>build</key> + <map> + <key>command</key> + <string>xcodebuild</string> + <key>options</key> + <array> + <string>-configuration Debug</string> + <string>-project SecondLife.xcodeproj</string> + </array> + </map> + <key>configure</key> + <map> + <key>options</key> + <array> + <string>-G</string> + <string>'Xcode'</string> + </array> + </map> + <key>name</key> + <string>DebugOS</string> + </map> + <key>RelWithDebInfo</key> + <map> + <key>build</key> + <map> + <key>arguments</key> + <array> + <string>|</string> + <string>grep</string> + <string>-v</string> + <string>setenv</string> + </array> + <key>command</key> + <string>xcodebuild</string> + <key>options</key> + <array> + <string>-configuration RelWithDebInfo</string> + <string>-project SecondLife.xcodeproj</string> + </array> + </map> + <key>configure</key> + <map> + <key>arguments</key> + <array> + <string>../indra</string> + </array> + <key>options</key> + <array> + <string>-G</string> + <string>'Xcode'</string> + </array> + </map> + <key>default</key> + <string>True</string> + <key>name</key> + <string>RelWithDebInfo</string> + </map> + <key>RelWithDebInfoOS</key> + <map> + <key>build</key> + <map> + <key>command</key> + <string>xcodebuild</string> + <key>options</key> + <array> + <string>-configuration RelWithDebInfo</string> + <string>-project SecondLife.xcodeproj</string> + </array> + </map> + <key>configure</key> + <map> + <key>options</key> + <array> + <string>-G</string> + <string>'Xcode'</string> + </array> + </map> + <key>name</key> + <string>RelWithDebInfoOS</string> + </map> + <key>Release</key> + <map> + <key>build</key> + <map> + <key>arguments</key> + <array> + <string>|</string> + <string>grep</string> + <string>-v</string> + <string>setenv</string> + </array> + <key>command</key> + <string>xcodebuild</string> + <key>options</key> + <array> + <string>-configuration Release</string> + <string>-project SecondLife.xcodeproj</string> + </array> + </map> + <key>configure</key> + <map> + <key>arguments</key> + <array> + <string>../indra</string> + </array> + <key>options</key> + <array> + <string>-G</string> + <string>'Xcode'</string> + </array> + </map> + <key>name</key> + <string>Release</string> + </map> + <key>ReleaseOS</key> + <map> + <key>build</key> + <map> + <key>command</key> + <string>xcodebuild</string> + <key>options</key> + <array> + <string>-configuration Release</string> + <string>-project SecondLife.xcodeproj</string> + </array> + </map> + <key>configure</key> + <map> + <key>options</key> + <array> + <string>-G</string> + <string>'Xcode'</string> + </array> + </map> + <key>name</key> + <string>ReleaseOS</string> + </map> </map> - <key>linux</key> + <key>name</key> + <string>darwin</string> + </map> + <key>linux</key> + <map> + <key>build_directory</key> + <string>build-linux-i686</string> + <key>configurations</key> <map> - <key>build_directory</key> - <string>build-linux-i686</string> - <key>configurations</key> - <map> - <key>Debug</key> - <map> - <key>build</key> - <map> - <key>command</key> - <string>make</string> - <key>options</key> - <array> - <string>-j 12</string> - </array> - </map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> - <key>options</key> - <array> - <string>-G</string> - <string>'Unix Makefiles'</string> - </array> - </map> - <key>name</key> - <string>Debug</string> - </map> - <key>DebugOS</key> - <map> - <key>build</key> - <map> - <key>command</key> - <string>make</string> - <key>options</key> - <array> - <string>-j 2</string> - </array> - </map> - <key>configure</key> - <map> - <key>options</key> - <array> - <string>-G</string> - <string>'Unix Makefiles'</string> - </array> - </map> - <key>name</key> - <string>DebugOS</string> - </map> - <key>RelWithDebInfo</key> - <map> - <key>build</key> - <map> - <key>command</key> - <string>make</string> - <key>options</key> - <array> - <string>-j 12</string> - </array> - </map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> - <key>options</key> - <array> - <string>-G</string> - <string>'Unix Makefiles'</string> - </array> - </map> - <key>default</key> - <string>True</string> - <key>name</key> - <string>RelWithDebInfo</string> - </map> - <key>RelWithDebInfoOS</key> - <map> - <key>build</key> - <map> - <key>command</key> - <string>make</string> - <key>options</key> - <array> - <string>-j 2</string> - </array> - </map> - <key>configure</key> - <map> - <key>options</key> - <array> - <string>-G</string> - <string>'Unix Makefiles'</string> - </array> - </map> - <key>name</key> - <string>RelWithDebInfoOS</string> - </map> - <key>Release</key> - <map> - <key>build</key> - <map> - <key>command</key> - <string>make</string> - <key>options</key> - <array> - <string>-j 12</string> - </array> - </map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> - <key>options</key> - <array> - <string>-G</string> - <string>'Unix Makefiles'</string> - </array> - </map> - <key>name</key> - <string>Release</string> - </map> - <key>ReleaseOS</key> - <map> - <key>build</key> - <map> - <key>command</key> - <string>make</string> - <key>options</key> - <array> - <string>-j 2</string> - </array> - </map> - <key>configure</key> - <map> - <key>options</key> - <array> - <string>-G</string> - <string>'Unix Makefiles'</string> - </array> - </map> - <key>name</key> - <string>ReleaseOS</string> + <key>Debug</key> + <map> + <key>build</key> + <map> + <key>command</key> + <string>make</string> + <key>options</key> + <array> + <string>-j 12</string> + </array> + </map> + <key>configure</key> + <map> + <key>arguments</key> + <array> + <string>../indra</string> + </array> + <key>options</key> + <array> + <string>-G</string> + <string>'Unix Makefiles'</string> + </array> + </map> + <key>name</key> + <string>Debug</string> + </map> + <key>DebugOS</key> + <map> + <key>build</key> + <map> + <key>command</key> + <string>make</string> + <key>options</key> + <array> + <string>-j 2</string> + </array> + </map> + <key>configure</key> + <map> + <key>options</key> + <array> + <string>-G</string> + <string>'Unix Makefiles'</string> + </array> + </map> + <key>name</key> + <string>DebugOS</string> + </map> + <key>RelWithDebInfo</key> + <map> + <key>build</key> + <map> + <key>command</key> + <string>make</string> + <key>options</key> + <array> + <string>-j 12</string> + </array> + </map> + <key>configure</key> + <map> + <key>arguments</key> + <array> + <string>../indra</string> + </array> + <key>options</key> + <array> + <string>-G</string> + <string>'Unix Makefiles'</string> + </array> </map> <key>default</key> + <string>True</string> + <key>name</key> + <string>RelWithDebInfo</string> + </map> + <key>RelWithDebInfoOS</key> + <map> + <key>build</key> <map> - <key>build</key> - <map> - </map> - <key>name</key> - <string>default</string> + <key>command</key> + <string>make</string> + <key>options</key> + <array> + <string>-j 2</string> + </array> </map> + <key>configure</key> + <map> + <key>options</key> + <array> + <string>-G</string> + <string>'Unix Makefiles'</string> + </array> + </map> + <key>name</key> + <string>RelWithDebInfoOS</string> + </map> + <key>Release</key> + <map> + <key>build</key> + <map> + <key>command</key> + <string>make</string> + <key>options</key> + <array> + <string>-j 12</string> + </array> + </map> + <key>configure</key> + <map> + <key>arguments</key> + <array> + <string>../indra</string> + </array> + <key>options</key> + <array> + <string>-G</string> + <string>'Unix Makefiles'</string> + </array> + </map> + <key>name</key> + <string>Release</string> + </map> + <key>ReleaseOS</key> + <map> + <key>build</key> + <map> + <key>command</key> + <string>make</string> + <key>options</key> + <array> + <string>-j 2</string> + </array> + </map> + <key>configure</key> + <map> + <key>options</key> + <array> + <string>-G</string> + <string>'Unix Makefiles'</string> + </array> + </map> + <key>name</key> + <string>ReleaseOS</string> + </map> + <key>default</key> + <map> + <key>build</key> + <map> + </map> + <key>name</key> + <string>default</string> </map> - <key>name</key> - <string>linux</string> </map> - <key>windows</key> + <key>name</key> + <string>linux</string> + </map> + <key>windows</key> + <map> + <key>build_directory</key> + <string>build-vc100</string> + <key>configurations</key> <map> - <key>build_directory</key> - <string>build-vc100</string> - <key>configurations</key> - <map> - <key>Debug</key> - <map> - <key>build</key> - <map> - <key>arguments</key> - <array> - <string>SecondLife.sln</string> - </array> - <key>command</key> - <string>BuildConsole</string> - <key>options</key> - <array> - <string>/build</string> - <string>"/cfg=Debug|Win32"</string> - </array> - </map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>..\indra</string> - <string>&&</string> - <string>..\indra\tools\vstool\VSTool.exe</string> - <string>--solution</string> - <string>SecondLife.sln</string> - <string>--config</string> - <string>Debug</string> - <string>--startup</string> - <string>secondlife-bin</string> - </array> - <key>options</key> - <array> - <string>-G</string> - <string>"Visual Studio 10"</string> - </array> - </map> - <key>name</key> - <string>Debug</string> - </map> - <key>DebugOS</key> - <map> - <key>build</key> - <map> - <key>arguments</key> - <array> - <string>SecondLife.sln</string> - </array> - <key>command</key> - <string>msbuild.exe</string> - <key>options</key> - <array> - <string>/p:Configuration=Debug</string> - <string>/p:Platform=Win32</string> - <string>/t:Build</string> - <string>/p:useenv=true</string> - <string>/verbosity:minimal</string> - <string>/toolsversion:4.0</string> - <string>/p:"VCBuildAdditionalOptions= /incremental"</string> - </array> - </map> - <key>configure</key> - <map> - <key>options</key> - <array> - <string>-G</string> - <string>"Visual Studio 10"</string> - <string>-DUNATTENDED:BOOL=ON</string> - <string>-DUSE_PRECOMPILED_HEADERS=ON</string> - <string>-DINSTALL_PROPRIETARY=TRUE</string> - <string>-DUSE_KDU=FALSE</string> - <string>-DFMOD=FALSE</string> - </array> - </map> - <key>name</key> - <string>DebugOS</string> - </map> - <key>RelWithDebInfo</key> - <map> - <key>build</key> - <map> - <key>arguments</key> - <array> - <string>SecondLife.sln</string> - </array> - <key>command</key> - <string>BuildConsole</string> - <key>options</key> - <array> - <string>/build</string> - <string>"/cfg=RelWithDebInfo|Win32"</string> - </array> - </map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>..\indra</string> - <string>&&</string> - <string>..\indra\tools\vstool\VSTool.exe</string> - <string>--solution</string> - <string>SecondLife.sln</string> - <string>--config</string> - <string>RelWithDebInfo</string> - <string>--startup</string> - <string>secondlife-bin</string> - </array> - <key>options</key> - <array> - <string>-G</string> - <string>"Visual Studio 10"</string> - </array> - </map> - <key>default</key> - <string>True</string> - <key>name</key> - <string>RelWithDebInfo</string> - </map> - <key>RelWithDebInfoOS</key> - <map> - <key>build</key> - <map> - <key>arguments</key> - <array> - <string>SecondLife.sln</string> - </array> - <key>command</key> - <string>msbuild.exe</string> - <key>options</key> - <array> - <string>/p:Configuration=RelWithDebInfo</string> - <string>/p:Platform=Win32</string> - <string>/t:Build</string> - <string>/p:useenv=true</string> - <string>/verbosity:minimal</string> - <string>/toolsversion:4.0</string> - <string>/p:"VCBuildAdditionalOptions= /incremental"</string> - </array> - </map> - <key>configure</key> - <map> - <key>options</key> - <array> - <string>-G</string> - <string>"Visual Studio 10"</string> - <string>-DUNATTENDED:BOOL=ON</string> - <string>-DUSE_PRECOMPILED_HEADERS=ON</string> - <string>-DINSTALL_PROPRIETARY=TRUE</string> - <string>-DUSE_KDU=FALSE</string> - <string>-DFMOD=FALSE</string> - </array> - </map> - <key>name</key> - <string>RelWithDebInfoOS</string> - </map> - <key>Release</key> - <map> - <key>build</key> - <map> - <key>arguments</key> - <array> - <string>SecondLife.sln</string> - </array> - <key>command</key> - <string>BuildConsole</string> - <key>options</key> - <array> - <string>/build</string> - <string>"/cfg=Release|Win32"</string> - <string>"/CL_ADD=/m:1"</string> - </array> - </map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>..\indra</string> - <string>&&</string> - <string>..\indra\tools\vstool\VSTool.exe</string> - <string>--solution</string> - <string>SecondLife.sln</string> - <string>--config</string> - <string>Release</string> - <string>--startup</string> - <string>secondlife-bin</string> - </array> - <key>options</key> - <array> - <string>-G</string> - <string>"Visual Studio 10"</string> - </array> - </map> - <key>name</key> - <string>Release</string> - </map> - <key>VC10msbuildRelWithDebInfo</key> - <map> - <key>build</key> - <map> - <string>msbuild.exe</string> - <string>SecondLife.sln</string> - <string>/verbosity:minimal</string> - <string>/t:build</string> - <string>/p:Configuration=RelWithDebInfo</string> - <string>/p:Platform=Win32</string> - <string>/p:"VCBuildAdditionalOptions= /useenv"</string> - <string>/p:"VCBuildAdditionalOptions= /incremental"</string> - </array> - <string>VC10msbuildRelWithDebInfo</string> - <key>VC10msbuildRelease</key> - <key>command</key> - <string>msbuild.exe</string> - <key>options</key> - <array> - <string>/p:Configuration=Release</string> - </array> - <string>VC10msbuildRelease</string> - <key>VCexpressRelWithDebInfo</key> - <key>arguments</key> - <array> - <string>"RelWithDebInfo|Win32"</string> - </array> - <string>vcbuild.exe</string> - <string>/u</string> - <string>/p:useenv=true</string> - <string>/verbosity:minimal</string> - <string>/toolsversion:4.0</string> - </array> - </map> - <key>configure</key> - <map> - <key>options</key> - <array> - <string>-G</string> - <string>"Visual Studio 10"</string> - <string>-DUNATTENDED:BOOL=ON</string> - <string>-DUSE_PRECOMPILED_HEADERS=ON</string> - <string>-DINSTALL_PROPRIETARY=TRUE</string> - <string>-DUSE_KDU=FALSE</string> - <string>-DFMOD=FALSE</string> - </array> - </map> - <key>name</key> - <string>VCexpressRelWithDebInfo</string> - </map> - </map> - <key>name</key> - <string>windows</string> + <key>Debug</key> + <map> + <key>build</key> + <map> + <key>arguments</key> + <array> + <string>SecondLife.sln</string> + </array> + <key>command</key> + <string>BuildConsole</string> + <key>options</key> + <array> + <string>/build</string> + <string>"/cfg=Debug|Win32"</string> + </array> + </map> + <key>configure</key> + <map> + <key>arguments</key> + <array> + <string>..\indra</string> + <string>&&</string> + <string>..\indra\tools\vstool\VSTool.exe</string> + <string>--solution</string> + <string>SecondLife.sln</string> + <string>--config</string> + <string>Debug</string> + <string>--startup</string> + <string>secondlife-bin</string> + </array> + <key>options</key> + <array> + <string>-G</string> + <string>"Visual Studio 10"</string> + </array> + </map> + <key>name</key> + <string>Debug</string> + </map> + <key>DebugOS</key> + <map> + <key>build</key> + <map> + <key>arguments</key> + <array> + <string>SecondLife.sln</string> + </array> + <key>command</key> + <string>msbuild.exe</string> + <key>options</key> + <array> + <string>/p:Configuration=Debug</string> + <string>/p:Platform=Win32</string> + <string>/t:Build</string> + <string>/p:useenv=true</string> + <string>/verbosity:minimal</string> + <string>/toolsversion:4.0</string> + <string>/p:"VCBuildAdditionalOptions= /incremental"</string> + </array> + </map> + <key>configure</key> + <map> + <key>options</key> + <array> + <string>-G</string> + <string>"Visual Studio 10"</string> + <string>-DUNATTENDED:BOOL=ON</string> + <string>-DUSE_PRECOMPILED_HEADERS=ON</string> + <string>-DINSTALL_PROPRIETARY=TRUE</string> + <string>-DUSE_KDU=FALSE</string> + <string>-DFMOD=FALSE</string> + </array> + </map> + <key>name</key> + <string>DebugOS</string> + </map> + <key>RelWithDebInfo</key> + <map> + <key>build</key> + <map> + <key>arguments</key> + <array> + <string>SecondLife.sln</string> + </array> + <key>command</key> + <string>BuildConsole</string> + <key>options</key> + <array> + <string>/build</string> + <string>"/cfg=RelWithDebInfo|Win32"</string> + </array> + </map> + <key>configure</key> + <map> + <key>arguments</key> + <array> + <string>..\indra</string> + <string>&&</string> + <string>..\indra\tools\vstool\VSTool.exe</string> + <string>--solution</string> + <string>SecondLife.sln</string> + <string>--config</string> + <string>RelWithDebInfo</string> + <string>--startup</string> + <string>secondlife-bin</string> + </array> + <key>options</key> + <array> + <string>-G</string> + <string>"Visual Studio 10"</string> + </array> + </map> + <key>default</key> + <string>True</string> + <key>name</key> + <string>RelWithDebInfo</string> + </map> + <key>RelWithDebInfoOS</key> + <map> + <key>build</key> + <map> + <key>arguments</key> + <array> + <string>SecondLife.sln</string> + </array> + <key>command</key> + <string>msbuild.exe</string> + <key>options</key> + <array> + <string>/p:Configuration=RelWithDebInfo</string> + <string>/p:Platform=Win32</string> + <string>/t:Build</string> + <string>/p:useenv=true</string> + <string>/verbosity:minimal</string> + <string>/toolsversion:4.0</string> + <string>/p:"VCBuildAdditionalOptions= /incremental"</string> + </array> + </map> + <key>configure</key> + <map> + <key>options</key> + <array> + <string>-G</string> + <string>"Visual Studio 10"</string> + <string>-DUNATTENDED:BOOL=ON</string> + <string>-DUSE_PRECOMPILED_HEADERS=ON</string> + <string>-DINSTALL_PROPRIETARY=TRUE</string> + <string>-DUSE_KDU=FALSE</string> + <string>-DFMOD=FALSE</string> + </array> + </map> + <key>name</key> + <string>RelWithDebInfoOS</string> + </map> + <key>Release</key> + <map> + <key>build</key> + <map> + <key>arguments</key> + <array> + <string>SecondLife.sln</string> + </array> + <key>command</key> + <string>BuildConsole</string> + <key>options</key> + <array> + <string>/build</string> + <string>"/cfg=Release|Win32"</string> + <string>"/CL_ADD=/m:1"</string> + </array> + </map> + <key>configure</key> + <map> + <key>arguments</key> + <array> + <string>..\indra</string> + <string>&&</string> + <string>..\indra\tools\vstool\VSTool.exe</string> + <string>--solution</string> + <string>SecondLife.sln</string> + <string>--config</string> + <string>Release</string> + <string>--startup</string> + <string>secondlife-bin</string> + </array> + <key>options</key> + <array> + <string>-G</string> + <string>"Visual Studio 10"</string> + </array> + </map> + <key>name</key> + <string>Release</string> + </map> + <key>ReleaseOS</key> + <map> + <key>build</key> + <map> + <key>arguments</key> + <array> + <string>SecondLife.sln</string> + </array> + <key>command</key> + <string>msbuild.exe</string> + <key>options</key> + <array> + <string>/p:Configuration=Release</string> + <string>/p:Platform=Win32</string> + <string>/t:Build</string> + <string>/p:useenv=true</string> + <string>/verbosity:minimal</string> + <string>/toolsversion:4.0</string> + <string>/p:"VCBuildAdditionalOptions= /incremental"</string> + </array> + </map> + <key>configure</key> + <map> + <key>options</key> + <array> + <string>-G</string> + <string>"Visual Studio 10"</string> + <string>-DUNATTENDED:BOOL=ON</string> + <string>-DUSE_PRECOMPILED_HEADERS=ON</string> + <string>-DINSTALL_PROPRIETARY=TRUE</string> + <string>-DUSE_KDU=FALSE</string> + <string>-DFMOD=FALSE</string> + </array> + </map> + <key>name</key> + <string>ReleaseOS</string> + </map> </map> + <key>name</key> + <string>windows</string> </map> </map> - <key>type</key> - <string>autobuild</string> - <key>version</key> - <string>1.2</string> </map> + <key>type</key> + <string>autobuild</string> + <key>version</key> + <string>1.2</string> +</map> </llsd> -- cgit v1.2.3 From ac40560782a61d95dacc492bd52ea3955206cb4b Mon Sep 17 00:00:00 2001 From: "Nyx (Neal Orman)" <nyx@lindenlab.com> Date: Thu, 21 Apr 2011 18:07:31 -0400 Subject: reversing the elimination of the stub build of convexdecomp, as we still need the binary version, even with the full LL source being available. This is because the binary package of the full version is not redistributable due to having the havok binaries in it. --- autobuild.xml | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/autobuild.xml b/autobuild.xml index 7d63aa9209..04b45ce5df 100755 --- a/autobuild.xml +++ b/autobuild.xml @@ -1143,6 +1143,54 @@ </map> </map> </map> + <key>llconvexdecompositionstub</key> + <map> + <key>license</key> + <string>lgpl</string> + <key>license_file</key> + <string>LICENSES/lgpl.txt</string> + <key>name</key> + <string>llconvexdecompositionstub</string> + <key>platforms</key> + <map> + <key>darwin</key> + <map> + <key>archive</key> + <map> + <key>hash</key> + <string>349fa0e287fb275bbee43ced194a1db1</string> + <key>url</key> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llconvexdecompositionstub-0.3-darwin-20101015.tar.bz2</string> + </map> + <key>name</key> + <string>darwin</string> + </map> + <key>linux</key> + <map> + <key>archive</key> + <map> + <key>hash</key> + <string>dbf4b15e74ce9042e8500720dffc461a</string> + <key>url</key> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llconvexdecompositionstub-0.3-linux-20101015a.tar.bz2</string> + </map> + <key>name</key> + <string>linux</string> + </map> + <key>windows</key> + <map> + <key>archive</key> + <map> + <key>hash</key> + <string>bba9a4dd04fda1b263f34448a044783b</string> + <key>url</key> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llconvexdecompositionstub-0.3-windows-20101015.tar.bz2</string> + </map> + <key>name</key> + <string>windows</string> + </map> + </map> + </map> <key>llqtwebkit</key> <map> <key>license</key> -- cgit v1.2.3 From e26bfe00ef467a65eb126a75fa2aba6ccd5cd07a Mon Sep 17 00:00:00 2001 From: Seth ProductEngine <slitovchuk@productengine.com> Date: Fri, 22 Apr 2011 01:07:52 +0300 Subject: STORM-380 FIXED Added syncing animations and sounds before the gesture starts playing. The actual playing of animations and sounds of a gesture starts only when all needed animations and sound files are loaded into viewer cache. This reduces the delay between animations and sounds meant to be played simultaneously but may increase the delay between the moment a gesture is triggered and the moment it starts playing. Fixed calling assets callback to clean up the void pointer in getAssetData() and avoid potential memory leaks. --- indra/llmessage/llassetstorage.cpp | 23 +++++- indra/newview/llgesturemgr.cpp | 156 ++++++++++++++++++++++++++++++++++++- indra/newview/llgesturemgr.h | 19 ++++- 3 files changed, 191 insertions(+), 7 deletions(-) diff --git a/indra/llmessage/llassetstorage.cpp b/indra/llmessage/llassetstorage.cpp index 27a368df3d..69d092de76 100644 --- a/indra/llmessage/llassetstorage.cpp +++ b/indra/llmessage/llassetstorage.cpp @@ -398,6 +398,12 @@ BOOL LLAssetStorage::hasLocalAsset(const LLUUID &uuid, const LLAssetType::EType bool LLAssetStorage::findInStaticVFSAndInvokeCallback(const LLUUID& uuid, LLAssetType::EType type, LLGetAssetCallback callback, void *user_data) { + if (user_data) + { + // The *user_data should not be passed without a callback to clean it up. + llassert(callback != NULL) + } + BOOL exists = mStaticVFS->getExists(uuid, type); if (exists) { @@ -432,15 +438,26 @@ void LLAssetStorage::getAssetData(const LLUUID uuid, LLAssetType::EType type, LL llinfos << "ASSET_TRACE requesting " << uuid << " type " << LLAssetType::lookup(type) << llendl; + if (user_data) + { + // The *user_data should not be passed without a callback to clean it up. + llassert(callback != NULL) + } + if (mShutDown) { llinfos << "ASSET_TRACE cancelled " << uuid << " type " << LLAssetType::lookup(type) << " shutting down" << llendl; - return; // don't get the asset or do any callbacks, we are shutting down + + if (callback) + { + callback(mVFS, uuid, type, user_data, LL_ERR_ASSET_REQUEST_FAILED, LL_EXSTAT_NONE); + } + return; } - + if (uuid.isNull()) { - // Special case early out for NULL uuid + // Special case early out for NULL uuid and for shutting down if (callback) { callback(mVFS, uuid, type, user_data, LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE, LL_EXSTAT_NULL_UUID); diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp index f658287fb1..2f9856c650 100644 --- a/indra/newview/llgesturemgr.cpp +++ b/indra/newview/llgesturemgr.cpp @@ -33,8 +33,10 @@ #include <algorithm> // library +#include "llaudioengine.h" #include "lldatapacker.h" #include "llinventory.h" +#include "llkeyframemotion.h" #include "llmultigesture.h" #include "llnotificationsutil.h" #include "llstl.h" @@ -526,6 +528,66 @@ void LLGestureMgr::playGesture(LLMultiGesture* gesture) gesture->mPlaying = TRUE; mPlaying.push_back(gesture); + // Load all needed assets to minimize the delays + // when gesture is playing. + for (std::vector<LLGestureStep*>::iterator steps_it = gesture->mSteps.begin(); + steps_it != gesture->mSteps.end(); + ++steps_it) + { + LLGestureStep* step = *steps_it; + switch(step->getType()) + { + case STEP_ANIMATION: + { + LLGestureStepAnimation* anim_step = (LLGestureStepAnimation*)step; + const LLUUID& anim_id = anim_step->mAnimAssetID; + + // Don't request the animation if this step stops it or if it is already in Static VFS + if (!(anim_id.isNull() + || anim_step->mFlags & ANIM_FLAG_STOP + || gAssetStorage->hasLocalAsset(anim_id, LLAssetType::AT_ANIMATION))) + { + mLoadingAssets.insert(anim_id); + + LLUUID* id = new LLUUID(gAgentID); + gAssetStorage->getAssetData(anim_id, + LLAssetType::AT_ANIMATION, + onAssetLoadComplete, + (void *)id, + TRUE); + } + break; + } + case STEP_SOUND: + { + LLGestureStepSound* sound_step = (LLGestureStepSound*)step; + const LLUUID& sound_id = sound_step->mSoundAssetID; + if (!(sound_id.isNull() + || gAssetStorage->hasLocalAsset(sound_id, LLAssetType::AT_SOUND))) + { + mLoadingAssets.insert(sound_id); + + gAssetStorage->getAssetData(sound_id, + LLAssetType::AT_SOUND, + onAssetLoadComplete, + NULL, + TRUE); + } + break; + } + case STEP_CHAT: + case STEP_WAIT: + case STEP_EOF: + { + break; + } + default: + { + llwarns << "Unknown gesture step type: " << step->getType() << llendl; + } + } + } + // And get it going stepGesture(gesture); @@ -741,7 +803,7 @@ void LLGestureMgr::stepGesture(LLMultiGesture* gesture) { return; } - if (!isAgentAvatarValid()) return; + if (!isAgentAvatarValid() || hasLoadingAssets(gesture)) return; // Of the ones that started playing, have any stopped? @@ -1091,6 +1153,98 @@ void LLGestureMgr::onLoadComplete(LLVFS *vfs, } } +// static +void LLGestureMgr::onAssetLoadComplete(LLVFS *vfs, + const LLUUID& asset_uuid, + LLAssetType::EType type, + void* user_data, S32 status, LLExtStat ext_status) +{ + LLGestureMgr& self = LLGestureMgr::instance(); + + // Complete the asset loading process depending on the type and + // remove the asset id from pending downloads list. + switch(type) + { + case LLAssetType::AT_ANIMATION: + { + LLKeyframeMotion::onLoadComplete(vfs, asset_uuid, type, user_data, status, ext_status); + + self.mLoadingAssets.erase(asset_uuid); + + break; + } + case LLAssetType::AT_SOUND: + { + LLAudioEngine::assetCallback(vfs, asset_uuid, type, user_data, status, ext_status); + + self.mLoadingAssets.erase(asset_uuid); + + break; + } + default: + { + llwarns << "Unexpected asset type: " << type << llendl; + + // We don't want to return from this callback without + // an animation or sound callback being fired + // and *user_data handled to avoid memory leaks. + llassert(type == LLAssetType::AT_ANIMATION || type == LLAssetType::AT_SOUND); + } + } +} + +// static +bool LLGestureMgr::hasLoadingAssets(LLMultiGesture* gesture) +{ + LLGestureMgr& self = LLGestureMgr::instance(); + + for (std::vector<LLGestureStep*>::iterator steps_it = gesture->mSteps.begin(); + steps_it != gesture->mSteps.end(); + ++steps_it) + { + LLGestureStep* step = *steps_it; + switch(step->getType()) + { + case STEP_ANIMATION: + { + LLGestureStepAnimation* anim_step = (LLGestureStepAnimation*)step; + const LLUUID& anim_id = anim_step->mAnimAssetID; + + if (!(anim_id.isNull() + || anim_step->mFlags & ANIM_FLAG_STOP + || self.mLoadingAssets.find(anim_id) == self.mLoadingAssets.end())) + { + return true; + } + break; + } + case STEP_SOUND: + { + LLGestureStepSound* sound_step = (LLGestureStepSound*)step; + const LLUUID& sound_id = sound_step->mSoundAssetID; + + if (!(sound_id.isNull() + || self.mLoadingAssets.find(sound_id) == self.mLoadingAssets.end())) + { + return true; + } + break; + } + case STEP_CHAT: + case STEP_WAIT: + case STEP_EOF: + { + break; + } + default: + { + llwarns << "Unknown gesture step type: " << step->getType() << llendl; + } + } + } + + return false; +} void LLGestureMgr::stopGesture(LLMultiGesture* gesture) { diff --git a/indra/newview/llgesturemgr.h b/indra/newview/llgesturemgr.h index b9935efeb3..5930841cbc 100644 --- a/indra/newview/llgesturemgr.h +++ b/indra/newview/llgesturemgr.h @@ -154,9 +154,20 @@ protected: // Used by loadGesture static void onLoadComplete(LLVFS *vfs, - const LLUUID& asset_uuid, - LLAssetType::EType type, - void* user_data, S32 status, LLExtStat ext_status); + const LLUUID& asset_uuid, + LLAssetType::EType type, + void* user_data, S32 status, LLExtStat ext_status); + + // Used by playGesture to load an asset file + // required to play a gesture step + static void onAssetLoadComplete(LLVFS *vfs, + const LLUUID& asset_uuid, + LLAssetType::EType type, + void* user_data, S32 status, LLExtStat ext_status); + + // Checks whether all animation and sound assets + // needed to play a gesture are loaded. + static bool hasLoadingAssets(LLMultiGesture* gesture); private: // Active gestures. @@ -172,6 +183,8 @@ private: callback_map_t mCallbackMap; std::vector<LLMultiGesture*> mPlaying; BOOL mValid; + + std::set<LLUUID> mLoadingAssets; }; #endif -- cgit v1.2.3 From 9c6dd947bd94a863d3c3d6e6bd38fa7d06bfc924 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Thu, 21 Apr 2011 19:49:03 -0400 Subject: SH-1381 Avatar Physics behavior is tightly tied to viewer framerate Changed physics algorithm to perform integration over several steps if framerate is slow. Fixed a fundamental issue in the algorithm where timestep wasn't being used to calculate velocity changes. Had to change around some parameter ranges since the physics are calculated slightly differently now. --- indra/newview/character/avatar_lad.xml | 72 +++++++++++++------------- indra/newview/llphysicsmotion.cpp | 94 ++++++++++++++++------------------ 2 files changed, 79 insertions(+), 87 deletions(-) diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index ec162e3608..ce15c4b8f7 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -4352,8 +4352,8 @@ wearable="shape" edit_group="driven" value_default="0" - value_min="-1.5" - value_max="1.5"> + value_min="-1.25" + value_max="1.25"> <param_morph /> </param> @@ -11875,7 +11875,7 @@ render_pass="bump"> edit_group="physics_advanced" value_default="0" value_min="0" - value_max=".1"> + value_max="30"> <param_driver /> </param> @@ -11887,9 +11887,9 @@ render_pass="bump"> label="Breast Physics Drag" wearable="physics" edit_group="physics_advanced" - value_default=".15" + value_default="1" value_min="0" - value_max=".5"> + value_max="10"> <param_driver /> </param> @@ -11914,9 +11914,9 @@ render_pass="bump"> label="Breast Physics UpDown Spring" wearable="physics" edit_group="physics_breasts_updown" - value_default=".1" + value_default="10" value_min="0" - value_max="3"> + value_max="100"> <param_driver /> </param> <param @@ -11940,11 +11940,9 @@ render_pass="bump"> label="Breast Physics UpDown Damping" wearable="physics" edit_group="physics_breasts_updown" - value_default=".05" + value_default=".2" value_min="0" - value_max=".1" - camera_elevation=".3" - camera_distance=".8"> + value_max="1"> <param_driver /> </param> @@ -11969,9 +11967,9 @@ render_pass="bump"> label="Breast Physics InOut Spring" wearable="physics" edit_group="physics_breasts_inout" - value_default=".1" + value_default="10" value_min="0" - value_max="3"> + value_max="100"> <param_driver /> </param> <param @@ -11995,9 +11993,9 @@ render_pass="bump"> label="Breast Physics InOut Damping" wearable="physics" edit_group="physics_breasts_inout" - value_default=".05" + value_default=".2" value_min="0" - value_max=".1"> + value_max="1"> <param_driver /> </param> @@ -12022,7 +12020,7 @@ render_pass="bump"> edit_group="physics_advanced" value_default="0" value_min="0" - value_max=".1"> + value_max="30"> <param_driver /> </param> <param @@ -12032,9 +12030,9 @@ render_pass="bump"> label="Belly Physics Drag" wearable="physics" edit_group="physics_advanced" - value_default=".15" + value_default="1" value_min="0" - value_max=".5"> + value_max="10"> <param_driver /> </param> <param @@ -12056,9 +12054,9 @@ render_pass="bump"> label="Belly Physics UpDown Spring" wearable="physics" edit_group="physics_belly_updown" - value_default=".1" + value_default="10" value_min="0" - value_max="3"> + value_max="100"> <param_driver /> </param> <param @@ -12080,9 +12078,9 @@ render_pass="bump"> label="Belly Physics UpDown Damping" wearable="physics" edit_group="physics_belly_updown" - value_default=".05" + value_default=".2" value_min="0" - value_max=".1"> + value_max="1"> <param_driver /> </param> @@ -12107,7 +12105,7 @@ render_pass="bump"> edit_group="physics_advanced" value_default="0" value_min="0" - value_max=".1"> + value_max="30"> <param_driver /> </param> <param @@ -12117,9 +12115,9 @@ render_pass="bump"> label="Butt Physics Drag" wearable="physics" edit_group="physics_advanced" - value_default=".15" + value_default="1" value_min="0" - value_max=".5"> + value_max="10"> <param_driver /> </param> @@ -12142,9 +12140,9 @@ render_pass="bump"> label="Butt Physics UpDown Spring" wearable="physics" edit_group="physics_butt_updown" - value_default=".1" + value_default="10" value_min="0" - value_max="3"> + value_max="100"> <param_driver /> </param> <param @@ -12166,9 +12164,9 @@ render_pass="bump"> label="Butt Physics UpDown Damping" wearable="physics" edit_group="physics_butt_updown" - value_default=".05" + value_default=".2" value_min="0" - value_max=".1"> + value_max="1"> <param_driver /> </param> @@ -12191,9 +12189,9 @@ render_pass="bump"> label="Butt Physics LeftRight Spring" wearable="physics" edit_group="physics_butt_leftright" - value_default=".1" + value_default="10" value_min="0" - value_max="3"> + value_max="100"> <param_driver /> </param> <param @@ -12215,9 +12213,9 @@ render_pass="bump"> label="Butt Physics LeftRight Damping" wearable="physics" edit_group="physics_butt_leftright" - value_default=".05" + value_default=".2" value_min="0" - value_max=".1"> + value_max="1"> <param_driver /> </param> @@ -12242,9 +12240,9 @@ render_pass="bump"> label="Breast Physics LeftRight Spring" wearable="physics" edit_group="physics_breasts_leftright" - value_default=".1" + value_default="10" value_min="0" - value_max="3"> + value_max="100"> <param_driver /> </param> <param @@ -12268,9 +12266,9 @@ render_pass="bump"> label="Breast Physics LeftRight Damping" wearable="physics" edit_group="physics_breasts_leftright" - value_default=".05" + value_default=".2" value_min="0" - value_max=".1"> + value_max="1"> <param_driver /> </param> diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index e4335d968f..7c199085c0 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -126,9 +126,8 @@ protected: F32 behavior_maxeffect); F32 toLocal(const LLVector3 &world); - F32 calculateVelocity_local(const F32 time_delta); - F32 calculateAcceleration_local(F32 velocity_local, - const F32 time_delta); + F32 calculateVelocity_local(); + F32 calculateAcceleration_local(F32 velocity_local); private: const std::string mParamDriverName; const std::string mParamControllerName; @@ -379,19 +378,20 @@ F32 LLPhysicsMotion::toLocal(const LLVector3 &world) return world * dir_world; } -F32 LLPhysicsMotion::calculateVelocity_local(const F32 time_delta) +F32 LLPhysicsMotion::calculateVelocity_local() { + const F32 world_to_model_scale = 10.0f; LLJoint *joint = mJointState->getJoint(); const LLVector3 position_world = joint->getWorldPosition(); const LLQuaternion rotation_world = joint->getWorldRotation(); const LLVector3 last_position_world = mPosition_world; - const LLVector3 velocity_world = (position_world-last_position_world) / time_delta; + const LLVector3 positionchange_world = (position_world-last_position_world) * world_to_model_scale; + const LLVector3 velocity_world = positionchange_world; const F32 velocity_local = toLocal(velocity_world); return velocity_local; } -F32 LLPhysicsMotion::calculateAcceleration_local(const F32 velocity_local, - const F32 time_delta) +F32 LLPhysicsMotion::calculateAcceleration_local(const F32 velocity_local) { // const F32 smoothing = getParamValue("Smoothing"); static const F32 smoothing = 3.0f; // Removed smoothing param since it's probably not necessary @@ -483,7 +483,31 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) if (physics_test) behavior_maxeffect = 1.0f; - BOOL update_visuals = FALSE; + // Normalize the param position to be from [0,1]. + // We have to use normalized values because there may be more than one driven param, + // and each of these driven params may have its own range. + // This means we'll do all our calculations in normalized [0,1] local coordinates. + const F32 position_user_local = (mParamDriver->getWeight() - mParamDriver->getMinWeight()) / (mParamDriver->getMaxWeight() - mParamDriver->getMinWeight()); + + // + // End parameters and settings + //////////////////////////////////////////////////////////////////////////////// + + + //////////////////////////////////////////////////////////////////////////////// + // Calculate velocity and acceleration in parameter space. + // + + //const F32 velocity_joint_local = calculateVelocity_local(time_iteration_step); + const F32 velocity_joint_local = calculateVelocity_local(); + const F32 acceleration_joint_local = calculateAcceleration_local(velocity_joint_local); + + // + // End velocity and acceleration + //////////////////////////////////////////////////////////////////////////////// + + BOOL update_visuals = FALSE; + // Break up the physics into a bunch of iterations so that differing framerates will show // roughly the same behavior. for (F32 time_iteration = 0; time_iteration <= time_delta; time_iteration += TIME_ITERATION_STEP) @@ -491,46 +515,20 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) F32 time_iteration_step = TIME_ITERATION_STEP; if (time_iteration + TIME_ITERATION_STEP > time_delta) { - time_iteration_step = time_delta; + time_iteration_step = time_delta-time_iteration; } - // mPositon_local should be in normalized 0,1 range already. Just making sure... - F32 position_current_local = llclamp(mPosition_local, - 0.0f, - 1.0f); - - // Normalize the param position to be from [0,1]. - // We have to use normalized values because there may be more than one driven param, - // and each of these driven params may have its own range. - // This means we'll do all our calculations in normalized [0,1] local coordinates. - F32 position_user_local = mParamDriver->getWeight(); - position_user_local = (position_user_local - mParamDriver->getMinWeight()) / (mParamDriver->getMaxWeight() - mParamDriver->getMinWeight()); - + const F32 position_current_local = llclamp(mPosition_local, + 0.0f, + 1.0f); // If the effect is turned off then don't process unless we need one more update // to set the position to the default (i.e. user) position. if ((behavior_maxeffect == 0) && (position_current_local == position_user_local)) { - return FALSE; + return update_visuals; } - // - // End parameters and settings - //////////////////////////////////////////////////////////////////////////////// - - - //////////////////////////////////////////////////////////////////////////////// - // Calculate velocity and acceleration in parameter space. - // - - const F32 velocity_joint_local = calculateVelocity_local(time_iteration_step); - const F32 acceleration_joint_local = calculateAcceleration_local(velocity_joint_local, time_iteration_step); - - // - // End velocity and acceleration - //////////////////////////////////////////////////////////////////////////////// - - //////////////////////////////////////////////////////////////////////////////// // Calculate the total force // @@ -547,7 +545,7 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) // Gravity always points downward in world space. // F = mg const LLVector3 gravity_world(0,0,1); - const F32 force_gravity = behavior_gain * (toLocal(gravity_world) * behavior_gravity * behavior_mass); + const F32 force_gravity = (toLocal(gravity_world) * behavior_gravity * behavior_mass); // Damping is a restoring force that opposes the current velocity. // F = -kv @@ -575,10 +573,10 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) // Calculate the new acceleration based on the net force. // a = F/m const F32 acceleration_new_local = force_net / behavior_mass; - static const F32 max_acceleration = 10.0f; // magic number, used to be customizable. - F32 velocity_new_local = mVelocity_local + acceleration_new_local; + static const F32 max_velocity = 100.0f; // magic number, used to be customizable. + F32 velocity_new_local = mVelocity_local + acceleration_new_local*time_iteration_step; velocity_new_local = llclamp(velocity_new_local, - -max_acceleration, max_acceleration); + -max_velocity, max_velocity); // Temporary debugging setting to cause all avatars to move, for profiling purposes. if (physics_test) @@ -604,8 +602,6 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) (position_new_local != position_new_local)) { position_new_local = 0; - position_current_local = 0; - position_user_local = 0; mVelocity_local = 0; mVelocityJoint_local = 0; mAccelerationJoint_local = 0; @@ -674,16 +670,14 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) // End update visual params //////////////////////////////////////////////////////////////////////////////// - mVelocityJoint_local = velocity_joint_local; - mVelocity_local = velocity_new_local; mAccelerationJoint_local = acceleration_joint_local; mPosition_local = position_new_local; - - mPosition_world = joint->getWorldPosition(); - } mLastTime = time; + mPosition_world = joint->getWorldPosition(); + mVelocityJoint_local = velocity_joint_local; + /* // Write out debugging info into a spreadsheet. -- cgit v1.2.3 From 7a330c0e3fd4a3e190e6327deb769b595bc91342 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Thu, 21 Apr 2011 19:49:03 -0400 Subject: SH-1381 Avatar Physics behavior is tightly tied to viewer framerate Changed physics algorithm to perform integration over several steps if framerate is slow. Fixed a fundamental issue in the algorithm where timestep wasn't being used to calculate velocity changes. Had to change around some parameter ranges since the physics are calculated slightly differently now. --- indra/newview/character/avatar_lad.xml | 72 +++++++++++++------------- indra/newview/llphysicsmotion.cpp | 94 ++++++++++++++++------------------ 2 files changed, 79 insertions(+), 87 deletions(-) diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index 6acaa75c32..5d6b10c047 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -4352,8 +4352,8 @@ wearable="shape" edit_group="driven" value_default="0" - value_min="-1.5" - value_max="1.5"> + value_min="-1.25" + value_max="1.25"> <param_morph /> </param> @@ -11875,7 +11875,7 @@ render_pass="bump"> edit_group="physics_advanced" value_default="0" value_min="0" - value_max=".1"> + value_max="30"> <param_driver /> </param> @@ -11887,9 +11887,9 @@ render_pass="bump"> label="Breast Physics Drag" wearable="physics" edit_group="physics_advanced" - value_default=".15" + value_default="1" value_min="0" - value_max=".5"> + value_max="10"> <param_driver /> </param> @@ -11914,9 +11914,9 @@ render_pass="bump"> label="Breast Physics UpDown Spring" wearable="physics" edit_group="physics_breasts_updown" - value_default=".1" + value_default="10" value_min="0" - value_max="3"> + value_max="100"> <param_driver /> </param> <param @@ -11940,11 +11940,9 @@ render_pass="bump"> label="Breast Physics UpDown Damping" wearable="physics" edit_group="physics_breasts_updown" - value_default=".05" + value_default=".2" value_min="0" - value_max=".1" - camera_elevation=".3" - camera_distance=".8"> + value_max="1"> <param_driver /> </param> @@ -11969,9 +11967,9 @@ render_pass="bump"> label="Breast Physics InOut Spring" wearable="physics" edit_group="physics_breasts_inout" - value_default=".1" + value_default="10" value_min="0" - value_max="3"> + value_max="100"> <param_driver /> </param> <param @@ -11995,9 +11993,9 @@ render_pass="bump"> label="Breast Physics InOut Damping" wearable="physics" edit_group="physics_breasts_inout" - value_default=".05" + value_default=".2" value_min="0" - value_max=".1"> + value_max="1"> <param_driver /> </param> @@ -12022,7 +12020,7 @@ render_pass="bump"> edit_group="physics_advanced" value_default="0" value_min="0" - value_max=".1"> + value_max="30"> <param_driver /> </param> <param @@ -12032,9 +12030,9 @@ render_pass="bump"> label="Belly Physics Drag" wearable="physics" edit_group="physics_advanced" - value_default=".15" + value_default="1" value_min="0" - value_max=".5"> + value_max="10"> <param_driver /> </param> <param @@ -12056,9 +12054,9 @@ render_pass="bump"> label="Belly Physics UpDown Spring" wearable="physics" edit_group="physics_belly_updown" - value_default=".1" + value_default="10" value_min="0" - value_max="3"> + value_max="100"> <param_driver /> </param> <param @@ -12080,9 +12078,9 @@ render_pass="bump"> label="Belly Physics UpDown Damping" wearable="physics" edit_group="physics_belly_updown" - value_default=".05" + value_default=".2" value_min="0" - value_max=".1"> + value_max="1"> <param_driver /> </param> @@ -12107,7 +12105,7 @@ render_pass="bump"> edit_group="physics_advanced" value_default="0" value_min="0" - value_max=".1"> + value_max="30"> <param_driver /> </param> <param @@ -12117,9 +12115,9 @@ render_pass="bump"> label="Butt Physics Drag" wearable="physics" edit_group="physics_advanced" - value_default=".15" + value_default="1" value_min="0" - value_max=".5"> + value_max="10"> <param_driver /> </param> @@ -12142,9 +12140,9 @@ render_pass="bump"> label="Butt Physics UpDown Spring" wearable="physics" edit_group="physics_butt_updown" - value_default=".1" + value_default="10" value_min="0" - value_max="3"> + value_max="100"> <param_driver /> </param> <param @@ -12166,9 +12164,9 @@ render_pass="bump"> label="Butt Physics UpDown Damping" wearable="physics" edit_group="physics_butt_updown" - value_default=".05" + value_default=".2" value_min="0" - value_max=".1"> + value_max="1"> <param_driver /> </param> @@ -12191,9 +12189,9 @@ render_pass="bump"> label="Butt Physics LeftRight Spring" wearable="physics" edit_group="physics_butt_leftright" - value_default=".1" + value_default="10" value_min="0" - value_max="3"> + value_max="100"> <param_driver /> </param> <param @@ -12215,9 +12213,9 @@ render_pass="bump"> label="Butt Physics LeftRight Damping" wearable="physics" edit_group="physics_butt_leftright" - value_default=".05" + value_default=".2" value_min="0" - value_max=".1"> + value_max="1"> <param_driver /> </param> @@ -12242,9 +12240,9 @@ render_pass="bump"> label="Breast Physics LeftRight Spring" wearable="physics" edit_group="physics_breasts_leftright" - value_default=".1" + value_default="10" value_min="0" - value_max="3"> + value_max="100"> <param_driver /> </param> <param @@ -12268,9 +12266,9 @@ render_pass="bump"> label="Breast Physics LeftRight Damping" wearable="physics" edit_group="physics_breasts_leftright" - value_default=".05" + value_default=".2" value_min="0" - value_max=".1"> + value_max="1"> <param_driver /> </param> diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index c9d355b3b5..7d862848b5 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -132,9 +132,8 @@ protected: F32 behavior_maxeffect); F32 toLocal(const LLVector3 &world); - F32 calculateVelocity_local(const F32 time_delta); - F32 calculateAcceleration_local(F32 velocity_local, - const F32 time_delta); + F32 calculateVelocity_local(); + F32 calculateAcceleration_local(F32 velocity_local); private: const std::string mParamDriverName; const std::string mParamControllerName; @@ -385,19 +384,20 @@ F32 LLPhysicsMotion::toLocal(const LLVector3 &world) return world * dir_world; } -F32 LLPhysicsMotion::calculateVelocity_local(const F32 time_delta) +F32 LLPhysicsMotion::calculateVelocity_local() { + const F32 world_to_model_scale = 10.0f; LLJoint *joint = mJointState->getJoint(); const LLVector3 position_world = joint->getWorldPosition(); const LLQuaternion rotation_world = joint->getWorldRotation(); const LLVector3 last_position_world = mPosition_world; - const LLVector3 velocity_world = (position_world-last_position_world) / time_delta; + const LLVector3 positionchange_world = (position_world-last_position_world) * world_to_model_scale; + const LLVector3 velocity_world = positionchange_world; const F32 velocity_local = toLocal(velocity_world); return velocity_local; } -F32 LLPhysicsMotion::calculateAcceleration_local(const F32 velocity_local, - const F32 time_delta) +F32 LLPhysicsMotion::calculateAcceleration_local(const F32 velocity_local) { // const F32 smoothing = getParamValue("Smoothing"); static const F32 smoothing = 3.0f; // Removed smoothing param since it's probably not necessary @@ -489,7 +489,31 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) if (physics_test) behavior_maxeffect = 1.0f; - BOOL update_visuals = FALSE; + // Normalize the param position to be from [0,1]. + // We have to use normalized values because there may be more than one driven param, + // and each of these driven params may have its own range. + // This means we'll do all our calculations in normalized [0,1] local coordinates. + const F32 position_user_local = (mParamDriver->getWeight() - mParamDriver->getMinWeight()) / (mParamDriver->getMaxWeight() - mParamDriver->getMinWeight()); + + // + // End parameters and settings + //////////////////////////////////////////////////////////////////////////////// + + + //////////////////////////////////////////////////////////////////////////////// + // Calculate velocity and acceleration in parameter space. + // + + //const F32 velocity_joint_local = calculateVelocity_local(time_iteration_step); + const F32 velocity_joint_local = calculateVelocity_local(); + const F32 acceleration_joint_local = calculateAcceleration_local(velocity_joint_local); + + // + // End velocity and acceleration + //////////////////////////////////////////////////////////////////////////////// + + BOOL update_visuals = FALSE; + // Break up the physics into a bunch of iterations so that differing framerates will show // roughly the same behavior. for (F32 time_iteration = 0; time_iteration <= time_delta; time_iteration += TIME_ITERATION_STEP) @@ -497,46 +521,20 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) F32 time_iteration_step = TIME_ITERATION_STEP; if (time_iteration + TIME_ITERATION_STEP > time_delta) { - time_iteration_step = time_delta; + time_iteration_step = time_delta-time_iteration; } - // mPositon_local should be in normalized 0,1 range already. Just making sure... - F32 position_current_local = llclamp(mPosition_local, - 0.0f, - 1.0f); - - // Normalize the param position to be from [0,1]. - // We have to use normalized values because there may be more than one driven param, - // and each of these driven params may have its own range. - // This means we'll do all our calculations in normalized [0,1] local coordinates. - F32 position_user_local = mParamDriver->getWeight(); - position_user_local = (position_user_local - mParamDriver->getMinWeight()) / (mParamDriver->getMaxWeight() - mParamDriver->getMinWeight()); - + const F32 position_current_local = llclamp(mPosition_local, + 0.0f, + 1.0f); // If the effect is turned off then don't process unless we need one more update // to set the position to the default (i.e. user) position. if ((behavior_maxeffect == 0) && (position_current_local == position_user_local)) { - return FALSE; + return update_visuals; } - // - // End parameters and settings - //////////////////////////////////////////////////////////////////////////////// - - - //////////////////////////////////////////////////////////////////////////////// - // Calculate velocity and acceleration in parameter space. - // - - const F32 velocity_joint_local = calculateVelocity_local(time_iteration_step); - const F32 acceleration_joint_local = calculateAcceleration_local(velocity_joint_local, time_iteration_step); - - // - // End velocity and acceleration - //////////////////////////////////////////////////////////////////////////////// - - //////////////////////////////////////////////////////////////////////////////// // Calculate the total force // @@ -553,7 +551,7 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) // Gravity always points downward in world space. // F = mg const LLVector3 gravity_world(0,0,1); - const F32 force_gravity = behavior_gain * (toLocal(gravity_world) * behavior_gravity * behavior_mass); + const F32 force_gravity = (toLocal(gravity_world) * behavior_gravity * behavior_mass); // Damping is a restoring force that opposes the current velocity. // F = -kv @@ -581,10 +579,10 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) // Calculate the new acceleration based on the net force. // a = F/m const F32 acceleration_new_local = force_net / behavior_mass; - static const F32 max_acceleration = 10.0f; // magic number, used to be customizable. - F32 velocity_new_local = mVelocity_local + acceleration_new_local; + static const F32 max_velocity = 100.0f; // magic number, used to be customizable. + F32 velocity_new_local = mVelocity_local + acceleration_new_local*time_iteration_step; velocity_new_local = llclamp(velocity_new_local, - -max_acceleration, max_acceleration); + -max_velocity, max_velocity); // Temporary debugging setting to cause all avatars to move, for profiling purposes. if (physics_test) @@ -610,8 +608,6 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) (position_new_local != position_new_local)) { position_new_local = 0; - position_current_local = 0; - position_user_local = 0; mVelocity_local = 0; mVelocityJoint_local = 0; mAccelerationJoint_local = 0; @@ -680,16 +676,14 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) // End update visual params //////////////////////////////////////////////////////////////////////////////// - mVelocityJoint_local = velocity_joint_local; - mVelocity_local = velocity_new_local; mAccelerationJoint_local = acceleration_joint_local; mPosition_local = position_new_local; - - mPosition_world = joint->getWorldPosition(); - } mLastTime = time; + mPosition_world = joint->getWorldPosition(); + mVelocityJoint_local = velocity_joint_local; + /* // Write out debugging info into a spreadsheet. -- cgit v1.2.3 From af6f2c8b2291a3ac43de899b8520a89e5ecc2657 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Thu, 21 Apr 2011 20:30:38 -0400 Subject: SH-1381 FIXED Avatar Physics behavior is tightly tied to viewer framerate Changed range of gain; previous range was too small. --- indra/newview/llphysicsmotion.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 7c199085c0..6851e7bb1a 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -380,7 +380,7 @@ F32 LLPhysicsMotion::toLocal(const LLVector3 &world) F32 LLPhysicsMotion::calculateVelocity_local() { - const F32 world_to_model_scale = 10.0f; + const F32 world_to_model_scale = 100.0f; LLJoint *joint = mJointState->getJoint(); const LLVector3 position_world = joint->getWorldPosition(); const LLQuaternion rotation_world = joint->getWorldRotation(); -- cgit v1.2.3 From f227e8ec01c99e09df7f362b934d57d80702a882 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Thu, 21 Apr 2011 20:30:38 -0400 Subject: SH-1381 FIXED Avatar Physics behavior is tightly tied to viewer framerate Changed range of gain; previous range was too small. --- indra/newview/llphysicsmotion.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 7d862848b5..e6a7212a47 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -386,7 +386,7 @@ F32 LLPhysicsMotion::toLocal(const LLVector3 &world) F32 LLPhysicsMotion::calculateVelocity_local() { - const F32 world_to_model_scale = 10.0f; + const F32 world_to_model_scale = 100.0f; LLJoint *joint = mJointState->getJoint(); const LLVector3 position_world = joint->getWorldPosition(); const LLQuaternion rotation_world = joint->getWorldRotation(); -- cgit v1.2.3 From 8c4555d54fc7c8686ffd139425f4c346576cac50 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Thu, 21 Apr 2011 18:04:38 -0700 Subject: Backed out changeset: e7b38729ad6d --- indra/newview/app_settings/settings_minimal.xml | 8 +- .../skins/default/xui/en/panel_bottomtray.xml | 1060 ++++++++++---------- .../minimal/xui/en/panel_adhoc_control_panel.xml | 35 - .../skins/minimal/xui/en/panel_bottomtray.xml | 38 - .../minimal/xui/en/panel_im_control_panel.xml | 33 - 5 files changed, 534 insertions(+), 640 deletions(-) diff --git a/indra/newview/app_settings/settings_minimal.xml b/indra/newview/app_settings/settings_minimal.xml index 60aecb279c..bc97ec00e9 100644 --- a/indra/newview/app_settings/settings_minimal.xml +++ b/indra/newview/app_settings/settings_minimal.xml @@ -52,7 +52,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>1</integer> + <integer>0</integer> </map> <key>HelpURLFormat</key> <map> @@ -124,7 +124,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>0</integer> + <integer>1</integer> </map> <key>VoiceDisableMic</key> <map> @@ -133,7 +133,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>0</integer> + <integer>1</integer> </map> <key>ScriptsCanShowUI</key> <map> @@ -290,7 +290,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>1</integer> + <integer>0</integer> </map> <key>EnableAvatarShare</key> <map> diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index c57f09c32f..c8882fd02c 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -1,530 +1,530 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel - background_visible="true" - bg_alpha_color="DkGray" - bg_opaque_color="DkGray" - chrome="true" - follows="left|bottom|right" - focus_root="true" - height="33" - layout="topleft" - left="0" - name="bottom_tray" - top="28" - width="1310"> - <string - name="DragIndicationImageName" - value="Accordion_ArrowOpened_Off" /> - <string - name="SpeakBtnToolTip" - value="Turns microphone on/off" /> - <string - name="VoiceControlBtnToolTip" - value="Shows/hides voice control panel" /> - <layout_stack - border_size="0" - clip="false" - follows="all" - height="28" - layout="topleft" - left="0" - mouse_opaque="false" - name="toolbar_stack" - orientation="horizontal" - top="0" - width="1310"> - <layout_panel - auto_resize="false" - user_resize="false" - min_width="2" - width="2" /> - <layout_panel - auto_resize="false" - layout="topleft" - max_width="320" - min_width="214" - height="28" - mouse_opaque="false" - name="chat_bar_layout_panel" - user_resize="true" - width="310" > - <panel - name="chat_bar" - filename="panel_nearby_chat_bar.xml" - left="0" - height="28" - width="308" - top="0" - mouse_opaque="false" - follows="left|right" - /> - </layout_panel> - <!-- - This 5px Panel is an indicator of where the resize handle is. - The panel provides a gap between the resize handle icon and a button to the right. - --> - <layout_panel - auto_resize="false" - layout="topleft" - max_width="5" - min_width="5" - name="chat_bar_resize_handle_panel" - user_resize="false" - width="5"> - <icon - follows="top|right" - height="25" - image_name="ChatBarHandle" - layout="topleft" - left="-7" - name="resize_handle" - top="4" - width="5" /> - </layout_panel> - <layout_panel - auto_resize="false" - follows="left|right" - height="28" - layout="topleft" - min_height="28" - min_width="59" - mouse_opaque="false" - name="speak_panel" - top_delta="0" - user_resize="false" - width="108"> - <talk_button - follows="left|right" - height="23" - layout="topleft" - left="0" - name="talk" - top="5" - width="105"> - <show_button - tab_stop="true"> - <init_callback - function="Button.SetDockableFloaterToggle" - parameter="voice_controls" /> - </show_button> - <!-- do not remove halign attribute with default value. otherwise it can't be overridden in other locales. - & pad_right is default value for long label which can be right aligned. See EXT-6318 --> - <speak_button - halign="center" - label="Speak" - label_selected="Speak" - name="speak_btn" - pad_right="20" - tab_stop="true" - use_ellipses="true" /> - </talk_button> - </layout_panel> - <layout_panel - auto_resize="false" - follows="right" - height="28" - layout="topleft" - min_height="28" - min_width="65" - mouse_opaque="false" - name="gesture_panel" - top_delta="0" - user_resize="false" - width="85"> - <gesture_combo_list - follows="left|right" - height="23" - label="Gesture" - layout="topleft" - left="0" - name="Gesture" - tool_tip="Shows/hides gestures" - top="5" - width="82"> - <combo_button - pad_right="10" - use_ellipses="true" /> - <combo_list - page_lines="17" /> - </gesture_combo_list> - </layout_panel> - <layout_panel - auto_resize="false" - follows="right" - height="28" - layout="topleft" - min_height="28" - min_width="52" - mouse_opaque="false" - name="movement_panel" - user_resize="false" - width="83"> - <bottomtray_button - follows="left|right" - height="23" - image_pressed="PushButton_Press" - image_pressed_selected="PushButton_Selected_Press" - image_selected="PushButton_Selected_Press" - is_toggle="true" - label="Move" - layout="topleft" - name="movement_btn" - tool_tip="Shows/hides movement controls" - top="5" - use_ellipses="true" - width="80"> - <init_callback - function="Button.SetDockableFloaterToggle" - parameter="moveview" /> - </bottomtray_button> - - </layout_panel> - <layout_panel - auto_resize="false" - follows="left|right" - height="28" - layout="topleft" - min_height="28" - min_width="52" - mouse_opaque="false" - name="cam_panel" - user_resize="false" - width="83"> - <bottomtray_button - follows="left|right" - height="23" - image_pressed="PushButton_Press" - image_pressed_selected="PushButton_Selected_Press" - image_selected="PushButton_Selected_Press" - is_toggle="true" - label="View" - layout="topleft" - left="0" - name="camera_btn" - tool_tip="Shows/hides camera controls" - top="5" - use_ellipses="true" - width="80"> - <init_callback - function="Button.SetDockableFloaterToggle" - parameter="camera" /> - </bottomtray_button> - </layout_panel> - <layout_panel - auto_resize="false" - follows="left|right" - height="28" - layout="topleft" - min_width="40" - mouse_opaque="false" - name="snapshot_panel" - user_resize="false" - width="39"> - <bottomtray_button - follows="left|right" - height="23" - image_overlay="Snapshot_Off" - image_pressed="PushButton_Press" - image_pressed_selected="PushButton_Selected_Press" - image_selected="PushButton_Selected_Press" - is_toggle="true" - layout="topleft" - left="0" - name="snapshots" - tool_tip="Take snapshot" - top="5" - width="36"> - <init_callback - function="Button.SetFloaterToggle" - parameter="snapshot" /> - </bottomtray_button> - </layout_panel> - <layout_panel - auto_resize="false" - follows="left|right" - height="28" - layout="topleft" - min_height="28" - min_width="52" - mouse_opaque="false" - name="build_btn_panel" - user_resize="false" - width="83"> - <!--*FIX: Build Floater is not opened with default registration. Will be fixed soon. -Disabled for now. ---> - <bottomtray_button - follows="left|right" - height="23" - image_pressed="PushButton_Press" - image_pressed_selected="PushButton_Selected_Press" - image_selected="PushButton_Selected_Press" - is_toggle="true" - label="Build" - layout="topleft" - left="0" - name="build_btn" - tool_tip="Shows/hides Build Tools" - top="5" - use_ellipses="true" - width="80"> - <commit_callback - function="Build.Toggle" - parameter="build" /> - </bottomtray_button> - </layout_panel> - <layout_panel - auto_resize="false" - follows="left|right" - height="28" - layout="topleft" - min_height="28" - min_width="52" - mouse_opaque="false" - name="search_btn_panel" - user_resize="false" - width="83"> - <bottomtray_button - follows="left|right" - height="23" - image_pressed="PushButton_Press" - image_pressed_selected="PushButton_Selected_Press" - image_selected="PushButton_Selected_Press" - is_toggle="true" - label="Search" - layout="topleft" - left="0" - name="search_btn" - tool_tip="Shows/hides Search" - top="5" - use_ellipses="true" - width="80"> - <init_callback - function="Button.SetFloaterToggle" - parameter="search" /> - </bottomtray_button> - </layout_panel> - <layout_panel - auto_resize="false" - follows="left|right" - height="28" - layout="topleft" - min_height="28" - min_width="52" - mouse_opaque="false" - name="world_map_btn_panel" - user_resize="false" - width="83"> - <bottomtray_button - follows="left|right" - height="23" - image_pressed="PushButton_Press" - image_pressed_selected="PushButton_Selected_Press" - image_selected="PushButton_Selected_Press" - is_toggle="true" - label="Map" - layout="topleft" - left="0" - name="world_map_btn" - tool_tip="Shows/hides World Map" - top="5" - use_ellipses="true" - width="80"> - <init_callback - function="Button.SetFloaterToggle" - parameter="world_map" /> - </bottomtray_button> - </layout_panel> - <layout_panel - auto_resize="false" - follows="left|right" - height="28" - layout="topleft" - min_height="28" - min_width="52" - mouse_opaque="false" - name="mini_map_btn_panel" - user_resize="false" - width="83"> - <bottomtray_button - follows="left|right" - height="23" - image_pressed="PushButton_Press" - image_pressed_selected="PushButton_Selected_Press" - image_selected="PushButton_Selected_Press" - is_toggle="true" - label="Mini-Map" - layout="topleft" - left="0" - name="mini_map_btn" - tool_tip="Shows/hides Mini-Map" - top="5" - use_ellipses="true" - width="80"> - <init_callback - function="Button.SetFloaterToggle" - parameter="mini_map" /> - </bottomtray_button> - </layout_panel> - <layout_panel - follows="left|right" - height="30" - layout="topleft" - min_width="95" - mouse_opaque="false" - name="chiclet_list_panel" - top="0" - user_resize="false" - width="189"> - <!--*NOTE: min_width of the chiclet_panel (chiclet_list) must be the same -as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. EXT-991--> - <chiclet_panel - chiclet_padding="4" - follows="left|right" - height="24" - layout="topleft" - left="1" - min_width="95" - mouse_opaque="false" - name="chiclet_list" - top="7" - width="189"> - <button - auto_resize="true" - follows="right" - height="29" - image_hover_selected="SegmentedBtn_Left_Over" - image_hover_unselected="SegmentedBtn_Left_Over" - image_overlay="Arrow_Small_Left" - image_pressed="SegmentedBtn_Left_Press" - image_pressed_selected="SegmentedBtn_Left_Press" - image_selected="SegmentedBtn_Left_Off" - image_unselected="SegmentedBtn_Left_Off" - layout="topleft" - name="chicklet_left_scroll_button" - tab_stop="false" - top="-28" - visible="false" - width="7" /> - <button - auto_resize="true" - follows="right" - height="29" - image_hover_selected="SegmentedBtn_Right_Over" - image_hover_unselected="SegmentedBtn_Right_Over" - image_overlay="Arrow_Small_Right" - image_pressed="SegmentedBtn_Right_Press" - image_pressed_selected="SegmentedBtn_Right_Press" - image_selected="SegmentedBtn_Right_Off" - image_unselected="SegmentedBtn_Right_Off" - layout="topleft" - name="chicklet_right_scroll_button" - tab_stop="false" - top="-28" - visible="false" - width="7" /> - </chiclet_panel> - </layout_panel> - <layout_panel auto_resize="false" - user_resize="false" - width="4" - min_width="4"/> - <layout_panel - auto_resize="false" - follows="right" - height="28" - layout="topleft" - min_height="28" - min_width="37" - name="im_well_panel" - top="0" - user_resize="false" - width="37"> - <chiclet_im_well - follows="right" - height="28" - layout="topleft" - left="0" - max_displayed_count="99" - name="im_well" - top="0" - width="35"> - <!-- -Emulate 4 states of button by background images, see details in EXT-3147. The same should be for notification_well button -xml attribute Description -image_unselected "Unlit" - there are no new messages -image_selected "Unlit" + "Selected" - there are no new messages and the Well is open -image_pressed "Lit" - there are new messages -image_pressed_selected "Lit" + "Selected" - there are new messages and the Well is open - --> - <button - auto_resize="true" - follows="right" - halign="center" - height="23" - image_overlay="Unread_IM" - image_overlay_alignment="center" - image_pressed="WellButton_Lit" - image_pressed_selected="WellButton_Lit_Selected" - image_selected="PushButton_Press" - label_color="Black" - left="0" - name="Unread IM messages" - tool_tip="Conversations" - width="34"> - <init_callback - function="Button.SetDockableFloaterToggle" - parameter="im_well_window" /> - </button> - </chiclet_im_well> - </layout_panel> - <layout_panel - auto_resize="false" - follows="right" - height="28" - layout="topleft" - min_height="28" - min_width="37" - name="notification_well_panel" - top="0" - user_resize="false" - width="37"> - <chiclet_notification - follows="right" - height="23" - layout="topleft" - left="0" - max_displayed_count="99" - name="notification_well" - top="5" - width="35"> - <button - auto_resize="true" - bottom_pad="3" - follows="right" - halign="center" - height="23" - image_overlay="Notices_Unread" - image_overlay_alignment="center" - image_pressed="WellButton_Lit" - image_pressed_selected="WellButton_Lit_Selected" - image_selected="PushButton_Press" - label_color="Black" - left="0" - name="Unread" - tool_tip="Notifications" - width="34"> - <init_callback - function="Button.SetDockableFloaterToggle" - parameter="notification_well_window" /> - </button> - </chiclet_notification> - </layout_panel> - <layout_panel - auto_resize="false" - user_resize="false" - min_width="4" - name="DUMMY2" - width="8" /> - </layout_stack> -</panel> \ No newline at end of file +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + background_visible="true" + bg_alpha_color="DkGray" + bg_opaque_color="DkGray" + chrome="true" + follows="left|bottom|right" + focus_root="true" + height="33" + layout="topleft" + left="0" + name="bottom_tray" + top="28" + width="1310"> + <string + name="DragIndicationImageName" + value="Accordion_ArrowOpened_Off" /> + <string + name="SpeakBtnToolTip" + value="Turns microphone on/off" /> + <string + name="VoiceControlBtnToolTip" + value="Shows/hides voice control panel" /> + <layout_stack + border_size="0" + clip="false" + follows="all" + height="28" + layout="topleft" + left="0" + mouse_opaque="false" + name="toolbar_stack" + orientation="horizontal" + top="0" + width="1310"> + <layout_panel + auto_resize="false" + user_resize="false" + min_width="2" + width="2" /> + <layout_panel + auto_resize="false" + layout="topleft" + max_width="320" + min_width="214" + height="28" + mouse_opaque="false" + name="chat_bar_layout_panel" + user_resize="true" + width="310" > + <panel + name="chat_bar" + filename="panel_nearby_chat_bar.xml" + left="0" + height="28" + width="308" + top="0" + mouse_opaque="false" + follows="left|right" + /> + </layout_panel> + <!-- + This 5px Panel is an indicator of where the resize handle is. + The panel provides a gap between the resize handle icon and a button to the right. + --> + <layout_panel + auto_resize="false" + layout="topleft" + max_width="5" + min_width="5" + name="chat_bar_resize_handle_panel" + user_resize="false" + width="5"> + <icon + follows="top|right" + height="25" + image_name="ChatBarHandle" + layout="topleft" + left="-7" + name="resize_handle" + top="4" + width="5" /> + </layout_panel> + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_height="28" + min_width="59" + mouse_opaque="false" + name="speak_panel" + top_delta="0" + user_resize="false" + width="108"> + <talk_button + follows="left|right" + height="23" + layout="topleft" + left="0" + name="talk" + top="5" + width="105"> + <show_button + tab_stop="true"> + <init_callback + function="Button.SetDockableFloaterToggle" + parameter="voice_controls" /> + </show_button> + <!-- do not remove halign attribute with default value. otherwise it can't be overridden in other locales. + & pad_right is default value for long label which can be right aligned. See EXT-6318 --> + <speak_button + halign="center" + label="Speak" + label_selected="Speak" + name="speak_btn" + pad_right="20" + tab_stop="true" + use_ellipses="true" /> + </talk_button> + </layout_panel> + <layout_panel + auto_resize="false" + follows="right" + height="28" + layout="topleft" + min_height="28" + min_width="65" + mouse_opaque="false" + name="gesture_panel" + top_delta="0" + user_resize="false" + width="85"> + <gesture_combo_list + follows="left|right" + height="23" + label="Gesture" + layout="topleft" + left="0" + name="Gesture" + tool_tip="Shows/hides gestures" + top="5" + width="82"> + <combo_button + pad_right="10" + use_ellipses="true" /> + <combo_list + page_lines="17" /> + </gesture_combo_list> + </layout_panel> + <layout_panel + auto_resize="false" + follows="right" + height="28" + layout="topleft" + min_height="28" + min_width="52" + mouse_opaque="false" + name="movement_panel" + user_resize="false" + width="83"> + <bottomtray_button + follows="left|right" + height="23" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + is_toggle="true" + label="Move" + layout="topleft" + name="movement_btn" + tool_tip="Shows/hides movement controls" + top="5" + use_ellipses="true" + width="80"> + <init_callback + function="Button.SetDockableFloaterToggle" + parameter="moveview" /> + </bottomtray_button> + + </layout_panel> + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_height="28" + min_width="52" + mouse_opaque="false" + name="cam_panel" + user_resize="false" + width="83"> + <bottomtray_button + follows="left|right" + height="23" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + is_toggle="true" + label="View" + layout="topleft" + left="0" + name="camera_btn" + tool_tip="Shows/hides camera controls" + top="5" + use_ellipses="true" + width="80"> + <init_callback + function="Button.SetDockableFloaterToggle" + parameter="camera" /> + </bottomtray_button> + </layout_panel> + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_width="40" + mouse_opaque="false" + name="snapshot_panel" + user_resize="false" + width="39"> + <bottomtray_button + follows="left|right" + height="23" + image_overlay="Snapshot_Off" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + is_toggle="true" + layout="topleft" + left="0" + name="snapshots" + tool_tip="Take snapshot" + top="5" + width="36"> + <init_callback + function="Button.SetFloaterToggle" + parameter="snapshot" /> + </bottomtray_button> + </layout_panel> + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_height="28" + min_width="52" + mouse_opaque="false" + name="build_btn_panel" + user_resize="false" + width="83"> + <!--*FIX: Build Floater is not opened with default registration. Will be fixed soon. +Disabled for now. +--> + <bottomtray_button + follows="left|right" + height="23" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + is_toggle="true" + label="Build" + layout="topleft" + left="0" + name="build_btn" + tool_tip="Shows/hides Build Tools" + top="5" + use_ellipses="true" + width="80"> + <commit_callback + function="Build.Toggle" + parameter="build" /> + </bottomtray_button> + </layout_panel> + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_height="28" + min_width="52" + mouse_opaque="false" + name="search_btn_panel" + user_resize="false" + width="83"> + <bottomtray_button + follows="left|right" + height="23" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + is_toggle="true" + label="Search" + layout="topleft" + left="0" + name="search_btn" + tool_tip="Shows/hides Search" + top="5" + use_ellipses="true" + width="80"> + <init_callback + function="Button.SetFloaterToggle" + parameter="search" /> + </bottomtray_button> + </layout_panel> + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_height="28" + min_width="52" + mouse_opaque="false" + name="world_map_btn_panel" + user_resize="false" + width="83"> + <bottomtray_button + follows="left|right" + height="23" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + is_toggle="true" + label="Map" + layout="topleft" + left="0" + name="world_map_btn" + tool_tip="Shows/hides World Map" + top="5" + use_ellipses="true" + width="80"> + <init_callback + function="Button.SetFloaterToggle" + parameter="world_map" /> + </bottomtray_button> + </layout_panel> + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_height="28" + min_width="52" + mouse_opaque="false" + name="mini_map_btn_panel" + user_resize="false" + width="83"> + <bottomtray_button + follows="left|right" + height="23" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + is_toggle="true" + label="Mini-Map" + layout="topleft" + left="0" + name="mini_map_btn" + tool_tip="Shows/hides Mini-Map" + top="5" + use_ellipses="true" + width="80"> + <init_callback + function="Button.SetFloaterToggle" + parameter="mini_map" /> + </bottomtray_button> + </layout_panel> + <layout_panel + follows="left|right" + height="30" + layout="topleft" + min_width="95" + mouse_opaque="false" + name="chiclet_list_panel" + top="0" + user_resize="false" + width="189"> + <!--*NOTE: min_width of the chiclet_panel (chiclet_list) must be the same +as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. EXT-991--> + <chiclet_panel + chiclet_padding="4" + follows="left|right" + height="24" + layout="topleft" + left="1" + min_width="95" + mouse_opaque="false" + name="chiclet_list" + top="7" + width="189"> + <button + auto_resize="true" + follows="right" + height="29" + image_hover_selected="SegmentedBtn_Left_Over" + image_hover_unselected="SegmentedBtn_Left_Over" + image_overlay="Arrow_Small_Left" + image_pressed="SegmentedBtn_Left_Press" + image_pressed_selected="SegmentedBtn_Left_Press" + image_selected="SegmentedBtn_Left_Off" + image_unselected="SegmentedBtn_Left_Off" + layout="topleft" + name="chicklet_left_scroll_button" + tab_stop="false" + top="-28" + visible="false" + width="7" /> + <button + auto_resize="true" + follows="right" + height="29" + image_hover_selected="SegmentedBtn_Right_Over" + image_hover_unselected="SegmentedBtn_Right_Over" + image_overlay="Arrow_Small_Right" + image_pressed="SegmentedBtn_Right_Press" + image_pressed_selected="SegmentedBtn_Right_Press" + image_selected="SegmentedBtn_Right_Off" + image_unselected="SegmentedBtn_Right_Off" + layout="topleft" + name="chicklet_right_scroll_button" + tab_stop="false" + top="-28" + visible="false" + width="7" /> + </chiclet_panel> + </layout_panel> + <layout_panel auto_resize="false" + user_resize="false" + width="4" + min_width="4"/> + <layout_panel + auto_resize="false" + follows="right" + height="28" + layout="topleft" + min_height="28" + min_width="37" + name="im_well_panel" + top="0" + user_resize="false" + width="37"> + <chiclet_im_well + follows="right" + height="28" + layout="topleft" + left="0" + max_displayed_count="99" + name="im_well" + top="0" + width="35"> + <!-- +Emulate 4 states of button by background images, see details in EXT-3147. The same should be for notification_well button +xml attribute Description +image_unselected "Unlit" - there are no new messages +image_selected "Unlit" + "Selected" - there are no new messages and the Well is open +image_pressed "Lit" - there are new messages +image_pressed_selected "Lit" + "Selected" - there are new messages and the Well is open + --> + <button + auto_resize="true" + follows="right" + halign="center" + height="23" + image_overlay="Unread_IM" + image_overlay_alignment="center" + image_pressed="WellButton_Lit" + image_pressed_selected="WellButton_Lit_Selected" + image_selected="PushButton_Press" + label_color="Black" + left="0" + name="Unread IM messages" + tool_tip="Conversations" + width="34"> + <init_callback + function="Button.SetDockableFloaterToggle" + parameter="im_well_window" /> + </button> + </chiclet_im_well> + </layout_panel> + <layout_panel + auto_resize="false" + follows="right" + height="28" + layout="topleft" + min_height="28" + min_width="37" + name="notification_well_panel" + top="0" + user_resize="false" + width="37"> + <chiclet_notification + follows="right" + height="23" + layout="topleft" + left="0" + max_displayed_count="99" + name="notification_well" + top="5" + width="35"> + <button + auto_resize="true" + bottom_pad="3" + follows="right" + halign="center" + height="23" + image_overlay="Notices_Unread" + image_overlay_alignment="center" + image_pressed="WellButton_Lit" + image_pressed_selected="WellButton_Lit_Selected" + image_selected="PushButton_Press" + label_color="Black" + left="0" + name="Unread" + tool_tip="Notifications" + width="34"> + <init_callback + function="Button.SetDockableFloaterToggle" + parameter="notification_well_window" /> + </button> + </chiclet_notification> + </layout_panel> + <layout_panel + auto_resize="false" + user_resize="false" + min_width="4" + name="DUMMY2" + width="8" /> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml index 39d1a90850..5730adab8a 100644 --- a/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml +++ b/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml @@ -42,40 +42,5 @@ show_speaking_indicator="false" width="147" /> </layout_panel> - <layout_panel - auto_resize="false" - follows="top|left|right" - height="25" - layout="topleft" - min_height="25" - width="130" - name="call_btn_panel" - user_resize="false" - visible="false"> - <button - follows="all" - height="20" - label="Call" - name="call_btn" - width="130" - top="5" /> - </layout_panel> - <layout_panel - auto_resize="false" - follows="top|left|right" - height="25" - layout="topleft" - min_height="25" - width="130" - name="end_call_btn_panel" - user_resize="false" - visible="false"> - <button - follows="all" - height="20" - label="Leave Call" - name="end_call_btn" - top="5"/> - </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml index 95f2010e44..e0c0bd13d9 100644 --- a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml @@ -61,44 +61,6 @@ </layout_panel> <layout_panel auto_resize="false" - follows="left|right" - height="28" - layout="topleft" - min_height="28" - min_width="59" - mouse_opaque="false" - name="speak_panel" - top_delta="0" - user_resize="false" - width="108"> - <talk_button - follows="left|right" - height="23" - layout="topleft" - left="0" - name="talk" - top="5" - width="105"> - <show_button - tab_stop="true"> - <init_callback - function="Button.SetDockableFloaterToggle" - parameter="voice_controls" /> - </show_button> - <!-- do not remove halign attribute with default value. otherwise it can't be overridden in other locales. - & pad_right is default value for long label which can be right aligned. See EXT-6318 --> - <speak_button - halign="center" - label="Speak" - label_selected="Speak" - name="speak_btn" - pad_right="20" - tab_stop="true" - use_ellipses="true" /> - </talk_button> - </layout_panel> - <layout_panel - auto_resize="false" follows="right" height="28" layout="topleft" diff --git a/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml index be13bc1bb7..c3f46f11e0 100644 --- a/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml +++ b/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml @@ -77,39 +77,6 @@ tool_tip = "Offer to teleport this person" width="140" /> </layout_panel> - <layout_panel - auto_resize="false" - follows="top|left|right" - height="25" - layout="topleft" - min_height="25" - width="140" - name="call_btn_panel" - user_resize="false"> - <button - follows="left|top|right" - height="23" - label="Call" - name="call_btn" - width="140" /> - </layout_panel> - <layout_panel - auto_resize="false" - follows="top|left|right" - height="25" - layout="topleft" - min_height="25" - width="140" - name="end_call_btn_panel" - user_resize="false" - visible="false"> - <button - follows="left|top|right" - height="23" - label="End Call" - name="end_call_btn" - width="140" /> - </layout_panel> <layout_panel mouse_opaque="false" auto_resize="true" -- cgit v1.2.3 From a9aeeab6c5fc4efeeaddf294bc4686efe02db5c1 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Thu, 21 Apr 2011 18:36:07 -0700 Subject: removed skylight-specific build params --- BuildParams | 7 ------- 1 file changed, 7 deletions(-) diff --git a/BuildParams b/BuildParams index f49a714c03..c0955cfeda 100644 --- a/BuildParams +++ b/BuildParams @@ -164,13 +164,6 @@ viewer-tut-teamcity.email = enus@lindenlab.com viewer-tut-teamcity.build_server = false viewer-tut-teamcity.build_server_tests = false -# ======================================== -# experience -# ======================================== -viewer-experience.public_build = false -viewer-experience.viewer_channel = "Second Life SkyLight Viewer" -viewer-experience.login_channel = "Second Life SkyLight Viewer" - # ================================================================= # asset delivery 2010 projects # ================================================================= -- cgit v1.2.3 From 33eb030bc043274c061fbe8cfa22b5f33d43e3e8 Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Fri, 22 Apr 2011 00:05:04 -0500 Subject: Update llconvexdecompositionstub for new package layout. --- autobuild.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 33cc180384..a81cf5275d 100755 --- a/autobuild.xml +++ b/autobuild.xml @@ -1158,9 +1158,9 @@ <key>archive</key> <map> <key>hash</key> - <string>349fa0e287fb275bbee43ced194a1db1</string> + <string>506779a74c527c1a2bf93addb58c3e48</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llconvexdecompositionstub-0.3-darwin-20101015.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llconvexdecompositionstub/rev/227397/arch/Darwin/installer/llconvexdecompositionstub-0.3-darwin-20110421.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -1170,9 +1170,9 @@ <key>archive</key> <map> <key>hash</key> - <string>dbf4b15e74ce9042e8500720dffc461a</string> + <string>be40b4d5ce1303f8818d294584b8c6a3</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llconvexdecompositionstub-0.3-linux-20101015a.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llconvexdecompositionstub/rev/227397/arch/Linux/installer/llconvexdecompositionstub-0.3-linux-20110422.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -1182,9 +1182,9 @@ <key>archive</key> <map> <key>hash</key> - <string>bba9a4dd04fda1b263f34448a044783b</string> + <string>6f65d135e16e64dec91323bad0710406</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llconvexdecompositionstub-0.3-windows-20101015.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llconvexdecompositionstub/rev/227397/arch/CYGWIN/installer/llconvexdecompositionstub-0.3-windows-20110421.tar.bz2</string> </map> <key>name</key> <string>windows</string> -- cgit v1.2.3 From 0349d1f29197ca00c9eb7278d97bd56ea4d2050a Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Fri, 22 Apr 2011 01:17:19 -0500 Subject: Update convex decomp stub to include latest api changes. --- autobuild.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index a81cf5275d..b3a7071e29 100755 --- a/autobuild.xml +++ b/autobuild.xml @@ -1158,9 +1158,9 @@ <key>archive</key> <map> <key>hash</key> - <string>506779a74c527c1a2bf93addb58c3e48</string> + <string>bc1388fc28dbb3bba1fe7cb8d09f49b4</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llconvexdecompositionstub/rev/227397/arch/Darwin/installer/llconvexdecompositionstub-0.3-darwin-20110421.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llconvexdecompositionstub/rev/227399/arch/Darwin/installer/llconvexdecompositionstub-0.3-darwin-20110421.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -1170,9 +1170,9 @@ <key>archive</key> <map> <key>hash</key> - <string>be40b4d5ce1303f8818d294584b8c6a3</string> + <string>3295bd4a0514b7c15dda9044f40c175e</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llconvexdecompositionstub/rev/227397/arch/Linux/installer/llconvexdecompositionstub-0.3-linux-20110422.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llconvexdecompositionstub/rev/227399/arch/Linux/installer/llconvexdecompositionstub-0.3-linux-20110422.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -1182,9 +1182,9 @@ <key>archive</key> <map> <key>hash</key> - <string>6f65d135e16e64dec91323bad0710406</string> + <string>92f1dff3249024c1534b55343ed79ea3</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llconvexdecompositionstub/rev/227397/arch/CYGWIN/installer/llconvexdecompositionstub-0.3-windows-20110421.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llconvexdecompositionstub/rev/227399/arch/CYGWIN/installer/llconvexdecompositionstub-0.3-windows-20110421.tar.bz2</string> </map> <key>name</key> <string>windows</string> -- cgit v1.2.3 From 175f12350d351570712db03e15c1bc89af677ad8 Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine <vsavchuk@productengine.com> Date: Fri, 22 Apr 2011 19:07:15 +0300 Subject: STORM-1093 FIX "Dock" icon is still shown after a side panel has been docked with Ctrl+Shift+W. Reason: When an undocked side tray tab floater got closed with Ctrl+Shift+W, LLSideTray::setTabDocked() was called. It docked the floater but didn't update the dock/undock icon. Fix: Made setTabDocked() a general purpose method, not a hack suitable for using only as a floater close callback in the basic viewer mode. It now updates the dock/undock icon. Other changes: * Replaced numerous calls to toggleTabDocked with setDocked(), that is safer because does exactly what you want. * Got rid of a duplicated floater close callback. --- indra/newview/llfloatersidetraytab.cpp | 3 +- indra/newview/llsidetray.cpp | 61 ++++++++++++---------------------- indra/newview/llsidetray.h | 2 +- 3 files changed, 24 insertions(+), 42 deletions(-) diff --git a/indra/newview/llfloatersidetraytab.cpp b/indra/newview/llfloatersidetraytab.cpp index 94407e6da0..9f15e62d84 100644 --- a/indra/newview/llfloatersidetraytab.cpp +++ b/indra/newview/llfloatersidetraytab.cpp @@ -47,5 +47,6 @@ LLFloaterSideTrayTab::~LLFloaterSideTrayTab() void LLFloaterSideTrayTab::onClose(bool app_quitting) { - LLSideTray::getInstance()->setTabDocked(getName(), true); + // The floater is already being closed, so don't toggle it once more (that may crash viewer). + LLSideTray::getInstance()->setTabDocked(getName(), /* dock = */ true, /* toggle_floater = */ false); } diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index 4f18ee1da2..615899d49f 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -127,8 +127,6 @@ protected: void undock(LLFloater* floater_tab); LLSideTray* getSideTray(); - - void onFloaterClose(LLSD::Boolean app_quitting); public: virtual ~LLSideTrayTab(); @@ -146,7 +144,7 @@ public: void onOpen (const LLSD& key); - void toggleTabDocked(); + void toggleTabDocked(bool toggle_floater = true); void setDocked(bool dock); bool isDocked() const; @@ -160,7 +158,6 @@ private: std::string mDescription; LLView* mMainPanel; - boost::signals2::connection mFloaterCloseConn; }; LLSideTrayTab::LLSideTrayTab(const Params& p) @@ -196,8 +193,8 @@ BOOL LLSideTrayTab::postBuild() title_panel->getChild<LLTextBox>(TAB_PANEL_CAPTION_TITLE_BOX)->setValue(mTabTitle); - getChild<LLButton>("undock")->setCommitCallback(boost::bind(&LLSideTrayTab::toggleTabDocked, this)); - getChild<LLButton>("dock")->setCommitCallback(boost::bind(&LLSideTrayTab::toggleTabDocked, this)); + getChild<LLButton>("undock")->setCommitCallback(boost::bind(&LLSideTrayTab::setDocked, this, false)); + getChild<LLButton>("dock")->setCommitCallback(boost::bind(&LLSideTrayTab::setDocked, this, true)); return true; } @@ -253,14 +250,16 @@ LLSideTray* LLSideTrayTab::getSideTray() return side_tray; } -void LLSideTrayTab::toggleTabDocked() +void LLSideTrayTab::toggleTabDocked(bool toggle_floater /* = true */) { + // *FIX: Calling this method twice per frame would crash the viewer. + std::string tab_name = getName(); LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab_name); if (!floater_tab) return; - bool docking = LLFloater::isShown(floater_tab); + bool docking = !isDocked(); // Hide the "Tear Off" button when a tab gets undocked // and show "Dock" button instead. @@ -278,7 +277,10 @@ void LLSideTrayTab::toggleTabDocked() // Open/close the floater *after* we reparent the tab panel, // so that it doesn't receive redundant visibility change notifications. - LLFloaterReg::toggleInstance("side_bar_tab", tab_name); + if (toggle_floater) + { + LLFloaterReg::toggleInstance("side_bar_tab", tab_name); + } } // Same as toggleTabDocked() apart from making sure that we do exactly what we want. @@ -298,18 +300,6 @@ bool LLSideTrayTab::isDocked() const return dynamic_cast<LLSideTray*>(getParent()) != NULL; } -void LLSideTrayTab::onFloaterClose(LLSD::Boolean app_quitting) -{ - // If user presses Ctrl-Shift-W, handle that gracefully by docking all - // undocked tabs before their floaters get destroyed (STORM-1016). - - // Don't dock on quit for the current dock state to be correctly saved. - if (app_quitting) return; - - lldebugs << "Forcibly docking tab " << getName() << llendl; - setDocked(true); -} - BOOL LLSideTrayTab::handleScrollWheel(S32 x, S32 y, S32 clicks) { // Let children handle the event @@ -333,7 +323,6 @@ void LLSideTrayTab::dock(LLFloater* floater_tab) return; } - mFloaterCloseConn.disconnect(); setRect(side_tray->getLocalRect()); reshape(getRect().getWidth(), getRect().getHeight()); @@ -382,7 +371,6 @@ void LLSideTrayTab::undock(LLFloater* floater_tab) } floater_tab->addChild(this); - mFloaterCloseConn = floater_tab->setCloseCallback(boost::bind(&LLSideTrayTab::onFloaterClose, this, _2)); floater_tab->setTitle(mTabTitle); floater_tab->setName(getName()); @@ -510,7 +498,7 @@ public: LLSideTrayTab* tab = side_tray->getTab(getName()); if (!tab) return FALSE; - tab->toggleTabDocked(); + tab->setDocked(false); LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab->getName()); if (!floater_tab) return FALSE; @@ -681,7 +669,7 @@ LLPanel* LLSideTray::openChildPanel(LLSideTrayTab* tab, const std::string& panel if (tab_attached && LLUI::sSettingGroups["config"]->getBOOL("OpenSidePanelsInFloaters")) { - tab->toggleTabDocked(); + tab->setDocked(false); tab_attached = false; } @@ -1102,7 +1090,7 @@ void LLSideTray::detachTabs() if (!is_visible) continue; llassert(isTabAttached(tab->getName())); - tab->toggleTabDocked(); + tab->setDocked(false); } } @@ -1327,8 +1315,9 @@ bool LLSideTray::isPanelActive(const std::string& panel_name) return (panel->getName() == panel_name); } -void LLSideTray::setTabDocked(const std::string& tab_name, bool dock) +void LLSideTray::setTabDocked(const std::string& tab_name, bool dock, bool toggle_floater /* = true*/) { + // Lookup tab by name. LLSideTrayTab* tab = getTab(tab_name); if (!tab) { // not a docked tab, look through detached tabs @@ -1345,20 +1334,12 @@ void LLSideTray::setTabDocked(const std::string& tab_name, bool dock) } - if (tab) - { - bool tab_attached = isTabAttached(tab_name); - LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab_name); - if (!floater_tab) return; + llassert(tab != NULL); - if (dock && !tab_attached) - { - tab->dock(floater_tab); - } - else if (!dock && tab_attached) - { - tab->undock(floater_tab); - } + // Toggle its dock state. + if (tab && tab->isDocked() != dock) + { + tab->toggleTabDocked(toggle_floater); } } diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h index 1dddd9e9bc..57e4264247 100644 --- a/indra/newview/llsidetray.h +++ b/indra/newview/llsidetray.h @@ -121,7 +121,7 @@ public: LLPanel* getActivePanel (); bool isPanelActive (const std::string& panel_name); - void setTabDocked(const std::string& tab_name, bool dock); + void setTabDocked(const std::string& tab_name, bool dock, bool toggle_floater = true); /* * get the panel of given type T (don't show it or do anything else with it) -- cgit v1.2.3 From cf0aa6981aa6769169900691d69bf3566dc42295 Mon Sep 17 00:00:00 2001 From: Xiaohong Bao <bao@lindenlab.com> Date: Fri, 22 Apr 2011 10:24:46 -0600 Subject: fix for sh-1420: the background image at startup is missing from mesh-development and viewer-beta. --- indra/newview/llpanellogin.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 7820ac3ecd..0bdbeefd2a 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -34,6 +34,7 @@ #include "llmd5.h" #include "llsecondlifeurls.h" #include "v4color.h" +#include "llversionviewer.h" #include "llappviewer.h" #include "llbutton.h" @@ -851,12 +852,20 @@ void LLPanelLogin::loadLoginPage() LLVersionInfo::getShortVersion().c_str(), LLVersionInfo::getBuild()); - char* curl_channel = curl_escape(LLVersionInfo::getChannel().c_str(), 0); + char* curl_channel ; char* curl_version = curl_escape(version.c_str(), 0); + if(strcmp(LLVersionInfo::getChannel().c_str(), LL_CHANNEL)) + { + curl_channel = curl_escape(LLVersionInfo::getChannel().c_str(), 0); + } + else //if LL_CHANNEL, direct it to "Second Life Beta Viewer". + { + curl_channel = curl_escape("Second Life Beta Viewer", 0); + } oStr << "&channel=" << curl_channel; oStr << "&version=" << curl_version; - + curl_free(curl_channel); curl_free(curl_version); -- cgit v1.2.3 From 154a465bdaff58023c43bed12b4a049ae72a55df Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Fri, 22 Apr 2011 13:17:44 -0400 Subject: dos2unix line ending fix for llphysicsmotion.cpp --- indra/newview/llphysicsmotion.cpp | 1476 ++++++++++++++++++------------------- 1 file changed, 738 insertions(+), 738 deletions(-) diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index e6a7212a47..ef0c1a3558 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -1,738 +1,738 @@ -/** - * @file llphysicsmotion.cpp - * @brief Implementation of LLPhysicsMotion class. - * - * $LicenseInfo:firstyear=2001&license=viewergpl$ - * - * Copyright (c) 2001-2009, Linden Research, Inc. - * - * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - * $/LicenseInfo$ - */ - -//----------------------------------------------------------------------------- -// Header Files -//----------------------------------------------------------------------------- -#include "llviewerprecompiledheaders.h" -#include "linden_common.h" - -#include "m3math.h" -#include "v3dmath.h" - -#include "llphysicsmotion.h" -#include "llagent.h" -#include "llcharacter.h" -#include "llviewercontrol.h" -#include "llviewervisualparam.h" -#include "llvoavatarself.h" - -typedef std::map<std::string, std::string> controller_map_t; -typedef std::map<std::string, F32> default_controller_map_t; - -#define MIN_REQUIRED_PIXEL_AREA_AVATAR_PHYSICS_MOTION 0.f -#define TIME_ITERATION_STEP 0.1f - -inline F64 llsgn(const F64 a) -{ - if (a >= 0) - return 1; - return -1; -} - -/* - At a high level, this works by setting temporary parameters that are not stored - in the avatar's list of params, and are not conveyed to other users. We accomplish - this by creating some new temporary driven params inside avatar_lad that are then driven - by the actual params that the user sees and sets. For example, in the old system, - the user sets a param called breast bouyancy, which controls the Z value of the breasts. - In our new system, the user still sets the breast bouyancy, but that param is redefined - as a driver param so that affects a new temporary driven param that the bounce is applied - to. -*/ - -class LLPhysicsMotion -{ -public: - /* - param_driver_name: The param that controls the params that are being affected by the physics. - joint_name: The joint that the body part is attached to. The joint is - used to determine the orientation (rotation) of the body part. - - character: The avatar that this physics affects. - - motion_direction_vec: The direction (in world coordinates) that determines the - motion. For example, (0,0,1) is up-down, and means that up-down motion is what - determines how this joint moves. - - controllers: The various settings (e.g. spring force, mass) that determine how - the body part behaves. - */ - LLPhysicsMotion(const std::string ¶m_driver_name, - const std::string &joint_name, - LLCharacter *character, - const LLVector3 &motion_direction_vec, - const controller_map_t &controllers) : - mParamDriverName(param_driver_name), - mJointName(joint_name), - mMotionDirectionVec(motion_direction_vec), - mParamDriver(NULL), - mParamControllers(controllers), - mCharacter(character), - mLastTime(0), - mPosition_local(0), - mVelocityJoint_local(0), - mPositionLastUpdate_local(0) - { - mJointState = new LLJointState; - } - - BOOL initialize(); - - ~LLPhysicsMotion() {} - - BOOL onUpdate(F32 time); - - LLPointer<LLJointState> getJointState() - { - return mJointState; - } -protected: - F32 getParamValue(const std::string& controller_key) - { - const controller_map_t::const_iterator& entry = mParamControllers.find(controller_key); - if (entry == mParamControllers.end()) - { - return sDefaultController[controller_key]; - } - const std::string& param_name = (*entry).second.c_str(); - return mCharacter->getVisualParamWeight(param_name.c_str()); - } - void setParamValue(LLViewerVisualParam *param, - const F32 new_value_local, - F32 behavior_maxeffect); - - F32 toLocal(const LLVector3 &world); - F32 calculateVelocity_local(); - F32 calculateAcceleration_local(F32 velocity_local); -private: - const std::string mParamDriverName; - const std::string mParamControllerName; - const LLVector3 mMotionDirectionVec; - const std::string mJointName; - - F32 mPosition_local; - F32 mVelocityJoint_local; // How fast the joint is moving - F32 mAccelerationJoint_local; // Acceleration on the joint - - F32 mVelocity_local; // How fast the param is moving - F32 mPositionLastUpdate_local; - LLVector3 mPosition_world; - - LLViewerVisualParam *mParamDriver; - const controller_map_t mParamControllers; - - LLPointer<LLJointState> mJointState; - LLCharacter *mCharacter; - - F32 mLastTime; - - static default_controller_map_t sDefaultController; -}; - -default_controller_map_t initDefaultController() -{ - default_controller_map_t controller; - controller["Mass"] = 0.2f; - controller["Gravity"] = 0.0f; - controller["Damping"] = .05f; - controller["Drag"] = 0.15f; - controller["MaxEffect"] = 0.1f; - controller["Spring"] = 0.1f; - controller["Gain"] = 10.0f; - return controller; -} - -default_controller_map_t LLPhysicsMotion::sDefaultController = initDefaultController(); - -BOOL LLPhysicsMotion::initialize() -{ - if (!mJointState->setJoint(mCharacter->getJoint(mJointName.c_str()))) - return FALSE; - mJointState->setUsage(LLJointState::ROT); - - mParamDriver = (LLViewerVisualParam*)mCharacter->getVisualParam(mParamDriverName.c_str()); - if (mParamDriver == NULL) - { - llinfos << "Failure reading in [ " << mParamDriverName << " ]" << llendl; - return FALSE; - } - - return TRUE; -} - -LLPhysicsMotionController::LLPhysicsMotionController(const LLUUID &id) : - LLMotion(id), - mCharacter(NULL) -{ - mName = "breast_motion"; -} - -LLPhysicsMotionController::~LLPhysicsMotionController() -{ - for (motion_vec_t::iterator iter = mMotions.begin(); - iter != mMotions.end(); - ++iter) - { - delete (*iter); - } -} - -BOOL LLPhysicsMotionController::onActivate() -{ - return TRUE; -} - -void LLPhysicsMotionController::onDeactivate() -{ -} - -LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter *character) -{ - mCharacter = character; - - mMotions.clear(); - - // Breast Cleavage - { - controller_map_t controller; - controller["Mass"] = "Breast_Physics_Mass"; - controller["Gravity"] = "Breast_Physics_Gravity"; - controller["Drag"] = "Breast_Physics_Drag"; - controller["Damping"] = "Breast_Physics_InOut_Damping"; - controller["MaxEffect"] = "Breast_Physics_InOut_Max_Effect"; - controller["Spring"] = "Breast_Physics_InOut_Spring"; - controller["Gain"] = "Breast_Physics_InOut_Gain"; - LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_InOut_Controller", - "mChest", - character, - LLVector3(-1,0,0), - controller); - if (!motion->initialize()) - { - llassert_always(FALSE); - return STATUS_FAILURE; - } - addMotion(motion); - } - - // Breast Bounce - { - controller_map_t controller; - controller["Mass"] = "Breast_Physics_Mass"; - controller["Gravity"] = "Breast_Physics_Gravity"; - controller["Drag"] = "Breast_Physics_Drag"; - controller["Damping"] = "Breast_Physics_UpDown_Damping"; - controller["MaxEffect"] = "Breast_Physics_UpDown_Max_Effect"; - controller["Spring"] = "Breast_Physics_UpDown_Spring"; - controller["Gain"] = "Breast_Physics_UpDown_Gain"; - LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_UpDown_Controller", - "mChest", - character, - LLVector3(0,0,1), - controller); - if (!motion->initialize()) - { - llassert_always(FALSE); - return STATUS_FAILURE; - } - addMotion(motion); - } - - // Breast Sway - { - controller_map_t controller; - controller["Mass"] = "Breast_Physics_Mass"; - controller["Gravity"] = "Breast_Physics_Gravity"; - controller["Drag"] = "Breast_Physics_Drag"; - controller["Damping"] = "Breast_Physics_LeftRight_Damping"; - controller["MaxEffect"] = "Breast_Physics_LeftRight_Max_Effect"; - controller["Spring"] = "Breast_Physics_LeftRight_Spring"; - controller["Gain"] = "Breast_Physics_LeftRight_Gain"; - LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_LeftRight_Controller", - "mChest", - character, - LLVector3(0,-1,0), - controller); - if (!motion->initialize()) - { - llassert_always(FALSE); - return STATUS_FAILURE; - } - addMotion(motion); - } - // Butt Bounce - { - controller_map_t controller; - controller["Mass"] = "Butt_Physics_Mass"; - controller["Gravity"] = "Butt_Physics_Gravity"; - controller["Drag"] = "Butt_Physics_Drag"; - controller["Damping"] = "Butt_Physics_UpDown_Damping"; - controller["MaxEffect"] = "Butt_Physics_UpDown_Max_Effect"; - controller["Spring"] = "Butt_Physics_UpDown_Spring"; - controller["Gain"] = "Butt_Physics_UpDown_Gain"; - LLPhysicsMotion *motion = new LLPhysicsMotion("Butt_Physics_UpDown_Controller", - "mPelvis", - character, - LLVector3(0,0,-1), - controller); - if (!motion->initialize()) - { - llassert_always(FALSE); - return STATUS_FAILURE; - } - addMotion(motion); - } - - // Butt LeftRight - { - controller_map_t controller; - controller["Mass"] = "Butt_Physics_Mass"; - controller["Gravity"] = "Butt_Physics_Gravity"; - controller["Drag"] = "Butt_Physics_Drag"; - controller["Damping"] = "Butt_Physics_LeftRight_Damping"; - controller["MaxEffect"] = "Butt_Physics_LeftRight_Max_Effect"; - controller["Spring"] = "Butt_Physics_LeftRight_Spring"; - controller["Gain"] = "Butt_Physics_LeftRight_Gain"; - LLPhysicsMotion *motion = new LLPhysicsMotion("Butt_Physics_LeftRight_Controller", - "mPelvis", - character, - LLVector3(0,-1,0), - controller); - if (!motion->initialize()) - { - llassert_always(FALSE); - return STATUS_FAILURE; - } - addMotion(motion); - } - - // Belly Bounce - { - controller_map_t controller; - controller["Mass"] = "Belly_Physics_Mass"; - controller["Gravity"] = "Belly_Physics_Gravity"; - controller["Drag"] = "Belly_Physics_Drag"; - controller["Damping"] = "Belly_Physics_UpDown_Damping"; - controller["MaxEffect"] = "Belly_Physics_UpDown_Max_Effect"; - controller["Spring"] = "Belly_Physics_UpDown_Spring"; - controller["Gain"] = "Belly_Physics_UpDown_Gain"; - LLPhysicsMotion *motion = new LLPhysicsMotion("Belly_Physics_UpDown_Controller", - "mPelvis", - character, - LLVector3(0,0,-1), - controller); - if (!motion->initialize()) - { - llassert_always(FALSE); - return STATUS_FAILURE; - } - addMotion(motion); - } - - return STATUS_SUCCESS; -} - -void LLPhysicsMotionController::addMotion(LLPhysicsMotion *motion) -{ - addJointState(motion->getJointState()); - mMotions.push_back(motion); -} - -F32 LLPhysicsMotionController::getMinPixelArea() -{ - return MIN_REQUIRED_PIXEL_AREA_AVATAR_PHYSICS_MOTION; -} - -// Local space means "parameter space". -F32 LLPhysicsMotion::toLocal(const LLVector3 &world) -{ - LLJoint *joint = mJointState->getJoint(); - const LLQuaternion rotation_world = joint->getWorldRotation(); - - LLVector3 dir_world = mMotionDirectionVec * rotation_world; - dir_world.normalize(); - return world * dir_world; -} - -F32 LLPhysicsMotion::calculateVelocity_local() -{ - const F32 world_to_model_scale = 100.0f; - LLJoint *joint = mJointState->getJoint(); - const LLVector3 position_world = joint->getWorldPosition(); - const LLQuaternion rotation_world = joint->getWorldRotation(); - const LLVector3 last_position_world = mPosition_world; - const LLVector3 positionchange_world = (position_world-last_position_world) * world_to_model_scale; - const LLVector3 velocity_world = positionchange_world; - const F32 velocity_local = toLocal(velocity_world); - return velocity_local; -} - -F32 LLPhysicsMotion::calculateAcceleration_local(const F32 velocity_local) -{ -// const F32 smoothing = getParamValue("Smoothing"); - static const F32 smoothing = 3.0f; // Removed smoothing param since it's probably not necessary - const F32 acceleration_local = velocity_local - mVelocityJoint_local; - - const F32 smoothed_acceleration_local = - acceleration_local * 1.0/smoothing + - mAccelerationJoint_local * (smoothing-1.0)/smoothing; - - return smoothed_acceleration_local; -} - -BOOL LLPhysicsMotionController::onUpdate(F32 time, U8* joint_mask) -{ - // Skip if disabled globally. - if (!gSavedSettings.getBOOL("AvatarPhysics")) - { - return TRUE; - } - - BOOL update_visuals = FALSE; - for (motion_vec_t::iterator iter = mMotions.begin(); - iter != mMotions.end(); - ++iter) - { - LLPhysicsMotion *motion = (*iter); - update_visuals |= motion->onUpdate(time); - } - - if (update_visuals) - mCharacter->updateVisualParams(); - - return TRUE; -} - - -// Return TRUE if character has to update visual params. -BOOL LLPhysicsMotion::onUpdate(F32 time) -{ - // static FILE *mFileWrite = fopen("c:\\temp\\avatar_data.txt","w"); - - if (!mParamDriver) - return FALSE; - - if (!mLastTime) - { - mLastTime = time; - return FALSE; - } - - //////////////////////////////////////////////////////////////////////////////// - // Get all parameters and settings - // - - const F32 time_delta = time - mLastTime; - - // Don't update too frequently, to avoid precision errors from small time slices. - if (time_delta <= .01) - { - return FALSE; - } - - // If less than 1FPS, we don't want to be spending time updating physics at all. - if (time_delta > 1.0) - { - mLastTime = time; - return FALSE; - } - - // Higher LOD is better. This controls the granularity - // and frequency of updates for the motions. - const F32 lod_factor = LLVOAvatar::sPhysicsLODFactor; - if (lod_factor == 0) - { - return TRUE; - } - - LLJoint *joint = mJointState->getJoint(); - - const F32 behavior_mass = getParamValue("Mass"); - const F32 behavior_gravity = getParamValue("Gravity"); - const F32 behavior_spring = getParamValue("Spring"); - const F32 behavior_gain = getParamValue("Gain"); - const F32 behavior_damping = getParamValue("Damping"); - const F32 behavior_drag = getParamValue("Drag"); - const BOOL physics_test = FALSE; // Enable this to simulate bouncing on all parts. - - F32 behavior_maxeffect = getParamValue("MaxEffect"); - if (physics_test) - behavior_maxeffect = 1.0f; - - // Normalize the param position to be from [0,1]. - // We have to use normalized values because there may be more than one driven param, - // and each of these driven params may have its own range. - // This means we'll do all our calculations in normalized [0,1] local coordinates. - const F32 position_user_local = (mParamDriver->getWeight() - mParamDriver->getMinWeight()) / (mParamDriver->getMaxWeight() - mParamDriver->getMinWeight()); - - // - // End parameters and settings - //////////////////////////////////////////////////////////////////////////////// - - - //////////////////////////////////////////////////////////////////////////////// - // Calculate velocity and acceleration in parameter space. - // - - //const F32 velocity_joint_local = calculateVelocity_local(time_iteration_step); - const F32 velocity_joint_local = calculateVelocity_local(); - const F32 acceleration_joint_local = calculateAcceleration_local(velocity_joint_local); - - // - // End velocity and acceleration - //////////////////////////////////////////////////////////////////////////////// - - BOOL update_visuals = FALSE; - - // Break up the physics into a bunch of iterations so that differing framerates will show - // roughly the same behavior. - for (F32 time_iteration = 0; time_iteration <= time_delta; time_iteration += TIME_ITERATION_STEP) - { - F32 time_iteration_step = TIME_ITERATION_STEP; - if (time_iteration + TIME_ITERATION_STEP > time_delta) - { - time_iteration_step = time_delta-time_iteration; - } - - // mPositon_local should be in normalized 0,1 range already. Just making sure... - const F32 position_current_local = llclamp(mPosition_local, - 0.0f, - 1.0f); - // If the effect is turned off then don't process unless we need one more update - // to set the position to the default (i.e. user) position. - if ((behavior_maxeffect == 0) && (position_current_local == position_user_local)) - { - return update_visuals; - } - - //////////////////////////////////////////////////////////////////////////////// - // Calculate the total force - // - - // Spring force is a restoring force towards the original user-set breast position. - // F = kx - const F32 spring_length = position_current_local - position_user_local; - const F32 force_spring = -spring_length * behavior_spring; - - // Acceleration is the force that comes from the change in velocity of the torso. - // F = ma - const F32 force_accel = behavior_gain * (acceleration_joint_local * behavior_mass); - - // Gravity always points downward in world space. - // F = mg - const LLVector3 gravity_world(0,0,1); - const F32 force_gravity = (toLocal(gravity_world) * behavior_gravity * behavior_mass); - - // Damping is a restoring force that opposes the current velocity. - // F = -kv - const F32 force_damping = -behavior_damping * mVelocity_local; - - // Drag is a force imparted by velocity (intuitively it is similar to wind resistance) - // F = .5kv^2 - const F32 force_drag = .5*behavior_drag*velocity_joint_local*velocity_joint_local*llsgn(velocity_joint_local); - - const F32 force_net = (force_accel + - force_gravity + - force_spring + - force_damping + - force_drag); - - // - // End total force - //////////////////////////////////////////////////////////////////////////////// - - - //////////////////////////////////////////////////////////////////////////////// - // Calculate new params - // - - // Calculate the new acceleration based on the net force. - // a = F/m - const F32 acceleration_new_local = force_net / behavior_mass; - static const F32 max_velocity = 100.0f; // magic number, used to be customizable. - F32 velocity_new_local = mVelocity_local + acceleration_new_local*time_iteration_step; - velocity_new_local = llclamp(velocity_new_local, - -max_velocity, max_velocity); - - // Temporary debugging setting to cause all avatars to move, for profiling purposes. - if (physics_test) - { - velocity_new_local = sin(time*4.0); - } - // Calculate the new parameters, or remain unchanged if max speed is 0. - F32 position_new_local = position_current_local + velocity_new_local*time_iteration_step; - if (behavior_maxeffect == 0) - position_new_local = position_user_local; - - // Zero out the velocity if the param is being pushed beyond its limits. - if ((position_new_local < 0 && velocity_new_local < 0) || - (position_new_local > 1 && velocity_new_local > 0)) - { - velocity_new_local = 0; - } - - // Check for NaN values. A NaN value is detected if the variables doesn't equal itself. - // If NaN, then reset everything. - if ((mPosition_local != mPosition_local) || - (mVelocity_local != mVelocity_local) || - (position_new_local != position_new_local)) - { - position_new_local = 0; - mVelocity_local = 0; - mVelocityJoint_local = 0; - mAccelerationJoint_local = 0; - mPosition_local = 0; - mPosition_world = LLVector3(0,0,0); - } - - const F32 position_new_local_clamped = llclamp(position_new_local, - 0.0f, - 1.0f); - - LLDriverParam *driver_param = dynamic_cast<LLDriverParam *>(mParamDriver); - llassert_always(driver_param); - if (driver_param) - { - // If this is one of our "hidden" driver params, then make sure it's - // the default value. - if ((driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) && - (driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT)) - { - mCharacter->setVisualParamWeight(driver_param, - 0, - FALSE); - } - for (LLDriverParam::entry_list_t::iterator iter = driver_param->mDriven.begin(); - iter != driver_param->mDriven.end(); - ++iter) - { - LLDrivenEntry &entry = (*iter); - LLViewerVisualParam *driven_param = entry.mParam; - setParamValue(driven_param,position_new_local_clamped, behavior_maxeffect); - } - } - - // - // End calculate new params - //////////////////////////////////////////////////////////////////////////////// - - //////////////////////////////////////////////////////////////////////////////// - // Conditionally update the visual params - // - - // Updating the visual params (i.e. what the user sees) is fairly expensive. - // So only update if the params have changed enough, and also take into account - // the graphics LOD settings. - - // For non-self, if the avatar is small enough visually, then don't update. - const F32 area_for_max_settings = 0.0; - const F32 area_for_min_settings = 1400.0; - const F32 area_for_this_setting = area_for_max_settings + (area_for_min_settings-area_for_max_settings)*(1.0-lod_factor); - const F32 pixel_area = fsqrtf(mCharacter->getPixelArea()); - - const BOOL is_self = (dynamic_cast<LLVOAvatarSelf *>(mCharacter) != NULL); - if ((pixel_area > area_for_this_setting) || is_self) - { - const F32 position_diff_local = llabs(mPositionLastUpdate_local-position_new_local_clamped); - const F32 min_delta = (1.0001f-lod_factor)*0.4f; - if (llabs(position_diff_local) > min_delta) - { - update_visuals = TRUE; - mPositionLastUpdate_local = position_new_local; - } - } - - // - // End update visual params - //////////////////////////////////////////////////////////////////////////////// - - mVelocity_local = velocity_new_local; - mAccelerationJoint_local = acceleration_joint_local; - mPosition_local = position_new_local; - } - mLastTime = time; - mPosition_world = joint->getWorldPosition(); - mVelocityJoint_local = velocity_joint_local; - - - /* - // Write out debugging info into a spreadsheet. - if (mFileWrite != NULL && is_self) - { - fprintf(mFileWrite,"%f\t%f\t%f \t\t%f \t\t%f\t%f\t%f\t \t\t%f\t%f\t%f\t%f\t%f \t\t%f\t%f\t%f\n", - position_new_local, - velocity_new_local, - acceleration_new_local, - - time_delta, - - mPosition_world[0], - mPosition_world[1], - mPosition_world[2], - - force_net, - force_spring, - force_accel, - force_damping, - force_drag, - - spring_length, - velocity_joint_local, - acceleration_joint_local - ); - } - */ - - return update_visuals; -} - -// Range of new_value_local is assumed to be [0 , 1] normalized. -void LLPhysicsMotion::setParamValue(LLViewerVisualParam *param, - F32 new_value_normalized, - F32 behavior_maxeffect) -{ - const F32 value_min_local = param->getMinWeight(); - const F32 value_max_local = param->getMaxWeight(); - const F32 min_val = 0.5f-behavior_maxeffect/2.0; - const F32 max_val = 0.5f+behavior_maxeffect/2.0; - - // Scale from [0,1] to [min_val,max_val] - const F32 new_value_rescaled = min_val + (max_val-min_val) * new_value_normalized; - - // Scale from [0,1] to [value_min_local,value_max_local] - const F32 new_value_local = value_min_local + (value_max_local-value_min_local) * new_value_rescaled; - - mCharacter->setVisualParamWeight(param, - new_value_local, - FALSE); -} +/** + * @file llphysicsmotion.cpp + * @brief Implementation of LLPhysicsMotion class. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +//----------------------------------------------------------------------------- +// Header Files +//----------------------------------------------------------------------------- +#include "llviewerprecompiledheaders.h" +#include "linden_common.h" + +#include "m3math.h" +#include "v3dmath.h" + +#include "llphysicsmotion.h" +#include "llagent.h" +#include "llcharacter.h" +#include "llviewercontrol.h" +#include "llviewervisualparam.h" +#include "llvoavatarself.h" + +typedef std::map<std::string, std::string> controller_map_t; +typedef std::map<std::string, F32> default_controller_map_t; + +#define MIN_REQUIRED_PIXEL_AREA_AVATAR_PHYSICS_MOTION 0.f +#define TIME_ITERATION_STEP 0.1f + +inline F64 llsgn(const F64 a) +{ + if (a >= 0) + return 1; + return -1; +} + +/* + At a high level, this works by setting temporary parameters that are not stored + in the avatar's list of params, and are not conveyed to other users. We accomplish + this by creating some new temporary driven params inside avatar_lad that are then driven + by the actual params that the user sees and sets. For example, in the old system, + the user sets a param called breast bouyancy, which controls the Z value of the breasts. + In our new system, the user still sets the breast bouyancy, but that param is redefined + as a driver param so that affects a new temporary driven param that the bounce is applied + to. +*/ + +class LLPhysicsMotion +{ +public: + /* + param_driver_name: The param that controls the params that are being affected by the physics. + joint_name: The joint that the body part is attached to. The joint is + used to determine the orientation (rotation) of the body part. + + character: The avatar that this physics affects. + + motion_direction_vec: The direction (in world coordinates) that determines the + motion. For example, (0,0,1) is up-down, and means that up-down motion is what + determines how this joint moves. + + controllers: The various settings (e.g. spring force, mass) that determine how + the body part behaves. + */ + LLPhysicsMotion(const std::string ¶m_driver_name, + const std::string &joint_name, + LLCharacter *character, + const LLVector3 &motion_direction_vec, + const controller_map_t &controllers) : + mParamDriverName(param_driver_name), + mJointName(joint_name), + mMotionDirectionVec(motion_direction_vec), + mParamDriver(NULL), + mParamControllers(controllers), + mCharacter(character), + mLastTime(0), + mPosition_local(0), + mVelocityJoint_local(0), + mPositionLastUpdate_local(0) + { + mJointState = new LLJointState; + } + + BOOL initialize(); + + ~LLPhysicsMotion() {} + + BOOL onUpdate(F32 time); + + LLPointer<LLJointState> getJointState() + { + return mJointState; + } +protected: + F32 getParamValue(const std::string& controller_key) + { + const controller_map_t::const_iterator& entry = mParamControllers.find(controller_key); + if (entry == mParamControllers.end()) + { + return sDefaultController[controller_key]; + } + const std::string& param_name = (*entry).second.c_str(); + return mCharacter->getVisualParamWeight(param_name.c_str()); + } + void setParamValue(LLViewerVisualParam *param, + const F32 new_value_local, + F32 behavior_maxeffect); + + F32 toLocal(const LLVector3 &world); + F32 calculateVelocity_local(); + F32 calculateAcceleration_local(F32 velocity_local); +private: + const std::string mParamDriverName; + const std::string mParamControllerName; + const LLVector3 mMotionDirectionVec; + const std::string mJointName; + + F32 mPosition_local; + F32 mVelocityJoint_local; // How fast the joint is moving + F32 mAccelerationJoint_local; // Acceleration on the joint + + F32 mVelocity_local; // How fast the param is moving + F32 mPositionLastUpdate_local; + LLVector3 mPosition_world; + + LLViewerVisualParam *mParamDriver; + const controller_map_t mParamControllers; + + LLPointer<LLJointState> mJointState; + LLCharacter *mCharacter; + + F32 mLastTime; + + static default_controller_map_t sDefaultController; +}; + +default_controller_map_t initDefaultController() +{ + default_controller_map_t controller; + controller["Mass"] = 0.2f; + controller["Gravity"] = 0.0f; + controller["Damping"] = .05f; + controller["Drag"] = 0.15f; + controller["MaxEffect"] = 0.1f; + controller["Spring"] = 0.1f; + controller["Gain"] = 10.0f; + return controller; +} + +default_controller_map_t LLPhysicsMotion::sDefaultController = initDefaultController(); + +BOOL LLPhysicsMotion::initialize() +{ + if (!mJointState->setJoint(mCharacter->getJoint(mJointName.c_str()))) + return FALSE; + mJointState->setUsage(LLJointState::ROT); + + mParamDriver = (LLViewerVisualParam*)mCharacter->getVisualParam(mParamDriverName.c_str()); + if (mParamDriver == NULL) + { + llinfos << "Failure reading in [ " << mParamDriverName << " ]" << llendl; + return FALSE; + } + + return TRUE; +} + +LLPhysicsMotionController::LLPhysicsMotionController(const LLUUID &id) : + LLMotion(id), + mCharacter(NULL) +{ + mName = "breast_motion"; +} + +LLPhysicsMotionController::~LLPhysicsMotionController() +{ + for (motion_vec_t::iterator iter = mMotions.begin(); + iter != mMotions.end(); + ++iter) + { + delete (*iter); + } +} + +BOOL LLPhysicsMotionController::onActivate() +{ + return TRUE; +} + +void LLPhysicsMotionController::onDeactivate() +{ +} + +LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter *character) +{ + mCharacter = character; + + mMotions.clear(); + + // Breast Cleavage + { + controller_map_t controller; + controller["Mass"] = "Breast_Physics_Mass"; + controller["Gravity"] = "Breast_Physics_Gravity"; + controller["Drag"] = "Breast_Physics_Drag"; + controller["Damping"] = "Breast_Physics_InOut_Damping"; + controller["MaxEffect"] = "Breast_Physics_InOut_Max_Effect"; + controller["Spring"] = "Breast_Physics_InOut_Spring"; + controller["Gain"] = "Breast_Physics_InOut_Gain"; + LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_InOut_Controller", + "mChest", + character, + LLVector3(-1,0,0), + controller); + if (!motion->initialize()) + { + llassert_always(FALSE); + return STATUS_FAILURE; + } + addMotion(motion); + } + + // Breast Bounce + { + controller_map_t controller; + controller["Mass"] = "Breast_Physics_Mass"; + controller["Gravity"] = "Breast_Physics_Gravity"; + controller["Drag"] = "Breast_Physics_Drag"; + controller["Damping"] = "Breast_Physics_UpDown_Damping"; + controller["MaxEffect"] = "Breast_Physics_UpDown_Max_Effect"; + controller["Spring"] = "Breast_Physics_UpDown_Spring"; + controller["Gain"] = "Breast_Physics_UpDown_Gain"; + LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_UpDown_Controller", + "mChest", + character, + LLVector3(0,0,1), + controller); + if (!motion->initialize()) + { + llassert_always(FALSE); + return STATUS_FAILURE; + } + addMotion(motion); + } + + // Breast Sway + { + controller_map_t controller; + controller["Mass"] = "Breast_Physics_Mass"; + controller["Gravity"] = "Breast_Physics_Gravity"; + controller["Drag"] = "Breast_Physics_Drag"; + controller["Damping"] = "Breast_Physics_LeftRight_Damping"; + controller["MaxEffect"] = "Breast_Physics_LeftRight_Max_Effect"; + controller["Spring"] = "Breast_Physics_LeftRight_Spring"; + controller["Gain"] = "Breast_Physics_LeftRight_Gain"; + LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_LeftRight_Controller", + "mChest", + character, + LLVector3(0,-1,0), + controller); + if (!motion->initialize()) + { + llassert_always(FALSE); + return STATUS_FAILURE; + } + addMotion(motion); + } + // Butt Bounce + { + controller_map_t controller; + controller["Mass"] = "Butt_Physics_Mass"; + controller["Gravity"] = "Butt_Physics_Gravity"; + controller["Drag"] = "Butt_Physics_Drag"; + controller["Damping"] = "Butt_Physics_UpDown_Damping"; + controller["MaxEffect"] = "Butt_Physics_UpDown_Max_Effect"; + controller["Spring"] = "Butt_Physics_UpDown_Spring"; + controller["Gain"] = "Butt_Physics_UpDown_Gain"; + LLPhysicsMotion *motion = new LLPhysicsMotion("Butt_Physics_UpDown_Controller", + "mPelvis", + character, + LLVector3(0,0,-1), + controller); + if (!motion->initialize()) + { + llassert_always(FALSE); + return STATUS_FAILURE; + } + addMotion(motion); + } + + // Butt LeftRight + { + controller_map_t controller; + controller["Mass"] = "Butt_Physics_Mass"; + controller["Gravity"] = "Butt_Physics_Gravity"; + controller["Drag"] = "Butt_Physics_Drag"; + controller["Damping"] = "Butt_Physics_LeftRight_Damping"; + controller["MaxEffect"] = "Butt_Physics_LeftRight_Max_Effect"; + controller["Spring"] = "Butt_Physics_LeftRight_Spring"; + controller["Gain"] = "Butt_Physics_LeftRight_Gain"; + LLPhysicsMotion *motion = new LLPhysicsMotion("Butt_Physics_LeftRight_Controller", + "mPelvis", + character, + LLVector3(0,-1,0), + controller); + if (!motion->initialize()) + { + llassert_always(FALSE); + return STATUS_FAILURE; + } + addMotion(motion); + } + + // Belly Bounce + { + controller_map_t controller; + controller["Mass"] = "Belly_Physics_Mass"; + controller["Gravity"] = "Belly_Physics_Gravity"; + controller["Drag"] = "Belly_Physics_Drag"; + controller["Damping"] = "Belly_Physics_UpDown_Damping"; + controller["MaxEffect"] = "Belly_Physics_UpDown_Max_Effect"; + controller["Spring"] = "Belly_Physics_UpDown_Spring"; + controller["Gain"] = "Belly_Physics_UpDown_Gain"; + LLPhysicsMotion *motion = new LLPhysicsMotion("Belly_Physics_UpDown_Controller", + "mPelvis", + character, + LLVector3(0,0,-1), + controller); + if (!motion->initialize()) + { + llassert_always(FALSE); + return STATUS_FAILURE; + } + addMotion(motion); + } + + return STATUS_SUCCESS; +} + +void LLPhysicsMotionController::addMotion(LLPhysicsMotion *motion) +{ + addJointState(motion->getJointState()); + mMotions.push_back(motion); +} + +F32 LLPhysicsMotionController::getMinPixelArea() +{ + return MIN_REQUIRED_PIXEL_AREA_AVATAR_PHYSICS_MOTION; +} + +// Local space means "parameter space". +F32 LLPhysicsMotion::toLocal(const LLVector3 &world) +{ + LLJoint *joint = mJointState->getJoint(); + const LLQuaternion rotation_world = joint->getWorldRotation(); + + LLVector3 dir_world = mMotionDirectionVec * rotation_world; + dir_world.normalize(); + return world * dir_world; +} + +F32 LLPhysicsMotion::calculateVelocity_local() +{ + const F32 world_to_model_scale = 100.0f; + LLJoint *joint = mJointState->getJoint(); + const LLVector3 position_world = joint->getWorldPosition(); + const LLQuaternion rotation_world = joint->getWorldRotation(); + const LLVector3 last_position_world = mPosition_world; + const LLVector3 positionchange_world = (position_world-last_position_world) * world_to_model_scale; + const LLVector3 velocity_world = positionchange_world; + const F32 velocity_local = toLocal(velocity_world); + return velocity_local; +} + +F32 LLPhysicsMotion::calculateAcceleration_local(const F32 velocity_local) +{ +// const F32 smoothing = getParamValue("Smoothing"); + static const F32 smoothing = 3.0f; // Removed smoothing param since it's probably not necessary + const F32 acceleration_local = velocity_local - mVelocityJoint_local; + + const F32 smoothed_acceleration_local = + acceleration_local * 1.0/smoothing + + mAccelerationJoint_local * (smoothing-1.0)/smoothing; + + return smoothed_acceleration_local; +} + +BOOL LLPhysicsMotionController::onUpdate(F32 time, U8* joint_mask) +{ + // Skip if disabled globally. + if (!gSavedSettings.getBOOL("AvatarPhysics")) + { + return TRUE; + } + + BOOL update_visuals = FALSE; + for (motion_vec_t::iterator iter = mMotions.begin(); + iter != mMotions.end(); + ++iter) + { + LLPhysicsMotion *motion = (*iter); + update_visuals |= motion->onUpdate(time); + } + + if (update_visuals) + mCharacter->updateVisualParams(); + + return TRUE; +} + + +// Return TRUE if character has to update visual params. +BOOL LLPhysicsMotion::onUpdate(F32 time) +{ + // static FILE *mFileWrite = fopen("c:\\temp\\avatar_data.txt","w"); + + if (!mParamDriver) + return FALSE; + + if (!mLastTime) + { + mLastTime = time; + return FALSE; + } + + //////////////////////////////////////////////////////////////////////////////// + // Get all parameters and settings + // + + const F32 time_delta = time - mLastTime; + + // Don't update too frequently, to avoid precision errors from small time slices. + if (time_delta <= .01) + { + return FALSE; + } + + // If less than 1FPS, we don't want to be spending time updating physics at all. + if (time_delta > 1.0) + { + mLastTime = time; + return FALSE; + } + + // Higher LOD is better. This controls the granularity + // and frequency of updates for the motions. + const F32 lod_factor = LLVOAvatar::sPhysicsLODFactor; + if (lod_factor == 0) + { + return TRUE; + } + + LLJoint *joint = mJointState->getJoint(); + + const F32 behavior_mass = getParamValue("Mass"); + const F32 behavior_gravity = getParamValue("Gravity"); + const F32 behavior_spring = getParamValue("Spring"); + const F32 behavior_gain = getParamValue("Gain"); + const F32 behavior_damping = getParamValue("Damping"); + const F32 behavior_drag = getParamValue("Drag"); + const BOOL physics_test = FALSE; // Enable this to simulate bouncing on all parts. + + F32 behavior_maxeffect = getParamValue("MaxEffect"); + if (physics_test) + behavior_maxeffect = 1.0f; + + // Normalize the param position to be from [0,1]. + // We have to use normalized values because there may be more than one driven param, + // and each of these driven params may have its own range. + // This means we'll do all our calculations in normalized [0,1] local coordinates. + const F32 position_user_local = (mParamDriver->getWeight() - mParamDriver->getMinWeight()) / (mParamDriver->getMaxWeight() - mParamDriver->getMinWeight()); + + // + // End parameters and settings + //////////////////////////////////////////////////////////////////////////////// + + + //////////////////////////////////////////////////////////////////////////////// + // Calculate velocity and acceleration in parameter space. + // + + //const F32 velocity_joint_local = calculateVelocity_local(time_iteration_step); + const F32 velocity_joint_local = calculateVelocity_local(); + const F32 acceleration_joint_local = calculateAcceleration_local(velocity_joint_local); + + // + // End velocity and acceleration + //////////////////////////////////////////////////////////////////////////////// + + BOOL update_visuals = FALSE; + + // Break up the physics into a bunch of iterations so that differing framerates will show + // roughly the same behavior. + for (F32 time_iteration = 0; time_iteration <= time_delta; time_iteration += TIME_ITERATION_STEP) + { + F32 time_iteration_step = TIME_ITERATION_STEP; + if (time_iteration + TIME_ITERATION_STEP > time_delta) + { + time_iteration_step = time_delta-time_iteration; + } + + // mPositon_local should be in normalized 0,1 range already. Just making sure... + const F32 position_current_local = llclamp(mPosition_local, + 0.0f, + 1.0f); + // If the effect is turned off then don't process unless we need one more update + // to set the position to the default (i.e. user) position. + if ((behavior_maxeffect == 0) && (position_current_local == position_user_local)) + { + return update_visuals; + } + + //////////////////////////////////////////////////////////////////////////////// + // Calculate the total force + // + + // Spring force is a restoring force towards the original user-set breast position. + // F = kx + const F32 spring_length = position_current_local - position_user_local; + const F32 force_spring = -spring_length * behavior_spring; + + // Acceleration is the force that comes from the change in velocity of the torso. + // F = ma + const F32 force_accel = behavior_gain * (acceleration_joint_local * behavior_mass); + + // Gravity always points downward in world space. + // F = mg + const LLVector3 gravity_world(0,0,1); + const F32 force_gravity = (toLocal(gravity_world) * behavior_gravity * behavior_mass); + + // Damping is a restoring force that opposes the current velocity. + // F = -kv + const F32 force_damping = -behavior_damping * mVelocity_local; + + // Drag is a force imparted by velocity (intuitively it is similar to wind resistance) + // F = .5kv^2 + const F32 force_drag = .5*behavior_drag*velocity_joint_local*velocity_joint_local*llsgn(velocity_joint_local); + + const F32 force_net = (force_accel + + force_gravity + + force_spring + + force_damping + + force_drag); + + // + // End total force + //////////////////////////////////////////////////////////////////////////////// + + + //////////////////////////////////////////////////////////////////////////////// + // Calculate new params + // + + // Calculate the new acceleration based on the net force. + // a = F/m + const F32 acceleration_new_local = force_net / behavior_mass; + static const F32 max_velocity = 100.0f; // magic number, used to be customizable. + F32 velocity_new_local = mVelocity_local + acceleration_new_local*time_iteration_step; + velocity_new_local = llclamp(velocity_new_local, + -max_velocity, max_velocity); + + // Temporary debugging setting to cause all avatars to move, for profiling purposes. + if (physics_test) + { + velocity_new_local = sin(time*4.0); + } + // Calculate the new parameters, or remain unchanged if max speed is 0. + F32 position_new_local = position_current_local + velocity_new_local*time_iteration_step; + if (behavior_maxeffect == 0) + position_new_local = position_user_local; + + // Zero out the velocity if the param is being pushed beyond its limits. + if ((position_new_local < 0 && velocity_new_local < 0) || + (position_new_local > 1 && velocity_new_local > 0)) + { + velocity_new_local = 0; + } + + // Check for NaN values. A NaN value is detected if the variables doesn't equal itself. + // If NaN, then reset everything. + if ((mPosition_local != mPosition_local) || + (mVelocity_local != mVelocity_local) || + (position_new_local != position_new_local)) + { + position_new_local = 0; + mVelocity_local = 0; + mVelocityJoint_local = 0; + mAccelerationJoint_local = 0; + mPosition_local = 0; + mPosition_world = LLVector3(0,0,0); + } + + const F32 position_new_local_clamped = llclamp(position_new_local, + 0.0f, + 1.0f); + + LLDriverParam *driver_param = dynamic_cast<LLDriverParam *>(mParamDriver); + llassert_always(driver_param); + if (driver_param) + { + // If this is one of our "hidden" driver params, then make sure it's + // the default value. + if ((driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) && + (driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT)) + { + mCharacter->setVisualParamWeight(driver_param, + 0, + FALSE); + } + for (LLDriverParam::entry_list_t::iterator iter = driver_param->mDriven.begin(); + iter != driver_param->mDriven.end(); + ++iter) + { + LLDrivenEntry &entry = (*iter); + LLViewerVisualParam *driven_param = entry.mParam; + setParamValue(driven_param,position_new_local_clamped, behavior_maxeffect); + } + } + + // + // End calculate new params + //////////////////////////////////////////////////////////////////////////////// + + //////////////////////////////////////////////////////////////////////////////// + // Conditionally update the visual params + // + + // Updating the visual params (i.e. what the user sees) is fairly expensive. + // So only update if the params have changed enough, and also take into account + // the graphics LOD settings. + + // For non-self, if the avatar is small enough visually, then don't update. + const F32 area_for_max_settings = 0.0; + const F32 area_for_min_settings = 1400.0; + const F32 area_for_this_setting = area_for_max_settings + (area_for_min_settings-area_for_max_settings)*(1.0-lod_factor); + const F32 pixel_area = fsqrtf(mCharacter->getPixelArea()); + + const BOOL is_self = (dynamic_cast<LLVOAvatarSelf *>(mCharacter) != NULL); + if ((pixel_area > area_for_this_setting) || is_self) + { + const F32 position_diff_local = llabs(mPositionLastUpdate_local-position_new_local_clamped); + const F32 min_delta = (1.0001f-lod_factor)*0.4f; + if (llabs(position_diff_local) > min_delta) + { + update_visuals = TRUE; + mPositionLastUpdate_local = position_new_local; + } + } + + // + // End update visual params + //////////////////////////////////////////////////////////////////////////////// + + mVelocity_local = velocity_new_local; + mAccelerationJoint_local = acceleration_joint_local; + mPosition_local = position_new_local; + } + mLastTime = time; + mPosition_world = joint->getWorldPosition(); + mVelocityJoint_local = velocity_joint_local; + + + /* + // Write out debugging info into a spreadsheet. + if (mFileWrite != NULL && is_self) + { + fprintf(mFileWrite,"%f\t%f\t%f \t\t%f \t\t%f\t%f\t%f\t \t\t%f\t%f\t%f\t%f\t%f \t\t%f\t%f\t%f\n", + position_new_local, + velocity_new_local, + acceleration_new_local, + + time_delta, + + mPosition_world[0], + mPosition_world[1], + mPosition_world[2], + + force_net, + force_spring, + force_accel, + force_damping, + force_drag, + + spring_length, + velocity_joint_local, + acceleration_joint_local + ); + } + */ + + return update_visuals; +} + +// Range of new_value_local is assumed to be [0 , 1] normalized. +void LLPhysicsMotion::setParamValue(LLViewerVisualParam *param, + F32 new_value_normalized, + F32 behavior_maxeffect) +{ + const F32 value_min_local = param->getMinWeight(); + const F32 value_max_local = param->getMaxWeight(); + const F32 min_val = 0.5f-behavior_maxeffect/2.0; + const F32 max_val = 0.5f+behavior_maxeffect/2.0; + + // Scale from [0,1] to [min_val,max_val] + const F32 new_value_rescaled = min_val + (max_val-min_val) * new_value_normalized; + + // Scale from [0,1] to [value_min_local,value_max_local] + const F32 new_value_local = value_min_local + (value_max_local-value_min_local) * new_value_rescaled; + + mCharacter->setVisualParamWeight(param, + new_value_local, + FALSE); +} -- cgit v1.2.3 From a53043e8e2535dbb82c5672259a878664f5036ce Mon Sep 17 00:00:00 2001 From: callum <none@none> Date: Fri, 22 Apr 2011 12:05:30 -0700 Subject: EXP-738 FIX Login screen background image takes too long to load Misc improvements to make the login page load properly. --- indra/newview/llmediactrl.cpp | 20 ++--- indra/newview/llpanellogin.cpp | 170 +++-------------------------------------- indra/newview/llpanellogin.h | 2 - 3 files changed, 15 insertions(+), 177 deletions(-) diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index 5007f1c17a..b3ad9efeb2 100644 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -68,7 +68,6 @@ LLMediaCtrl::Params::Params() : start_url("start_url"), border_visible("border_visible", true), ignore_ui_scale("ignore_ui_scale", true), - hide_loading("hide_loading", false), decouple_texture_size("decouple_texture_size", false), texture_width("texture_width", 1024), texture_height("texture_height", 1024), @@ -97,8 +96,6 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) : mCurrentNavUrl( "" ), mStretchToFill( true ), mMaintainAspectRatio ( true ), - mHideLoading (false), - mHidingInitialLoad (false), mDecoupleTextureSize ( false ), mTextureWidth ( 1024 ), mTextureHeight ( 1024 ), @@ -121,8 +118,6 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) : setBorderVisible(p.border_visible); - mHideLoading = p.hide_loading; - setDecoupleTextureSize(p.decouple_texture_size); setTextureSize(p.texture_width, p.texture_height); @@ -684,11 +679,6 @@ bool LLMediaCtrl::ensureMediaSourceExists() mMediaSource->clearCache(); mClearCache = false; } - - if(mHideLoading) - { - mHidingInitialLoad = true; - } } else { @@ -756,11 +746,11 @@ void LLMediaCtrl::draw() } } - if(mHidingInitialLoad) - { - // If we're hiding loading, don't draw at all. - draw_media = false; - } +// if(mHidingInitialLoad) +// { +// // If we're hiding loading, don't draw at all. +// draw_media = false; +// } bool background_visible = isBackgroundVisible(); bool background_opaque = isBackgroundOpaque(); diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 7820ac3ecd..a5385b0b1c 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -81,7 +81,6 @@ const S32 MAX_PASSWORD = 16; LLPanelLogin *LLPanelLogin::sInstance = NULL; BOOL LLPanelLogin::sCapslockDidNotification = FALSE; - class LLLoginRefreshHandler : public LLCommandHandler { public: @@ -97,58 +96,6 @@ public: } }; -LLLoginRefreshHandler gLoginRefreshHandler; - - -// helper class that trys to download a URL from a web site and calls a method -// on parent class indicating if the web server is working or not -class LLIamHereLogin : public LLHTTPClient::Responder -{ - private: - LLIamHereLogin( LLPanelLogin* parent ) : - mParent( parent ) - {} - - LLPanelLogin* mParent; - - public: - static boost::intrusive_ptr< LLIamHereLogin > build( LLPanelLogin* parent ) - { - return boost::intrusive_ptr< LLIamHereLogin >( new LLIamHereLogin( parent ) ); - }; - - virtual void setParent( LLPanelLogin* parentIn ) - { - mParent = parentIn; - }; - - // We don't actually expect LLSD back, so need to override completedRaw - virtual void completedRaw(U32 status, const std::string& reason, - const LLChannelDescriptors& channels, - const LLIOPipe::buffer_ptr_t& buffer) - { - completed(status, reason, LLSD()); // will call result() or error() - } - - virtual void result( const LLSD& content ) - { - if ( mParent ) - mParent->setSiteIsAlive( true ); - }; - - virtual void error( U32 status, const std::string& reason ) - { - if ( mParent ) - mParent->setSiteIsAlive( false ); - }; -}; - -// this is global and not a class member to keep crud out of the header file -namespace { - boost::intrusive_ptr< LLIamHereLogin > gResponsePtr = 0; -}; - - //--------------------------------------------------------------------------- // Public methods //--------------------------------------------------------------------------- @@ -160,7 +107,6 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, mLogoImage(), mCallback(callback), mCallbackData(cb_data), - mHtmlAvailable( TRUE ), mListener(new LLPanelLoginListener(this)) { setBackgroundVisible(FALSE); @@ -190,21 +136,11 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, buildFromFile( "panel_login.xml"); - // Legacy login web page is hidden under the menu bar. - // Adjust reg-in-client web browser widget to not be hidden. - if (gSavedSettings.getBOOL("RegInClient")) - { - reshape(rect.getWidth(), rect.getHeight() - MENU_BAR_HEIGHT); - } - else - { - reshape(rect.getWidth(), rect.getHeight()); - } + reshape(rect.getWidth(), rect.getHeight()); getChild<LLLineEditor>("password_edit")->setKeystrokeCallback(onPassKey, this); // change z sort of clickable text to be behind buttons - //sendChildToBack(getChildView("channel_text")); sendChildToBack(getChildView("forgot_password_text")); if(LLStartUp::getStartSLURL().getType() != LLSLURL::LOCATION) @@ -249,16 +185,10 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("login_html"); web_browser->addObserver(this); - // Clear the browser's cache to avoid any potential for the cache messing up the login screen. - web_browser->clearCache(); - reshapeBrowser(); - // kick off a request to grab the url manually - gResponsePtr = LLIamHereLogin::build( this ); - - LLHTTPClient::head( LLGridManager::getInstance()->getLoginPage(), gResponsePtr ); - + loadLoginPage(); + // Show last logged in user favorites in "Start at" combo. addUsersWithFavoritesToUsername(); getChild<LLComboBox>("username_combo")->setTextChangedCallback(boost::bind(&LLPanelLogin::addFavoritesToStartLocation, this)); @@ -334,46 +264,10 @@ void LLPanelLogin::reshapeBrowser() reshape( rect.getWidth(), rect.getHeight(), 1 ); } -void LLPanelLogin::setSiteIsAlive( bool alive ) -{ - LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("login_html"); - // if the contents of the site was retrieved - if ( alive ) - { - if ( web_browser ) - { - loadLoginPage(); - - // mark as available - mHtmlAvailable = TRUE; - } - } - else - // the site is not available (missing page, server down, other badness) - { - if ( web_browser ) - { - // hide browser control (revealing default one) - web_browser->setVisible( FALSE ); - - // mark as unavailable - mHtmlAvailable = FALSE; - } - } -} - - LLPanelLogin::~LLPanelLogin() { LLPanelLogin::sInstance = NULL; - // tell the responder we're not here anymore - if ( gResponsePtr ) - gResponsePtr->setParent( 0 ); - - //// We know we're done with the image, so be rid of it. - //gTextureList.deleteImage( mLogoImage ); - // Controls having keyboard focus by default // must reset it on destroy. (EXT-2748) gFocusMgr.setDefaultKeyboardFocus(NULL); @@ -396,22 +290,13 @@ void LLPanelLogin::draw() S32 width = getRect().getWidth(); S32 height = getRect().getHeight(); - if ( mHtmlAvailable ) - { - if (getChild<LLView>("login_widgets")->getVisible()) - { - // draw a background box in black - gl_rect_2d( 0, height - 264, width, 264, LLColor4::black ); - // draw the bottom part of the background image - // just the blue background to the native client UI - mLogoImage->draw(0, -264, width + 8, mLogoImage->getHeight()); - } - } - else + if (getChild<LLView>("login_widgets")->getVisible()) { - // the HTML login page is not available so default to the original screen - S32 offscreen_part = height / 3; - mLogoImage->draw(0, -offscreen_part, width, height+offscreen_part); + // draw a background box in black + gl_rect_2d( 0, height - 264, width, 264, LLColor4::black ); + // draw the bottom part of the background image + // just the blue background to the native client UI + mLogoImage->draw(0, -264, width + 8, mLogoImage->getHeight()); }; } glPopMatrix(); @@ -870,23 +755,10 @@ void LLPanelLogin::loadLoginPage() oStr << "&os=" << os_info; curl_free(os_info); - gViewerWindow->setMenuBackgroundColor(false, !LLGridManager::getInstance()->isInProductionGrid()); - gLoginMenuBarView->setBackgroundColor(gMenuBarView->getBackgroundColor()); LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html"); - - // navigate to the "real" page - if (gSavedSettings.getBOOL("RegInClient")) - { - web_browser->setFocus(TRUE); - login_page = sInstance->getString("reg_in_client_url"); - web_browser->navigateTo(login_page, "text/html"); - } - else - { - web_browser->navigateTo( oStr.str(), "text/html" ); - } + web_browser->navigateTo( oStr.str(), "text/html" ); } void LLPanelLogin::handleMediaEvent(LLPluginClassMedia* /*self*/, EMediaEvent event) @@ -917,10 +789,6 @@ void LLPanelLogin::onClickConnect(void *) { if (sInstance && sInstance->mCallback) { - // tell the responder we're not here anymore - if ( gResponsePtr ) - gResponsePtr->setParent( 0 ); - // JC - Make sure the fields all get committed. sInstance->setFocus(FALSE); @@ -988,24 +856,6 @@ void LLPanelLogin::onClickConnect(void *) } } -/* -// static -bool LLPanelLogin::newAccountAlertCallback(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - if (0 == option) - { - llinfos << "Going to account creation URL" << llendl; - LLWeb::loadURLExternal( LLNotifications::instance().getGlobalString("CREATE_ACCOUNT_URL")); - } - else - { - sInstance->setFocus(TRUE); - } - return false; -} -*/ - // static void LLPanelLogin::onClickNewAccount(void*) { diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h index 9cc5e3456a..11273453ba 100644 --- a/indra/newview/llpanellogin.h +++ b/indra/newview/llpanellogin.h @@ -89,7 +89,6 @@ private: void addUsersWithFavoritesToUsername(); static void onClickConnect(void*); static void onClickNewAccount(void*); -// static bool newAccountAlertCallback(const LLSD& notification, const LLSD& response); static void onClickVersion(void*); static void onClickForgotPassword(void*); static void onClickHelp(void*); @@ -114,7 +113,6 @@ private: static LLPanelLogin* sInstance; static BOOL sCapslockDidNotification; - BOOL mHtmlAvailable; }; std::string load_password_from_disk(void); -- cgit v1.2.3 From 391bef0df021dd3a56c262087ba977ab9f2bb662 Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Fri, 22 Apr 2011 16:03:31 -0400 Subject: fix DOS line endings --- indra/newview/llphysicsmotion.cpp | 1464 ++++++++++++++++++------------------- 1 file changed, 732 insertions(+), 732 deletions(-) diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 6851e7bb1a..30a04109bc 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -1,732 +1,732 @@ -/** - * @file llphysicsmotion.cpp - * @brief Implementation of LLPhysicsMotion class. - * - * $LicenseInfo:firstyear=2011&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2011, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -//----------------------------------------------------------------------------- -// Header Files -//----------------------------------------------------------------------------- -#include "llviewerprecompiledheaders.h" -#include "linden_common.h" - -#include "m3math.h" -#include "v3dmath.h" - -#include "llphysicsmotion.h" -#include "llagent.h" -#include "llcharacter.h" -#include "llviewercontrol.h" -#include "llviewervisualparam.h" -#include "llvoavatarself.h" - -typedef std::map<std::string, std::string> controller_map_t; -typedef std::map<std::string, F32> default_controller_map_t; - -#define MIN_REQUIRED_PIXEL_AREA_AVATAR_PHYSICS_MOTION 0.f -#define TIME_ITERATION_STEP 0.1f - -inline F64 llsgn(const F64 a) -{ - if (a >= 0) - return 1; - return -1; -} - -/* - At a high level, this works by setting temporary parameters that are not stored - in the avatar's list of params, and are not conveyed to other users. We accomplish - this by creating some new temporary driven params inside avatar_lad that are then driven - by the actual params that the user sees and sets. For example, in the old system, - the user sets a param called breast bouyancy, which controls the Z value of the breasts. - In our new system, the user still sets the breast bouyancy, but that param is redefined - as a driver param so that affects a new temporary driven param that the bounce is applied - to. -*/ - -class LLPhysicsMotion -{ -public: - /* - param_driver_name: The param that controls the params that are being affected by the physics. - joint_name: The joint that the body part is attached to. The joint is - used to determine the orientation (rotation) of the body part. - - character: The avatar that this physics affects. - - motion_direction_vec: The direction (in world coordinates) that determines the - motion. For example, (0,0,1) is up-down, and means that up-down motion is what - determines how this joint moves. - - controllers: The various settings (e.g. spring force, mass) that determine how - the body part behaves. - */ - LLPhysicsMotion(const std::string ¶m_driver_name, - const std::string &joint_name, - LLCharacter *character, - const LLVector3 &motion_direction_vec, - const controller_map_t &controllers) : - mParamDriverName(param_driver_name), - mJointName(joint_name), - mMotionDirectionVec(motion_direction_vec), - mParamDriver(NULL), - mParamControllers(controllers), - mCharacter(character), - mLastTime(0), - mPosition_local(0), - mVelocityJoint_local(0), - mPositionLastUpdate_local(0) - { - mJointState = new LLJointState; - } - - BOOL initialize(); - - ~LLPhysicsMotion() {} - - BOOL onUpdate(F32 time); - - LLPointer<LLJointState> getJointState() - { - return mJointState; - } -protected: - F32 getParamValue(const std::string& controller_key) - { - const controller_map_t::const_iterator& entry = mParamControllers.find(controller_key); - if (entry == mParamControllers.end()) - { - return sDefaultController[controller_key]; - } - const std::string& param_name = (*entry).second.c_str(); - return mCharacter->getVisualParamWeight(param_name.c_str()); - } - void setParamValue(LLViewerVisualParam *param, - const F32 new_value_local, - F32 behavior_maxeffect); - - F32 toLocal(const LLVector3 &world); - F32 calculateVelocity_local(); - F32 calculateAcceleration_local(F32 velocity_local); -private: - const std::string mParamDriverName; - const std::string mParamControllerName; - const LLVector3 mMotionDirectionVec; - const std::string mJointName; - - F32 mPosition_local; - F32 mVelocityJoint_local; // How fast the joint is moving - F32 mAccelerationJoint_local; // Acceleration on the joint - - F32 mVelocity_local; // How fast the param is moving - F32 mPositionLastUpdate_local; - LLVector3 mPosition_world; - - LLViewerVisualParam *mParamDriver; - const controller_map_t mParamControllers; - - LLPointer<LLJointState> mJointState; - LLCharacter *mCharacter; - - F32 mLastTime; - - static default_controller_map_t sDefaultController; -}; - -default_controller_map_t initDefaultController() -{ - default_controller_map_t controller; - controller["Mass"] = 0.2f; - controller["Gravity"] = 0.0f; - controller["Damping"] = .05f; - controller["Drag"] = 0.15f; - controller["MaxEffect"] = 0.1f; - controller["Spring"] = 0.1f; - controller["Gain"] = 10.0f; - return controller; -} - -default_controller_map_t LLPhysicsMotion::sDefaultController = initDefaultController(); - -BOOL LLPhysicsMotion::initialize() -{ - if (!mJointState->setJoint(mCharacter->getJoint(mJointName.c_str()))) - return FALSE; - mJointState->setUsage(LLJointState::ROT); - - mParamDriver = (LLViewerVisualParam*)mCharacter->getVisualParam(mParamDriverName.c_str()); - if (mParamDriver == NULL) - { - llinfos << "Failure reading in [ " << mParamDriverName << " ]" << llendl; - return FALSE; - } - - return TRUE; -} - -LLPhysicsMotionController::LLPhysicsMotionController(const LLUUID &id) : - LLMotion(id), - mCharacter(NULL) -{ - mName = "breast_motion"; -} - -LLPhysicsMotionController::~LLPhysicsMotionController() -{ - for (motion_vec_t::iterator iter = mMotions.begin(); - iter != mMotions.end(); - ++iter) - { - delete (*iter); - } -} - -BOOL LLPhysicsMotionController::onActivate() -{ - return TRUE; -} - -void LLPhysicsMotionController::onDeactivate() -{ -} - -LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter *character) -{ - mCharacter = character; - - mMotions.clear(); - - // Breast Cleavage - { - controller_map_t controller; - controller["Mass"] = "Breast_Physics_Mass"; - controller["Gravity"] = "Breast_Physics_Gravity"; - controller["Drag"] = "Breast_Physics_Drag"; - controller["Damping"] = "Breast_Physics_InOut_Damping"; - controller["MaxEffect"] = "Breast_Physics_InOut_Max_Effect"; - controller["Spring"] = "Breast_Physics_InOut_Spring"; - controller["Gain"] = "Breast_Physics_InOut_Gain"; - LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_InOut_Controller", - "mChest", - character, - LLVector3(-1,0,0), - controller); - if (!motion->initialize()) - { - llassert_always(FALSE); - return STATUS_FAILURE; - } - addMotion(motion); - } - - // Breast Bounce - { - controller_map_t controller; - controller["Mass"] = "Breast_Physics_Mass"; - controller["Gravity"] = "Breast_Physics_Gravity"; - controller["Drag"] = "Breast_Physics_Drag"; - controller["Damping"] = "Breast_Physics_UpDown_Damping"; - controller["MaxEffect"] = "Breast_Physics_UpDown_Max_Effect"; - controller["Spring"] = "Breast_Physics_UpDown_Spring"; - controller["Gain"] = "Breast_Physics_UpDown_Gain"; - LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_UpDown_Controller", - "mChest", - character, - LLVector3(0,0,1), - controller); - if (!motion->initialize()) - { - llassert_always(FALSE); - return STATUS_FAILURE; - } - addMotion(motion); - } - - // Breast Sway - { - controller_map_t controller; - controller["Mass"] = "Breast_Physics_Mass"; - controller["Gravity"] = "Breast_Physics_Gravity"; - controller["Drag"] = "Breast_Physics_Drag"; - controller["Damping"] = "Breast_Physics_LeftRight_Damping"; - controller["MaxEffect"] = "Breast_Physics_LeftRight_Max_Effect"; - controller["Spring"] = "Breast_Physics_LeftRight_Spring"; - controller["Gain"] = "Breast_Physics_LeftRight_Gain"; - LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_LeftRight_Controller", - "mChest", - character, - LLVector3(0,-1,0), - controller); - if (!motion->initialize()) - { - llassert_always(FALSE); - return STATUS_FAILURE; - } - addMotion(motion); - } - // Butt Bounce - { - controller_map_t controller; - controller["Mass"] = "Butt_Physics_Mass"; - controller["Gravity"] = "Butt_Physics_Gravity"; - controller["Drag"] = "Butt_Physics_Drag"; - controller["Damping"] = "Butt_Physics_UpDown_Damping"; - controller["MaxEffect"] = "Butt_Physics_UpDown_Max_Effect"; - controller["Spring"] = "Butt_Physics_UpDown_Spring"; - controller["Gain"] = "Butt_Physics_UpDown_Gain"; - LLPhysicsMotion *motion = new LLPhysicsMotion("Butt_Physics_UpDown_Controller", - "mPelvis", - character, - LLVector3(0,0,-1), - controller); - if (!motion->initialize()) - { - llassert_always(FALSE); - return STATUS_FAILURE; - } - addMotion(motion); - } - - // Butt LeftRight - { - controller_map_t controller; - controller["Mass"] = "Butt_Physics_Mass"; - controller["Gravity"] = "Butt_Physics_Gravity"; - controller["Drag"] = "Butt_Physics_Drag"; - controller["Damping"] = "Butt_Physics_LeftRight_Damping"; - controller["MaxEffect"] = "Butt_Physics_LeftRight_Max_Effect"; - controller["Spring"] = "Butt_Physics_LeftRight_Spring"; - controller["Gain"] = "Butt_Physics_LeftRight_Gain"; - LLPhysicsMotion *motion = new LLPhysicsMotion("Butt_Physics_LeftRight_Controller", - "mPelvis", - character, - LLVector3(0,-1,0), - controller); - if (!motion->initialize()) - { - llassert_always(FALSE); - return STATUS_FAILURE; - } - addMotion(motion); - } - - // Belly Bounce - { - controller_map_t controller; - controller["Mass"] = "Belly_Physics_Mass"; - controller["Gravity"] = "Belly_Physics_Gravity"; - controller["Drag"] = "Belly_Physics_Drag"; - controller["Damping"] = "Belly_Physics_UpDown_Damping"; - controller["MaxEffect"] = "Belly_Physics_UpDown_Max_Effect"; - controller["Spring"] = "Belly_Physics_UpDown_Spring"; - controller["Gain"] = "Belly_Physics_UpDown_Gain"; - LLPhysicsMotion *motion = new LLPhysicsMotion("Belly_Physics_UpDown_Controller", - "mPelvis", - character, - LLVector3(0,0,-1), - controller); - if (!motion->initialize()) - { - llassert_always(FALSE); - return STATUS_FAILURE; - } - addMotion(motion); - } - - return STATUS_SUCCESS; -} - -void LLPhysicsMotionController::addMotion(LLPhysicsMotion *motion) -{ - addJointState(motion->getJointState()); - mMotions.push_back(motion); -} - -F32 LLPhysicsMotionController::getMinPixelArea() -{ - return MIN_REQUIRED_PIXEL_AREA_AVATAR_PHYSICS_MOTION; -} - -// Local space means "parameter space". -F32 LLPhysicsMotion::toLocal(const LLVector3 &world) -{ - LLJoint *joint = mJointState->getJoint(); - const LLQuaternion rotation_world = joint->getWorldRotation(); - - LLVector3 dir_world = mMotionDirectionVec * rotation_world; - dir_world.normalize(); - return world * dir_world; -} - -F32 LLPhysicsMotion::calculateVelocity_local() -{ - const F32 world_to_model_scale = 100.0f; - LLJoint *joint = mJointState->getJoint(); - const LLVector3 position_world = joint->getWorldPosition(); - const LLQuaternion rotation_world = joint->getWorldRotation(); - const LLVector3 last_position_world = mPosition_world; - const LLVector3 positionchange_world = (position_world-last_position_world) * world_to_model_scale; - const LLVector3 velocity_world = positionchange_world; - const F32 velocity_local = toLocal(velocity_world); - return velocity_local; -} - -F32 LLPhysicsMotion::calculateAcceleration_local(const F32 velocity_local) -{ -// const F32 smoothing = getParamValue("Smoothing"); - static const F32 smoothing = 3.0f; // Removed smoothing param since it's probably not necessary - const F32 acceleration_local = velocity_local - mVelocityJoint_local; - - const F32 smoothed_acceleration_local = - acceleration_local * 1.0/smoothing + - mAccelerationJoint_local * (smoothing-1.0)/smoothing; - - return smoothed_acceleration_local; -} - -BOOL LLPhysicsMotionController::onUpdate(F32 time, U8* joint_mask) -{ - // Skip if disabled globally. - if (!gSavedSettings.getBOOL("AvatarPhysics")) - { - return TRUE; - } - - BOOL update_visuals = FALSE; - for (motion_vec_t::iterator iter = mMotions.begin(); - iter != mMotions.end(); - ++iter) - { - LLPhysicsMotion *motion = (*iter); - update_visuals |= motion->onUpdate(time); - } - - if (update_visuals) - mCharacter->updateVisualParams(); - - return TRUE; -} - - -// Return TRUE if character has to update visual params. -BOOL LLPhysicsMotion::onUpdate(F32 time) -{ - // static FILE *mFileWrite = fopen("c:\\temp\\avatar_data.txt","w"); - - if (!mParamDriver) - return FALSE; - - if (!mLastTime) - { - mLastTime = time; - return FALSE; - } - - //////////////////////////////////////////////////////////////////////////////// - // Get all parameters and settings - // - - const F32 time_delta = time - mLastTime; - - // Don't update too frequently, to avoid precision errors from small time slices. - if (time_delta <= .01) - { - return FALSE; - } - - // If less than 1FPS, we don't want to be spending time updating physics at all. - if (time_delta > 1.0) - { - mLastTime = time; - return FALSE; - } - - // Higher LOD is better. This controls the granularity - // and frequency of updates for the motions. - const F32 lod_factor = LLVOAvatar::sPhysicsLODFactor; - if (lod_factor == 0) - { - return TRUE; - } - - LLJoint *joint = mJointState->getJoint(); - - const F32 behavior_mass = getParamValue("Mass"); - const F32 behavior_gravity = getParamValue("Gravity"); - const F32 behavior_spring = getParamValue("Spring"); - const F32 behavior_gain = getParamValue("Gain"); - const F32 behavior_damping = getParamValue("Damping"); - const F32 behavior_drag = getParamValue("Drag"); - const BOOL physics_test = FALSE; // Enable this to simulate bouncing on all parts. - - F32 behavior_maxeffect = getParamValue("MaxEffect"); - if (physics_test) - behavior_maxeffect = 1.0f; - - // Normalize the param position to be from [0,1]. - // We have to use normalized values because there may be more than one driven param, - // and each of these driven params may have its own range. - // This means we'll do all our calculations in normalized [0,1] local coordinates. - const F32 position_user_local = (mParamDriver->getWeight() - mParamDriver->getMinWeight()) / (mParamDriver->getMaxWeight() - mParamDriver->getMinWeight()); - - // - // End parameters and settings - //////////////////////////////////////////////////////////////////////////////// - - - //////////////////////////////////////////////////////////////////////////////// - // Calculate velocity and acceleration in parameter space. - // - - //const F32 velocity_joint_local = calculateVelocity_local(time_iteration_step); - const F32 velocity_joint_local = calculateVelocity_local(); - const F32 acceleration_joint_local = calculateAcceleration_local(velocity_joint_local); - - // - // End velocity and acceleration - //////////////////////////////////////////////////////////////////////////////// - - BOOL update_visuals = FALSE; - - // Break up the physics into a bunch of iterations so that differing framerates will show - // roughly the same behavior. - for (F32 time_iteration = 0; time_iteration <= time_delta; time_iteration += TIME_ITERATION_STEP) - { - F32 time_iteration_step = TIME_ITERATION_STEP; - if (time_iteration + TIME_ITERATION_STEP > time_delta) - { - time_iteration_step = time_delta-time_iteration; - } - - // mPositon_local should be in normalized 0,1 range already. Just making sure... - const F32 position_current_local = llclamp(mPosition_local, - 0.0f, - 1.0f); - // If the effect is turned off then don't process unless we need one more update - // to set the position to the default (i.e. user) position. - if ((behavior_maxeffect == 0) && (position_current_local == position_user_local)) - { - return update_visuals; - } - - //////////////////////////////////////////////////////////////////////////////// - // Calculate the total force - // - - // Spring force is a restoring force towards the original user-set breast position. - // F = kx - const F32 spring_length = position_current_local - position_user_local; - const F32 force_spring = -spring_length * behavior_spring; - - // Acceleration is the force that comes from the change in velocity of the torso. - // F = ma - const F32 force_accel = behavior_gain * (acceleration_joint_local * behavior_mass); - - // Gravity always points downward in world space. - // F = mg - const LLVector3 gravity_world(0,0,1); - const F32 force_gravity = (toLocal(gravity_world) * behavior_gravity * behavior_mass); - - // Damping is a restoring force that opposes the current velocity. - // F = -kv - const F32 force_damping = -behavior_damping * mVelocity_local; - - // Drag is a force imparted by velocity (intuitively it is similar to wind resistance) - // F = .5kv^2 - const F32 force_drag = .5*behavior_drag*velocity_joint_local*velocity_joint_local*llsgn(velocity_joint_local); - - const F32 force_net = (force_accel + - force_gravity + - force_spring + - force_damping + - force_drag); - - // - // End total force - //////////////////////////////////////////////////////////////////////////////// - - - //////////////////////////////////////////////////////////////////////////////// - // Calculate new params - // - - // Calculate the new acceleration based on the net force. - // a = F/m - const F32 acceleration_new_local = force_net / behavior_mass; - static const F32 max_velocity = 100.0f; // magic number, used to be customizable. - F32 velocity_new_local = mVelocity_local + acceleration_new_local*time_iteration_step; - velocity_new_local = llclamp(velocity_new_local, - -max_velocity, max_velocity); - - // Temporary debugging setting to cause all avatars to move, for profiling purposes. - if (physics_test) - { - velocity_new_local = sin(time*4.0); - } - // Calculate the new parameters, or remain unchanged if max speed is 0. - F32 position_new_local = position_current_local + velocity_new_local*time_iteration_step; - if (behavior_maxeffect == 0) - position_new_local = position_user_local; - - // Zero out the velocity if the param is being pushed beyond its limits. - if ((position_new_local < 0 && velocity_new_local < 0) || - (position_new_local > 1 && velocity_new_local > 0)) - { - velocity_new_local = 0; - } - - // Check for NaN values. A NaN value is detected if the variables doesn't equal itself. - // If NaN, then reset everything. - if ((mPosition_local != mPosition_local) || - (mVelocity_local != mVelocity_local) || - (position_new_local != position_new_local)) - { - position_new_local = 0; - mVelocity_local = 0; - mVelocityJoint_local = 0; - mAccelerationJoint_local = 0; - mPosition_local = 0; - mPosition_world = LLVector3(0,0,0); - } - - const F32 position_new_local_clamped = llclamp(position_new_local, - 0.0f, - 1.0f); - - LLDriverParam *driver_param = dynamic_cast<LLDriverParam *>(mParamDriver); - llassert_always(driver_param); - if (driver_param) - { - // If this is one of our "hidden" driver params, then make sure it's - // the default value. - if ((driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) && - (driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT)) - { - mCharacter->setVisualParamWeight(driver_param, - 0, - FALSE); - } - for (LLDriverParam::entry_list_t::iterator iter = driver_param->mDriven.begin(); - iter != driver_param->mDriven.end(); - ++iter) - { - LLDrivenEntry &entry = (*iter); - LLViewerVisualParam *driven_param = entry.mParam; - setParamValue(driven_param,position_new_local_clamped, behavior_maxeffect); - } - } - - // - // End calculate new params - //////////////////////////////////////////////////////////////////////////////// - - //////////////////////////////////////////////////////////////////////////////// - // Conditionally update the visual params - // - - // Updating the visual params (i.e. what the user sees) is fairly expensive. - // So only update if the params have changed enough, and also take into account - // the graphics LOD settings. - - // For non-self, if the avatar is small enough visually, then don't update. - const F32 area_for_max_settings = 0.0; - const F32 area_for_min_settings = 1400.0; - const F32 area_for_this_setting = area_for_max_settings + (area_for_min_settings-area_for_max_settings)*(1.0-lod_factor); - const F32 pixel_area = fsqrtf(mCharacter->getPixelArea()); - - const BOOL is_self = (dynamic_cast<LLVOAvatarSelf *>(mCharacter) != NULL); - if ((pixel_area > area_for_this_setting) || is_self) - { - const F32 position_diff_local = llabs(mPositionLastUpdate_local-position_new_local_clamped); - const F32 min_delta = (1.0001f-lod_factor)*0.4f; - if (llabs(position_diff_local) > min_delta) - { - update_visuals = TRUE; - mPositionLastUpdate_local = position_new_local; - } - } - - // - // End update visual params - //////////////////////////////////////////////////////////////////////////////// - - mVelocity_local = velocity_new_local; - mAccelerationJoint_local = acceleration_joint_local; - mPosition_local = position_new_local; - } - mLastTime = time; - mPosition_world = joint->getWorldPosition(); - mVelocityJoint_local = velocity_joint_local; - - - /* - // Write out debugging info into a spreadsheet. - if (mFileWrite != NULL && is_self) - { - fprintf(mFileWrite,"%f\t%f\t%f \t\t%f \t\t%f\t%f\t%f\t \t\t%f\t%f\t%f\t%f\t%f \t\t%f\t%f\t%f\n", - position_new_local, - velocity_new_local, - acceleration_new_local, - - time_delta, - - mPosition_world[0], - mPosition_world[1], - mPosition_world[2], - - force_net, - force_spring, - force_accel, - force_damping, - force_drag, - - spring_length, - velocity_joint_local, - acceleration_joint_local - ); - } - */ - - return update_visuals; -} - -// Range of new_value_local is assumed to be [0 , 1] normalized. -void LLPhysicsMotion::setParamValue(LLViewerVisualParam *param, - F32 new_value_normalized, - F32 behavior_maxeffect) -{ - const F32 value_min_local = param->getMinWeight(); - const F32 value_max_local = param->getMaxWeight(); - const F32 min_val = 0.5f-behavior_maxeffect/2.0; - const F32 max_val = 0.5f+behavior_maxeffect/2.0; - - // Scale from [0,1] to [min_val,max_val] - const F32 new_value_rescaled = min_val + (max_val-min_val) * new_value_normalized; - - // Scale from [0,1] to [value_min_local,value_max_local] - const F32 new_value_local = value_min_local + (value_max_local-value_min_local) * new_value_rescaled; - - mCharacter->setVisualParamWeight(param, - new_value_local, - FALSE); -} +/** + * @file llphysicsmotion.cpp + * @brief Implementation of LLPhysicsMotion class. + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +//----------------------------------------------------------------------------- +// Header Files +//----------------------------------------------------------------------------- +#include "llviewerprecompiledheaders.h" +#include "linden_common.h" + +#include "m3math.h" +#include "v3dmath.h" + +#include "llphysicsmotion.h" +#include "llagent.h" +#include "llcharacter.h" +#include "llviewercontrol.h" +#include "llviewervisualparam.h" +#include "llvoavatarself.h" + +typedef std::map<std::string, std::string> controller_map_t; +typedef std::map<std::string, F32> default_controller_map_t; + +#define MIN_REQUIRED_PIXEL_AREA_AVATAR_PHYSICS_MOTION 0.f +#define TIME_ITERATION_STEP 0.1f + +inline F64 llsgn(const F64 a) +{ + if (a >= 0) + return 1; + return -1; +} + +/* + At a high level, this works by setting temporary parameters that are not stored + in the avatar's list of params, and are not conveyed to other users. We accomplish + this by creating some new temporary driven params inside avatar_lad that are then driven + by the actual params that the user sees and sets. For example, in the old system, + the user sets a param called breast bouyancy, which controls the Z value of the breasts. + In our new system, the user still sets the breast bouyancy, but that param is redefined + as a driver param so that affects a new temporary driven param that the bounce is applied + to. +*/ + +class LLPhysicsMotion +{ +public: + /* + param_driver_name: The param that controls the params that are being affected by the physics. + joint_name: The joint that the body part is attached to. The joint is + used to determine the orientation (rotation) of the body part. + + character: The avatar that this physics affects. + + motion_direction_vec: The direction (in world coordinates) that determines the + motion. For example, (0,0,1) is up-down, and means that up-down motion is what + determines how this joint moves. + + controllers: The various settings (e.g. spring force, mass) that determine how + the body part behaves. + */ + LLPhysicsMotion(const std::string ¶m_driver_name, + const std::string &joint_name, + LLCharacter *character, + const LLVector3 &motion_direction_vec, + const controller_map_t &controllers) : + mParamDriverName(param_driver_name), + mJointName(joint_name), + mMotionDirectionVec(motion_direction_vec), + mParamDriver(NULL), + mParamControllers(controllers), + mCharacter(character), + mLastTime(0), + mPosition_local(0), + mVelocityJoint_local(0), + mPositionLastUpdate_local(0) + { + mJointState = new LLJointState; + } + + BOOL initialize(); + + ~LLPhysicsMotion() {} + + BOOL onUpdate(F32 time); + + LLPointer<LLJointState> getJointState() + { + return mJointState; + } +protected: + F32 getParamValue(const std::string& controller_key) + { + const controller_map_t::const_iterator& entry = mParamControllers.find(controller_key); + if (entry == mParamControllers.end()) + { + return sDefaultController[controller_key]; + } + const std::string& param_name = (*entry).second.c_str(); + return mCharacter->getVisualParamWeight(param_name.c_str()); + } + void setParamValue(LLViewerVisualParam *param, + const F32 new_value_local, + F32 behavior_maxeffect); + + F32 toLocal(const LLVector3 &world); + F32 calculateVelocity_local(); + F32 calculateAcceleration_local(F32 velocity_local); +private: + const std::string mParamDriverName; + const std::string mParamControllerName; + const LLVector3 mMotionDirectionVec; + const std::string mJointName; + + F32 mPosition_local; + F32 mVelocityJoint_local; // How fast the joint is moving + F32 mAccelerationJoint_local; // Acceleration on the joint + + F32 mVelocity_local; // How fast the param is moving + F32 mPositionLastUpdate_local; + LLVector3 mPosition_world; + + LLViewerVisualParam *mParamDriver; + const controller_map_t mParamControllers; + + LLPointer<LLJointState> mJointState; + LLCharacter *mCharacter; + + F32 mLastTime; + + static default_controller_map_t sDefaultController; +}; + +default_controller_map_t initDefaultController() +{ + default_controller_map_t controller; + controller["Mass"] = 0.2f; + controller["Gravity"] = 0.0f; + controller["Damping"] = .05f; + controller["Drag"] = 0.15f; + controller["MaxEffect"] = 0.1f; + controller["Spring"] = 0.1f; + controller["Gain"] = 10.0f; + return controller; +} + +default_controller_map_t LLPhysicsMotion::sDefaultController = initDefaultController(); + +BOOL LLPhysicsMotion::initialize() +{ + if (!mJointState->setJoint(mCharacter->getJoint(mJointName.c_str()))) + return FALSE; + mJointState->setUsage(LLJointState::ROT); + + mParamDriver = (LLViewerVisualParam*)mCharacter->getVisualParam(mParamDriverName.c_str()); + if (mParamDriver == NULL) + { + llinfos << "Failure reading in [ " << mParamDriverName << " ]" << llendl; + return FALSE; + } + + return TRUE; +} + +LLPhysicsMotionController::LLPhysicsMotionController(const LLUUID &id) : + LLMotion(id), + mCharacter(NULL) +{ + mName = "breast_motion"; +} + +LLPhysicsMotionController::~LLPhysicsMotionController() +{ + for (motion_vec_t::iterator iter = mMotions.begin(); + iter != mMotions.end(); + ++iter) + { + delete (*iter); + } +} + +BOOL LLPhysicsMotionController::onActivate() +{ + return TRUE; +} + +void LLPhysicsMotionController::onDeactivate() +{ +} + +LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter *character) +{ + mCharacter = character; + + mMotions.clear(); + + // Breast Cleavage + { + controller_map_t controller; + controller["Mass"] = "Breast_Physics_Mass"; + controller["Gravity"] = "Breast_Physics_Gravity"; + controller["Drag"] = "Breast_Physics_Drag"; + controller["Damping"] = "Breast_Physics_InOut_Damping"; + controller["MaxEffect"] = "Breast_Physics_InOut_Max_Effect"; + controller["Spring"] = "Breast_Physics_InOut_Spring"; + controller["Gain"] = "Breast_Physics_InOut_Gain"; + LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_InOut_Controller", + "mChest", + character, + LLVector3(-1,0,0), + controller); + if (!motion->initialize()) + { + llassert_always(FALSE); + return STATUS_FAILURE; + } + addMotion(motion); + } + + // Breast Bounce + { + controller_map_t controller; + controller["Mass"] = "Breast_Physics_Mass"; + controller["Gravity"] = "Breast_Physics_Gravity"; + controller["Drag"] = "Breast_Physics_Drag"; + controller["Damping"] = "Breast_Physics_UpDown_Damping"; + controller["MaxEffect"] = "Breast_Physics_UpDown_Max_Effect"; + controller["Spring"] = "Breast_Physics_UpDown_Spring"; + controller["Gain"] = "Breast_Physics_UpDown_Gain"; + LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_UpDown_Controller", + "mChest", + character, + LLVector3(0,0,1), + controller); + if (!motion->initialize()) + { + llassert_always(FALSE); + return STATUS_FAILURE; + } + addMotion(motion); + } + + // Breast Sway + { + controller_map_t controller; + controller["Mass"] = "Breast_Physics_Mass"; + controller["Gravity"] = "Breast_Physics_Gravity"; + controller["Drag"] = "Breast_Physics_Drag"; + controller["Damping"] = "Breast_Physics_LeftRight_Damping"; + controller["MaxEffect"] = "Breast_Physics_LeftRight_Max_Effect"; + controller["Spring"] = "Breast_Physics_LeftRight_Spring"; + controller["Gain"] = "Breast_Physics_LeftRight_Gain"; + LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_LeftRight_Controller", + "mChest", + character, + LLVector3(0,-1,0), + controller); + if (!motion->initialize()) + { + llassert_always(FALSE); + return STATUS_FAILURE; + } + addMotion(motion); + } + // Butt Bounce + { + controller_map_t controller; + controller["Mass"] = "Butt_Physics_Mass"; + controller["Gravity"] = "Butt_Physics_Gravity"; + controller["Drag"] = "Butt_Physics_Drag"; + controller["Damping"] = "Butt_Physics_UpDown_Damping"; + controller["MaxEffect"] = "Butt_Physics_UpDown_Max_Effect"; + controller["Spring"] = "Butt_Physics_UpDown_Spring"; + controller["Gain"] = "Butt_Physics_UpDown_Gain"; + LLPhysicsMotion *motion = new LLPhysicsMotion("Butt_Physics_UpDown_Controller", + "mPelvis", + character, + LLVector3(0,0,-1), + controller); + if (!motion->initialize()) + { + llassert_always(FALSE); + return STATUS_FAILURE; + } + addMotion(motion); + } + + // Butt LeftRight + { + controller_map_t controller; + controller["Mass"] = "Butt_Physics_Mass"; + controller["Gravity"] = "Butt_Physics_Gravity"; + controller["Drag"] = "Butt_Physics_Drag"; + controller["Damping"] = "Butt_Physics_LeftRight_Damping"; + controller["MaxEffect"] = "Butt_Physics_LeftRight_Max_Effect"; + controller["Spring"] = "Butt_Physics_LeftRight_Spring"; + controller["Gain"] = "Butt_Physics_LeftRight_Gain"; + LLPhysicsMotion *motion = new LLPhysicsMotion("Butt_Physics_LeftRight_Controller", + "mPelvis", + character, + LLVector3(0,-1,0), + controller); + if (!motion->initialize()) + { + llassert_always(FALSE); + return STATUS_FAILURE; + } + addMotion(motion); + } + + // Belly Bounce + { + controller_map_t controller; + controller["Mass"] = "Belly_Physics_Mass"; + controller["Gravity"] = "Belly_Physics_Gravity"; + controller["Drag"] = "Belly_Physics_Drag"; + controller["Damping"] = "Belly_Physics_UpDown_Damping"; + controller["MaxEffect"] = "Belly_Physics_UpDown_Max_Effect"; + controller["Spring"] = "Belly_Physics_UpDown_Spring"; + controller["Gain"] = "Belly_Physics_UpDown_Gain"; + LLPhysicsMotion *motion = new LLPhysicsMotion("Belly_Physics_UpDown_Controller", + "mPelvis", + character, + LLVector3(0,0,-1), + controller); + if (!motion->initialize()) + { + llassert_always(FALSE); + return STATUS_FAILURE; + } + addMotion(motion); + } + + return STATUS_SUCCESS; +} + +void LLPhysicsMotionController::addMotion(LLPhysicsMotion *motion) +{ + addJointState(motion->getJointState()); + mMotions.push_back(motion); +} + +F32 LLPhysicsMotionController::getMinPixelArea() +{ + return MIN_REQUIRED_PIXEL_AREA_AVATAR_PHYSICS_MOTION; +} + +// Local space means "parameter space". +F32 LLPhysicsMotion::toLocal(const LLVector3 &world) +{ + LLJoint *joint = mJointState->getJoint(); + const LLQuaternion rotation_world = joint->getWorldRotation(); + + LLVector3 dir_world = mMotionDirectionVec * rotation_world; + dir_world.normalize(); + return world * dir_world; +} + +F32 LLPhysicsMotion::calculateVelocity_local() +{ + const F32 world_to_model_scale = 100.0f; + LLJoint *joint = mJointState->getJoint(); + const LLVector3 position_world = joint->getWorldPosition(); + const LLQuaternion rotation_world = joint->getWorldRotation(); + const LLVector3 last_position_world = mPosition_world; + const LLVector3 positionchange_world = (position_world-last_position_world) * world_to_model_scale; + const LLVector3 velocity_world = positionchange_world; + const F32 velocity_local = toLocal(velocity_world); + return velocity_local; +} + +F32 LLPhysicsMotion::calculateAcceleration_local(const F32 velocity_local) +{ +// const F32 smoothing = getParamValue("Smoothing"); + static const F32 smoothing = 3.0f; // Removed smoothing param since it's probably not necessary + const F32 acceleration_local = velocity_local - mVelocityJoint_local; + + const F32 smoothed_acceleration_local = + acceleration_local * 1.0/smoothing + + mAccelerationJoint_local * (smoothing-1.0)/smoothing; + + return smoothed_acceleration_local; +} + +BOOL LLPhysicsMotionController::onUpdate(F32 time, U8* joint_mask) +{ + // Skip if disabled globally. + if (!gSavedSettings.getBOOL("AvatarPhysics")) + { + return TRUE; + } + + BOOL update_visuals = FALSE; + for (motion_vec_t::iterator iter = mMotions.begin(); + iter != mMotions.end(); + ++iter) + { + LLPhysicsMotion *motion = (*iter); + update_visuals |= motion->onUpdate(time); + } + + if (update_visuals) + mCharacter->updateVisualParams(); + + return TRUE; +} + + +// Return TRUE if character has to update visual params. +BOOL LLPhysicsMotion::onUpdate(F32 time) +{ + // static FILE *mFileWrite = fopen("c:\\temp\\avatar_data.txt","w"); + + if (!mParamDriver) + return FALSE; + + if (!mLastTime) + { + mLastTime = time; + return FALSE; + } + + //////////////////////////////////////////////////////////////////////////////// + // Get all parameters and settings + // + + const F32 time_delta = time - mLastTime; + + // Don't update too frequently, to avoid precision errors from small time slices. + if (time_delta <= .01) + { + return FALSE; + } + + // If less than 1FPS, we don't want to be spending time updating physics at all. + if (time_delta > 1.0) + { + mLastTime = time; + return FALSE; + } + + // Higher LOD is better. This controls the granularity + // and frequency of updates for the motions. + const F32 lod_factor = LLVOAvatar::sPhysicsLODFactor; + if (lod_factor == 0) + { + return TRUE; + } + + LLJoint *joint = mJointState->getJoint(); + + const F32 behavior_mass = getParamValue("Mass"); + const F32 behavior_gravity = getParamValue("Gravity"); + const F32 behavior_spring = getParamValue("Spring"); + const F32 behavior_gain = getParamValue("Gain"); + const F32 behavior_damping = getParamValue("Damping"); + const F32 behavior_drag = getParamValue("Drag"); + const BOOL physics_test = FALSE; // Enable this to simulate bouncing on all parts. + + F32 behavior_maxeffect = getParamValue("MaxEffect"); + if (physics_test) + behavior_maxeffect = 1.0f; + + // Normalize the param position to be from [0,1]. + // We have to use normalized values because there may be more than one driven param, + // and each of these driven params may have its own range. + // This means we'll do all our calculations in normalized [0,1] local coordinates. + const F32 position_user_local = (mParamDriver->getWeight() - mParamDriver->getMinWeight()) / (mParamDriver->getMaxWeight() - mParamDriver->getMinWeight()); + + // + // End parameters and settings + //////////////////////////////////////////////////////////////////////////////// + + + //////////////////////////////////////////////////////////////////////////////// + // Calculate velocity and acceleration in parameter space. + // + + //const F32 velocity_joint_local = calculateVelocity_local(time_iteration_step); + const F32 velocity_joint_local = calculateVelocity_local(); + const F32 acceleration_joint_local = calculateAcceleration_local(velocity_joint_local); + + // + // End velocity and acceleration + //////////////////////////////////////////////////////////////////////////////// + + BOOL update_visuals = FALSE; + + // Break up the physics into a bunch of iterations so that differing framerates will show + // roughly the same behavior. + for (F32 time_iteration = 0; time_iteration <= time_delta; time_iteration += TIME_ITERATION_STEP) + { + F32 time_iteration_step = TIME_ITERATION_STEP; + if (time_iteration + TIME_ITERATION_STEP > time_delta) + { + time_iteration_step = time_delta-time_iteration; + } + + // mPositon_local should be in normalized 0,1 range already. Just making sure... + const F32 position_current_local = llclamp(mPosition_local, + 0.0f, + 1.0f); + // If the effect is turned off then don't process unless we need one more update + // to set the position to the default (i.e. user) position. + if ((behavior_maxeffect == 0) && (position_current_local == position_user_local)) + { + return update_visuals; + } + + //////////////////////////////////////////////////////////////////////////////// + // Calculate the total force + // + + // Spring force is a restoring force towards the original user-set breast position. + // F = kx + const F32 spring_length = position_current_local - position_user_local; + const F32 force_spring = -spring_length * behavior_spring; + + // Acceleration is the force that comes from the change in velocity of the torso. + // F = ma + const F32 force_accel = behavior_gain * (acceleration_joint_local * behavior_mass); + + // Gravity always points downward in world space. + // F = mg + const LLVector3 gravity_world(0,0,1); + const F32 force_gravity = (toLocal(gravity_world) * behavior_gravity * behavior_mass); + + // Damping is a restoring force that opposes the current velocity. + // F = -kv + const F32 force_damping = -behavior_damping * mVelocity_local; + + // Drag is a force imparted by velocity (intuitively it is similar to wind resistance) + // F = .5kv^2 + const F32 force_drag = .5*behavior_drag*velocity_joint_local*velocity_joint_local*llsgn(velocity_joint_local); + + const F32 force_net = (force_accel + + force_gravity + + force_spring + + force_damping + + force_drag); + + // + // End total force + //////////////////////////////////////////////////////////////////////////////// + + + //////////////////////////////////////////////////////////////////////////////// + // Calculate new params + // + + // Calculate the new acceleration based on the net force. + // a = F/m + const F32 acceleration_new_local = force_net / behavior_mass; + static const F32 max_velocity = 100.0f; // magic number, used to be customizable. + F32 velocity_new_local = mVelocity_local + acceleration_new_local*time_iteration_step; + velocity_new_local = llclamp(velocity_new_local, + -max_velocity, max_velocity); + + // Temporary debugging setting to cause all avatars to move, for profiling purposes. + if (physics_test) + { + velocity_new_local = sin(time*4.0); + } + // Calculate the new parameters, or remain unchanged if max speed is 0. + F32 position_new_local = position_current_local + velocity_new_local*time_iteration_step; + if (behavior_maxeffect == 0) + position_new_local = position_user_local; + + // Zero out the velocity if the param is being pushed beyond its limits. + if ((position_new_local < 0 && velocity_new_local < 0) || + (position_new_local > 1 && velocity_new_local > 0)) + { + velocity_new_local = 0; + } + + // Check for NaN values. A NaN value is detected if the variables doesn't equal itself. + // If NaN, then reset everything. + if ((mPosition_local != mPosition_local) || + (mVelocity_local != mVelocity_local) || + (position_new_local != position_new_local)) + { + position_new_local = 0; + mVelocity_local = 0; + mVelocityJoint_local = 0; + mAccelerationJoint_local = 0; + mPosition_local = 0; + mPosition_world = LLVector3(0,0,0); + } + + const F32 position_new_local_clamped = llclamp(position_new_local, + 0.0f, + 1.0f); + + LLDriverParam *driver_param = dynamic_cast<LLDriverParam *>(mParamDriver); + llassert_always(driver_param); + if (driver_param) + { + // If this is one of our "hidden" driver params, then make sure it's + // the default value. + if ((driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) && + (driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT)) + { + mCharacter->setVisualParamWeight(driver_param, + 0, + FALSE); + } + for (LLDriverParam::entry_list_t::iterator iter = driver_param->mDriven.begin(); + iter != driver_param->mDriven.end(); + ++iter) + { + LLDrivenEntry &entry = (*iter); + LLViewerVisualParam *driven_param = entry.mParam; + setParamValue(driven_param,position_new_local_clamped, behavior_maxeffect); + } + } + + // + // End calculate new params + //////////////////////////////////////////////////////////////////////////////// + + //////////////////////////////////////////////////////////////////////////////// + // Conditionally update the visual params + // + + // Updating the visual params (i.e. what the user sees) is fairly expensive. + // So only update if the params have changed enough, and also take into account + // the graphics LOD settings. + + // For non-self, if the avatar is small enough visually, then don't update. + const F32 area_for_max_settings = 0.0; + const F32 area_for_min_settings = 1400.0; + const F32 area_for_this_setting = area_for_max_settings + (area_for_min_settings-area_for_max_settings)*(1.0-lod_factor); + const F32 pixel_area = fsqrtf(mCharacter->getPixelArea()); + + const BOOL is_self = (dynamic_cast<LLVOAvatarSelf *>(mCharacter) != NULL); + if ((pixel_area > area_for_this_setting) || is_self) + { + const F32 position_diff_local = llabs(mPositionLastUpdate_local-position_new_local_clamped); + const F32 min_delta = (1.0001f-lod_factor)*0.4f; + if (llabs(position_diff_local) > min_delta) + { + update_visuals = TRUE; + mPositionLastUpdate_local = position_new_local; + } + } + + // + // End update visual params + //////////////////////////////////////////////////////////////////////////////// + + mVelocity_local = velocity_new_local; + mAccelerationJoint_local = acceleration_joint_local; + mPosition_local = position_new_local; + } + mLastTime = time; + mPosition_world = joint->getWorldPosition(); + mVelocityJoint_local = velocity_joint_local; + + + /* + // Write out debugging info into a spreadsheet. + if (mFileWrite != NULL && is_self) + { + fprintf(mFileWrite,"%f\t%f\t%f \t\t%f \t\t%f\t%f\t%f\t \t\t%f\t%f\t%f\t%f\t%f \t\t%f\t%f\t%f\n", + position_new_local, + velocity_new_local, + acceleration_new_local, + + time_delta, + + mPosition_world[0], + mPosition_world[1], + mPosition_world[2], + + force_net, + force_spring, + force_accel, + force_damping, + force_drag, + + spring_length, + velocity_joint_local, + acceleration_joint_local + ); + } + */ + + return update_visuals; +} + +// Range of new_value_local is assumed to be [0 , 1] normalized. +void LLPhysicsMotion::setParamValue(LLViewerVisualParam *param, + F32 new_value_normalized, + F32 behavior_maxeffect) +{ + const F32 value_min_local = param->getMinWeight(); + const F32 value_max_local = param->getMaxWeight(); + const F32 min_val = 0.5f-behavior_maxeffect/2.0; + const F32 max_val = 0.5f+behavior_maxeffect/2.0; + + // Scale from [0,1] to [min_val,max_val] + const F32 new_value_rescaled = min_val + (max_val-min_val) * new_value_normalized; + + // Scale from [0,1] to [value_min_local,value_max_local] + const F32 new_value_local = value_min_local + (value_max_local-value_min_local) * new_value_rescaled; + + mCharacter->setVisualParamWeight(param, + new_value_local, + FALSE); +} -- cgit v1.2.3 From 368173b7d602aa1d790a4510c4bf9e6d9e102d1d Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Fri, 22 Apr 2011 18:52:22 -0700 Subject: EXP-749 [REGRESSION] Voice status indicator shown in IM session instead of profile pic in Basic and Advanced modes --- indra/newview/llchiclet.cpp | 3 ++- indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index 885d553524..277fc9d7b9 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -483,8 +483,9 @@ void LLIMChiclet::setShowSpeaker(bool show) if(needs_resize) { mShowSpeaker = show; - toggleSpeakerControl(); } + + toggleSpeakerControl(); } void LLIMChiclet::enableCounterControl(bool enable) diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml index 99807d4717..d27c14f4e7 100644 --- a/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml +++ b/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml @@ -21,6 +21,7 @@ width="20" /> <chiclet_im_p2p.avatar_icon bottom="3" + color="white" follows="left|top|bottom" height="20" left="2" -- cgit v1.2.3 From 95f41fbd9beda8089531bee5827a1eeba076ba6f Mon Sep 17 00:00:00 2001 From: Boroondas Gupte <hg@boroon.dasgupta.ch> Date: Mon, 25 Apr 2011 13:46:31 +0200 Subject: STORM-1182 FIX Fixed XUI Preview tool not loading XML files from a dev checkout on Mac. Ported Vadim's STORM-1182 fix for Linux (3d30b2bc1369) to the corresponding Mac file. --- doc/contributions.txt | 1 + indra/llvfs/lldir_mac.cpp | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/doc/contributions.txt b/doc/contributions.txt index e7db8c0ded..3b579f8ae3 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -204,6 +204,7 @@ Boroondas Gupte SNOW-624 SNOW-737 STORM-318 + STORM-1182 VWR-233 VWR-20583 VWR-20891 diff --git a/indra/llvfs/lldir_mac.cpp b/indra/llvfs/lldir_mac.cpp index 445285aa43..e862ef0d84 100644 --- a/indra/llvfs/lldir_mac.cpp +++ b/indra/llvfs/lldir_mac.cpp @@ -150,11 +150,11 @@ LLDir_Mac::LLDir_Mac() CFURLRef resourcesURLRef = CFBundleCopyResourcesDirectoryURL(mainBundleRef); CFURLRefToLLString(resourcesURLRef, mAppRODataDir, true); - U32 indra_pos = mExecutableDir.find("/indra"); - if (indra_pos != std::string::npos) + U32 build_dir_pos = mExecutableDir.find("/build-darwin-"); + if (build_dir_pos != std::string::npos) { // ...we're in a dev checkout - mSkinBaseDir = mExecutableDir.substr(0, indra_pos) + mSkinBaseDir = mExecutableDir.substr(0, build_dir_pos) + "/indra/newview/skins"; llinfos << "Running in dev checkout with mSkinBaseDir " << mSkinBaseDir << llendl; -- cgit v1.2.3 From 3f44e78fbe5b27858d63111ab556e961c6f5c703 Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Mon, 25 Apr 2011 09:27:39 -0400 Subject: Added tag 2.6.6-start for changeset 800cefce8d36 --- .hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/.hgtags b/.hgtags index ec1576c43c..59bb25c228 100644 --- a/.hgtags +++ b/.hgtags @@ -106,3 +106,4 @@ d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc 2.6.3-beta1 74cd32a06837b0c2cb793b2e8d4d82f5d49462b2 2.6.4-start 74cd32a06837b0c2cb793b2e8d4d82f5d49462b2 2.6.4-start f632f87bb71b0f13d21f2f64b0c42cedb008c749 2.6.4-start +800cefce8d364ffdd2f383cbecb91294da3ea424 2.6.6-start -- cgit v1.2.3 From b87cb90a55ed74d51587eec581fb57e29f510c41 Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Mon, 25 Apr 2011 09:28:36 -0400 Subject: increment viewer version to 2.6.7 --- indra/llcommon/llversionviewer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h index df5afcbf1c..58f96df8ab 100644 --- a/indra/llcommon/llversionviewer.h +++ b/indra/llcommon/llversionviewer.h @@ -29,7 +29,7 @@ const S32 LL_VERSION_MAJOR = 2; const S32 LL_VERSION_MINOR = 6; -const S32 LL_VERSION_PATCH = 6; +const S32 LL_VERSION_PATCH = 7; const S32 LL_VERSION_BUILD = 0; const char * const LL_CHANNEL = "Second Life Developer"; -- cgit v1.2.3 From ddf0d70a086cc4b8d534e760e18fba8acb143d1d Mon Sep 17 00:00:00 2001 From: "Debi King (Dessie)" <dessie@lindenlab.com> Date: Mon, 25 Apr 2011 11:56:17 -0400 Subject: Added tag DRTVWR-50_2.6.5-beta1, 2.6.5-beta1 for changeset 7db558aaa7c1 --- .hgtags | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.hgtags b/.hgtags index ec1576c43c..74e1eb4e68 100644 --- a/.hgtags +++ b/.hgtags @@ -106,3 +106,5 @@ d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc 2.6.3-beta1 74cd32a06837b0c2cb793b2e8d4d82f5d49462b2 2.6.4-start 74cd32a06837b0c2cb793b2e8d4d82f5d49462b2 2.6.4-start f632f87bb71b0f13d21f2f64b0c42cedb008c749 2.6.4-start +7db558aaa7c176f2022b3e9cfe38ac72f6d1fccd DRTVWR-50_2.6.5-beta1 +7db558aaa7c176f2022b3e9cfe38ac72f6d1fccd 2.6.5-beta1 -- cgit v1.2.3 From d8309a29efb7e3ce66d2ee5778418f3f9c1dd6ac Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Mon, 25 Apr 2011 13:35:17 -0500 Subject: SH-1371 Fix for tcmalloc package error. --- indra/newview/viewer_manifest.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index cb7c04cd15..5ac9ec8ccc 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -977,8 +977,8 @@ class Linux_i686Manifest(LinuxManifest): self.path("libopenal.so", "libopenal.so.1") self.path("libopenal.so", "libvivoxoal.so.1") # vivox's sdk expects this soname self.path("libfontconfig.so.1.4.4") - self.path("libtcmalloc_minimal.so", "libtcmalloc_minimal.so") #formerly called google perf tools - self.path("libtcmalloc_minimal.so.0", "libtcmalloc_minimal.so.0") #formerly called google perf tools + self.path("libtcmalloc.so", "libtcmalloc.so") #formerly called google perf tools + self.path("libtcmalloc.so.0", "libtcmalloc.so.0") #formerly called google perf tools try: self.path("libfmod-3.75.so") pass -- cgit v1.2.3 From 2417cb3021123d7305b1c4fe4bdf16fddaecb494 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed <nat@lindenlab.com> Date: Mon, 25 Apr 2011 17:13:51 -0400 Subject: Update with CG's build.sh patch to upload summary.json. Patch taken from here: https://paste.lindenlab.com/show/6902/ --- build.sh | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/build.sh b/build.sh index 6677958716..d112e5ea1c 100755 --- a/build.sh +++ b/build.sh @@ -118,11 +118,12 @@ eval '$build_'"$arch" || pass # File no longer exists in code-sep branch, so let's make sure it exists in order to use it. if test -f scripts/update_version_files.py ; then begin_section UpdateVer - python scripts/update_version_files.py \ - --channel="$viewer_channel" \ - --server_channel="$server_channel" \ - --revision=$revision \ - --verbose \ + eval $(python scripts/update_version_files.py \ + --channel="$viewer_channel" \ + --server_channel="$server_channel" \ + --revision=$revision \ + --verbose \ + | sed -n -e "s,Setting viewer channel/version: '\([^']*\)' / '\([^']*\)',VIEWER_CHANNEL='\1';VIEWER_VERSION='\2',p")\ || fail update_version_files.py end_section UpdateVer fi @@ -262,6 +263,9 @@ then upload_item installer "$package" binary/octet-stream upload_item quicklink "$package" binary/octet-stream + echo "{\"Type\":\"viewer\",\"Version\":\"${VIEWER_VERSION}\"}" > summary.json + upload_item installer summary.json text/plain + # Upload crash reporter files. case "$last_built_variant" in Release) -- cgit v1.2.3 From 26f2762b89705a69e831016ea67af9500907721d Mon Sep 17 00:00:00 2001 From: Ricky Curtice <kf6kjg+hg@gmail.com> Date: Mon, 25 Apr 2011 16:24:16 -0700 Subject: Removed an extra variable I'd added. Also cleaned up some whitespace-around-operator issues. While removing the extra variable seems to make the code more ugly, all it does is reveal the pre-existing ugliness that had been masked in the past. Trying to find a fix, or even try to come to a real understanding of why this section of code is the way it is, is out of my scope for this task. --- indra/newview/llselectmgr.cpp | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 2c5073d027..96468c0b21 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -6585,16 +6585,12 @@ bool LLSelectMgr::selectionMove(const LLVector3& displ, } } - // get the non-squared edition for use below - // note the use of fsqrtf, this was used in the definition of dist_vec() and is therefore re-used here - F32 min_dist = fsqrtf(min_dist_squared); - // factor the distance into the displacement vector. This will get us // equally visible movements for both close and far away selections. - F32 min_dist_factored = sqrt(min_dist) / 2; // FIXME: this variable name doesn't state its true meaning. - displ_global.setVec(displ.mV[0]*min_dist_factored, - displ.mV[1]*min_dist_factored, - displ.mV[2]*min_dist_factored); + F32 min_dist = sqrt(fsqrtf(min_dist_squared)) / 2; + displ_global.setVec(displ.mV[0] * min_dist, + displ.mV[1] * min_dist, + displ.mV[2] * min_dist); // equates to: Displ_global = Displ * M_cam_axes_in_global_frame displ_global = LLViewerCamera::getInstance()->rotateToAbsolute(displ_global); -- cgit v1.2.3 From 36f8899861b4f6ad75485cc26e7493689aa53acc Mon Sep 17 00:00:00 2001 From: Leslie Linden <leslie@lindenlab.com> Date: Mon, 25 Apr 2011 17:31:04 -0700 Subject: EXP-637 FIX -- As a new user, I would like Second Life to start up with a maximized window to fully immerse myself in the experience Mac viewer now properly supports the calls to maximize and unmaximize the screen. Reviewed by Callum --- indra/llwindow/llwindowmacosx.cpp | 101 +++++++++++++++++++++++++------------- indra/llwindow/llwindowmacosx.h | 3 +- 2 files changed, 69 insertions(+), 35 deletions(-) diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp index affd7276cc..447e3661db 100644 --- a/indra/llwindow/llwindowmacosx.cpp +++ b/indra/llwindow/llwindowmacosx.cpp @@ -108,9 +108,6 @@ static long getDictLong (CFDictionaryRef refDict, CFStringRef key); static EventTypeSpec WindowHandlerEventList[] = { // Window-related events - // { kEventClassWindow, kEventWindowCollapsing }, - // { kEventClassWindow, kEventWindowCollapsed }, - // { kEventClassWindow, kEventWindowShown }, { kEventClassWindow, kEventWindowActivated }, { kEventClassWindow, kEventWindowDeactivated }, { kEventClassWindow, kEventWindowShown }, @@ -121,8 +118,7 @@ static EventTypeSpec WindowHandlerEventList[] = { kEventClassWindow, kEventWindowClose }, { kEventClassWindow, kEventWindowBoundsChanging }, { kEventClassWindow, kEventWindowBoundsChanged }, - // { kEventClassWindow, kEventWindowZoomed }, - // { kEventClassWindow, kEventWindowDrawContent }, + { kEventClassWindow, kEventWindowGetIdealSize }, // Mouse events { kEventClassMouse, kEventMouseDown }, @@ -248,6 +244,7 @@ LLWindowMacOSX::LLWindowMacOSX(LLWindowCallbacks* callbacks, mCursorIgnoreNextDelta = FALSE; mNeedsResize = FALSE; mOverrideAspectRatio = 0.f; + mMaximized = FALSE; mMinimized = FALSE; mTSMDocument = NULL; // Just in case. mLanguageTextInputAllowed = FALSE; @@ -455,24 +452,23 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits if(!mFullscreen && (mWindow == NULL)) { - Rect window_rect; //int displayWidth = CGDisplayPixelsWide(mDisplay); //int displayHeight = CGDisplayPixelsHigh(mDisplay); //const int menuBarPlusTitleBar = 44; // Ugly magic number. LL_DEBUGS("Window") << "createContext: creating window" << LL_ENDL; - window_rect.left = (long) x; - window_rect.right = (long) x + width; - window_rect.top = (long) y; - window_rect.bottom = (long) y + height; + mPreviousWindowRect.left = (long) x; + mPreviousWindowRect.right = (long) x + width; + mPreviousWindowRect.top = (long) y; + mPreviousWindowRect.bottom = (long) y + height; //----------------------------------------------------------------------- // Create the window //----------------------------------------------------------------------- mWindow = NewCWindow( NULL, - &window_rect, + &mPreviousWindowRect, mWindowTitle, false, // Create the window invisible. Whoever calls createContext() should show it after any moving/resizing. // noGrowDocProc, // Window with no grow box and no zoom box @@ -481,8 +477,7 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits kFirstWindowOfClass, true, (long)this); - - + if (!mWindow) { setupFailure("Window creation error", "Error", OSMB_OK); @@ -1093,31 +1088,22 @@ BOOL LLWindowMacOSX::getVisible() BOOL LLWindowMacOSX::getMinimized() { - BOOL result = FALSE; - - // Since the set of states where we want to act "minimized" is non-trivial, it's easier to - // track things locally than to try and retrieve the state from the window manager. - result = mMinimized; - - return(result); + return mMinimized; } BOOL LLWindowMacOSX::getMaximized() { - BOOL result = FALSE; - - if (mWindow) - { - // TODO - } - - return(result); + return mMaximized; } BOOL LLWindowMacOSX::maximize() { - // TODO - return FALSE; + if (mWindow && !mMaximized) + { + ZoomWindow(mWindow, inContent, true); + } + + return mMaximized; } BOOL LLWindowMacOSX::getFullscreen() @@ -2559,7 +2545,24 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e GetEventParameter(event, kEventParamCurrentBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, ¤tBounds); GetEventParameter(event, kEventParamPreviousBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, &previousBounds); - + + // Put an offset into window un-maximize operation since the kEventWindowGetIdealSize + // event only allows the specification of size and not position. + if (mMaximized) + { + short leftOffset = mPreviousWindowRect.left - currentBounds.left; + currentBounds.left += leftOffset; + currentBounds.right += leftOffset; + + short topOffset = mPreviousWindowRect.top - currentBounds.top; + currentBounds.top += topOffset; + currentBounds.bottom += topOffset; + } + else + { + // Store off the size for future un-maximize operations + mPreviousWindowRect = previousBounds; + } if ((currentBounds.right - currentBounds.left) < MIN_WIDTH) { @@ -2578,13 +2581,43 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e case kEventWindowBoundsChanged: { + // Get new window bounds Rect newBounds; - GetEventParameter(event, kEventParamCurrentBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, &newBounds); + + // Get previous window bounds + Rect oldBounds; + GetEventParameter(event, kEventParamPreviousBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, &oldBounds); + + // Determine if the new size is larger than the old + bool newBoundsLarger = ((newBounds.right - newBounds.left) >= (oldBounds.right - oldBounds.left)); + newBoundsLarger &= ((newBounds.bottom - newBounds.top) >= (oldBounds.bottom - oldBounds.top)); + + // Check to see if this is a zoom event (+ button on window pane) + unsigned int eventParams; + GetEventParameter(event, kEventParamAttributes, typeUInt32, NULL, sizeof(int), NULL, &eventParams); + bool isZoomEvent = ((eventParams & kWindowBoundsChangeZoom) != 0); + + // Maximized flag is if zoom event and increasing window size + mMaximized = (isZoomEvent && newBoundsLarger); + aglUpdateContext(mContext); + mCallbacks->handleResize(this, newBounds.right - newBounds.left, newBounds.bottom - newBounds.top); - - + } + break; + + case kEventWindowGetIdealSize: + // Only recommend a new ideal size when un-maximizing + if (mMaximized == TRUE) + { + Point nonMaximizedSize; + + nonMaximizedSize.v = mPreviousWindowRect.bottom - mPreviousWindowRect.top; + nonMaximizedSize.h = mPreviousWindowRect.right - mPreviousWindowRect.left; + + SetEventParameter(event, kEventParamDimensions, typeQDPoint, sizeof(Point), &nonMaximizedSize); + result = noErr; } break; diff --git a/indra/llwindow/llwindowmacosx.h b/indra/llwindow/llwindowmacosx.h index 6dc093b4be..6c9e075a21 100644 --- a/indra/llwindow/llwindowmacosx.h +++ b/indra/llwindow/llwindowmacosx.h @@ -156,7 +156,6 @@ protected: static pascal Boolean staticMoveEventComparator( EventRef event, void* data); OSStatus eventHandler (EventHandlerCallRef myHandler, EventRef event); void adjustCursorDecouple(bool warpingMouse = false); - void fixWindowSize(void); void stopDockTileBounce(); static MASK modifiersToMask(SInt16 modifiers); @@ -182,6 +181,7 @@ protected: EventComparatorUPP mMoveEventCampartorUPP; Rect mOldMouseClip; // Screen rect to which the mouse cursor was globally constrained before we changed it in clipMouse() + Rect mPreviousWindowRect; // Save previous window for un-maximize event Str255 mWindowTitle; double mOriginalAspectRatio; BOOL mSimulatedRightClick; @@ -195,6 +195,7 @@ protected: BOOL mNeedsResize; // Constructor figured out the window is too big, it needs a resize. LLCoordScreen mNeedsResizeSize; F32 mOverrideAspectRatio; + BOOL mMaximized; BOOL mMinimized; U32 mFSAASamples; BOOL mForceRebuild; -- cgit v1.2.3 From 5e4c0cd857de2ede02dfc0f72feb75648d823600 Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Mon, 25 Apr 2011 20:22:54 -0500 Subject: SH-1427 Fix for alpha objects not getting the right light curves when deferred rendering enabled. --- .../shaders/class1/deferred/alphaF.glsl | 7 ++- .../shaders/class1/deferred/alphaV.glsl | 55 ++++++++++++++++------ .../shaders/class2/deferred/alphaF.glsl | 8 +++- .../shaders/class2/deferred/alphaV.glsl | 51 +++++++++++++++----- indra/newview/pipeline.cpp | 14 ++++-- 5 files changed, 104 insertions(+), 31 deletions(-) diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl index 28a38d4390..3b12a07a27 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl @@ -23,6 +23,7 @@ varying vec3 vary_ambient; varying vec3 vary_directional; varying vec3 vary_fragcoord; varying vec3 vary_position; +varying vec3 vary_pointlight_col; uniform mat4 inv_proj; @@ -46,13 +47,17 @@ void main() vec4 pos = vec4(vary_position, 1.0); + vec4 diff= texture2D(diffuseMap, gl_TexCoord[0].xy); + vec4 col = vec4(vary_ambient + vary_directional.rgb, gl_Color.a); - vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy) * col; + vec4 color = diff * col; color.rgb = atmosLighting(color.rgb); color.rgb = scaleSoftClip(color.rgb); + color.rgb += diff.rgb * vary_pointlight_col.rgb; + gl_FragColor = color; //gl_FragColor = vec4(1,0,1,1); //gl_FragColor = vec4(1,0,1,1)*shadow; diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl index 7ac410da95..525b68c437 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl @@ -11,7 +11,6 @@ vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol); void calcAtmospherics(vec3 inPositionEye); float calcDirectionalLight(vec3 n, vec3 l); -float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float is_pointlight); vec3 atmosAmbient(vec3 light); vec3 atmosAffectDirectionalLight(float lightIntensity); @@ -23,11 +22,37 @@ varying vec3 vary_directional; varying vec3 vary_fragcoord; varying vec3 vary_position; varying vec3 vary_light; +varying vec3 vary_pointlight_col; uniform float near_clip; uniform float shadow_offset; uniform float shadow_bias; +float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight) +{ + //get light vector + vec3 lv = lp.xyz-v; + + //get distance + float d = length(lv); + + //normalize light vector + lv *= 1.0/d; + + //distance attenuation + float dist2 = d*d/(la*la); + float da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0); + + // spotlight coefficient. + float spot = max(dot(-ln, lv), is_pointlight); + da *= spot*spot; // GL_SPOT_EXPONENT=2 + + //angular attenuation + da *= calcDirectionalLight(n, lv); + + return da; +} + void main() { //transform vertex @@ -38,33 +63,35 @@ void main() vec4 pos = (gl_ModelViewMatrix * gl_Vertex); vec3 norm = normalize(gl_NormalMatrix * gl_Normal); - vary_position = pos.xyz; + float dp_directional_light = max(0.0, dot(norm, gl_LightSource[0].position.xyz)); + vary_position = pos.xyz + gl_LightSource[0].position.xyz * (1.0-dp_directional_light)*shadow_offset; calcAtmospherics(pos.xyz); //vec4 color = calcLighting(pos.xyz, norm, gl_Color, vec4(0.)); - vec4 col = vec4(0.0, 0.0, 0.0, gl_Color.a); - // Collect normal lights (need to be divided by two, as we later multiply by 2) - col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].specular.a); - col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].specular.a); - col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].specular.a); - col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].specular.a); - col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].specular.a); - col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].specular.a); - col.rgb += gl_LightSource[1].diffuse.rgb*calcDirectionalLight(norm, gl_LightSource[1].position.xyz); - col.rgb = scaleDownLight(col.rgb); + // Collect normal lights + col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].quadraticAttenuation, gl_LightSource[2].specular.a); + col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].quadraticAttenuation ,gl_LightSource[3].specular.a); + col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].quadraticAttenuation, gl_LightSource[4].specular.a); + col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].quadraticAttenuation, gl_LightSource[5].specular.a); + col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].quadraticAttenuation, gl_LightSource[6].specular.a); + col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].quadraticAttenuation, gl_LightSource[7].specular.a); + vary_pointlight_col = col.rgb*gl_Color.rgb; + + col.rgb = vec3(0,0,0); + // Add windlight lights - col.rgb += atmosAmbient(vec3(0.)); + col.rgb = atmosAmbient(vec3(0.)); vary_light = gl_LightSource[0].position.xyz; vary_ambient = col.rgb*gl_Color.rgb; vary_directional.rgb = gl_Color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, gl_LightSource[0].position.xyz), (1.0-gl_Color.a)*(1.0-gl_Color.a))); - col.rgb = min(col.rgb*gl_Color.rgb, 1.0); + col.rgb = col.rgb*gl_Color.rgb; gl_FrontColor = col; diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl index 1dd29bfc70..88ca60318b 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl @@ -29,6 +29,7 @@ varying vec3 vary_directional; varying vec3 vary_fragcoord; varying vec3 vary_position; varying vec3 vary_light; +varying vec3 vary_pointlight_col; uniform float shadow_bias; @@ -105,15 +106,20 @@ void main() } } + vec4 diff= texture2D(diffuseMap, gl_TexCoord[0].xy); + vec4 col = vec4(vary_ambient + vary_directional.rgb*shadow, gl_Color.a); - vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy) * col; + vec4 color = diff * col; color.rgb = atmosLighting(color.rgb); color.rgb = scaleSoftClip(color.rgb); + color.rgb += diff.rgb * vary_pointlight_col.rgb; + //gl_FragColor = gl_Color; gl_FragColor = color; + //gl_FragColor.r = 0.0; //gl_FragColor = vec4(1,shadow,1,1); } diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl index 92f1cb22d6..ea09d5bb09 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl @@ -11,7 +11,6 @@ vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol); void calcAtmospherics(vec3 inPositionEye); float calcDirectionalLight(vec3 n, vec3 l); -float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float is_pointlight); vec3 atmosAmbient(vec3 light); vec3 atmosAffectDirectionalLight(float lightIntensity); @@ -23,11 +22,37 @@ varying vec3 vary_directional; varying vec3 vary_fragcoord; varying vec3 vary_position; varying vec3 vary_light; +varying vec3 vary_pointlight_col; uniform float near_clip; uniform float shadow_offset; uniform float shadow_bias; +float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight) +{ + //get light vector + vec3 lv = lp.xyz-v; + + //get distance + float d = length(lv); + + //normalize light vector + lv *= 1.0/d; + + //distance attenuation + float dist2 = d*d/(la*la); + float da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0); + + // spotlight coefficient. + float spot = max(dot(-ln, lv), is_pointlight); + da *= spot*spot; // GL_SPOT_EXPONENT=2 + + //angular attenuation + da *= calcDirectionalLight(n, lv); + + return da; +} + void main() { //transform vertex @@ -46,25 +71,27 @@ void main() //vec4 color = calcLighting(pos.xyz, norm, gl_Color, vec4(0.)); vec4 col = vec4(0.0, 0.0, 0.0, gl_Color.a); - // Collect normal lights (need to be divided by two, as we later multiply by 2) - col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].specular.a); - col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].specular.a); - col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].specular.a); - col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].specular.a); - col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].specular.a); - col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].specular.a); - col.rgb += gl_LightSource[1].diffuse.rgb*calcDirectionalLight(norm, gl_LightSource[1].position.xyz); - col.rgb = scaleDownLight(col.rgb); + // Collect normal lights + col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].quadraticAttenuation, gl_LightSource[2].specular.a); + col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].quadraticAttenuation ,gl_LightSource[3].specular.a); + col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].quadraticAttenuation, gl_LightSource[4].specular.a); + col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].quadraticAttenuation, gl_LightSource[5].specular.a); + col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].quadraticAttenuation, gl_LightSource[6].specular.a); + col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].quadraticAttenuation, gl_LightSource[7].specular.a); + vary_pointlight_col = col.rgb*gl_Color.rgb; + + col.rgb = vec3(0,0,0); + // Add windlight lights - col.rgb += atmosAmbient(vec3(0.)); + col.rgb = atmosAmbient(vec3(0.)); vary_light = gl_LightSource[0].position.xyz; vary_ambient = col.rgb*gl_Color.rgb; vary_directional.rgb = gl_Color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, gl_LightSource[0].position.xyz), (1.0-gl_Color.a)*(1.0-gl_Color.a))); - col.rgb = min(col.rgb*gl_Color.rgb, 1.0); + col.rgb = col.rgb*gl_Color.rgb; gl_FrontColor = col; diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index bd3b5d05f6..21fbe52ccd 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -5019,9 +5019,17 @@ void LLPipeline::setupHWLights(LLDrawPool* pool) light_state->setDiffuse(light_color); light_state->setAmbient(LLColor4::black); light_state->setConstantAttenuation(0.f); - light_state->setLinearAttenuation(linatten); - light_state->setQuadraticAttenuation(0.f); - + if (sRenderDeferred) + { + light_state->setLinearAttenuation(light_radius*1.5f); + light_state->setQuadraticAttenuation(light->getLightFalloff()*0.5f+1.f); + } + else + { + light_state->setLinearAttenuation(linatten); + light_state->setQuadraticAttenuation(0.f); + } + if (light->isLightSpotlight() // directional (spot-)light && (LLPipeline::sRenderDeferred || gSavedSettings.getBOOL("RenderSpotLightsInNondeferred"))) // these are only rendered as GL spotlights if we're in deferred rendering mode *or* the setting forces them on { -- cgit v1.2.3 From 4311d5eacaba8543e952865d98cbf8258801cc6a Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Mon, 25 Apr 2011 20:43:49 -0500 Subject: SH-1371 tcmalloc comes with the viewer now, don't look for it in /usr/lib --- indra/newview/linux_tools/wrapper.sh | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/indra/newview/linux_tools/wrapper.sh b/indra/newview/linux_tools/wrapper.sh index d2df968544..283a28a0aa 100755 --- a/indra/newview/linux_tools/wrapper.sh +++ b/indra/newview/linux_tools/wrapper.sh @@ -92,23 +92,23 @@ cd "${RUN_PATH}" ## subprocesses that care. export SAVED_LD_LIBRARY_PATH="${LD_LIBRARY_PATH}" -if [ -n "$LL_TCMALLOC" ]; then - tcmalloc_libs='/usr/lib/libtcmalloc.so.0 /usr/lib/libstacktrace.so.0 /lib/libpthread.so.0' - all=1 - for f in $tcmalloc_libs; do - if [ ! -f $f ]; then - all=0 - fi - done - if [ $all != 1 ]; then - echo 'Cannot use tcmalloc libraries: components missing' 1>&2 - else - export LD_PRELOAD=$(echo $tcmalloc_libs | tr ' ' :) - if [ -z "$HEAPCHECK" -a -z "$HEAPPROFILE" ]; then - export HEAPCHECK=${HEAPCHECK:-normal} - fi - fi -fi +# if [ -n "$LL_TCMALLOC" ]; then +# tcmalloc_libs='/usr/lib/libtcmalloc.so.0 /usr/lib/libstacktrace.so.0 /lib/libpthread.so.0' +# all=1 +# for f in $tcmalloc_libs; do +# if [ ! -f $f ]; then +# all=0 +# fi +# done +# if [ $all != 1 ]; then +# echo 'Cannot use tcmalloc libraries: components missing' 1>&2 +# else +# export LD_PRELOAD=$(echo $tcmalloc_libs | tr ' ' :) +# if [ -z "$HEAPCHECK" -a -z "$HEAPPROFILE" ]; then +# export HEAPCHECK=${HEAPCHECK:-normal} +# fi +# fi +#fi export SL_ENV='LD_LIBRARY_PATH="`pwd`"/lib:"${LD_LIBRARY_PATH}"' export SL_CMD='$LL_WRAPPER bin/do-not-directly-run-secondlife-bin' -- cgit v1.2.3 From 1ef083244ad8cc603b50c1d737d8efb4ed14bb17 Mon Sep 17 00:00:00 2001 From: Merov Linden <merov@lindenlab.com> Date: Mon, 25 Apr 2011 22:37:15 -0700 Subject: EXP-664 : Add JPEG2000 compression settings for test, fix one crash on compression, enhanced error handling on image upload --- indra/newview/app_settings/settings.xml | 33 +++++++++++++++++++++++++++++++++ indra/newview/llviewertexturelist.cpp | 31 ++++++++++++++++++++++++++++++- 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index f2a0e5ac19..24c495a0ef 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -4295,6 +4295,39 @@ <key>Value</key> <real>0.25</real> </map> + <key>Jpeg2000AdvancedCompression</key> + <map> + <key>Comment</key> + <string>Use advanced Jpeg2000 compression options (precincts, blocks, ordering, markers)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>Jpeg2000PrecinctsSize</key> + <map> + <key>Comment</key> + <string>Size of image precincts. Assumed square and same for all levels. Must be power of 2.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>256</integer> + </map> + <key>Jpeg2000BlocksSize</key> + <map> + <key>Comment</key> + <string>Size of encoding blocks. Assumed square and same for all levels. Must be power of 2. Max 64, Min 4.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>64</integer> + </map> <key>KeepAspectForSnapshot</key> <map> <key>Comment</key> diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 5afed721ac..182cba0e8c 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -932,16 +932,19 @@ BOOL LLViewerTextureList::createUploadFile(const std::string& filename, LLPointer<LLImageFormatted> image = LLImageFormatted::createFromType(codec); if (image.isNull()) { + image->setLastError("Couldn't open the image to be uploaded."); return FALSE; } if (!image->load(filename)) { + image->setLastError("Couldn't load the image to be uploaded."); return FALSE; } // Decompress or expand it in a raw image structure LLPointer<LLImageRaw> raw_image = new LLImageRaw; if (!image->decode(raw_image, 0.0f)) { + image->setLastError("Couldn't decode the image to be uploaded."); return FALSE; } // Check the image constraints @@ -952,8 +955,15 @@ BOOL LLViewerTextureList::createUploadFile(const std::string& filename, } // Convert to j2c (JPEG2000) and save the file locally LLPointer<LLImageJ2C> compressedImage = convertToUploadFile(raw_image); + if (compressedImage.isNull()) + { + image->setLastError("Couldn't convert the image to jpeg2000."); + llinfos << "Couldn't convert to j2c, file : " << filename << llendl; + return FALSE; + } if (!compressedImage->save(out_filename)) { + image->setLastError("Couldn't create the jpeg2000 image for upload."); llinfos << "Couldn't create output file : " << out_filename << llendl; return FALSE; } @@ -961,6 +971,7 @@ BOOL LLViewerTextureList::createUploadFile(const std::string& filename, LLPointer<LLImageJ2C> integrity_test = new LLImageJ2C; if (!integrity_test->loadAndValidate( out_filename )) { + image->setLastError("The created jpeg2000 image is corrupt."); llinfos << "Image file : " << out_filename << " is corrupt" << llendl; return FALSE; } @@ -978,7 +989,25 @@ LLPointer<LLImageJ2C> LLViewerTextureList::convertToUploadFile(LLPointer<LLImage (raw_image->getWidth() * raw_image->getHeight() <= LL_IMAGE_REZ_LOSSLESS_CUTOFF * LL_IMAGE_REZ_LOSSLESS_CUTOFF)) compressedImage->setReversible(TRUE); - compressedImage->encode(raw_image, 0.0f); + + if (gSavedSettings.getBOOL("Jpeg2000AdvancedCompression")) + { + // This test option will create jpeg2000 images with precincts for each level, RPCL ordering + // and PLT markers. The block size is also optionally modifiable. + // Note: the images hence created are compatible with older versions of the viewer. + // Read the blocks and precincts size settings + S32 block_size = gSavedSettings.getS32("Jpeg2000BlocksSize"); + S32 precinct_size = gSavedSettings.getS32("Jpeg2000PrecinctsSize"); + llinfos << "Advanced JPEG2000 Compression: precinct = " << precinct_size << ", block = " << block_size << llendl; + compressedImage->initEncode(*raw_image, block_size, precinct_size); + } + + if (!compressedImage->encode(raw_image, 0.0f)) + { + llinfos << "convertToUploadFile : encode returns with error!!" << llendl; + // Clear up the pointer so we don't leak that one + compressedImage = NULL; + } return compressedImage; } -- cgit v1.2.3 From 1c9513135912482efb952a9277077d806f8f0df0 Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Tue, 26 Apr 2011 13:09:59 -0500 Subject: SH-1374 tcmalloc symlinks are broken on installer, include tcmalloc.so.0.1.0 --- indra/newview/viewer_manifest.py | 1 + 1 file changed, 1 insertion(+) diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 5ac9ec8ccc..c723176308 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -979,6 +979,7 @@ class Linux_i686Manifest(LinuxManifest): self.path("libfontconfig.so.1.4.4") self.path("libtcmalloc.so", "libtcmalloc.so") #formerly called google perf tools self.path("libtcmalloc.so.0", "libtcmalloc.so.0") #formerly called google perf tools + self.path("libtcmalloc.so.0.1.0", "libtcmalloc.so.0.1.0") #formerly called google perf tools try: self.path("libfmod-3.75.so") pass -- cgit v1.2.3 From deba003d101fc96802e87e10ef553d24dd40a615 Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Tue, 26 Apr 2011 13:24:21 -0500 Subject: spaces not tabs --- indra/newview/viewer_manifest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index c723176308..a04b4a9ca0 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -979,7 +979,7 @@ class Linux_i686Manifest(LinuxManifest): self.path("libfontconfig.so.1.4.4") self.path("libtcmalloc.so", "libtcmalloc.so") #formerly called google perf tools self.path("libtcmalloc.so.0", "libtcmalloc.so.0") #formerly called google perf tools - self.path("libtcmalloc.so.0.1.0", "libtcmalloc.so.0.1.0") #formerly called google perf tools + self.path("libtcmalloc.so.0.1.0", "libtcmalloc.so.0.1.0") #formerly called google perf tools try: self.path("libfmod-3.75.so") pass -- cgit v1.2.3 From c18e2f74b0f98bc772cb4cdcda17e598971b8b62 Mon Sep 17 00:00:00 2001 From: Boroondas Gupte <hg@boroon.dasgupta.ch> Date: Tue, 26 Apr 2011 22:22:33 +0200 Subject: STORM-1182 Use string::rfind instead of string::find ... so the last occurance of the build prefix in the executable path will be matched. This should avoid cuttung too much subdirs away if someone checks out the source to a path already containing "/build-darwin-" or "/build-linux-". --- indra/llvfs/lldir_linux.cpp | 2 +- indra/llvfs/lldir_mac.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/llvfs/lldir_linux.cpp b/indra/llvfs/lldir_linux.cpp index ae25ab2f21..72b54f5380 100644 --- a/indra/llvfs/lldir_linux.cpp +++ b/indra/llvfs/lldir_linux.cpp @@ -93,7 +93,7 @@ LLDir_Linux::LLDir_Linux() #else mAppRODataDir = tmp_str; #endif - std::string::size_type build_dir_pos = mExecutableDir.find("/build-linux-"); + std::string::size_type build_dir_pos = mExecutableDir.rfind("/build-linux-"); if (build_dir_pos != std::string::npos) { // ...we're in a dev checkout diff --git a/indra/llvfs/lldir_mac.cpp b/indra/llvfs/lldir_mac.cpp index e862ef0d84..f9369b043e 100644 --- a/indra/llvfs/lldir_mac.cpp +++ b/indra/llvfs/lldir_mac.cpp @@ -150,7 +150,7 @@ LLDir_Mac::LLDir_Mac() CFURLRef resourcesURLRef = CFBundleCopyResourcesDirectoryURL(mainBundleRef); CFURLRefToLLString(resourcesURLRef, mAppRODataDir, true); - U32 build_dir_pos = mExecutableDir.find("/build-darwin-"); + U32 build_dir_pos = mExecutableDir.rfind("/build-darwin-"); if (build_dir_pos != std::string::npos) { // ...we're in a dev checkout -- cgit v1.2.3 From d952f97459a04d64b698380b777406f1644f9bb2 Mon Sep 17 00:00:00 2001 From: Leslie Linden <leslie@lindenlab.com> Date: Tue, 26 Apr 2011 14:02:41 -0700 Subject: EXP-752 FIX -- When "View Display Names" is disabled, only my own profile loads, when I click others profiles Avatar username is now looked up in the name cache when it is blank, which happens when display names are turned off apparently. Reviewed by Fredrik. --- indra/newview/llavataractions.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index ca7ec7cc30..cbbdcb2983 100644 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -302,8 +302,14 @@ void LLAvatarActions::startConference(const uuid_vec_t& ids) static void on_avatar_name_show_profile(const LLUUID& agent_id, const LLAvatarName& av_name) { - llinfos << "opening web profile for " << av_name.mUsername << llendl; - std::string url = getProfileURL(av_name.mUsername); + std::string username = av_name.mUsername; + if (username.empty()) + { + username = LLCacheName::buildUsername(av_name.mDisplayName); + } + + llinfos << "opening web profile for " << username << llendl; + std::string url = getProfileURL(username); // PROFILES: open in webkit window LLWeb::loadWebURLInternal(url, "", agent_id.asString()); -- cgit v1.2.3 From e1e736eff89a279114d3fdc0381e1b669ea5a406 Mon Sep 17 00:00:00 2001 From: Leslie Linden <leslie@lindenlab.com> Date: Tue, 26 Apr 2011 14:02:41 -0700 Subject: EXP-752 FIX -- When "View Display Names" is disabled, only my own profile loads, when I click others profiles Avatar username is now looked up in the name cache when it is blank, which happens when display names are turned off apparently. Reviewed by Fredrik. --- indra/newview/llavataractions.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index ca7ec7cc30..cbbdcb2983 100644 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -302,8 +302,14 @@ void LLAvatarActions::startConference(const uuid_vec_t& ids) static void on_avatar_name_show_profile(const LLUUID& agent_id, const LLAvatarName& av_name) { - llinfos << "opening web profile for " << av_name.mUsername << llendl; - std::string url = getProfileURL(av_name.mUsername); + std::string username = av_name.mUsername; + if (username.empty()) + { + username = LLCacheName::buildUsername(av_name.mDisplayName); + } + + llinfos << "opening web profile for " << username << llendl; + std::string url = getProfileURL(username); // PROFILES: open in webkit window LLWeb::loadWebURLInternal(url, "", agent_id.asString()); -- cgit v1.2.3 From f7bd5b98949fc72ac1fd4b97ecd4907e14c04315 Mon Sep 17 00:00:00 2001 From: Leslie Linden <leslie@lindenlab.com> Date: Tue, 26 Apr 2011 14:02:41 -0700 Subject: EXP-752 FIX -- When "View Display Names" is disabled, only my own profile loads, when I click others profiles Avatar username is now looked up in the name cache when it is blank, which happens when display names are turned off apparently. Reviewed by Fredrik. --- indra/newview/llavataractions.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index ca7ec7cc30..cbbdcb2983 100644 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -302,8 +302,14 @@ void LLAvatarActions::startConference(const uuid_vec_t& ids) static void on_avatar_name_show_profile(const LLUUID& agent_id, const LLAvatarName& av_name) { - llinfos << "opening web profile for " << av_name.mUsername << llendl; - std::string url = getProfileURL(av_name.mUsername); + std::string username = av_name.mUsername; + if (username.empty()) + { + username = LLCacheName::buildUsername(av_name.mDisplayName); + } + + llinfos << "opening web profile for " << username << llendl; + std::string url = getProfileURL(username); // PROFILES: open in webkit window LLWeb::loadWebURLInternal(url, "", agent_id.asString()); -- cgit v1.2.3 From 4bc90f24b3ced350ed44ca782f876af19af83c41 Mon Sep 17 00:00:00 2001 From: brad kittenbrink <brad@lindenlab.com> Date: Tue, 26 Apr 2011 14:58:58 -0700 Subject: FIX VWR-25608 error on shutdow due to buffer overflow in LLVFS::audit --- indra/llvfs/llvfs.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/indra/llvfs/llvfs.cpp b/indra/llvfs/llvfs.cpp index c1fe21c57d..82166d3e56 100644 --- a/indra/llvfs/llvfs.cpp +++ b/indra/llvfs/llvfs.cpp @@ -26,6 +26,8 @@ #include "linden_common.h" +#include "llvfs.h" + #include <sys/stat.h> #include <set> #include <map> @@ -39,8 +41,6 @@ #include <sys/file.h> #endif -#include "llvfs.h" - #include "llstl.h" #include "lltimer.h" @@ -1711,7 +1711,8 @@ void LLVFS::audit() BOOL vfs_corrupt = FALSE; - std::vector<U8> buffer(index_size); + // since we take the address of element 0, we need to have at least one element. + std::vector<U8> buffer(llmax(index_size,1U)); if (fread(&buffer[0], 1, index_size, mIndexFP) != index_size) { -- cgit v1.2.3 From d4b9db012e2b5195759f694792c392770112b42d Mon Sep 17 00:00:00 2001 From: brad kittenbrink <brad@lindenlab.com> Date: Tue, 26 Apr 2011 15:04:22 -0700 Subject: FIX VWR-25609: crash on shutdown in LLGLNamePool::sInstances destructor --- indra/llrender/llgl.cpp | 29 ++++++++--------------------- indra/llrender/llgl.h | 7 ++++--- indra/llrender/llvertexbuffer.cpp | 4 ---- indra/newview/llspatialpartition.cpp | 2 -- 4 files changed, 12 insertions(+), 30 deletions(-) diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp index c86c89fa9b..b1a4051e96 100644 --- a/indra/llrender/llgl.cpp +++ b/indra/llrender/llgl.cpp @@ -105,7 +105,6 @@ LLMatrix4 gGLObliqueProjectionInverse; #define LL_GL_NAME_POOLING 0 -LLGLNamePool::pool_list_t LLGLNamePool::sInstances; std::list<LLGLUpdate*> LLGLUpdate::sGLQ; #if (LL_WINDOWS || LL_LINUX || LL_SOLARIS) && !LL_MESA_HEADLESS @@ -1920,22 +1919,8 @@ LLGLNamePool::LLGLNamePool() { } -void LLGLNamePool::registerPool(LLGLNamePool* pool) -{ - pool_list_t::iterator iter = std::find(sInstances.begin(), sInstances.end(), pool); - if (iter == sInstances.end()) - { - sInstances.push_back(pool); - } -} - LLGLNamePool::~LLGLNamePool() { - pool_list_t::iterator iter = std::find(sInstances.begin(), sInstances.end(), this); - if (iter != sInstances.end()) - { - sInstances.erase(iter); - } } void LLGLNamePool::upkeep() @@ -2004,20 +1989,22 @@ void LLGLNamePool::release(GLuint name) void LLGLNamePool::upkeepPools() { LLMemType mt(LLMemType::MTYPE_UPKEEP_POOLS); - for (pool_list_t::iterator iter = sInstances.begin(); iter != sInstances.end(); ++iter) + tracker_t::LLInstanceTrackerScopedGuard guard; + for (tracker_t::instance_iter iter = guard.beginInstances(); iter != guard.endInstances(); ++iter) { - LLGLNamePool* pool = *iter; - pool->upkeep(); + LLGLNamePool & pool = *iter; + pool.upkeep(); } } //static void LLGLNamePool::cleanupPools() { - for (pool_list_t::iterator iter = sInstances.begin(); iter != sInstances.end(); ++iter) + tracker_t::LLInstanceTrackerScopedGuard guard; + for (tracker_t::instance_iter iter = guard.beginInstances(); iter != guard.endInstances(); ++iter) { - LLGLNamePool* pool = *iter; - pool->cleanup(); + LLGLNamePool & pool = *iter; + pool.cleanup(); } } diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h index 684fd50883..51b0a1e45f 100644 --- a/indra/llrender/llgl.h +++ b/indra/llrender/llgl.h @@ -40,6 +40,7 @@ #include "v4math.h" #include "llplane.h" #include "llgltypes.h" +#include "llinstancetracker.h" #include "llglheaders.h" #include "glh/glh_linear.h" @@ -328,9 +329,11 @@ public: Generic pooling scheme for things which use GL names (used for occlusion queries and vertex buffer objects). Prevents thrashing of GL name caches by avoiding calls to glGenFoo and glDeleteFoo. */ -class LLGLNamePool +class LLGLNamePool : public LLInstanceTracker<LLGLNamePool> { public: + typedef LLInstanceTracker<LLGLNamePool> tracker_t; + struct NameEntry { GLuint name; @@ -357,13 +360,11 @@ public: GLuint allocate(); void release(GLuint name); - static void registerPool(LLGLNamePool* pool); static void upkeepPools(); static void cleanupPools(); protected: typedef std::vector<LLGLNamePool*> pool_list_t; - static pool_list_t sInstances; virtual GLuint allocateName() = 0; virtual void releaseName(GLuint name) = 0; diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index 1beb74eca6..1a5a4f734d 100644 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp @@ -323,10 +323,6 @@ void LLVertexBuffer::initClass(bool use_vbo, bool no_vbo_mapping) } sDisableVBOMapping = sEnableVBOs && no_vbo_mapping ; - LLGLNamePool::registerPool(&sDynamicVBOPool); - LLGLNamePool::registerPool(&sDynamicIBOPool); - LLGLNamePool::registerPool(&sStreamVBOPool); - LLGLNamePool::registerPool(&sStreamIBOPool); } //static diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 8adb8c30e0..94784f3f49 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -1635,8 +1635,6 @@ LLSpatialPartition::LLSpatialPartition(U32 data_mask, BOOL render_by_group, U32 mSlopRatio = 0.25f; mInfiniteFarClip = FALSE; - LLGLNamePool::registerPool(&sQueryPool); - mOctree = new LLSpatialGroup::OctreeRoot(LLVector3d(0,0,0), LLVector3d(1,1,1), NULL); -- cgit v1.2.3 From 2840bff7734fc7888da804d7aad4e9f252f33872 Mon Sep 17 00:00:00 2001 From: brad kittenbrink <brad@lindenlab.com> Date: Tue, 26 Apr 2011 15:10:39 -0700 Subject: FIX VWR-25610: LLControlCroup::loadFromFile makes unnecessary copies of large LLSD objects. --- indra/llxml/llcontrol.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/indra/llxml/llcontrol.cpp b/indra/llxml/llcontrol.cpp index 6e4364a20d..a604c1e631 100644 --- a/indra/llxml/llcontrol.cpp +++ b/indra/llxml/llcontrol.cpp @@ -839,7 +839,6 @@ U32 LLControlGroup::loadFromFile(const std::string& filename, bool set_default_v { std::string name; LLSD settings; - LLSD control_map; llifstream infile; infile.open(filename); if(!infile.is_open()) @@ -864,7 +863,7 @@ U32 LLControlGroup::loadFromFile(const std::string& filename, bool set_default_v { bool persist = true; name = (*itr).first; - control_map = (*itr).second; + LLSD const & control_map = (*itr).second; if(control_map.has("Persist")) { -- cgit v1.2.3 From f4540fab4887f6fe54ed6472c4b2458e3ac745d5 Mon Sep 17 00:00:00 2001 From: brad kittenbrink <brad@lindenlab.com> Date: Tue, 26 Apr 2011 17:06:04 -0700 Subject: FIX CHOP-629: Enabled debugging info for llcommon.dll --- indra/llcommon/CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index 22e0705036..800bf8eba9 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -268,6 +268,10 @@ if(LLCOMMON_LINK_SHARED) add_definitions(-fPIC) endif(WINDOWS) endif(NOT WORD_SIZE EQUAL 32) + if(WINDOWS) + # always generate llcommon.pdb, even for "Release" builds + set_target_properties(llcommon PROPERTIES LINK_FLAGS "/DEBUG") + endif(WINDOWS) ll_stage_sharedlib(llcommon) else(LLCOMMON_LINK_SHARED) add_library (llcommon ${llcommon_SOURCE_FILES}) -- cgit v1.2.3 From 1143f2c1bdb464dd54e7b10e90763af9b8254b6c Mon Sep 17 00:00:00 2001 From: "Debi King (Dessie)" <dessie@lindenlab.com> Date: Wed, 27 Apr 2011 12:28:40 -0400 Subject: Added tag DRTVWR-46_2.6.3-release, 2.6.3-release for changeset 8f2da1701c81 --- .hgtags | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.hgtags b/.hgtags index 629783d37f..e3f34d6041 100644 --- a/.hgtags +++ b/.hgtags @@ -97,3 +97,5 @@ d1203046bb653b763f835b04d184646949d8dd5c 2.6.2-beta1 ec32f1045e7c2644015245df3a9933620aa194b8 2.6.3-start d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc DRTVWR-47_2.6.3-beta1 d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc 2.6.3-beta1 +8f2da1701c81a62352df2b8d413d27fb2cade9a6 DRTVWR-46_2.6.3-release +8f2da1701c81a62352df2b8d413d27fb2cade9a6 2.6.3-release -- cgit v1.2.3 From e6bd982c00fe0f08a6640a19ef0adfda75d4d3ed Mon Sep 17 00:00:00 2001 From: Merov Linden <merov@lindenlab.com> Date: Wed, 27 Apr 2011 10:47:41 -0700 Subject: OPEN-50 : backing out that change that is incompatible with Incredibuild. --- autobuild.xml | 3 --- 1 file changed, 3 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index bd98d59766..2ac869b20a 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1674,9 +1674,6 @@ <string>-DCMAKE_BUILD_TYPE:STRING=Release</string> <string>-DWORD_SIZE:STRING=32</string> <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> - <string>-DUSE_PRECOMPILED_HEADERS=ON</string> - <string>-DLL_RELEASE_FOR_DOWNLOAD:BOOL=TRUE</string> - <string>-DINSTALL_PROPRIETARY=TRUE</string> </array> </map> <key>name</key> -- cgit v1.2.3 From adf7a568948fc0915d10f35291b573688aad8947 Mon Sep 17 00:00:00 2001 From: "Debi King (Dessie)" <dessie@lindenlab.com> Date: Wed, 27 Apr 2011 16:11:07 -0400 Subject: Added tag DRTVWR-44_2.6.2-release, 2.6.2-release for changeset 214180ad5714 --- .hgtags | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.hgtags b/.hgtags index e3f34d6041..635d1bece0 100644 --- a/.hgtags +++ b/.hgtags @@ -99,3 +99,5 @@ d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc DRTVWR-47_2.6.3-beta1 d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc 2.6.3-beta1 8f2da1701c81a62352df2b8d413d27fb2cade9a6 DRTVWR-46_2.6.3-release 8f2da1701c81a62352df2b8d413d27fb2cade9a6 2.6.3-release +214180ad5714ce8392b82bbebcc92f4babd98300 DRTVWR-44_2.6.2-release +214180ad5714ce8392b82bbebcc92f4babd98300 2.6.2-release -- cgit v1.2.3 From 36986de1fc1437f509d120b79430c87575e755b1 Mon Sep 17 00:00:00 2001 From: brad kittenbrink <brad@lindenlab.com> Date: Wed, 27 Apr 2011 16:02:16 -0700 Subject: Fix for mac compile error in VWR-25608 fix. --- indra/llvfs/llvfs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/llvfs/llvfs.cpp b/indra/llvfs/llvfs.cpp index 82166d3e56..78b67e9b68 100644 --- a/indra/llvfs/llvfs.cpp +++ b/indra/llvfs/llvfs.cpp @@ -1712,7 +1712,7 @@ void LLVFS::audit() BOOL vfs_corrupt = FALSE; // since we take the address of element 0, we need to have at least one element. - std::vector<U8> buffer(llmax(index_size,1U)); + std::vector<U8> buffer(llmax<size_t>(index_size,1U)); if (fread(&buffer[0], 1, index_size, mIndexFP) != index_size) { -- cgit v1.2.3 From 37ef2c4f0f7958106ea09abcd486cb9c305316e4 Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Wed, 27 Apr 2011 16:45:33 -0700 Subject: EXP-670 Voice for basic mode reviewed by Merov http://codereview.lindenlab.com/6231263/ --- indra/newview/llpanelvoicedevicesettings.cpp | 2 +- indra/newview/llviewerfloaterreg.cpp | 2 + indra/newview/llviewermenu.cpp | 9 + .../default/xui/en/panel_preferences_sound.xml | 171 +--------------- indra/newview/skins/minimal/textures/textures.xml | 4 +- .../skins/minimal/xui/en/panel_bottomtray.xml | 220 ++++++++++++--------- 6 files changed, 152 insertions(+), 256 deletions(-) diff --git a/indra/newview/llpanelvoicedevicesettings.cpp b/indra/newview/llpanelvoicedevicesettings.cpp index aef870d352..d13f57bd6a 100644 --- a/indra/newview/llpanelvoicedevicesettings.cpp +++ b/indra/newview/llpanelvoicedevicesettings.cpp @@ -316,6 +316,6 @@ void LLPanelVoiceDeviceSettings::onCommitOutputDevice() if(LLVoiceClient::getInstance()) { LLVoiceClient::getInstance()->setRenderDevice( - getChild<LLComboBox>("voice_input_device")->getValue().asString()); + getChild<LLComboBox>("voice_output_device")->getValue().asString()); } } diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index dca1e33e60..6dc85799ce 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -91,6 +91,7 @@ #include "llfloatersettingsdebug.h" #include "llfloatersidetraytab.h" #include "llfloatersnapshot.h" +#include "llfloatersounddevices.h" #include "llfloatertelehub.h" #include "llfloatertestinspectors.h" #include "llfloatertestlistview.h" @@ -239,6 +240,7 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("sell_land", "floater_sell_land.xml", &LLFloaterSellLand::buildFloater); LLFloaterReg::add("settings_debug", "floater_settings_debug.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSettingsDebug>); LLFloaterReg::add("side_bar_tab", "floater_side_bar_tab.xml", &LLFloaterReg::build<LLFloaterSideTrayTab>); + LLFloaterReg::add("sound_devices", "floater_sound_devices.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSoundDevices>); LLFloaterReg::add("stats", "floater_stats.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloater>); LLFloaterReg::add("start_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterRunQueue>); LLFloaterReg::add("stop_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotRunQueue>); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 3665b7d91f..c568c8eedb 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -5591,6 +5591,14 @@ class LLToggleHelp : public view_listener_t } }; +class LLToggleSpeak : public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + LLVoiceClient::getInstance()->toggleUserPTTState(); + return true; + } +}; class LLShowSidetrayPanel : public view_listener_t { bool handleEvent(const LLSD& userdata) @@ -8187,6 +8195,7 @@ void initialize_menus() commit.add("BuyCurrency", boost::bind(&handle_buy_currency)); view_listener_t::addMenu(new LLShowHelp(), "ShowHelp"); view_listener_t::addMenu(new LLToggleHelp(), "ToggleHelp"); + view_listener_t::addMenu(new LLToggleSpeak(), "ToggleSpeak"); view_listener_t::addMenu(new LLPromptShowURL(), "PromptShowURL"); view_listener_t::addMenu(new LLShowAgentProfile(), "ShowAgentProfile"); view_listener_t::addMenu(new LLToggleAgentProfile(), "ToggleAgentProfile"); diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml index 26af8dc29d..a314e0d85e 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml @@ -466,164 +466,13 @@ name="device_settings_btn" width="190"> </button> - <panel - background_visible="false" - bg_alpha_color="DkGray" - visiblity_control="ShowDeviceSettings" - border="false" - follows="top|left" - height="100" - label="Device Settings" - layout="topleft" - left_delta="-2" - name="device_settings_panel" - class="panel_voice_device_settings" - width="470" - top_pad="0"> - <panel.string - name="default_text"> - Default - </panel.string> - <panel.string - name="default system device"> - Default system device - </panel.string> - <panel.string - name="no device"> - No device - </panel.string> - <icon - height="18" - image_name="Microphone_On" - left_delta="4" - name="microphone_icon" - mouse_opaque="false" - top="7" - visible="true" - width="18" /> - <text - type="string" - length="1" - font.style="BOLD" - follows="left|top" - height="16" - layout="topleft" - left_pad="3" - name="Input" - width="70"> - Input - </text> - <combo_box - height="23" - control_name="VoiceInputAudioDevice" - layout="topleft" - left_pad="0" - max_chars="128" - name="voice_input_device" - top_delta="-5" - width="200" /> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left_delta="-70" - name="My volume label" - top_pad="4" - width="200"> - My volume: - </text> - <slider_bar - control_name="AudioLevelMic" - follows="left|top" - height="17" - increment="0.025" - initial_value="1.0" - layout="topleft" - left_delta="-6" - max_val="2" - name="mic_volume_slider" - tool_tip="Change the volume using this slider" - top_pad="-1" - width="220" /> - <text - type="string" - text_color="EmphasisColor" - length="1" - follows="left|top" - height="18" - layout="topleft" - left_pad="5" - name="wait_text" - top_delta="-1" - width="110"> - Please wait - </text> - <locate - height="20" - layout="topleft" - left_delta="0" - name="bar0" - top_delta="-2" - width="20" /> - <locate - height="20" - layout="topleft" - left_pad="5" - name="bar1" - top_delta="0" - width="20" /> - <locate - height="20" - layout="topleft" - left_pad="5" - name="bar2" - top_delta="0" - width="20" /> - <locate - height="20" - layout="topleft" - left_pad="5" - name="bar3" - top_delta="0" - width="20" /> - <locate - height="20" - layout="topleft" - left_pad="5" - name="bar4" - top_delta="0" - width="20" /> - <icon - height="18" - image_name="Parcel_Voice_Light" - left="5" - name="speaker_icon" - mouse_opaque="false" - top_pad="3" - visible="true" - width="22" /> - <text - font.style="BOLD" - type="string" - length="1" - follows="left|top" - height="15" - layout="topleft" - left_pad="0" - name="Output" - width="70"> - Output - </text> - <combo_box - control_name="VoiceOutputAudioDevice" - height="23" - layout="topleft" - left_pad="0" - max_chars="128" - name="voice_output_device" - top_delta="-3" - width="200" /> - </panel> - </panel> + <panel + layout="topleft" + filename="panel_sound_devices.xml" + visiblity_control="ShowDeviceSettings" + name="device_settings_panel" + top="314" + width="345" + left="18" + class="panel_voice_device_settings"/> +</panel> diff --git a/indra/newview/skins/minimal/textures/textures.xml b/indra/newview/skins/minimal/textures/textures.xml index b4848a0619..e3ed01721a 100644 --- a/indra/newview/skins/minimal/textures/textures.xml +++ b/indra/newview/skins/minimal/textures/textures.xml @@ -6,4 +6,6 @@ <texture name="bottomtray_close_off" file_name="bottomtray/close_off.png" preload="true" /> <texture name="bottomtray_close_over" file_name="bottomtray/close_over.png" preload="true" /> <texture name="bottomtray_close_press" file_name="bottomtray/close_press.png" preload="true" /> -</textures> + <texture name="Speak_Btn_Off" file_name="bottomtray/Speak_Btn_Off.png" preload="true" scale.left="4" scale.top="16" scale.right="8" scale.bottom="4" /> + <texture name="Speak_Btn_Selected_Press" file_name="bottomtray/Speak_Btn_Selected_Press.png" preload="true" scale.left="4" scale.top="16" scale.right="8" scale.bottom="4" /> + </textures> diff --git a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml index 95f2010e44..70a59cea43 100644 --- a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml @@ -12,16 +12,16 @@ focus_root="true" top="28" width="1310"> - <string + <string name="DragIndicationImageName" value="Accordion_ArrowOpened_Off" /> - <string + <string name="SpeakBtnToolTip" value="Turns microphone on/off" /> - <string + <string name="VoiceControlBtnToolTip" value="Shows/hides voice control panel" /> - <layout_stack + <layout_stack border_size="0" clip="false" follows="all" @@ -33,12 +33,12 @@ orientation="horizontal" top="0" width="1310"> - <layout_panel + <layout_panel auto_resize="false" user_resize="false" min_width="2" width="2" /> - <layout_panel + <layout_panel auto_resize="false" layout="topleft" max_width="320" @@ -48,7 +48,7 @@ name="chat_bar_layout_panel" user_resize="true" width="308" > - <panel + <panel name="chat_bar" filename="panel_nearby_chat_bar.xml" left="0" @@ -65,39 +65,73 @@ height="28" layout="topleft" min_height="28" - min_width="59" + min_width="35" mouse_opaque="false" name="speak_panel" top_delta="0" user_resize="false" - width="108"> - <talk_button + width="85"> + <button follows="left|right" height="23" layout="topleft" + label="Speak" left="0" - name="talk" + name="speak_btn" + + pad_right="30" + halign="center" + use_ellipses="true" + tab_stop="true" + is_toggle="true" + image_selected="Speak_Btn_Selected_Press" + image_unselected="Speak_Btn_Off" + image_pressed="Speak_Btn_Selected_Press" + image_pressed_selected="Speak_Btn_Selected_Press" top="5" - width="105"> - <show_button - tab_stop="true"> - <init_callback - function="Button.SetDockableFloaterToggle" - parameter="voice_controls" /> - </show_button> - <!-- do not remove halign attribute with default value. otherwise it can't be overridden in other locales. - & pad_right is default value for long label which can be right aligned. See EXT-6318 --> - <speak_button - halign="center" - label="Speak" - label_selected="Speak" - name="speak_btn" - pad_right="20" - tab_stop="true" - use_ellipses="true" /> - </talk_button> + width="85"> + + <commit_callback + function="ToggleSpeak" + parameter="f1_help" /> + </button> </layout_panel> - <layout_panel + + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_height="28" + min_width="20" + mouse_opaque="false" + name="flyout_panel" + top_delta="0" + user_resize="false" + width="20"> + <button + follows="left|right" + width="20" + top="5" + left="0" + height="23" + name="speak_flyout_btn" + label="" + tab_stop="false" + is_toggle="true" + image_disabled="ComboButton_UpOff" + image_unselected="ComboButton_UpOff" + image_selected="ComboButton_On" + image_pressed="ComboButton_UpSelected" + image_pressed_selected="ComboButton_Selected"> + <init_callback + function="Button.SetDockableFloaterToggle" + parameter="sound_devices" /> + </button> + + </layout_panel> + + <layout_panel auto_resize="false" follows="right" height="28" @@ -108,7 +142,7 @@ name="gesture_panel" top_delta="0" user_resize="false" - width="85"> + width="88"> <gesture_combo_list follows="left|right" height="23" @@ -116,20 +150,20 @@ layout="topleft" get_more="false" view_all="false" - left="0" + left="3" name="Gesture" tool_tip="Shows/hides gestures" top="5" width="82"> - <combo_button + <combo_button pad_right="10" can_drag="false" use_ellipses="true" /> - <combo_list + <combo_list page_lines="17" /> - </gesture_combo_list> - </layout_panel> - <layout_panel + </gesture_combo_list> + </layout_panel> + <layout_panel auto_resize="false" follows="left|right" height="28" @@ -140,7 +174,7 @@ name="cam_panel" user_resize="false" width="83"> - <bottomtray_button + <bottomtray_button can_drag="false" follows="left|right" height="23" @@ -156,12 +190,12 @@ top="5" use_ellipses="true" width="80"> - <init_callback + <init_callback function="Button.SetDockableFloaterToggle" parameter="camera" /> - </bottomtray_button> - </layout_panel> - <layout_panel + </bottomtray_button> + </layout_panel> + <layout_panel auto_resize="false" follows="left|right" height="28" @@ -170,7 +204,7 @@ name="splitter_panel" user_resize="false" width="17"> - <icon + <icon follows="left|bottom" height="18" width="2" @@ -178,8 +212,8 @@ image_name="Button_Separator" name="separator" top="7"/> - </layout_panel> - <layout_panel + </layout_panel> + <layout_panel auto_resize="false" follows="left|right" height="28" @@ -190,7 +224,7 @@ name="avatar_and_destinations_panel" user_resize="false" width="103"> - <bottomtray_button + <bottomtray_button can_drag="false" follows="left|right" height="23" @@ -206,11 +240,11 @@ is_toggle="true" use_ellipses="true" width="100"> - <bottomtray_button.commit_callback + <bottomtray_button.commit_callback function="Destination.show" /> - </bottomtray_button> - </layout_panel> - <layout_panel + </bottomtray_button> + </layout_panel> + <layout_panel auto_resize="false" follows="left|right" height="28" @@ -221,7 +255,7 @@ name="avatar_and_destinations_panel" user_resize="false" width="103"> - <bottomtray_button + <bottomtray_button can_drag="false" follows="left|right" height="23" @@ -236,11 +270,11 @@ is_toggle="true" use_ellipses="true" width="100"> - <bottomtray_button.commit_callback + <bottomtray_button.commit_callback function="Avatar.show" /> - </bottomtray_button> - </layout_panel> - <layout_panel + </bottomtray_button> + </layout_panel> + <layout_panel auto_resize="false" follows="left|right" height="28" @@ -249,7 +283,7 @@ name="splitter_panel" user_resize="false" width="17"> - <icon + <icon follows="left|bottom" height="18" width="2" @@ -257,8 +291,8 @@ image_name="Button_Separator" name="separator" top="7"/> - </layout_panel> - <layout_panel + </layout_panel> + <layout_panel auto_resize="false" follows="right" height="28" @@ -270,7 +304,7 @@ top_delta="0" user_resize="false" width="105"> - <bottomtray_button + <bottomtray_button can_drag="false" follows="left|right" height="23" @@ -286,12 +320,12 @@ is_toggle="true" use_ellipses="true" width="100"> - <bottomtray_button.commit_callback + <bottomtray_button.commit_callback function="ShowSidetrayPanel" parameter="panel_people" /> - </bottomtray_button> - </layout_panel> - <layout_panel + </bottomtray_button> + </layout_panel> + <layout_panel auto_resize="false" follows="right" height="28" @@ -303,7 +337,7 @@ top_delta="0" user_resize="false" width="105"> - <bottomtray_button + <bottomtray_button can_drag="false" follows="left|right" height="23" @@ -319,12 +353,12 @@ top="5" use_ellipses="true" width="100"> - <bottomtray_button.commit_callback + <bottomtray_button.commit_callback function="ToggleAgentProfile" parameter="agent"/> - </bottomtray_button> - </layout_panel> - <layout_panel + </bottomtray_button> + </layout_panel> + <layout_panel auto_resize="false" follows="right" height="28" @@ -336,7 +370,7 @@ top_delta="0" user_resize="false" width="105"> - <bottomtray_button + <bottomtray_button can_drag="false" follows="left|right" height="23" @@ -352,12 +386,12 @@ top="5" use_ellipses="true" width="100"> - <bottomtray_button.commit_callback + <bottomtray_button.commit_callback function="ToggleHelp" parameter="f1_help" /> - </bottomtray_button> - </layout_panel> - <layout_panel + </bottomtray_button> + </layout_panel> + <layout_panel follows="left|right" height="30" layout="topleft" @@ -367,9 +401,9 @@ top="0" user_resize="false" width="189"> - <!--*NOTE: min_width of the chiclet_panel (chiclet_list) must be the same + <!--*NOTE: min_width of the chiclet_panel (chiclet_list) must be the same as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. EXT-991--> - <chiclet_panel + <chiclet_panel chiclet_padding="4" follows="left|right" height="24" @@ -380,7 +414,7 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. name="chiclet_list" top="7" width="189"> - <button + <button auto_resize="true" follows="right" height="29" @@ -397,7 +431,7 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. top="-28" visible="false" width="7" /> - <button + <button auto_resize="true" follows="right" height="29" @@ -414,13 +448,13 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. top="-28" visible="false" width="7" /> - </chiclet_panel> - </layout_panel> - <layout_panel auto_resize="false" + </chiclet_panel> + </layout_panel> + <layout_panel auto_resize="false" user_resize="false" width="4" min_width="4"/> - <layout_panel + <layout_panel auto_resize="false" follows="right" height="28" @@ -431,7 +465,7 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. top="0" user_resize="false" width="37"> - <chiclet_im_well + <chiclet_im_well follows="right" height="28" layout="topleft" @@ -440,7 +474,7 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. name="im_well" top="0" width="35"> - <!-- + <!-- Emulate 4 states of button by background images, see details in EXT-3147. The same should be for notification_well button xml attribute Description image_unselected "Unlit" - there are no new messages @@ -448,7 +482,7 @@ image_selected "Unlit" + "Selected" - there are no new messages and the image_pressed "Lit" - there are new messages image_pressed_selected "Lit" + "Selected" - there are new messages and the Well is open --> - <button + <button auto_resize="true" follows="right" halign="center" @@ -463,13 +497,13 @@ image_pressed_selected "Lit" + "Selected" - there are new messages and the Well name="Unread IM messages" tool_tip="Conversations" width="34"> - <init_callback + <init_callback function="Button.SetDockableFloaterToggle" parameter="im_well_window" /> - </button> - </chiclet_im_well> - </layout_panel> - <layout_panel + </button> + </chiclet_im_well> + </layout_panel> + <layout_panel auto_resize="false" follows="right" height="28" @@ -480,7 +514,7 @@ image_pressed_selected "Lit" + "Selected" - there are new messages and the Well top="0" user_resize="false" width="37"> - <chiclet_notification + <chiclet_notification follows="right" height="23" layout="topleft" @@ -489,7 +523,7 @@ image_pressed_selected "Lit" + "Selected" - there are new messages and the Well name="notification_well" top="5" width="35"> - <button + <button auto_resize="true" bottom_pad="3" follows="right" @@ -505,7 +539,7 @@ image_pressed_selected "Lit" + "Selected" - there are new messages and the Well name="Unread" tool_tip="Notifications" width="34"> - <init_callback + <init_callback function="Button.SetDockableFloaterToggle" parameter="notification_well_window" /> </button> @@ -517,5 +551,5 @@ image_pressed_selected "Lit" + "Selected" - there are new messages and the Well min_width="4" name="DUMMY2" width="8" /> - </layout_stack> + </layout_stack> </panel> -- cgit v1.2.3 From 892c5109e8679ca28a53799289732efcbebd9d48 Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Wed, 27 Apr 2011 16:45:57 -0700 Subject: EXP-670 Voice for basic mode new files reviewed by merov --- indra/newview/llfloatersounddevices.cpp | 85 +++++++++++ indra/newview/llfloatersounddevices.h | 49 +++++++ .../skins/default/xui/en/floater_sound_devices.xml | 28 ++++ .../skins/default/xui/en/panel_sound_devices.xml | 163 +++++++++++++++++++++ .../minimal/textures/bottomtray/Speak_Btn_Off.png | Bin 0 -> 993 bytes .../bottomtray/Speak_Btn_Selected_Press.png | Bin 0 -> 1217 bytes 6 files changed, 325 insertions(+) create mode 100644 indra/newview/llfloatersounddevices.cpp create mode 100644 indra/newview/llfloatersounddevices.h create mode 100644 indra/newview/skins/default/xui/en/floater_sound_devices.xml create mode 100644 indra/newview/skins/default/xui/en/panel_sound_devices.xml create mode 100644 indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Off.png create mode 100644 indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Selected_Press.png diff --git a/indra/newview/llfloatersounddevices.cpp b/indra/newview/llfloatersounddevices.cpp new file mode 100644 index 0000000000..1f6a992fc5 --- /dev/null +++ b/indra/newview/llfloatersounddevices.cpp @@ -0,0 +1,85 @@ +/** + * @file llfloatersounddevices.cpp + * @author Leyla Farazha + * @brief Sound Preferences used for minimal skin + * +* $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ +#include "llviewerprecompiledheaders.h" + +#include "llfloatersounddevices.h" + +#include "llbottomtray.h" +#include "lldraghandle.h" + +#include "llpanelvoicedevicesettings.h" + +// Library includes +#include "indra_constants.h" + +// protected +LLFloaterSoundDevices::LLFloaterSoundDevices(const LLSD& key) +: LLTransientDockableFloater(NULL, false, key) +{ + LLTransientFloaterMgr::getInstance()->addControlView(this); + + // force docked state since this floater doesn't save it between recreations + setDocked(true); +} + +LLFloaterSoundDevices::~LLFloaterSoundDevices() +{ + LLTransientFloaterMgr::getInstance()->removeControlView(this); +} + +// virtual +BOOL LLFloaterSoundDevices::postBuild() +{ + LLTransientDockableFloater::postBuild(); + + LLView *anchor_panel = LLBottomTray::getInstance()->getChild<LLView>("speak_flyout_btn"); + setDockControl(new LLDockControl(anchor_panel, this, getDockTongue(), LLDockControl::TOP)); + + setIsChrome(TRUE); + if (mDragHandle) + mDragHandle->setTitleVisible(TRUE); + updateTransparency(TT_ACTIVE); // force using active floater transparency (STORM-730) + + return TRUE; +} + +//virtual +void LLFloaterSoundDevices::setDocked(bool docked, bool pop_on_undock/* = true*/) +{ + LLTransientDockableFloater::setDocked(docked, pop_on_undock); +} + +// virtual +void LLFloaterSoundDevices::setFocus( BOOL b ) +{ + LLTransientDockableFloater::setFocus(b); + + // Force using active floater transparency + // We have to override setFocus() for because selecting an item of the + // combobox causes the floater to lose focus and thus become transparent. + updateTransparency(TT_ACTIVE); +} \ No newline at end of file diff --git a/indra/newview/llfloatersounddevices.h b/indra/newview/llfloatersounddevices.h new file mode 100644 index 0000000000..f09ee3b069 --- /dev/null +++ b/indra/newview/llfloatersounddevices.h @@ -0,0 +1,49 @@ +/** + * @file llfloatersounddevices.h + * @author Leyla Farazha + * @brief Sound Preferences used for minimal skin + * +* $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#ifndef LL_LLFLOATERSOUNDDEVICES_H +#define LL_LLFLOATERSOUNDDEVICES_H + +#include "lltransientdockablefloater.h" + +class LLFloaterSoundDevices : public LLTransientDockableFloater +{ +public: + + LOG_CLASS(LLFloaterSoundDevices); + + LLFloaterSoundDevices(const LLSD& key); + ~LLFloaterSoundDevices(); + + /*virtual*/ BOOL postBuild(); + /*virtual*/ void setDocked(bool docked, bool pop_on_undock = true); + /*virtual*/ void setFocus( BOOL b ); +}; + + +#endif //LL_LLFLOATERSOUNDDEVICES_H + diff --git a/indra/newview/skins/default/xui/en/floater_sound_devices.xml b/indra/newview/skins/default/xui/en/floater_sound_devices.xml new file mode 100644 index 0000000000..3c9e5aeff3 --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_sound_devices.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater + border_visible="false" + border="false" + legacy_header_height="18" + can_minimize="true" + can_resize="true" + can_close="false" + save_dock_state="true" + save_visibility="true" + save_rect="true" + single_instance="true" + bevel_style="in" + height="140" + layout="topleft" + name="floater_sound_devices" + title="Sound Devicess" + width="315"> + <panel + layout="topleft" + follows="all" + filename="panel_sound_devices.xml" + name="device_settings_panel" + width="300" + left="2" + top="26" + class="panel_voice_device_settings"/> +</floater> diff --git a/indra/newview/skins/default/xui/en/panel_sound_devices.xml b/indra/newview/skins/default/xui/en/panel_sound_devices.xml new file mode 100644 index 0000000000..9812281323 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_sound_devices.xml @@ -0,0 +1,163 @@ +<panel + background_visible="false" + bg_alpha_color="DkGray" + follows="all" + height="200" + label="Device Settings" + layout="topleft" + name="device_settings_panel" + width="360"> + <panel.string + name="default_text"> + Default + </panel.string> + <panel.string + name="default system device"> + Default system device + </panel.string> + <panel.string + name="no device"> + No device + </panel.string> + <icon + height="18" + image_name="Microphone_On" + left_delta="4" + name="microphone_icon" + mouse_opaque="false" + top="7" + layout="topleft" + visible="true" + width="18" /> + <text + type="string" + length="1" + font.style="BOLD" + follows="left|top" + height="16" + layout="topleft" + left_pad="3" + name="Input" + width="70"> + Input + </text> + <combo_box + height="23" + control_name="VoiceInputAudioDevice" + follows="left|top" + layout="topleft" + left_pad="0" + max_chars="128" + name="voice_input_device" + top_delta="-5" + width="200" /> + <text + type="string" + length="1" + follows="left|top" + height="16" + layout="topleft" + left_delta="-70" + name="My volume label" + top_pad="4" + width="200"> + My volume: + </text> + <slider_bar + control_name="AudioLevelMic" + follows="top|right|left" + height="17" + increment="0.025" + initial_value="1.0" + layout="topleft" + left_delta="-6" + max_val="2" + name="mic_volume_slider" + tool_tip="Change the volume using this slider" + top_pad="-1" + width="220" /> + <text + type="string" + text_color="EmphasisColor" + length="1" + follows="right|top" + height="18" + layout="topleft" + left_pad="5" + name="wait_text" + top_delta="-1" + width="110"> + Please wait + </text> + <locate + follows="right|top" + height="20" + layout="topleft" + left_delta="0" + name="bar0" + top_delta="-2" + width="20" /> + <locate + follows="right|top" + height="20" + layout="topleft" + left_pad="5" + name="bar1" + top_delta="0" + width="20" /> + <locate + follows="right|top" + height="20" + layout="topleft" + left_pad="5" + name="bar2" + top_delta="0" + width="20" /> + <locate + follows="right|top" + height="20" + layout="topleft" + left_pad="5" + name="bar3" + top_delta="0" + width="20" /> + <locate + follows="right|top" + height="20" + layout="topleft" + left_pad="5" + name="bar4" + top_delta="0" + width="20" /> + <icon + height="18" + image_name="Parcel_Voice_Light" + left="5" + name="speaker_icon" + mouse_opaque="false" + top_pad="3" + visible="true" + width="22" /> + <text + font.style="BOLD" + type="string" + length="1" + follows="left|top" + height="15" + layout="topleft" + left_pad="0" + name="Output" + width="70"> + Output + </text> + <combo_box + control_name="VoiceOutputAudioDevice" + height="23" + follows="left|top" + layout="topleft" + left_pad="0" + max_chars="128" + name="voice_output_device" + top_delta="-3" + width="200" /> +</panel> diff --git a/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Off.png b/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Off.png new file mode 100644 index 0000000000..b6e9eef891 Binary files /dev/null and b/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Off.png differ diff --git a/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Selected_Press.png b/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Selected_Press.png new file mode 100644 index 0000000000..687cb7fb53 Binary files /dev/null and b/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Selected_Press.png differ -- cgit v1.2.3 From a59de335c5bfa7b730977f0061a046654e2b964c Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Wed, 27 Apr 2011 17:41:34 -0700 Subject: EXP-626 New bottomtray tooltips for basic mode --- indra/newview/skins/minimal/xui/en/panel_bottomtray.xml | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml index 70a59cea43..aff22c7e45 100644 --- a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml @@ -78,7 +78,7 @@ label="Speak" left="0" name="speak_btn" - + tool_tip="Turn your microphone on and off" pad_right="30" halign="center" use_ellipses="true" @@ -118,6 +118,7 @@ name="speak_flyout_btn" label="" tab_stop="false" + tool_tip="Change your sound preferences" is_toggle="true" image_disabled="ComboButton_UpOff" image_unselected="ComboButton_UpOff" @@ -152,7 +153,7 @@ view_all="false" left="3" name="Gesture" - tool_tip="Shows/hides gestures" + tool_tip="Make your avatar do things" top="5" width="82"> <combo_button @@ -186,7 +187,7 @@ layout="topleft" left="0" name="camera_btn" - tool_tip="Shows/hides camera controls" + tool_tip="Control your camera angle" top="5" use_ellipses="true" width="80"> @@ -235,7 +236,7 @@ layout="topleft" left="0" name="destination_btn" - tool_tip="Shows destinations window" + tool_tip="Travel through Second Life" top="5" is_toggle="true" use_ellipses="true" @@ -268,6 +269,7 @@ name="avatar_btn" top="5" is_toggle="true" + tool_tip="Change your appearance" use_ellipses="true" width="100"> <bottomtray_button.commit_callback @@ -315,7 +317,7 @@ layout="topleft" left="0" name="show_people_button" - tool_tip="Shows people window" + tool_tip="Find people in Second Life" top="5" is_toggle="true" use_ellipses="true" @@ -348,7 +350,7 @@ layout="topleft" left="0" name="show_profile_btn" - tool_tip="Shows profile window" + tool_tip="View and edit your Profile" is_toggle="true" top="5" use_ellipses="true" @@ -381,7 +383,7 @@ layout="topleft" left="0" name="show_help_btn" - tool_tip="Open Second Life How To topics" + tool_tip="View Second Life help info" is_toggle="true" top="5" use_ellipses="true" -- cgit v1.2.3 From 0453808465aa91d71f7dfd944003d81a523d92d6 Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Wed, 27 Apr 2011 17:41:49 -0700 Subject: Fixed floater sound devices title --- indra/newview/skins/default/xui/en/floater_sound_devices.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/skins/default/xui/en/floater_sound_devices.xml b/indra/newview/skins/default/xui/en/floater_sound_devices.xml index 3c9e5aeff3..584413c030 100644 --- a/indra/newview/skins/default/xui/en/floater_sound_devices.xml +++ b/indra/newview/skins/default/xui/en/floater_sound_devices.xml @@ -14,7 +14,7 @@ height="140" layout="topleft" name="floater_sound_devices" - title="Sound Devicess" + title="Sound Devices" width="315"> <panel layout="topleft" -- cgit v1.2.3 From 89198015596c72838962d3836b308469ef086e3e Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Wed, 27 Apr 2011 17:59:15 -0700 Subject: adding llfloatersounddevices.cpp/.h to the cmake file --- indra/newview/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index b1cb10665b..95cfc23ede 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -214,6 +214,7 @@ set(viewer_SOURCE_FILES llfloatersettingsdebug.cpp llfloatersidetraytab.cpp llfloatersnapshot.cpp + llfloatersounddevices.cpp llfloatertelehub.cpp llfloatertestinspectors.cpp llfloatertestlistview.cpp @@ -758,6 +759,7 @@ set(viewer_HEADER_FILES llfloatersettingsdebug.h llfloatersidetraytab.h llfloatersnapshot.h + llfloatersounddevices.h llfloatertelehub.h llfloatertestinspectors.h llfloatertestlistview.h -- cgit v1.2.3 From f56a2e55ccd86e3739f69c3d8dcc007c337bdaa1 Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Wed, 27 Apr 2011 18:17:09 -0700 Subject: adding newline at end of llfloatersounddevices.cpp --- indra/newview/llfloatersounddevices.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llfloatersounddevices.cpp b/indra/newview/llfloatersounddevices.cpp index 1f6a992fc5..4f3945c95f 100644 --- a/indra/newview/llfloatersounddevices.cpp +++ b/indra/newview/llfloatersounddevices.cpp @@ -82,4 +82,4 @@ void LLFloaterSoundDevices::setFocus( BOOL b ) // We have to override setFocus() for because selecting an item of the // combobox causes the floater to lose focus and thus become transparent. updateTransparency(TT_ACTIVE); -} \ No newline at end of file +} -- cgit v1.2.3 From 42fe138cbb1af4acbb6851711f8c7f86c65795c0 Mon Sep 17 00:00:00 2001 From: brad kittenbrink <brad@lindenlab.com> Date: Wed, 27 Apr 2011 19:13:17 -0700 Subject: Incorporated some suggestions from code review for VWR-25610 --- indra/llxml/llcontrol.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/indra/llxml/llcontrol.cpp b/indra/llxml/llcontrol.cpp index a604c1e631..0809d95628 100644 --- a/indra/llxml/llcontrol.cpp +++ b/indra/llxml/llcontrol.cpp @@ -837,7 +837,6 @@ U32 LLControlGroup::saveToFile(const std::string& filename, BOOL nondefault_only U32 LLControlGroup::loadFromFile(const std::string& filename, bool set_default_values, bool save_values) { - std::string name; LLSD settings; llifstream infile; infile.open(filename); @@ -862,8 +861,8 @@ U32 LLControlGroup::loadFromFile(const std::string& filename, bool set_default_v for(LLSD::map_const_iterator itr = settings.beginMap(); itr != settings.endMap(); ++itr) { bool persist = true; - name = (*itr).first; - LLSD const & control_map = (*itr).second; + std::string const & name = itr->first; + LLSD const & control_map = itr->second; if(control_map.has("Persist")) { -- cgit v1.2.3 From 67be82ad370601b00d70909669a80d06db62b404 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" <vir@lindenlab.com> Date: Thu, 28 Apr 2011 11:00:27 -0400 Subject: updated llconvexdecomposition for version linked with vs2010 havok --- autobuild.xml | 1428 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 714 insertions(+), 714 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index f4e7189166..fd5bc060fc 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1134,9 +1134,9 @@ <key>archive</key> <map> <key>hash</key> - <string>9f8579663eeac8ed5cfc6390560f0e24</string> + <string>95a1d483f3d01f480b55801e841b2151</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llconvexdecomposition/rev/226714/arch/CYGWIN/installer/llconvexdecomposition-0.1-windows-20110415.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llconvexdecomposition/rev/227989/arch/CYGWIN/installer/llconvexdecomposition-0.1-windows-20110428.tar.bz2</string> </map> <key>name</key> <string>windows</string> @@ -1784,739 +1784,739 @@ </map> </map> </map> - <key>package_description</key> - <map> - <key>name</key> - <string>viewer_development</string> - <key>platforms</key> + <key>package_description</key> <map> - <key>common</key> + <key>name</key> + <string>viewer_development</string> + <key>platforms</key> <map> - <key>configurations</key> + <key>common</key> <map> - <key>Debug</key> - <map> - <key>build</key> - <map> - </map> - <key>configure</key> - <map> - <key>command</key> - <string>cmake</string> - <key>options</key> - <array> - <string>-DCMAKE_BUILD_TYPE:STRING=Debug</string> - <string>-DWORD_SIZE:STRING=32</string> - <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> + <key>configurations</key> + <map> + <key>Debug</key> + <map> + <key>build</key> + <map> + </map> + <key>configure</key> + <map> + <key>command</key> + <string>cmake</string> + <key>options</key> + <array> + <string>-DCMAKE_BUILD_TYPE:STRING=Debug</string> + <string>-DWORD_SIZE:STRING=32</string> + <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> <string>-DINSTALL_PROPRIETARY=TRUE</string> - </array> - </map> - <key>name</key> - <string>Debug</string> - </map> - <key>DebugOS</key> - <map> - <key>configure</key> - <map> - <key>command</key> - <string>cmake</string> - <key>options</key> - <array> - <string>-DCMAKE_BUILD_TYPE:STRING=Debug</string> - <string>-DWORD_SIZE:STRING=32</string> - <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - </array> - <key>arguments</key> - <array> - <string>../indra</string> - </array> - </map> - <key>name</key> - <string>DebugOS</string> - </map> - <key>RelWithDebInfo</key> - <map> - <key>build</key> - <map> - </map> - <key>configure</key> - <map> - <key>command</key> - <string>cmake</string> - <key>options</key> - <array> - <string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string> - <string>-DWORD_SIZE:STRING=32</string> - <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> + </array> + </map> + <key>name</key> + <string>Debug</string> + </map> + <key>DebugOS</key> + <map> + <key>configure</key> + <map> + <key>arguments</key> + <array> + <string>../indra</string> + </array> + <key>command</key> + <string>cmake</string> + <key>options</key> + <array> + <string>-DCMAKE_BUILD_TYPE:STRING=Debug</string> + <string>-DWORD_SIZE:STRING=32</string> + <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> + <string>-DINSTALL_PROPRIETARY=FALSE</string> + </array> + </map> + <key>name</key> + <string>DebugOS</string> + </map> + <key>RelWithDebInfo</key> + <map> + <key>build</key> + <map> + </map> + <key>configure</key> + <map> + <key>command</key> + <string>cmake</string> + <key>options</key> + <array> + <string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string> + <string>-DWORD_SIZE:STRING=32</string> + <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> <string>-DINSTALL_PROPRIETARY=TRUE</string> - </array> - </map> - <key>name</key> - <string>RelWithDebInfo</string> - </map> - <key>RelWithDebInfoOS</key> - <map> - <key>configure</key> - <map> - <key>command</key> - <string>cmake</string> - <key>options</key> - <array> - <string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string> - <string>-DWORD_SIZE:STRING=32</string> - <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - </array> - <key>arguments</key> - <array> - <string>../indra</string> - </array> - </map> - <key>name</key> - <string>RelWithDebInfoOS</string> - </map> - <key>Release</key> - <map> - <key>build</key> - <map> - </map> - <key>configure</key> - <map> - <key>command</key> - <string>cmake</string> - <key>options</key> - <array> - <string>-DCMAKE_BUILD_TYPE:STRING=Release</string> - <string>-DWORD_SIZE:STRING=32</string> - <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> - <string>-DUSE_PRECOMPILED_HEADERS=ON</string> - <string>-DLL_RELEASE_FOR_DOWNLOAD:BOOL=TRUE</string> + </array> + </map> + <key>name</key> + <string>RelWithDebInfo</string> + </map> + <key>RelWithDebInfoOS</key> + <map> + <key>configure</key> + <map> + <key>arguments</key> + <array> + <string>../indra</string> + </array> + <key>command</key> + <string>cmake</string> + <key>options</key> + <array> + <string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string> + <string>-DWORD_SIZE:STRING=32</string> + <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> + <string>-DINSTALL_PROPRIETARY=FALSE</string> + </array> + </map> + <key>name</key> + <string>RelWithDebInfoOS</string> + </map> + <key>Release</key> + <map> + <key>build</key> + <map> + </map> + <key>configure</key> + <map> + <key>command</key> + <string>cmake</string> + <key>options</key> + <array> + <string>-DCMAKE_BUILD_TYPE:STRING=Release</string> + <string>-DWORD_SIZE:STRING=32</string> + <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> + <string>-DUSE_PRECOMPILED_HEADERS=ON</string> + <string>-DLL_RELEASE_FOR_DOWNLOAD:BOOL=TRUE</string> <string>-DINSTALL_PROPRIETARY=TRUE</string> - </array> - </map> - <key>name</key> - <string>Release</string> - </map> - <key>ReleaseOS</key> - <map> - <key>configure</key> - <map> - <key>command</key> - <string>cmake</string> - <key>options</key> - <array> - <string>-DCMAKE_BUILD_TYPE:STRING=Release</string> - <string>-DWORD_SIZE:STRING=32</string> - <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DLL_RELEASE_FOR_DOWNLOAD:BOOL=YES</string> - </array> - <key>arguments</key> - <array> - <string>../indra</string> - </array> - </map> - <key>name</key> - <string>ReleaseOS</string> - </map> + </array> + </map> + <key>name</key> + <string>Release</string> + </map> + <key>ReleaseOS</key> + <map> + <key>configure</key> + <map> + <key>arguments</key> + <array> + <string>../indra</string> + </array> + <key>command</key> + <string>cmake</string> + <key>options</key> + <array> + <string>-DCMAKE_BUILD_TYPE:STRING=Release</string> + <string>-DWORD_SIZE:STRING=32</string> + <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> + <string>-DINSTALL_PROPRIETARY=FALSE</string> + <string>-DLL_RELEASE_FOR_DOWNLOAD:BOOL=YES</string> + </array> + </map> + <key>name</key> + <string>ReleaseOS</string> + </map> + </map> + <key>name</key> + <string>common</string> </map> - <key>name</key> - <string>common</string> - </map> - <key>darwin</key> - <map> - <key>build_directory</key> - <string>build-darwin-i386</string> - <key>configurations</key> + <key>darwin</key> <map> - <key>Debug</key> - <map> - <key>build</key> - <map> - <key>arguments</key> - <array> - <string>|</string> - <string>grep</string> - <string>-v</string> - <string>setenv</string> - </array> - <key>command</key> - <string>xcodebuild</string> - <key>options</key> - <array> - <string>-configuration Debug</string> - <string>-project SecondLife.xcodeproj</string> - </array> - </map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> - <key>options</key> - <array> - <string>-G</string> - <string>'Xcode'</string> - </array> - </map> - <key>name</key> - <string>Debug</string> - </map> - <key>DebugOS</key> - <map> - <key>build</key> - <map> - <key>command</key> - <string>xcodebuild</string> - <key>options</key> - <array> - <string>-configuration Debug</string> - <string>-project SecondLife.xcodeproj</string> - </array> - </map> - <key>configure</key> - <map> - <key>options</key> - <array> - <string>-G</string> - <string>'Xcode'</string> - </array> - </map> - <key>name</key> - <string>DebugOS</string> - </map> - <key>RelWithDebInfo</key> - <map> - <key>build</key> - <map> - <key>arguments</key> - <array> - <string>|</string> - <string>grep</string> - <string>-v</string> - <string>setenv</string> - </array> - <key>command</key> - <string>xcodebuild</string> - <key>options</key> - <array> - <string>-configuration RelWithDebInfo</string> - <string>-project SecondLife.xcodeproj</string> - </array> - </map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> - <key>options</key> - <array> - <string>-G</string> - <string>'Xcode'</string> - </array> - </map> - <key>default</key> - <string>True</string> - <key>name</key> - <string>RelWithDebInfo</string> - </map> - <key>RelWithDebInfoOS</key> - <map> - <key>build</key> - <map> - <key>command</key> - <string>xcodebuild</string> - <key>options</key> - <array> - <string>-configuration RelWithDebInfo</string> - <string>-project SecondLife.xcodeproj</string> - </array> - </map> - <key>configure</key> - <map> - <key>options</key> - <array> - <string>-G</string> - <string>'Xcode'</string> - </array> - </map> - <key>name</key> - <string>RelWithDebInfoOS</string> - </map> - <key>Release</key> - <map> - <key>build</key> - <map> - <key>arguments</key> - <array> - <string>|</string> - <string>grep</string> - <string>-v</string> - <string>setenv</string> - </array> - <key>command</key> - <string>xcodebuild</string> - <key>options</key> - <array> - <string>-configuration Release</string> - <string>-project SecondLife.xcodeproj</string> - </array> - </map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> - <key>options</key> - <array> - <string>-G</string> - <string>'Xcode'</string> - </array> - </map> - <key>name</key> - <string>Release</string> - </map> - <key>ReleaseOS</key> - <map> - <key>build</key> - <map> - <key>command</key> - <string>xcodebuild</string> - <key>options</key> - <array> - <string>-configuration Release</string> - <string>-project SecondLife.xcodeproj</string> - </array> - </map> - <key>configure</key> - <map> - <key>options</key> - <array> - <string>-G</string> - <string>'Xcode'</string> - </array> - </map> - <key>name</key> - <string>ReleaseOS</string> - </map> + <key>build_directory</key> + <string>build-darwin-i386</string> + <key>configurations</key> + <map> + <key>Debug</key> + <map> + <key>build</key> + <map> + <key>arguments</key> + <array> + <string>|</string> + <string>grep</string> + <string>-v</string> + <string>setenv</string> + </array> + <key>command</key> + <string>xcodebuild</string> + <key>options</key> + <array> + <string>-configuration Debug</string> + <string>-project SecondLife.xcodeproj</string> + </array> + </map> + <key>configure</key> + <map> + <key>arguments</key> + <array> + <string>../indra</string> + </array> + <key>options</key> + <array> + <string>-G</string> + <string>'Xcode'</string> + </array> + </map> + <key>name</key> + <string>Debug</string> + </map> + <key>DebugOS</key> + <map> + <key>build</key> + <map> + <key>command</key> + <string>xcodebuild</string> + <key>options</key> + <array> + <string>-configuration Debug</string> + <string>-project SecondLife.xcodeproj</string> + </array> + </map> + <key>configure</key> + <map> + <key>options</key> + <array> + <string>-G</string> + <string>'Xcode'</string> + </array> + </map> + <key>name</key> + <string>DebugOS</string> + </map> + <key>RelWithDebInfo</key> + <map> + <key>build</key> + <map> + <key>arguments</key> + <array> + <string>|</string> + <string>grep</string> + <string>-v</string> + <string>setenv</string> + </array> + <key>command</key> + <string>xcodebuild</string> + <key>options</key> + <array> + <string>-configuration RelWithDebInfo</string> + <string>-project SecondLife.xcodeproj</string> + </array> + </map> + <key>configure</key> + <map> + <key>arguments</key> + <array> + <string>../indra</string> + </array> + <key>options</key> + <array> + <string>-G</string> + <string>'Xcode'</string> + </array> + </map> + <key>default</key> + <string>True</string> + <key>name</key> + <string>RelWithDebInfo</string> + </map> + <key>RelWithDebInfoOS</key> + <map> + <key>build</key> + <map> + <key>command</key> + <string>xcodebuild</string> + <key>options</key> + <array> + <string>-configuration RelWithDebInfo</string> + <string>-project SecondLife.xcodeproj</string> + </array> + </map> + <key>configure</key> + <map> + <key>options</key> + <array> + <string>-G</string> + <string>'Xcode'</string> + </array> + </map> + <key>name</key> + <string>RelWithDebInfoOS</string> + </map> + <key>Release</key> + <map> + <key>build</key> + <map> + <key>arguments</key> + <array> + <string>|</string> + <string>grep</string> + <string>-v</string> + <string>setenv</string> + </array> + <key>command</key> + <string>xcodebuild</string> + <key>options</key> + <array> + <string>-configuration Release</string> + <string>-project SecondLife.xcodeproj</string> + </array> + </map> + <key>configure</key> + <map> + <key>arguments</key> + <array> + <string>../indra</string> + </array> + <key>options</key> + <array> + <string>-G</string> + <string>'Xcode'</string> + </array> + </map> + <key>name</key> + <string>Release</string> + </map> + <key>ReleaseOS</key> + <map> + <key>build</key> + <map> + <key>command</key> + <string>xcodebuild</string> + <key>options</key> + <array> + <string>-configuration Release</string> + <string>-project SecondLife.xcodeproj</string> + </array> + </map> + <key>configure</key> + <map> + <key>options</key> + <array> + <string>-G</string> + <string>'Xcode'</string> + </array> + </map> + <key>name</key> + <string>ReleaseOS</string> + </map> + </map> + <key>name</key> + <string>darwin</string> </map> - <key>name</key> - <string>darwin</string> - </map> - <key>linux</key> - <map> - <key>build_directory</key> - <string>build-linux-i686</string> - <key>configurations</key> + <key>linux</key> <map> - <key>Debug</key> - <map> - <key>build</key> - <map> - <key>command</key> - <string>make</string> - <key>options</key> - <array> - <string>-j 12</string> - </array> - </map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> - <key>options</key> - <array> - <string>-G</string> - <string>'Unix Makefiles'</string> - </array> - </map> - <key>name</key> - <string>Debug</string> - </map> - <key>DebugOS</key> - <map> - <key>build</key> - <map> - <key>command</key> - <string>make</string> - <key>options</key> - <array> - <string>-j 2</string> - </array> - </map> - <key>configure</key> - <map> - <key>options</key> - <array> - <string>-G</string> - <string>'Unix Makefiles'</string> - </array> - </map> - <key>name</key> - <string>DebugOS</string> - </map> - <key>RelWithDebInfo</key> - <map> - <key>build</key> - <map> - <key>command</key> - <string>make</string> - <key>options</key> - <array> - <string>-j 12</string> - </array> - </map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> - <key>options</key> - <array> - <string>-G</string> - <string>'Unix Makefiles'</string> - </array> + <key>build_directory</key> + <string>build-linux-i686</string> + <key>configurations</key> + <map> + <key>Debug</key> + <map> + <key>build</key> + <map> + <key>command</key> + <string>make</string> + <key>options</key> + <array> + <string>-j 12</string> + </array> + </map> + <key>configure</key> + <map> + <key>arguments</key> + <array> + <string>../indra</string> + </array> + <key>options</key> + <array> + <string>-G</string> + <string>'Unix Makefiles'</string> + </array> + </map> + <key>name</key> + <string>Debug</string> + </map> + <key>DebugOS</key> + <map> + <key>build</key> + <map> + <key>command</key> + <string>make</string> + <key>options</key> + <array> + <string>-j 2</string> + </array> + </map> + <key>configure</key> + <map> + <key>options</key> + <array> + <string>-G</string> + <string>'Unix Makefiles'</string> + </array> + </map> + <key>name</key> + <string>DebugOS</string> + </map> + <key>RelWithDebInfo</key> + <map> + <key>build</key> + <map> + <key>command</key> + <string>make</string> + <key>options</key> + <array> + <string>-j 12</string> + </array> + </map> + <key>configure</key> + <map> + <key>arguments</key> + <array> + <string>../indra</string> + </array> + <key>options</key> + <array> + <string>-G</string> + <string>'Unix Makefiles'</string> + </array> + </map> + <key>default</key> + <string>True</string> + <key>name</key> + <string>RelWithDebInfo</string> + </map> + <key>RelWithDebInfoOS</key> + <map> + <key>build</key> + <map> + <key>command</key> + <string>make</string> + <key>options</key> + <array> + <string>-j 2</string> + </array> + </map> + <key>configure</key> + <map> + <key>options</key> + <array> + <string>-G</string> + <string>'Unix Makefiles'</string> + </array> + </map> + <key>name</key> + <string>RelWithDebInfoOS</string> + </map> + <key>Release</key> + <map> + <key>build</key> + <map> + <key>command</key> + <string>make</string> + <key>options</key> + <array> + <string>-j 12</string> + </array> + </map> + <key>configure</key> + <map> + <key>arguments</key> + <array> + <string>../indra</string> + </array> + <key>options</key> + <array> + <string>-G</string> + <string>'Unix Makefiles'</string> + </array> + </map> + <key>name</key> + <string>Release</string> + </map> + <key>ReleaseOS</key> + <map> + <key>build</key> + <map> + <key>command</key> + <string>make</string> + <key>options</key> + <array> + <string>-j 2</string> + </array> + </map> + <key>configure</key> + <map> + <key>options</key> + <array> + <string>-G</string> + <string>'Unix Makefiles'</string> + </array> + </map> + <key>name</key> + <string>ReleaseOS</string> </map> <key>default</key> - <string>True</string> - <key>name</key> - <string>RelWithDebInfo</string> - </map> - <key>RelWithDebInfoOS</key> - <map> - <key>build</key> <map> - <key>command</key> - <string>make</string> - <key>options</key> - <array> - <string>-j 2</string> - </array> + <key>build</key> + <map> + </map> + <key>name</key> + <string>default</string> </map> - <key>configure</key> - <map> - <key>options</key> - <array> - <string>-G</string> - <string>'Unix Makefiles'</string> - </array> - </map> - <key>name</key> - <string>RelWithDebInfoOS</string> - </map> - <key>Release</key> - <map> - <key>build</key> - <map> - <key>command</key> - <string>make</string> - <key>options</key> - <array> - <string>-j 12</string> - </array> - </map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> - <key>options</key> - <array> - <string>-G</string> - <string>'Unix Makefiles'</string> - </array> - </map> - <key>name</key> - <string>Release</string> - </map> - <key>ReleaseOS</key> - <map> - <key>build</key> - <map> - <key>command</key> - <string>make</string> - <key>options</key> - <array> - <string>-j 2</string> - </array> - </map> - <key>configure</key> - <map> - <key>options</key> - <array> - <string>-G</string> - <string>'Unix Makefiles'</string> - </array> - </map> - <key>name</key> - <string>ReleaseOS</string> - </map> - <key>default</key> - <map> - <key>build</key> - <map> - </map> - <key>name</key> - <string>default</string> </map> + <key>name</key> + <string>linux</string> </map> - <key>name</key> - <string>linux</string> - </map> - <key>windows</key> - <map> - <key>build_directory</key> - <string>build-vc100</string> - <key>configurations</key> + <key>windows</key> <map> - <key>Debug</key> - <map> - <key>build</key> - <map> - <key>arguments</key> - <array> - <string>SecondLife.sln</string> - </array> - <key>command</key> - <string>BuildConsole</string> - <key>options</key> - <array> - <string>/build</string> - <string>"/cfg=Debug|Win32"</string> - </array> - </map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>..\indra</string> - <string>&&</string> - <string>..\indra\tools\vstool\VSTool.exe</string> - <string>--solution</string> - <string>SecondLife.sln</string> - <string>--config</string> - <string>Debug</string> - <string>--startup</string> - <string>secondlife-bin</string> - </array> - <key>options</key> - <array> - <string>-G</string> - <string>"Visual Studio 10"</string> - </array> - </map> - <key>name</key> - <string>Debug</string> - </map> - <key>DebugOS</key> - <map> - <key>build</key> - <map> - <key>arguments</key> - <array> - <string>SecondLife.sln</string> - </array> - <key>command</key> - <string>msbuild.exe</string> - <key>options</key> - <array> - <string>/p:Configuration=Debug</string> - <string>/p:Platform=Win32</string> - <string>/t:Build</string> - <string>/p:useenv=true</string> - <string>/verbosity:minimal</string> - <string>/toolsversion:4.0</string> - <string>/p:"VCBuildAdditionalOptions= /incremental"</string> - </array> - </map> - <key>configure</key> - <map> - <key>options</key> - <array> - <string>-G</string> - <string>"Visual Studio 10"</string> - <string>-DUNATTENDED:BOOL=ON</string> - <string>-DUSE_PRECOMPILED_HEADERS=ON</string> - <string>-DINSTALL_PROPRIETARY=TRUE</string> - <string>-DUSE_KDU=FALSE</string> - <string>-DFMOD=FALSE</string> - </array> - </map> - <key>name</key> - <string>DebugOS</string> - </map> - <key>RelWithDebInfo</key> - <map> - <key>build</key> - <map> - <key>arguments</key> - <array> - <string>SecondLife.sln</string> - </array> - <key>command</key> - <string>BuildConsole</string> - <key>options</key> - <array> - <string>/build</string> - <string>"/cfg=RelWithDebInfo|Win32"</string> - </array> - </map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>..\indra</string> - <string>&&</string> - <string>..\indra\tools\vstool\VSTool.exe</string> - <string>--solution</string> - <string>SecondLife.sln</string> - <string>--config</string> - <string>RelWithDebInfo</string> - <string>--startup</string> - <string>secondlife-bin</string> - </array> - <key>options</key> - <array> - <string>-G</string> - <string>"Visual Studio 10"</string> - </array> + <key>build_directory</key> + <string>build-vc100</string> + <key>configurations</key> + <map> + <key>Debug</key> + <map> + <key>build</key> + <map> + <key>arguments</key> + <array> + <string>SecondLife.sln</string> + </array> + <key>command</key> + <string>BuildConsole</string> + <key>options</key> + <array> + <string>/build</string> + <string>"/cfg=Debug|Win32"</string> + </array> + </map> + <key>configure</key> + <map> + <key>arguments</key> + <array> + <string>..\indra</string> + <string>&&</string> + <string>..\indra\tools\vstool\VSTool.exe</string> + <string>--solution</string> + <string>SecondLife.sln</string> + <string>--config</string> + <string>Debug</string> + <string>--startup</string> + <string>secondlife-bin</string> + </array> + <key>options</key> + <array> + <string>-G</string> + <string>"Visual Studio 10"</string> + </array> + </map> + <key>name</key> + <string>Debug</string> + </map> + <key>DebugOS</key> + <map> + <key>build</key> + <map> + <key>arguments</key> + <array> + <string>SecondLife.sln</string> + </array> + <key>command</key> + <string>msbuild.exe</string> + <key>options</key> + <array> + <string>/p:Configuration=Debug</string> + <string>/p:Platform=Win32</string> + <string>/t:Build</string> + <string>/p:useenv=true</string> + <string>/verbosity:minimal</string> + <string>/toolsversion:4.0</string> + <string>/p:"VCBuildAdditionalOptions= /incremental"</string> + </array> + </map> + <key>configure</key> + <map> + <key>options</key> + <array> + <string>-G</string> + <string>"Visual Studio 10"</string> + <string>-DUNATTENDED:BOOL=ON</string> + <string>-DUSE_PRECOMPILED_HEADERS=ON</string> + <string>-DINSTALL_PROPRIETARY=TRUE</string> + <string>-DUSE_KDU=FALSE</string> + <string>-DFMOD=FALSE</string> + </array> + </map> + <key>name</key> + <string>DebugOS</string> + </map> + <key>RelWithDebInfo</key> + <map> + <key>build</key> + <map> + <key>arguments</key> + <array> + <string>SecondLife.sln</string> + </array> + <key>command</key> + <string>BuildConsole</string> + <key>options</key> + <array> + <string>/build</string> + <string>"/cfg=RelWithDebInfo|Win32"</string> + </array> + </map> + <key>configure</key> + <map> + <key>arguments</key> + <array> + <string>..\indra</string> + <string>&&</string> + <string>..\indra\tools\vstool\VSTool.exe</string> + <string>--solution</string> + <string>SecondLife.sln</string> + <string>--config</string> + <string>RelWithDebInfo</string> + <string>--startup</string> + <string>secondlife-bin</string> + </array> + <key>options</key> + <array> + <string>-G</string> + <string>"Visual Studio 10"</string> + </array> + </map> + <key>default</key> + <string>True</string> + <key>name</key> + <string>RelWithDebInfo</string> + </map> + <key>RelWithDebInfoOS</key> + <map> + <key>build</key> + <map> + <key>arguments</key> + <array> + <string>SecondLife.sln</string> + </array> + <key>command</key> + <string>msbuild.exe</string> + <key>options</key> + <array> + <string>/p:Configuration=RelWithDebInfo</string> + <string>/p:Platform=Win32</string> + <string>/t:Build</string> + <string>/p:useenv=true</string> + <string>/verbosity:minimal</string> + <string>/toolsversion:4.0</string> + <string>/p:"VCBuildAdditionalOptions= /incremental"</string> + </array> + </map> + <key>configure</key> + <map> + <key>options</key> + <array> + <string>-G</string> + <string>"Visual Studio 10"</string> + <string>-DUNATTENDED:BOOL=ON</string> + <string>-DUSE_PRECOMPILED_HEADERS=ON</string> + <string>-DINSTALL_PROPRIETARY=TRUE</string> + <string>-DUSE_KDU=FALSE</string> + <string>-DFMOD=FALSE</string> + </array> + </map> + <key>name</key> + <string>RelWithDebInfoOS</string> + </map> + <key>Release</key> + <map> + <key>build</key> + <map> + <key>arguments</key> + <array> + <string>SecondLife.sln</string> + </array> + <key>command</key> + <string>BuildConsole</string> + <key>options</key> + <array> + <string>/build</string> + <string>"/cfg=Release|Win32"</string> + <string>"/CL_ADD=/m:1"</string> + </array> + </map> + <key>configure</key> + <map> + <key>arguments</key> + <array> + <string>..\indra</string> + <string>&&</string> + <string>..\indra\tools\vstool\VSTool.exe</string> + <string>--solution</string> + <string>SecondLife.sln</string> + <string>--config</string> + <string>Release</string> + <string>--startup</string> + <string>secondlife-bin</string> + </array> + <key>options</key> + <array> + <string>-G</string> + <string>"Visual Studio 10"</string> + </array> + </map> + <key>name</key> + <string>Release</string> + </map> + <key>ReleaseOS</key> + <map> + <key>build</key> + <map> + <key>arguments</key> + <array> + <string>SecondLife.sln</string> + </array> + <key>command</key> + <string>msbuild.exe</string> + <key>options</key> + <array> + <string>/p:Configuration=Release</string> + <string>/p:Platform=Win32</string> + <string>/t:Build</string> + <string>/p:useenv=true</string> + <string>/verbosity:minimal</string> + <string>/toolsversion:4.0</string> + <string>/p:"VCBuildAdditionalOptions= /incremental"</string> + </array> + </map> + <key>configure</key> + <map> + <key>options</key> + <array> + <string>-G</string> + <string>"Visual Studio 10"</string> + <string>-DUNATTENDED:BOOL=ON</string> + <string>-DUSE_PRECOMPILED_HEADERS=ON</string> + <string>-DINSTALL_PROPRIETARY=TRUE</string> + <string>-DUSE_KDU=FALSE</string> + <string>-DFMOD=FALSE</string> + </array> + </map> + <key>name</key> + <string>ReleaseOS</string> </map> - <key>default</key> - <string>True</string> - <key>name</key> - <string>RelWithDebInfo</string> - </map> - <key>RelWithDebInfoOS</key> - <map> - <key>build</key> - <map> - <key>arguments</key> - <array> - <string>SecondLife.sln</string> - </array> - <key>command</key> - <string>msbuild.exe</string> - <key>options</key> - <array> - <string>/p:Configuration=RelWithDebInfo</string> - <string>/p:Platform=Win32</string> - <string>/t:Build</string> - <string>/p:useenv=true</string> - <string>/verbosity:minimal</string> - <string>/toolsversion:4.0</string> - <string>/p:"VCBuildAdditionalOptions= /incremental"</string> - </array> - </map> - <key>configure</key> - <map> - <key>options</key> - <array> - <string>-G</string> - <string>"Visual Studio 10"</string> - <string>-DUNATTENDED:BOOL=ON</string> - <string>-DUSE_PRECOMPILED_HEADERS=ON</string> - <string>-DINSTALL_PROPRIETARY=TRUE</string> - <string>-DUSE_KDU=FALSE</string> - <string>-DFMOD=FALSE</string> - </array> - </map> - <key>name</key> - <string>RelWithDebInfoOS</string> - </map> - <key>Release</key> - <map> - <key>build</key> - <map> - <key>arguments</key> - <array> - <string>SecondLife.sln</string> - </array> - <key>command</key> - <string>BuildConsole</string> - <key>options</key> - <array> - <string>/build</string> - <string>"/cfg=Release|Win32"</string> - <string>"/CL_ADD=/m:1"</string> - </array> - </map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>..\indra</string> - <string>&&</string> - <string>..\indra\tools\vstool\VSTool.exe</string> - <string>--solution</string> - <string>SecondLife.sln</string> - <string>--config</string> - <string>Release</string> - <string>--startup</string> - <string>secondlife-bin</string> - </array> - <key>options</key> - <array> - <string>-G</string> - <string>"Visual Studio 10"</string> - </array> - </map> - <key>name</key> - <string>Release</string> - </map> - <key>ReleaseOS</key> - <map> - <key>build</key> - <map> - <key>arguments</key> - <array> - <string>SecondLife.sln</string> - </array> - <key>command</key> - <string>msbuild.exe</string> - <key>options</key> - <array> - <string>/p:Configuration=Release</string> - <string>/p:Platform=Win32</string> - <string>/t:Build</string> - <string>/p:useenv=true</string> - <string>/verbosity:minimal</string> - <string>/toolsversion:4.0</string> - <string>/p:"VCBuildAdditionalOptions= /incremental"</string> - </array> - </map> - <key>configure</key> - <map> - <key>options</key> - <array> - <string>-G</string> - <string>"Visual Studio 10"</string> - <string>-DUNATTENDED:BOOL=ON</string> - <string>-DUSE_PRECOMPILED_HEADERS=ON</string> - <string>-DINSTALL_PROPRIETARY=TRUE</string> - <string>-DUSE_KDU=FALSE</string> - <string>-DFMOD=FALSE</string> - </array> - </map> - <key>name</key> - <string>ReleaseOS</string> </map> + <key>name</key> + <string>windows</string> </map> - <key>name</key> - <string>windows</string> </map> </map> + <key>type</key> + <string>autobuild</string> + <key>version</key> + <string>1.2</string> </map> - <key>type</key> - <string>autobuild</string> - <key>version</key> - <string>1.2</string> -</map> </llsd> -- cgit v1.2.3 From 873bd8ce26798fbea625b2323e7a84229ed92343 Mon Sep 17 00:00:00 2001 From: prep <prep@lindenlab.com> Date: Thu, 28 Apr 2011 14:22:11 -0400 Subject: Fix for SH-718 --- indra/newview/llfloatermodelpreview.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h index 186bf114d1..837484adb6 100644 --- a/indra/newview/llfloatermodelpreview.h +++ b/indra/newview/llfloatermodelpreview.h @@ -331,8 +331,8 @@ public: void setLoadState( U32 state ) { mLoadState = state; } U32 getLoadState() { return mLoadState; } - - void setResetJointFlag( bool state ) { mResetJoints = state; } + //setRestJointFlag: If an asset comes through that changes the joints, we want the reset to persist + void setResetJointFlag( bool state ) { if ( !mResetJoints ) mResetJoints = state; } bool getResetJointFlag( void ) { return mResetJoints; } LLVector3 getTranslationForJointOffset( std::string joint ); -- cgit v1.2.3 From b98a17c8255881ce0bf48b213ea6be8887363e1e Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Thu, 28 Apr 2011 16:40:06 -0500 Subject: SH-1443 Fix for fullbright alpha objects not appearing for some combinations of deferred rendering and non deferred automatic alpha mask toggling. --- indra/newview/lldrawpoolalpha.cpp | 8 +- indra/newview/llface.cpp | 32 +- indra/newview/llvovolume.cpp | 9402 ++++++++++++++++++------------------- 3 files changed, 4728 insertions(+), 4714 deletions(-) diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp index a2a109d5ee..2cfd3b0a33 100644 --- a/indra/newview/lldrawpoolalpha.cpp +++ b/indra/newview/lldrawpoolalpha.cpp @@ -210,7 +210,7 @@ void LLDrawPoolAlpha::render(S32 pass) gGL.setColorMask(true, true); } - if (LLPipeline::sAutoMaskAlphaNonDeferred && !deferred_render) + if (LLPipeline::sAutoMaskAlphaNonDeferred) { mColorSFactor = LLRender::BF_ONE; // } mColorDFactor = LLRender::BF_ZERO; // } these are like disabling blend on the color channels, but we're still blending on the alpha channel so that we can suppress glow @@ -226,7 +226,10 @@ void LLDrawPoolAlpha::render(S32 pass) simple_shader->bind(); pushBatches(LLRenderPass::PASS_ALPHA_MASK, getVertexDataMask()); } - fullbright_shader->bind(); + if (fullbright_shader) + { + fullbright_shader->bind(); + } pushBatches(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, getVertexDataMask()); LLGLSLShader::bindNoShader(); } @@ -273,6 +276,7 @@ void LLDrawPoolAlpha::render(S32 pass) if (deferred_render && pass == 1) { gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); + gGL.setSceneBlendType(LLRender::BT_ALPHA); } if (deferred_render && current_shader != NULL) diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index ae455a8287..5398c13c44 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -979,19 +979,29 @@ bool LLFace::canRenderAsMask() } const LLTextureEntry* te = getTextureEntry(); - return ( - ( - (LLPipeline::sRenderDeferred && LLPipeline::sAutoMaskAlphaDeferred) || - - (!LLPipeline::sRenderDeferred && LLPipeline::sAutoMaskAlphaNonDeferred) - ) // do we want masks at all? - && - (te->getColor().mV[3] == 1.0f) && // can't treat as mask if we have face alpha - !(LLPipeline::sRenderDeferred && te->getFullbright()) && // hack: alpha masking renders fullbright faces invisible in deferred rendering mode, need to figure out why - for now, avoid + + if ((te->getColor().mV[3] == 1.0f) && // can't treat as mask if we have face alpha (te->getGlow() == 0.f) && // glowing masks are hard to implement - don't mask + getTexture()->getIsAlphaMask()) // texture actually qualifies for masking (lazily recalculated but expensive) + { + if (LLPipeline::sRenderDeferred) + { + if (getViewerObject()->isHUDAttachment() || te->getFullbright()) + { //hud attachments and fullbright objects are NOT subject to the deferred rendering pipe + return LLPipeline::sAutoMaskAlphaNonDeferred; + } + else + { + return LLPipeline::sAutoMaskAlphaDeferred; + } + } + else + { + return LLPipeline::sAutoMaskAlphaNonDeferred; + } + } - getTexture()->getIsAlphaMask() // texture actually qualifies for masking (lazily recalculated but expensive) - ); + return false; } diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 45277265df..9d2887d2e8 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -1,4709 +1,4709 @@ -/** - * @file llvovolume.cpp - * @brief LLVOVolume class implementation - * - * $LicenseInfo:firstyear=2001&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -// A "volume" is a box, cylinder, sphere, or other primitive shape. - -#include "llviewerprecompiledheaders.h" - -#include "llvovolume.h" - -#include <sstream> - -#include "llviewercontrol.h" -#include "lldir.h" -#include "llflexibleobject.h" -#include "llfloatertools.h" -#include "llmaterialtable.h" -#include "llprimitive.h" -#include "llvolume.h" -#include "llvolumeoctree.h" -#include "llvolumemgr.h" -#include "llvolumemessage.h" -#include "material_codes.h" -#include "message.h" -#include "llpluginclassmedia.h" // for code in the mediaEvent handler -#include "object_flags.h" -#include "llagentconstants.h" -#include "lldrawable.h" -#include "lldrawpoolavatar.h" -#include "lldrawpoolbump.h" -#include "llface.h" -#include "llspatialpartition.h" -#include "llhudmanager.h" -#include "llflexibleobject.h" -#include "llsky.h" -#include "lltexturefetch.h" -#include "llvector4a.h" -#include "llviewercamera.h" -#include "llviewertexturelist.h" -#include "llviewerobjectlist.h" -#include "llviewerregion.h" -#include "llviewertextureanim.h" -#include "llworld.h" -#include "llselectmgr.h" -#include "pipeline.h" -#include "llsdutil.h" -#include "llmatrix4a.h" -#include "llmediaentry.h" -#include "llmediadataclient.h" -#include "llmeshrepository.h" -#include "llagent.h" -#include "llviewermediafocus.h" -#include "llvoavatar.h" - -const S32 MIN_QUIET_FRAMES_COALESCE = 30; -const F32 FORCE_SIMPLE_RENDER_AREA = 512.f; -const F32 FORCE_CULL_AREA = 8.f; -const F32 MAX_LOD_DISTANCE = 24.f; - - -BOOL gAnimateTextures = TRUE; -//extern BOOL gHideSelectedObjects; - -F32 LLVOVolume::sLODFactor = 1.f; -F32 LLVOVolume::sLODSlopDistanceFactor = 0.5f; //Changing this to zero, effectively disables the LOD transition slop -F32 LLVOVolume::sDistanceFactor = 1.0f; -S32 LLVOVolume::sNumLODChanges = 0; -LLPointer<LLObjectMediaDataClient> LLVOVolume::sObjectMediaClient = NULL; -LLPointer<LLObjectMediaNavigateClient> LLVOVolume::sObjectMediaNavigateClient = NULL; - -static LLFastTimer::DeclareTimer FTM_GEN_TRIANGLES("Generate Triangles"); -static LLFastTimer::DeclareTimer FTM_GEN_VOLUME("Generate Volumes"); -static LLFastTimer::DeclareTimer FTM_VOLUME_TEXTURES("Volume Textures"); - -// Implementation class of LLMediaDataClientObject. See llmediadataclient.h -class LLMediaDataClientObjectImpl : public LLMediaDataClientObject -{ -public: - LLMediaDataClientObjectImpl(LLVOVolume *obj, bool isNew) : mObject(obj), mNew(isNew) - { - mObject->addMDCImpl(); - } - ~LLMediaDataClientObjectImpl() - { - mObject->removeMDCImpl(); - } - - virtual U8 getMediaDataCount() const - { return mObject->getNumTEs(); } - - virtual LLSD getMediaDataLLSD(U8 index) const - { - LLSD result; - LLTextureEntry *te = mObject->getTE(index); - if (NULL != te) - { - llassert((te->getMediaData() != NULL) == te->hasMedia()); - if (te->getMediaData() != NULL) - { - result = te->getMediaData()->asLLSD(); - // XXX HACK: workaround bug in asLLSD() where whitelist is not set properly - // See DEV-41949 - if (!result.has(LLMediaEntry::WHITELIST_KEY)) - { - result[LLMediaEntry::WHITELIST_KEY] = LLSD::emptyArray(); - } - } - } - return result; - } - virtual bool isCurrentMediaUrl(U8 index, const std::string &url) const - { - LLTextureEntry *te = mObject->getTE(index); - if (te) - { - if (te->getMediaData()) - { - return (te->getMediaData()->getCurrentURL() == url); - } - } - return url.empty(); - } - - virtual LLUUID getID() const - { return mObject->getID(); } - - virtual void mediaNavigateBounceBack(U8 index) - { mObject->mediaNavigateBounceBack(index); } - - virtual bool hasMedia() const - { return mObject->hasMedia(); } - - virtual void updateObjectMediaData(LLSD const &data, const std::string &version_string) - { mObject->updateObjectMediaData(data, version_string); } - - virtual F64 getMediaInterest() const - { - F64 interest = mObject->getTotalMediaInterest(); - if (interest < (F64)0.0) - { - // media interest not valid yet, try pixel area - interest = mObject->getPixelArea(); - // HACK: force recalculation of pixel area if interest is the "magic default" of 1024. - if (interest == 1024.f) - { - const_cast<LLVOVolume*>(static_cast<LLVOVolume*>(mObject))->setPixelAreaAndAngle(gAgent); - interest = mObject->getPixelArea(); - } - } - return interest; - } - - virtual bool isInterestingEnough() const - { - return LLViewerMedia::isInterestingEnough(mObject, getMediaInterest()); - } - - virtual std::string getCapabilityUrl(const std::string &name) const - { return mObject->getRegion()->getCapability(name); } - - virtual bool isDead() const - { return mObject->isDead(); } - - virtual U32 getMediaVersion() const - { return LLTextureEntry::getVersionFromMediaVersionString(mObject->getMediaURL()); } - - virtual bool isNew() const - { return mNew; } - -private: - LLPointer<LLVOVolume> mObject; - bool mNew; -}; - - -LLVOVolume::LLVOVolume(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp) - : LLViewerObject(id, pcode, regionp), - mVolumeImpl(NULL) -{ - mTexAnimMode = 0; - mRelativeXform.setIdentity(); - mRelativeXformInvTrans.setIdentity(); - - mFaceMappingChanged = FALSE; - mLOD = MIN_LOD; - mTextureAnimp = NULL; - mVolumeChanged = FALSE; - mVObjRadius = LLVector3(1,1,0.5f).length(); - mNumFaces = 0; - mLODChanged = FALSE; - mSculptChanged = FALSE; - mSpotLightPriority = 0.f; - - mMediaImplList.resize(getNumTEs()); - mLastFetchedMediaVersion = -1; - mIndexInTex = 0; - mMDCImplCount = 0; -} - -LLVOVolume::~LLVOVolume() -{ - delete mTextureAnimp; - mTextureAnimp = NULL; - delete mVolumeImpl; - mVolumeImpl = NULL; - - if(!mMediaImplList.empty()) - { - for(U32 i = 0 ; i < mMediaImplList.size() ; i++) - { - if(mMediaImplList[i].notNull()) - { - mMediaImplList[i]->removeObject(this) ; - } - } - } -} - -void LLVOVolume::markDead() -{ - if (!mDead) - { - if(getMDCImplCount() > 0) - { - LLMediaDataClientObject::ptr_t obj = new LLMediaDataClientObjectImpl(const_cast<LLVOVolume*>(this), false); - if (sObjectMediaClient) sObjectMediaClient->removeFromQueue(obj); - if (sObjectMediaNavigateClient) sObjectMediaNavigateClient->removeFromQueue(obj); - } - - // Detach all media impls from this object - for(U32 i = 0 ; i < mMediaImplList.size() ; i++) - { - removeMediaImpl(i); - } - - if (mSculptTexture.notNull()) - { - mSculptTexture->removeVolume(this); - } - } - - LLViewerObject::markDead(); -} - - -// static -void LLVOVolume::initClass() -{ - // gSavedSettings better be around - if (gSavedSettings.getBOOL("PrimMediaMasterEnabled")) - { - const F32 queue_timer_delay = gSavedSettings.getF32("PrimMediaRequestQueueDelay"); - const F32 retry_timer_delay = gSavedSettings.getF32("PrimMediaRetryTimerDelay"); - const U32 max_retries = gSavedSettings.getU32("PrimMediaMaxRetries"); - const U32 max_sorted_queue_size = gSavedSettings.getU32("PrimMediaMaxSortedQueueSize"); - const U32 max_round_robin_queue_size = gSavedSettings.getU32("PrimMediaMaxRoundRobinQueueSize"); - sObjectMediaClient = new LLObjectMediaDataClient(queue_timer_delay, retry_timer_delay, max_retries, - max_sorted_queue_size, max_round_robin_queue_size); - sObjectMediaNavigateClient = new LLObjectMediaNavigateClient(queue_timer_delay, retry_timer_delay, - max_retries, max_sorted_queue_size, max_round_robin_queue_size); - } -} - -// static -void LLVOVolume::cleanupClass() -{ - sObjectMediaClient = NULL; - sObjectMediaNavigateClient = NULL; -} - -U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys, - void **user_data, - U32 block_num, EObjectUpdateType update_type, - LLDataPacker *dp) -{ - LLColor4U color; - const S32 teDirtyBits = (TEM_CHANGE_TEXTURE|TEM_CHANGE_COLOR|TEM_CHANGE_MEDIA); - - // Do base class updates... - U32 retval = LLViewerObject::processUpdateMessage(mesgsys, user_data, block_num, update_type, dp); - - LLUUID sculpt_id; - U8 sculpt_type = 0; - if (isSculpted()) - { - LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT); - sculpt_id = sculpt_params->getSculptTexture(); - sculpt_type = sculpt_params->getSculptType(); - } - - if (!dp) - { - if (update_type == OUT_FULL) - { - //////////////////////////////// - // - // Unpack texture animation data - // - // - - if (mesgsys->getSizeFast(_PREHASH_ObjectData, block_num, _PREHASH_TextureAnim)) - { - if (!mTextureAnimp) - { - mTextureAnimp = new LLViewerTextureAnim(); - } - else - { - if (!(mTextureAnimp->mMode & LLTextureAnim::SMOOTH)) - { - mTextureAnimp->reset(); - } - } - mTexAnimMode = 0; - mTextureAnimp->unpackTAMessage(mesgsys, block_num); - } - else - { - if (mTextureAnimp) - { - delete mTextureAnimp; - mTextureAnimp = NULL; - gPipeline.markTextured(mDrawable); - mFaceMappingChanged = TRUE; - mTexAnimMode = 0; - } - } - - // Unpack volume data - LLVolumeParams volume_params; - LLVolumeMessage::unpackVolumeParams(&volume_params, mesgsys, _PREHASH_ObjectData, block_num); - volume_params.setSculptID(sculpt_id, sculpt_type); - - if (setVolume(volume_params, 0)) - { - markForUpdate(TRUE); - } - } - - // Sigh, this needs to be done AFTER the volume is set as well, otherwise bad stuff happens... - //////////////////////////// - // - // Unpack texture entry data - // - S32 result = unpackTEMessage(mesgsys, _PREHASH_ObjectData, block_num); - if (result & teDirtyBits) - { - updateTEData(); - } - if (result & TEM_CHANGE_MEDIA) - { - retval |= MEDIA_FLAGS_CHANGED; - } - } - else - { - // CORY TO DO: Figure out how to get the value here - if (update_type != OUT_TERSE_IMPROVED) - { - LLVolumeParams volume_params; - BOOL res = LLVolumeMessage::unpackVolumeParams(&volume_params, *dp); - if (!res) - { - llwarns << "Bogus volume parameters in object " << getID() << llendl; - llwarns << getRegion()->getOriginGlobal() << llendl; - } - - volume_params.setSculptID(sculpt_id, sculpt_type); - - if (setVolume(volume_params, 0)) - { - markForUpdate(TRUE); - } - S32 res2 = unpackTEMessage(*dp); - if (TEM_INVALID == res2) - { - // There's something bogus in the data that we're unpacking. - dp->dumpBufferToLog(); - llwarns << "Flushing cache files" << llendl; - - if(LLVOCache::hasInstance() && getRegion()) - { - LLVOCache::getInstance()->removeEntry(getRegion()->getHandle()) ; - } - - llwarns << "Bogus TE data in " << getID() << llendl; - } - else - { - if (res2 & teDirtyBits) - { - updateTEData(); - } - if (res2 & TEM_CHANGE_MEDIA) - { - retval |= MEDIA_FLAGS_CHANGED; - } - } - - U32 value = dp->getPassFlags(); - - if (value & 0x40) - { - if (!mTextureAnimp) - { - mTextureAnimp = new LLViewerTextureAnim(); - } - else - { - if (!(mTextureAnimp->mMode & LLTextureAnim::SMOOTH)) - { - mTextureAnimp->reset(); - } - } - mTexAnimMode = 0; - mTextureAnimp->unpackTAMessage(*dp); - } - else if (mTextureAnimp) - { - delete mTextureAnimp; - mTextureAnimp = NULL; - gPipeline.markTextured(mDrawable); - mFaceMappingChanged = TRUE; - mTexAnimMode = 0; - } - } - else - { - S32 texture_length = mesgsys->getSizeFast(_PREHASH_ObjectData, block_num, _PREHASH_TextureEntry); - if (texture_length) - { - U8 tdpbuffer[1024]; - LLDataPackerBinaryBuffer tdp(tdpbuffer, 1024); - mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_TextureEntry, tdpbuffer, 0, block_num); - S32 result = unpackTEMessage(tdp); - if (result & teDirtyBits) - { - updateTEData(); - } - if (result & TEM_CHANGE_MEDIA) - { - retval |= MEDIA_FLAGS_CHANGED; - } - } - } - } - if (retval & (MEDIA_URL_REMOVED | MEDIA_URL_ADDED | MEDIA_URL_UPDATED | MEDIA_FLAGS_CHANGED)) - { - // If only the media URL changed, and it isn't a media version URL, - // ignore it - if ( ! ( retval & (MEDIA_URL_ADDED | MEDIA_URL_UPDATED) && - mMedia && ! mMedia->mMediaURL.empty() && - ! LLTextureEntry::isMediaVersionString(mMedia->mMediaURL) ) ) - { - // If the media changed at all, request new media data - LL_DEBUGS("MediaOnAPrim") << "Media update: " << getID() << ": retval=" << retval << " Media URL: " << - ((mMedia) ? mMedia->mMediaURL : std::string("")) << LL_ENDL; - requestMediaDataUpdate(retval & MEDIA_FLAGS_CHANGED); - } - else { - LL_INFOS("MediaOnAPrim") << "Ignoring media update for: " << getID() << " Media URL: " << - ((mMedia) ? mMedia->mMediaURL : std::string("")) << LL_ENDL; - } - } - // ...and clean up any media impls - cleanUpMediaImpls(); - - return retval; -} - - -void LLVOVolume::animateTextures() -{ - F32 off_s = 0.f, off_t = 0.f, scale_s = 1.f, scale_t = 1.f, rot = 0.f; - S32 result = mTextureAnimp->animateTextures(off_s, off_t, scale_s, scale_t, rot); - - if (result) - { - if (!mTexAnimMode) - { - mFaceMappingChanged = TRUE; - gPipeline.markTextured(mDrawable); - } - mTexAnimMode = result | mTextureAnimp->mMode; - - S32 start=0, end=mDrawable->getNumFaces()-1; - if (mTextureAnimp->mFace >= 0 && mTextureAnimp->mFace <= end) - { - start = end = mTextureAnimp->mFace; - } - - for (S32 i = start; i <= end; i++) - { - LLFace* facep = mDrawable->getFace(i); - if(facep->getVirtualSize() <= MIN_TEX_ANIM_SIZE && facep->mTextureMatrix) continue; - - const LLTextureEntry* te = facep->getTextureEntry(); - - if (!te) - { - continue; - } - - if (!(result & LLViewerTextureAnim::ROTATE)) - { - te->getRotation(&rot); - } - if (!(result & LLViewerTextureAnim::TRANSLATE)) - { - te->getOffset(&off_s,&off_t); - } - if (!(result & LLViewerTextureAnim::SCALE)) - { - te->getScale(&scale_s, &scale_t); - } - - if (!facep->mTextureMatrix) - { - facep->mTextureMatrix = new LLMatrix4(); - } - - LLMatrix4& tex_mat = *facep->mTextureMatrix; - tex_mat.setIdentity(); - LLVector3 trans ; - - if(facep->isAtlasInUse()) - { - // - //if use atlas for animated texture - //apply the following transform to the animation matrix. - // - - F32 tcoord_xoffset = 0.f ; - F32 tcoord_yoffset = 0.f ; - F32 tcoord_xscale = 1.f ; - F32 tcoord_yscale = 1.f ; - if(facep->isAtlasInUse()) - { - const LLVector2* tmp = facep->getTexCoordOffset() ; - tcoord_xoffset = tmp->mV[0] ; - tcoord_yoffset = tmp->mV[1] ; - - tmp = facep->getTexCoordScale() ; - tcoord_xscale = tmp->mV[0] ; - tcoord_yscale = tmp->mV[1] ; - } - trans.set(LLVector3(tcoord_xoffset + tcoord_xscale * (off_s+0.5f), tcoord_yoffset + tcoord_yscale * (off_t+0.5f), 0.f)); - - tex_mat.translate(LLVector3(-(tcoord_xoffset + tcoord_xscale * 0.5f), -(tcoord_yoffset + tcoord_yscale * 0.5f), 0.f)); - } - else //non atlas - { - trans.set(LLVector3(off_s+0.5f, off_t+0.5f, 0.f)); - tex_mat.translate(LLVector3(-0.5f, -0.5f, 0.f)); - } - - LLVector3 scale(scale_s, scale_t, 1.f); - LLQuaternion quat; - quat.setQuat(rot, 0, 0, -1.f); - - tex_mat.rotate(quat); - - LLMatrix4 mat; - mat.initAll(scale, LLQuaternion(), LLVector3()); - tex_mat *= mat; - - tex_mat.translate(trans); - } - } - else - { - if (mTexAnimMode && mTextureAnimp->mRate == 0) - { - U8 start, count; - - if (mTextureAnimp->mFace == -1) - { - start = 0; - count = getNumTEs(); - } - else - { - start = (U8) mTextureAnimp->mFace; - count = 1; - } - - for (S32 i = start; i < start + count; i++) - { - if (mTexAnimMode & LLViewerTextureAnim::TRANSLATE) - { - setTEOffset(i, mTextureAnimp->mOffS, mTextureAnimp->mOffT); - } - if (mTexAnimMode & LLViewerTextureAnim::SCALE) - { - setTEScale(i, mTextureAnimp->mScaleS, mTextureAnimp->mScaleT); - } - if (mTexAnimMode & LLViewerTextureAnim::ROTATE) - { - setTERotation(i, mTextureAnimp->mRot); - } - } - - gPipeline.markTextured(mDrawable); - mFaceMappingChanged = TRUE; - mTexAnimMode = 0; - } - } -} -BOOL LLVOVolume::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) -{ - LLViewerObject::idleUpdate(agent, world, time); - - static LLFastTimer::DeclareTimer ftm("Volume"); - LLFastTimer t(ftm); - - if (mDead || mDrawable.isNull()) - { - return TRUE; - } - - /////////////////////// - // - // Do texture animation stuff - // - - if (mTextureAnimp && gAnimateTextures) - { - animateTextures(); - } - - // Dispatch to implementation - if (mVolumeImpl) - { - mVolumeImpl->doIdleUpdate(agent, world, time); - } - - const S32 MAX_ACTIVE_OBJECT_QUIET_FRAMES = 40; - - if (mDrawable->isActive()) - { - if (mDrawable->isRoot() && - mDrawable->mQuietCount++ > MAX_ACTIVE_OBJECT_QUIET_FRAMES && - (!mDrawable->getParent() || !mDrawable->getParent()->isActive())) - { - mDrawable->makeStatic(); - } - } - - return TRUE; -} - -void LLVOVolume::updateTextures() -{ - const F32 TEXTURE_AREA_REFRESH_TIME = 5.f; // seconds - if (mTextureUpdateTimer.getElapsedTimeF32() > TEXTURE_AREA_REFRESH_TIME) - { - updateTextureVirtualSize(); - } -} - -BOOL LLVOVolume::isVisible() const -{ - if(mDrawable.notNull() && mDrawable->isVisible()) - { - return TRUE ; - } - - if(isAttachment()) - { - LLViewerObject* objp = (LLViewerObject*)getParent() ; - while(objp && !objp->isAvatar()) - { - objp = (LLViewerObject*)objp->getParent() ; - } - - return objp && objp->mDrawable.notNull() && objp->mDrawable->isVisible() ; - } - - return FALSE ; -} - -void LLVOVolume::updateTextureVirtualSize() -{ - LLFastTimer ftm(FTM_VOLUME_TEXTURES); - // Update the pixel area of all faces - - if(!isVisible()) - { - return ; - } - - if (!gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_SIMPLE)) - { - return; - } - - static LLCachedControl<bool> dont_load_textures(gSavedSettings,"TextureDisable"); - - if (dont_load_textures || LLAppViewer::getTextureFetch()->mDebugPause) // || !mDrawable->isVisible()) - { - return; - } - - mTextureUpdateTimer.reset(); - - F32 old_area = mPixelArea; - mPixelArea = 0.f; - - const S32 num_faces = mDrawable->getNumFaces(); - F32 min_vsize=999999999.f, max_vsize=0.f; - LLViewerCamera* camera = LLViewerCamera::getInstance(); - for (S32 i = 0; i < num_faces; i++) - { - LLFace* face = mDrawable->getFace(i); - const LLTextureEntry *te = face->getTextureEntry(); - LLViewerTexture *imagep = face->getTexture(); - if (!imagep || !te || - face->mExtents[0].equals3(face->mExtents[1])) - { - continue; - } - - F32 vsize; - F32 old_size = face->getVirtualSize(); - - if (isHUDAttachment()) - { - F32 area = (F32) camera->getScreenPixelArea(); - vsize = area; - imagep->setBoostLevel(LLViewerTexture::BOOST_HUD); - face->setPixelArea(area); // treat as full screen - face->setVirtualSize(vsize); - } - else - { - vsize = face->getTextureVirtualSize(); - } - - mPixelArea = llmax(mPixelArea, face->getPixelArea()); - - if (face->mTextureMatrix != NULL) - { - if ((vsize < MIN_TEX_ANIM_SIZE && old_size > MIN_TEX_ANIM_SIZE) || - (vsize > MIN_TEX_ANIM_SIZE && old_size < MIN_TEX_ANIM_SIZE)) - { - gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD, FALSE); - } - } - - if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXTURE_AREA)) - { - if (vsize < min_vsize) min_vsize = vsize; - if (vsize > max_vsize) max_vsize = vsize; - } - else if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXTURE_PRIORITY)) - { - LLViewerFetchedTexture* img = LLViewerTextureManager::staticCastToFetchedTexture(imagep) ; - if(img) - { - F32 pri = img->getDecodePriority(); - pri = llmax(pri, 0.0f); - if (pri < min_vsize) min_vsize = pri; - if (pri > max_vsize) max_vsize = pri; - } - } - else if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_FACE_AREA)) - { - F32 pri = mPixelArea; - if (pri < min_vsize) min_vsize = pri; - if (pri > max_vsize) max_vsize = pri; - } - } - - if (isSculpted()) - { - LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT); - LLUUID id = sculpt_params->getSculptTexture(); - - updateSculptTexture(); - - - - if (mSculptTexture.notNull()) - { - mSculptTexture->setBoostLevel(llmax((S32)mSculptTexture->getBoostLevel(), - (S32)LLViewerTexture::BOOST_SCULPTED)); - mSculptTexture->setForSculpt() ; - - if(!mSculptTexture->isCachedRawImageReady()) - { - S32 lod = llmin(mLOD, 3); - F32 lodf = ((F32)(lod + 1.0f)/4.f); - F32 tex_size = lodf * LLViewerTexture::sMaxSculptRez ; - mSculptTexture->addTextureStats(2.f * tex_size * tex_size, FALSE); - - //if the sculpty very close to the view point, load first - { - LLVector3 lookAt = getPositionAgent() - camera->getOrigin(); - F32 dist = lookAt.normVec() ; - F32 cos_angle_to_view_dir = lookAt * camera->getXAxis() ; - mSculptTexture->setAdditionalDecodePriority(0.8f * LLFace::calcImportanceToCamera(cos_angle_to_view_dir, dist)) ; - } - } - - S32 texture_discard = mSculptTexture->getDiscardLevel(); //try to match the texture - S32 current_discard = getVolume() ? getVolume()->getSculptLevel() : -2 ; - - if (texture_discard >= 0 && //texture has some data available - (texture_discard < current_discard || //texture has more data than last rebuild - current_discard < 0)) //no previous rebuild - { - gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, FALSE); - mSculptChanged = TRUE; - } - - if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SCULPTED)) - { - setDebugText(llformat("T%d C%d V%d\n%dx%d", - texture_discard, current_discard, getVolume()->getSculptLevel(), - mSculptTexture->getHeight(), mSculptTexture->getWidth())); - } - } - - } - - if (getLightTextureID().notNull()) - { - LLLightImageParams* params = (LLLightImageParams*) getParameterEntry(LLNetworkData::PARAMS_LIGHT_IMAGE); - LLUUID id = params->getLightTexture(); - mLightTexture = LLViewerTextureManager::getFetchedTexture(id); - if (mLightTexture.notNull()) - { - F32 rad = getLightRadius(); - mLightTexture->addTextureStats(gPipeline.calcPixelArea(getPositionAgent(), - LLVector3(rad,rad,rad), - *camera)); - } - } - - if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXTURE_AREA)) - { - setDebugText(llformat("%.0f:%.0f", (F32) sqrt(min_vsize),(F32) sqrt(max_vsize))); - } - else if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXTURE_PRIORITY)) - { - setDebugText(llformat("%.0f:%.0f", (F32) sqrt(min_vsize),(F32) sqrt(max_vsize))); - } - else if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_FACE_AREA)) - { - setDebugText(llformat("%.0f:%.0f", (F32) sqrt(min_vsize),(F32) sqrt(max_vsize))); - } - - if (mPixelArea == 0) - { //flexi phasing issues make this happen - mPixelArea = old_area; - } -} - -BOOL LLVOVolume::isActive() const -{ - return !mStatic || mTextureAnimp || (mVolumeImpl && mVolumeImpl->isActive()) || - (mDrawable.notNull() && mDrawable->isActive()); -} - -BOOL LLVOVolume::setMaterial(const U8 material) -{ - BOOL res = LLViewerObject::setMaterial(material); - - return res; -} - -void LLVOVolume::setTexture(const S32 face) -{ - llassert(face < getNumTEs()); - gGL.getTexUnit(0)->bind(getTEImage(face)); -} - -void LLVOVolume::setScale(const LLVector3 &scale, BOOL damped) -{ - if (scale != getScale()) - { - // store local radius - LLViewerObject::setScale(scale); - - if (mVolumeImpl) - { - mVolumeImpl->onSetScale(scale, damped); - } - - updateRadius(); - - //since drawable transforms do not include scale, changing volume scale - //requires an immediate rebuild of volume verts. - gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_POSITION, TRUE); - } -} - -LLFace* LLVOVolume::addFace(S32 f) -{ - const LLTextureEntry* te = getTE(f); - LLViewerTexture* imagep = getTEImage(f); - return mDrawable->addFace(te, imagep); -} - -LLDrawable *LLVOVolume::createDrawable(LLPipeline *pipeline) -{ - pipeline->allocDrawable(this); - - mDrawable->setRenderType(LLPipeline::RENDER_TYPE_VOLUME); - - S32 max_tes_to_set = getNumTEs(); - for (S32 i = 0; i < max_tes_to_set; i++) - { - addFace(i); - } - mNumFaces = max_tes_to_set; - - if (isAttachment()) - { - mDrawable->makeActive(); - } - - if (getIsLight()) - { - // Add it to the pipeline mLightSet - gPipeline.setLight(mDrawable, TRUE); - } - - updateRadius(); - bool force_update = true; // avoid non-alpha mDistance update being optimized away - mDrawable->updateDistance(*LLViewerCamera::getInstance(), force_update); - - return mDrawable; -} - -BOOL LLVOVolume::setVolume(const LLVolumeParams ¶ms_in, const S32 detail, bool unique_volume) -{ - LLVolumeParams volume_params = params_in; - - S32 last_lod = mVolumep.notNull() ? LLVolumeLODGroup::getVolumeDetailFromScale(mVolumep->getDetail()) : -1; - S32 lod = mLOD; - - BOOL is404 = FALSE; - - if (isSculpted()) - { - // if it's a mesh - if ((volume_params.getSculptType() & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH) - { //meshes might not have all LODs, get the force detail to best existing LOD - - LLUUID mesh_id = volume_params.getSculptID(); - - //profile and path params don't matter for meshes - volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE); - - lod = gMeshRepo.getActualMeshLOD(volume_params, lod); - if (lod == -1) - { - is404 = TRUE; - lod = 0; - } - } - } - - // Check if we need to change implementations - bool is_flexible = (volume_params.getPathParams().getCurveType() == LL_PCODE_PATH_FLEXIBLE); - if (is_flexible) - { - setParameterEntryInUse(LLNetworkData::PARAMS_FLEXIBLE, TRUE, false); - if (!mVolumeImpl) - { - LLFlexibleObjectData* data = (LLFlexibleObjectData*)getParameterEntry(LLNetworkData::PARAMS_FLEXIBLE); - mVolumeImpl = new LLVolumeImplFlexible(this, data); - } - } - else - { - // Mark the parameter not in use - setParameterEntryInUse(LLNetworkData::PARAMS_FLEXIBLE, FALSE, false); - if (mVolumeImpl) - { - delete mVolumeImpl; - mVolumeImpl = NULL; - if (mDrawable.notNull()) - { - // Undo the damage we did to this matrix - mDrawable->updateXform(FALSE); - } - } - } - - if (is404) - { - setIcon(LLViewerTextureManager::getFetchedTextureFromFile("icons/Inv_Mesh.png", TRUE, LLViewerTexture::BOOST_UI)); - } - - if ((LLPrimitive::setVolume(volume_params, lod, (mVolumeImpl && mVolumeImpl->isVolumeUnique()))) || mSculptChanged) - { - mFaceMappingChanged = TRUE; - - if (mVolumeImpl) - { - mVolumeImpl->onSetVolume(volume_params, mLOD); - } - - updateSculptTexture(); - - - if (isSculpted()) - { - updateSculptTexture(); - // if it's a mesh - if ((volume_params.getSculptType() & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH) - { - if (getVolume()->getNumVolumeFaces() == 0 || getVolume()->isTetrahedron()) - { - //load request not yet issued, request pipeline load this mesh - LLUUID asset_id = volume_params.getSculptID(); - S32 available_lod = gMeshRepo.loadMesh(this, volume_params, lod, last_lod); - if (available_lod != lod) - { - LLPrimitive::setVolume(volume_params, available_lod); - } - } - - } - else // otherwise is sculptie - { - if (mSculptTexture.notNull()) - { - sculpt(); - } - } - } - - return TRUE; - } - - return FALSE; -} - -void LLVOVolume::updateSculptTexture() -{ - LLPointer<LLViewerFetchedTexture> old_sculpt = mSculptTexture; - - if (isSculpted() && !isMesh()) - { - LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT); - LLUUID id = sculpt_params->getSculptTexture(); - if (id.notNull()) - { - mSculptTexture = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); - } - } - else - { - mSculptTexture = NULL; - } - - if (mSculptTexture != old_sculpt) - { - if (old_sculpt.notNull()) - { - old_sculpt->removeVolume(this); - } - if (mSculptTexture.notNull()) - { - mSculptTexture->addVolume(this); - } - } - -} - - - -void LLVOVolume::notifyMeshLoaded() -{ - mSculptChanged = TRUE; - gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_GEOMETRY, TRUE); -} - -// sculpt replaces generate() for sculpted surfaces -void LLVOVolume::sculpt() -{ - if (mSculptTexture.notNull()) - { - U16 sculpt_height = 0; - U16 sculpt_width = 0; - S8 sculpt_components = 0; - const U8* sculpt_data = NULL; - - S32 discard_level = mSculptTexture->getDiscardLevel() ; - LLImageRaw* raw_image = mSculptTexture->getCachedRawImage() ; - - S32 max_discard = mSculptTexture->getMaxDiscardLevel(); - if (discard_level > max_discard) - discard_level = max_discard; // clamp to the best we can do - - S32 current_discard = getVolume()->getSculptLevel() ; - if(current_discard < -2) - { - llwarns << "WARNING!!: Current discard of sculpty at " << current_discard - << " is less than -2." << llendl; - - // corrupted volume... don't update the sculpty - return; - } - else if (current_discard > MAX_DISCARD_LEVEL) - { - llwarns << "WARNING!!: Current discard of sculpty at " << current_discard - << " is more than than allowed max of " << MAX_DISCARD_LEVEL << llendl; - - // corrupted volume... don't update the sculpty - return; - } - - if (current_discard == discard_level) // no work to do here - return; - - if(!raw_image) - { - llassert(discard_level < 0) ; - - sculpt_width = 0; - sculpt_height = 0; - sculpt_data = NULL ; - - if(LLViewerTextureManager::sTesterp) - { - LLViewerTextureManager::sTesterp->updateGrayTextureBinding(); - } - } - else - { - sculpt_height = raw_image->getHeight(); - sculpt_width = raw_image->getWidth(); - sculpt_components = raw_image->getComponents(); - - sculpt_data = raw_image->getData(); - - if(LLViewerTextureManager::sTesterp) - { - mSculptTexture->updateBindStatsForTester() ; - } - } - getVolume()->sculpt(sculpt_width, sculpt_height, sculpt_components, sculpt_data, discard_level); - - //notify rebuild any other VOVolumes that reference this sculpty volume - for (S32 i = 0; i < mSculptTexture->getNumVolumes(); ++i) - { - LLVOVolume* volume = (*(mSculptTexture->getVolumeList()))[i]; - if (volume != this && volume->getVolume() == getVolume()) - { - gPipeline.markRebuild(volume->mDrawable, LLDrawable::REBUILD_GEOMETRY, FALSE); - } - } - } -} - -S32 LLVOVolume::computeLODDetail(F32 distance, F32 radius) -{ - S32 cur_detail; - if (LLPipeline::sDynamicLOD) - { - // We've got LOD in the profile, and in the twist. Use radius. - F32 tan_angle = (LLVOVolume::sLODFactor*radius)/distance; - cur_detail = LLVolumeLODGroup::getDetailFromTan(llround(tan_angle, 0.01f)); - } - else - { - cur_detail = llclamp((S32) (sqrtf(radius)*LLVOVolume::sLODFactor*4.f), 0, 3); - } - return cur_detail; -} - -BOOL LLVOVolume::calcLOD() -{ - if (mDrawable.isNull()) - { - return FALSE; - } - - S32 cur_detail = 0; - - F32 radius; - F32 distance; - - if (mDrawable->isState(LLDrawable::RIGGED)) - { - LLVOAvatar* avatar = getAvatar(); - distance = avatar->mDrawable->mDistanceWRTCamera; - radius = avatar->getBinRadius(); - } - else - { - distance = mDrawable->mDistanceWRTCamera; - radius = getVolume()->mLODScaleBias.scaledVec(getScale()).length(); - } - - //hold onto unmodified distance for debugging - F32 debug_distance = distance; - - distance *= sDistanceFactor; - - F32 rampDist = LLVOVolume::sLODFactor * 2; - - if (distance < rampDist) - { - // Boost LOD when you're REALLY close - distance *= 1.0f/rampDist; - distance *= distance; - distance *= rampDist; - } - - // DON'T Compensate for field of view changing on FOV zoom. - distance *= F_PI/3.f; - - cur_detail = computeLODDetail(llround(distance, 0.01f), - llround(radius, 0.01f)); - - - if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_LOD_INFO)) - { - setDebugText(llformat("%.2f:%.2f, %d", debug_distance, radius, cur_detail)); - } - - if (cur_detail != mLOD) - { - mAppAngle = llround((F32) atan2( mDrawable->getRadius(), mDrawable->mDistanceWRTCamera) * RAD_TO_DEG, 0.01f); - mLOD = cur_detail; - return TRUE; - } - else - { - return FALSE; - } -} - -BOOL LLVOVolume::updateLOD() -{ - if (mDrawable.isNull()) - { - return FALSE; - } - - BOOL lod_changed = calcLOD(); - - if (lod_changed) - { - gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, FALSE); - mLODChanged = TRUE; - } - - lod_changed = lod_changed || LLViewerObject::updateLOD(); - - return lod_changed; -} - -BOOL LLVOVolume::setDrawableParent(LLDrawable* parentp) -{ - if (!LLViewerObject::setDrawableParent(parentp)) - { - // no change in drawable parent - return FALSE; - } - - if (!mDrawable->isRoot()) - { - // rebuild vertices in parent relative space - gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, TRUE); - - if (mDrawable->isActive() && !parentp->isActive()) - { - parentp->makeActive(); - } - else if (mDrawable->isStatic() && parentp->isActive()) - { - mDrawable->makeActive(); - } - } - - return TRUE; -} - -void LLVOVolume::updateFaceFlags() -{ - for (S32 i = 0; i < getVolume()->getNumFaces(); i++) - { - LLFace *face = mDrawable->getFace(i); - if (!face) - { - return; - } - - BOOL fullbright = getTE(i)->getFullbright(); - face->clearState(LLFace::FULLBRIGHT | LLFace::HUD_RENDER | LLFace::LIGHT); - - if (fullbright || (mMaterial == LL_MCODE_LIGHT)) - { - face->setState(LLFace::FULLBRIGHT); - } - if (mDrawable->isLight()) - { - face->setState(LLFace::LIGHT); - } - if (isHUDAttachment()) - { - face->setState(LLFace::HUD_RENDER); - } - } -} - -BOOL LLVOVolume::setParent(LLViewerObject* parent) -{ - BOOL ret = FALSE ; - if (parent != getParent()) - { - ret = LLViewerObject::setParent(parent); - if (ret && mDrawable) - { - gPipeline.markMoved(mDrawable); - gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, TRUE); - } - } - - return ret ; -} - -// NOTE: regenFaces() MUST be followed by genTriangles()! -void LLVOVolume::regenFaces() -{ - // remove existing faces - BOOL count_changed = mNumFaces != getNumTEs(); - - if (count_changed) - { - deleteFaces(); - // add new faces - mNumFaces = getNumTEs(); - } - - for (S32 i = 0; i < mNumFaces; i++) - { - LLFace* facep = count_changed ? addFace(i) : mDrawable->getFace(i); - facep->setTEOffset(i); - facep->setTexture(getTEImage(i)); - facep->setViewerObject(this); - - // If the face had media on it, this will have broken the link between the LLViewerMediaTexture and the face. - // Re-establish the link. - if((int)mMediaImplList.size() > i) - { - if(mMediaImplList[i]) - { - LLViewerMediaTexture* media_tex = LLViewerTextureManager::findMediaTexture(mMediaImplList[i]->getMediaTextureID()) ; - if(media_tex) - { - media_tex->addMediaToFace(facep) ; - } - } - } - } - - if (!count_changed) - { - updateFaceFlags(); - } -} - -BOOL LLVOVolume::genBBoxes(BOOL force_global) -{ - BOOL res = TRUE; - - LLVector4a min,max; - - min.clear(); - max.clear(); - - BOOL rebuild = mDrawable->isState(LLDrawable::REBUILD_VOLUME | LLDrawable::REBUILD_POSITION | LLDrawable::REBUILD_RIGGED); - -// bool rigged = false; - LLVolume* volume = mRiggedVolume; - if (!volume) - { - volume = getVolume(); - } - - for (S32 i = 0; i < getVolume()->getNumVolumeFaces(); i++) - { - LLFace *face = mDrawable->getFace(i); - if (!face) - { - continue; - } - res &= face->genVolumeBBoxes(*volume, i, - mRelativeXform, mRelativeXformInvTrans, - (mVolumeImpl && mVolumeImpl->isVolumeGlobal()) || force_global); - - if (rebuild) - { - if (i == 0) - { - min = face->mExtents[0]; - max = face->mExtents[1]; - } - else - { - min.setMin(min, face->mExtents[0]); - max.setMax(max, face->mExtents[1]); - } - } - } - - if (rebuild) - { - mDrawable->setSpatialExtents(min,max); - min.add(max); - min.mul(0.5f); - mDrawable->setPositionGroup(min); - } - - updateRadius(); - mDrawable->movePartition(); - - return res; -} - -void LLVOVolume::preRebuild() -{ - if (mVolumeImpl != NULL) - { - mVolumeImpl->preRebuild(); - } -} - -void LLVOVolume::updateRelativeXform() -{ - if (mVolumeImpl) - { - mVolumeImpl->updateRelativeXform(); - return; - } - - LLDrawable* drawable = mDrawable; - - if (drawable->isState(LLDrawable::RIGGED) && mRiggedVolume.notNull()) - { //rigged volume (which is in agent space) is used for generating bounding boxes etc - //inverse of render matrix should go to partition space - mRelativeXform = getRenderMatrix(); - - F32* dst = (F32*) mRelativeXformInvTrans.mMatrix; - F32* src = (F32*) mRelativeXform.mMatrix; - dst[0] = src[0]; dst[1] = src[1]; dst[2] = src[2]; - dst[3] = src[4]; dst[4] = src[5]; dst[5] = src[6]; - dst[6] = src[8]; dst[7] = src[9]; dst[8] = src[10]; - - mRelativeXform.invert(); - mRelativeXformInvTrans.transpose(); - } - else if (drawable->isActive()) - { - // setup relative transforms - LLQuaternion delta_rot; - LLVector3 delta_pos, delta_scale; - - //matrix from local space to parent relative/global space - delta_rot = drawable->isSpatialRoot() ? LLQuaternion() : mDrawable->getRotation(); - delta_pos = drawable->isSpatialRoot() ? LLVector3(0,0,0) : mDrawable->getPosition(); - delta_scale = mDrawable->getScale(); - - // Vertex transform (4x4) - LLVector3 x_axis = LLVector3(delta_scale.mV[VX], 0.f, 0.f) * delta_rot; - LLVector3 y_axis = LLVector3(0.f, delta_scale.mV[VY], 0.f) * delta_rot; - LLVector3 z_axis = LLVector3(0.f, 0.f, delta_scale.mV[VZ]) * delta_rot; - - mRelativeXform.initRows(LLVector4(x_axis, 0.f), - LLVector4(y_axis, 0.f), - LLVector4(z_axis, 0.f), - LLVector4(delta_pos, 1.f)); - - - // compute inverse transpose for normals - // mRelativeXformInvTrans.setRows(x_axis, y_axis, z_axis); - // mRelativeXformInvTrans.invert(); - // mRelativeXformInvTrans.setRows(x_axis, y_axis, z_axis); - // grumble - invert is NOT a matrix invert, so we do it by hand: - - LLMatrix3 rot_inverse = LLMatrix3(~delta_rot); - - LLMatrix3 scale_inverse; - scale_inverse.setRows(LLVector3(1.0, 0.0, 0.0) / delta_scale.mV[VX], - LLVector3(0.0, 1.0, 0.0) / delta_scale.mV[VY], - LLVector3(0.0, 0.0, 1.0) / delta_scale.mV[VZ]); - - - mRelativeXformInvTrans = rot_inverse * scale_inverse; - - mRelativeXformInvTrans.transpose(); - } - else - { - LLVector3 pos = getPosition(); - LLVector3 scale = getScale(); - LLQuaternion rot = getRotation(); - - if (mParent) - { - pos *= mParent->getRotation(); - pos += mParent->getPosition(); - rot *= mParent->getRotation(); - } - - //LLViewerRegion* region = getRegion(); - //pos += region->getOriginAgent(); - - LLVector3 x_axis = LLVector3(scale.mV[VX], 0.f, 0.f) * rot; - LLVector3 y_axis = LLVector3(0.f, scale.mV[VY], 0.f) * rot; - LLVector3 z_axis = LLVector3(0.f, 0.f, scale.mV[VZ]) * rot; - - mRelativeXform.initRows(LLVector4(x_axis, 0.f), - LLVector4(y_axis, 0.f), - LLVector4(z_axis, 0.f), - LLVector4(pos, 1.f)); - - // compute inverse transpose for normals - LLMatrix3 rot_inverse = LLMatrix3(~rot); - - LLMatrix3 scale_inverse; - scale_inverse.setRows(LLVector3(1.0, 0.0, 0.0) / scale.mV[VX], - LLVector3(0.0, 1.0, 0.0) / scale.mV[VY], - LLVector3(0.0, 0.0, 1.0) / scale.mV[VZ]); - - - mRelativeXformInvTrans = rot_inverse * scale_inverse; - - mRelativeXformInvTrans.transpose(); - } -} - -static LLFastTimer::DeclareTimer FTM_GEN_FLEX("Generate Flexies"); -static LLFastTimer::DeclareTimer FTM_UPDATE_PRIMITIVES("Update Primitives"); -static LLFastTimer::DeclareTimer FTM_UPDATE_RIGGED_VOLUME("Update Rigged"); - -BOOL LLVOVolume::updateGeometry(LLDrawable *drawable) -{ - LLFastTimer t(FTM_UPDATE_PRIMITIVES); - - if (mDrawable->isState(LLDrawable::REBUILD_RIGGED)) - { - { - LLFastTimer t(FTM_UPDATE_RIGGED_VOLUME); - updateRiggedVolume(); - } - genBBoxes(FALSE); - mDrawable->clearState(LLDrawable::REBUILD_RIGGED); - } - - if (mVolumeImpl != NULL) - { - BOOL res; - { - LLFastTimer t(FTM_GEN_FLEX); - res = mVolumeImpl->doUpdateGeometry(drawable); - } - updateFaceFlags(); - return res; - } - - dirtySpatialGroup(drawable->isState(LLDrawable::IN_REBUILD_Q1)); - - BOOL compiled = FALSE; - - updateRelativeXform(); - - if (mDrawable.isNull()) // Not sure why this is happening, but it is... - { - return TRUE; // No update to complete - } - - if (mVolumeChanged || mFaceMappingChanged ) - { - compiled = TRUE; - - if (mVolumeChanged) - { - LLFastTimer ftm(FTM_GEN_VOLUME); - LLVolumeParams volume_params = getVolume()->getParams(); - setVolume(volume_params, 0); - drawable->setState(LLDrawable::REBUILD_VOLUME); - } - - { - LLFastTimer t(FTM_GEN_TRIANGLES); - regenFaces(); - genBBoxes(FALSE); - } - } - else if ((mLODChanged) || (mSculptChanged)) - { - LLVolume *old_volumep, *new_volumep; - F32 old_lod, new_lod; - S32 old_num_faces, new_num_faces ; - - old_volumep = getVolume(); - old_lod = old_volumep->getDetail(); - old_num_faces = old_volumep->getNumFaces() ; - old_volumep = NULL ; - - { - LLFastTimer ftm(FTM_GEN_VOLUME); - LLVolumeParams volume_params = getVolume()->getParams(); - setVolume(volume_params, 0); - } - - new_volumep = getVolume(); - new_lod = new_volumep->getDetail(); - new_num_faces = new_volumep->getNumFaces() ; - new_volumep = NULL ; - - if ((new_lod != old_lod) || mSculptChanged) - { - compiled = TRUE; - sNumLODChanges += new_num_faces ; - - drawable->setState(LLDrawable::REBUILD_VOLUME); // for face->genVolumeTriangles() - - { - LLFastTimer t(FTM_GEN_TRIANGLES); - if (new_num_faces != old_num_faces) - { - regenFaces(); - } - genBBoxes(FALSE); - - if (mSculptChanged) - { //changes in sculpt maps can thrash an object bounding box without - //triggering a spatial group bounding box update -- force spatial group - //to update bounding boxes - LLSpatialGroup* group = mDrawable->getSpatialGroup(); - if (group) - { - group->unbound(); - } - } - } - } - } - // it has its own drawable (it's moved) or it has changed UVs or it has changed xforms from global<->local - else - { - compiled = TRUE; - // All it did was move or we changed the texture coordinate offset - LLFastTimer t(FTM_GEN_TRIANGLES); - genBBoxes(FALSE); - } - - // Update face flags - updateFaceFlags(); - - if(compiled) - { - LLPipeline::sCompiles++; - } - - mVolumeChanged = FALSE; - mLODChanged = FALSE; - mSculptChanged = FALSE; - mFaceMappingChanged = FALSE; - - return LLViewerObject::updateGeometry(drawable); -} - -void LLVOVolume::updateFaceSize(S32 idx) -{ - LLFace* facep = mDrawable->getFace(idx); - if (idx >= getVolume()->getNumVolumeFaces()) - { - facep->setSize(0,0, true); - } - else - { - const LLVolumeFace& vol_face = getVolume()->getVolumeFace(idx); - facep->setSize(vol_face.mNumVertices, vol_face.mNumIndices, - true); // <--- volume faces should be padded for 16-byte alignment - - } -} - -BOOL LLVOVolume::isRootEdit() const -{ - if (mParent && !((LLViewerObject*)mParent)->isAvatar()) - { - return FALSE; - } - return TRUE; -} - -//virtual -void LLVOVolume::setNumTEs(const U8 num_tes) -{ - const U8 old_num_tes = getNumTEs() ; - - if(old_num_tes && old_num_tes < num_tes) //new faces added - { - LLViewerObject::setNumTEs(num_tes) ; - - if(mMediaImplList.size() >= old_num_tes && mMediaImplList[old_num_tes -1].notNull())//duplicate the last media textures if exists. - { - mMediaImplList.resize(num_tes) ; - const LLTextureEntry* te = getTE(old_num_tes - 1) ; - for(U8 i = old_num_tes; i < num_tes ; i++) - { - setTE(i, *te) ; - mMediaImplList[i] = mMediaImplList[old_num_tes -1] ; - } - mMediaImplList[old_num_tes -1]->setUpdated(TRUE) ; - } - } - else if(old_num_tes > num_tes && mMediaImplList.size() > num_tes) //old faces removed - { - U8 end = mMediaImplList.size() ; - for(U8 i = num_tes; i < end ; i++) - { - removeMediaImpl(i) ; - } - mMediaImplList.resize(num_tes) ; - - LLViewerObject::setNumTEs(num_tes) ; - } - else - { - LLViewerObject::setNumTEs(num_tes) ; - } - - return ; -} - -void LLVOVolume::setTEImage(const U8 te, LLViewerTexture *imagep) -{ - BOOL changed = (mTEImages[te] != imagep); - LLViewerObject::setTEImage(te, imagep); - if (changed) - { - gPipeline.markTextured(mDrawable); - mFaceMappingChanged = TRUE; - } -} - -S32 LLVOVolume::setTETexture(const U8 te, const LLUUID &uuid) -{ - S32 res = LLViewerObject::setTETexture(te, uuid); - if (res) - { - gPipeline.markTextured(mDrawable); - mFaceMappingChanged = TRUE; - } - return res; -} - -S32 LLVOVolume::setTEColor(const U8 te, const LLColor3& color) -{ - return setTEColor(te, LLColor4(color)); -} - -S32 LLVOVolume::setTEColor(const U8 te, const LLColor4& color) -{ - S32 retval = 0; - const LLTextureEntry *tep = getTE(te); - if (!tep) - { - llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl; - } - else if (color != tep->getColor()) - { - if (color.mV[3] != tep->getColor().mV[3]) - { - gPipeline.markTextured(mDrawable); - } - retval = LLPrimitive::setTEColor(te, color); - if (mDrawable.notNull() && retval) - { - // These should only happen on updates which are not the initial update. - mDrawable->setState(LLDrawable::REBUILD_COLOR); - dirtyMesh(); - } - } - - return retval; -} - -S32 LLVOVolume::setTEBumpmap(const U8 te, const U8 bumpmap) -{ - S32 res = LLViewerObject::setTEBumpmap(te, bumpmap); - if (res) - { - gPipeline.markTextured(mDrawable); - mFaceMappingChanged = TRUE; - } - return res; -} - -S32 LLVOVolume::setTETexGen(const U8 te, const U8 texgen) -{ - S32 res = LLViewerObject::setTETexGen(te, texgen); - if (res) - { - gPipeline.markTextured(mDrawable); - mFaceMappingChanged = TRUE; - } - return res; -} - -S32 LLVOVolume::setTEMediaTexGen(const U8 te, const U8 media) -{ - S32 res = LLViewerObject::setTEMediaTexGen(te, media); - if (res) - { - gPipeline.markTextured(mDrawable); - mFaceMappingChanged = TRUE; - } - return res; -} - -S32 LLVOVolume::setTEShiny(const U8 te, const U8 shiny) -{ - S32 res = LLViewerObject::setTEShiny(te, shiny); - if (res) - { - gPipeline.markTextured(mDrawable); - mFaceMappingChanged = TRUE; - } - return res; -} - -S32 LLVOVolume::setTEFullbright(const U8 te, const U8 fullbright) -{ - S32 res = LLViewerObject::setTEFullbright(te, fullbright); - if (res) - { - gPipeline.markTextured(mDrawable); - mFaceMappingChanged = TRUE; - } - return res; -} - -S32 LLVOVolume::setTEBumpShinyFullbright(const U8 te, const U8 bump) -{ - S32 res = LLViewerObject::setTEBumpShinyFullbright(te, bump); - if (res) - { - gPipeline.markTextured(mDrawable); - mFaceMappingChanged = TRUE; - } - return res; -} - -S32 LLVOVolume::setTEMediaFlags(const U8 te, const U8 media_flags) -{ - S32 res = LLViewerObject::setTEMediaFlags(te, media_flags); - if (res) - { - gPipeline.markTextured(mDrawable); - mFaceMappingChanged = TRUE; - } - return res; -} - -S32 LLVOVolume::setTEGlow(const U8 te, const F32 glow) -{ - S32 res = LLViewerObject::setTEGlow(te, glow); - if (res) - { - gPipeline.markTextured(mDrawable); - mFaceMappingChanged = TRUE; - } - return res; -} - -S32 LLVOVolume::setTEScale(const U8 te, const F32 s, const F32 t) -{ - S32 res = LLViewerObject::setTEScale(te, s, t); - if (res) - { - gPipeline.markTextured(mDrawable); - mFaceMappingChanged = TRUE; - } - return res; -} - -S32 LLVOVolume::setTEScaleS(const U8 te, const F32 s) -{ - S32 res = LLViewerObject::setTEScaleS(te, s); - if (res) - { - gPipeline.markTextured(mDrawable); - mFaceMappingChanged = TRUE; - } - return res; -} - -S32 LLVOVolume::setTEScaleT(const U8 te, const F32 t) -{ - S32 res = LLViewerObject::setTEScaleT(te, t); - if (res) - { - gPipeline.markTextured(mDrawable); - mFaceMappingChanged = TRUE; - } - return res; -} - -void LLVOVolume::updateTEData() -{ - /*if (mDrawable.notNull()) - { - mFaceMappingChanged = TRUE; - gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_MATERIAL, TRUE); - }*/ -} - -bool LLVOVolume::hasMedia() const -{ - bool result = false; - const U8 numTEs = getNumTEs(); - for (U8 i = 0; i < numTEs; i++) - { - const LLTextureEntry* te = getTE(i); - if(te->hasMedia()) - { - result = true; - break; - } - } - return result; -} - -LLVector3 LLVOVolume::getApproximateFaceNormal(U8 face_id) -{ - LLVolume* volume = getVolume(); - LLVector4a result; - result.clear(); - - LLVector3 ret; - - if (volume && face_id < volume->getNumVolumeFaces()) - { - const LLVolumeFace& face = volume->getVolumeFace(face_id); - for (S32 i = 0; i < (S32)face.mNumVertices; ++i) - { - result.add(face.mNormals[i]); - } - - LLVector3 ret(result.getF32ptr()); - ret = volumeDirectionToAgent(ret); - ret.normVec(); - } - - return ret; -} - -void LLVOVolume::requestMediaDataUpdate(bool isNew) -{ - if (sObjectMediaClient) - sObjectMediaClient->fetchMedia(new LLMediaDataClientObjectImpl(this, isNew)); -} - -bool LLVOVolume::isMediaDataBeingFetched() const -{ - // I know what I'm doing by const_casting this away: this is just - // a wrapper class that is only going to do a lookup. - return (sObjectMediaClient) ? sObjectMediaClient->isInQueue(new LLMediaDataClientObjectImpl(const_cast<LLVOVolume*>(this), false)) : false; -} - -void LLVOVolume::cleanUpMediaImpls() -{ - // Iterate through our TEs and remove any Impls that are no longer used - const U8 numTEs = getNumTEs(); - for (U8 i = 0; i < numTEs; i++) - { - const LLTextureEntry* te = getTE(i); - if( ! te->hasMedia()) - { - // Delete the media IMPL! - removeMediaImpl(i) ; - } - } -} - -void LLVOVolume::updateObjectMediaData(const LLSD &media_data_array, const std::string &media_version) -{ - // media_data_array is an array of media entry maps - // media_version is the version string in the response. - U32 fetched_version = LLTextureEntry::getVersionFromMediaVersionString(media_version); - - // Only update it if it is newer! - if ( (S32)fetched_version > mLastFetchedMediaVersion) - { - mLastFetchedMediaVersion = fetched_version; - //llinfos << "updating:" << this->getID() << " " << ll_pretty_print_sd(media_data_array) << llendl; - - LLSD::array_const_iterator iter = media_data_array.beginArray(); - LLSD::array_const_iterator end = media_data_array.endArray(); - U8 texture_index = 0; - for (; iter != end; ++iter, ++texture_index) - { - syncMediaData(texture_index, *iter, false/*merge*/, false/*ignore_agent*/); - } - } -} - -void LLVOVolume::syncMediaData(S32 texture_index, const LLSD &media_data, bool merge, bool ignore_agent) -{ - if(mDead) - { - // If the object has been marked dead, don't process media updates. - return; - } - - LLTextureEntry *te = getTE(texture_index); - if(!te) - { - return ; - } - - LL_DEBUGS("MediaOnAPrim") << "BEFORE: texture_index = " << texture_index - << " hasMedia = " << te->hasMedia() << " : " - << ((NULL == te->getMediaData()) ? "NULL MEDIA DATA" : ll_pretty_print_sd(te->getMediaData()->asLLSD())) << llendl; - - std::string previous_url; - LLMediaEntry* mep = te->getMediaData(); - if(mep) - { - // Save the "current url" from before the update so we can tell if - // it changes. - previous_url = mep->getCurrentURL(); - } - - if (merge) - { - te->mergeIntoMediaData(media_data); - } - else { - // XXX Question: what if the media data is undefined LLSD, but the - // update we got above said that we have media flags?? Here we clobber - // that, assuming the data from the service is more up-to-date. - te->updateMediaData(media_data); - } - - mep = te->getMediaData(); - if(mep) - { - bool update_from_self = false; - if (!ignore_agent) - { - LLUUID updating_agent = LLTextureEntry::getAgentIDFromMediaVersionString(getMediaURL()); - update_from_self = (updating_agent == gAgent.getID()); - } - viewer_media_t media_impl = LLViewerMedia::updateMediaImpl(mep, previous_url, update_from_self); - - addMediaImpl(media_impl, texture_index) ; - } - else - { - removeMediaImpl(texture_index); - } - - LL_DEBUGS("MediaOnAPrim") << "AFTER: texture_index = " << texture_index - << " hasMedia = " << te->hasMedia() << " : " - << ((NULL == te->getMediaData()) ? "NULL MEDIA DATA" : ll_pretty_print_sd(te->getMediaData()->asLLSD())) << llendl; -} - -void LLVOVolume::mediaNavigateBounceBack(U8 texture_index) -{ - // Find the media entry for this navigate - const LLMediaEntry* mep = NULL; - viewer_media_t impl = getMediaImpl(texture_index); - LLTextureEntry *te = getTE(texture_index); - if(te) - { - mep = te->getMediaData(); - } - - if (mep && impl) - { - std::string url = mep->getCurrentURL(); - // Look for a ":", if not there, assume "http://" - if (!url.empty() && std::string::npos == url.find(':')) - { - url = "http://" + url; - } - // If the url we're trying to "bounce back" to is either empty or not - // allowed by the whitelist, try the home url. If *that* doesn't work, - // set the media as failed and unload it - if (url.empty() || !mep->checkCandidateUrl(url)) - { - url = mep->getHomeURL(); - // Look for a ":", if not there, assume "http://" - if (!url.empty() && std::string::npos == url.find(':')) - { - url = "http://" + url; - } - } - if (url.empty() || !mep->checkCandidateUrl(url)) - { - // The url to navigate back to is not good, and we have nowhere else - // to go. - LL_WARNS("MediaOnAPrim") << "FAILED to bounce back URL \"" << url << "\" -- unloading impl" << LL_ENDL; - impl->setMediaFailed(true); - } - else { - // Okay, navigate now - LL_INFOS("MediaOnAPrim") << "bouncing back to URL: " << url << LL_ENDL; - impl->navigateTo(url, "", false, true); - } - } -} - -bool LLVOVolume::hasMediaPermission(const LLMediaEntry* media_entry, MediaPermType perm_type) -{ - // NOTE: This logic ALMOST duplicates the logic in the server (in particular, in llmediaservice.cpp). - if (NULL == media_entry ) return false; // XXX should we assert here? - - // The agent has permissions if: - // - world permissions are on, or - // - group permissions are on, and agent_id is in the group, or - // - agent permissions are on, and agent_id is the owner - - // *NOTE: We *used* to check for modify permissions here (i.e. permissions were - // granted if permModify() was true). However, this doesn't make sense in the - // viewer: we don't want to show controls or allow interaction if the author - // has deemed it so. See DEV-42115. - - U8 media_perms = (perm_type == MEDIA_PERM_INTERACT) ? media_entry->getPermsInteract() : media_entry->getPermsControl(); - - // World permissions - if (0 != (media_perms & LLMediaEntry::PERM_ANYONE)) - { - return true; - } - - // Group permissions - else if (0 != (media_perms & LLMediaEntry::PERM_GROUP)) - { - LLPermissions* obj_perm = LLSelectMgr::getInstance()->findObjectPermissions(this); - if (obj_perm && gAgent.isInGroup(obj_perm->getGroup())) - { - return true; - } - } - - // Owner permissions - else if (0 != (media_perms & LLMediaEntry::PERM_OWNER) && permYouOwner()) - { - return true; - } - - return false; - -} - -void LLVOVolume::mediaNavigated(LLViewerMediaImpl *impl, LLPluginClassMedia* plugin, std::string new_location) -{ - bool block_navigation = false; - // FIXME: if/when we allow the same media impl to be used by multiple faces, the logic here will need to be fixed - // to deal with multiple face indices. - int face_index = getFaceIndexWithMediaImpl(impl, -1); - - // Find the media entry for this navigate - LLMediaEntry* mep = NULL; - LLTextureEntry *te = getTE(face_index); - if(te) - { - mep = te->getMediaData(); - } - - if(mep) - { - if(!mep->checkCandidateUrl(new_location)) - { - block_navigation = true; - } - if (!block_navigation && !hasMediaPermission(mep, MEDIA_PERM_INTERACT)) - { - block_navigation = true; - } - } - else - { - LL_WARNS("MediaOnAPrim") << "Couldn't find media entry!" << LL_ENDL; - } - - if(block_navigation) - { - LL_INFOS("MediaOnAPrim") << "blocking navigate to URI " << new_location << LL_ENDL; - - // "bounce back" to the current URL from the media entry - mediaNavigateBounceBack(face_index); - } - else if (sObjectMediaNavigateClient) - { - - LL_DEBUGS("MediaOnAPrim") << "broadcasting navigate with URI " << new_location << LL_ENDL; - - sObjectMediaNavigateClient->navigate(new LLMediaDataClientObjectImpl(this, false), face_index, new_location); - } -} - -void LLVOVolume::mediaEvent(LLViewerMediaImpl *impl, LLPluginClassMedia* plugin, LLViewerMediaObserver::EMediaEvent event) -{ - switch(event) - { - - case LLViewerMediaObserver::MEDIA_EVENT_LOCATION_CHANGED: - { - switch(impl->getNavState()) - { - case LLViewerMediaImpl::MEDIANAVSTATE_FIRST_LOCATION_CHANGED: - { - // This is the first location changed event after the start of a non-server-directed nav. It may need to be broadcast or bounced back. - mediaNavigated(impl, plugin, plugin->getLocation()); - } - break; - - case LLViewerMediaImpl::MEDIANAVSTATE_FIRST_LOCATION_CHANGED_SPURIOUS: - // This navigate didn't change the current URL. - LL_DEBUGS("MediaOnAPrim") << " NOT broadcasting navigate (spurious)" << LL_ENDL; - break; - - case LLViewerMediaImpl::MEDIANAVSTATE_SERVER_FIRST_LOCATION_CHANGED: - // This is the first location changed event after the start of a server-directed nav. Don't broadcast it. - LL_INFOS("MediaOnAPrim") << " NOT broadcasting navigate (server-directed)" << LL_ENDL; - break; - - default: - // This is a subsequent location-changed due to a redirect. Don't broadcast. - LL_INFOS("MediaOnAPrim") << " NOT broadcasting navigate (redirect)" << LL_ENDL; - break; - } - } - break; - - case LLViewerMediaObserver::MEDIA_EVENT_NAVIGATE_COMPLETE: - { - switch(impl->getNavState()) - { - case LLViewerMediaImpl::MEDIANAVSTATE_COMPLETE_BEFORE_LOCATION_CHANGED: - { - // This is the first location changed event after the start of a non-server-directed nav. It may need to be broadcast or bounced back. - mediaNavigated(impl, plugin, plugin->getNavigateURI()); - } - break; - - case LLViewerMediaImpl::MEDIANAVSTATE_COMPLETE_BEFORE_LOCATION_CHANGED_SPURIOUS: - // This navigate didn't change the current URL. - LL_DEBUGS("MediaOnAPrim") << " NOT broadcasting navigate (spurious)" << LL_ENDL; - break; - - case LLViewerMediaImpl::MEDIANAVSTATE_SERVER_COMPLETE_BEFORE_LOCATION_CHANGED: - // This is the the navigate complete event from a server-directed nav. Don't broadcast it. - LL_INFOS("MediaOnAPrim") << " NOT broadcasting navigate (server-directed)" << LL_ENDL; - break; - - default: - // For all other states, the navigate should have been handled by LOCATION_CHANGED events already. - break; - } - } - break; - - default: - break; - } - -} - -void LLVOVolume::sendMediaDataUpdate() -{ - if (sObjectMediaClient) - sObjectMediaClient->updateMedia(new LLMediaDataClientObjectImpl(this, false)); -} - -void LLVOVolume::removeMediaImpl(S32 texture_index) -{ - if(mMediaImplList.size() <= (U32)texture_index || mMediaImplList[texture_index].isNull()) - { - return ; - } - - //make the face referencing to mMediaImplList[texture_index] to point back to the old texture. - if(mDrawable && texture_index < mDrawable->getNumFaces()) - { - LLFace* facep = mDrawable->getFace(texture_index) ; - if(facep) - { - LLViewerMediaTexture* media_tex = LLViewerTextureManager::findMediaTexture(mMediaImplList[texture_index]->getMediaTextureID()) ; - if(media_tex) - { - media_tex->removeMediaFromFace(facep) ; - } - } - } - - //check if some other face(s) of this object reference(s)to this media impl. - S32 i ; - S32 end = (S32)mMediaImplList.size() ; - for(i = 0; i < end ; i++) - { - if( i != texture_index && mMediaImplList[i] == mMediaImplList[texture_index]) - { - break ; - } - } - - if(i == end) //this object does not need this media impl. - { - mMediaImplList[texture_index]->removeObject(this) ; - } - - mMediaImplList[texture_index] = NULL ; - return ; -} - -void LLVOVolume::addMediaImpl(LLViewerMediaImpl* media_impl, S32 texture_index) -{ - if((S32)mMediaImplList.size() < texture_index + 1) - { - mMediaImplList.resize(texture_index + 1) ; - } - - if(mMediaImplList[texture_index].notNull()) - { - if(mMediaImplList[texture_index] == media_impl) - { - return ; - } - - removeMediaImpl(texture_index) ; - } - - mMediaImplList[texture_index] = media_impl; - media_impl->addObject(this) ; - - //add the face to show the media if it is in playing - if(mDrawable) - { - LLFace* facep = mDrawable->getFace(texture_index) ; - if(facep) - { - LLViewerMediaTexture* media_tex = LLViewerTextureManager::findMediaTexture(mMediaImplList[texture_index]->getMediaTextureID()) ; - if(media_tex) - { - media_tex->addMediaToFace(facep) ; - } - } - else //the face is not available now, start media on this face later. - { - media_impl->setUpdated(TRUE) ; - } - } - return ; -} - -viewer_media_t LLVOVolume::getMediaImpl(U8 face_id) const -{ - if(mMediaImplList.size() > face_id) - { - return mMediaImplList[face_id]; - } - return NULL; -} - -F64 LLVOVolume::getTotalMediaInterest() const -{ - // If this object is currently focused, this object has "high" interest - if (LLViewerMediaFocus::getInstance()->getFocusedObjectID() == getID()) - return F64_MAX; - - F64 interest = (F64)-1.0; // means not interested; - - // If this object is selected, this object has "high" interest, but since - // there can be more than one, we still add in calculated impl interest - // XXX Sadly, 'contains()' doesn't take a const :( - if (LLSelectMgr::getInstance()->getSelection()->contains(const_cast<LLVOVolume*>(this))) - interest = F64_MAX / 2.0; - - int i = 0; - const int end = getNumTEs(); - for ( ; i < end; ++i) - { - const viewer_media_t &impl = getMediaImpl(i); - if (!impl.isNull()) - { - if (interest == (F64)-1.0) interest = (F64)0.0; - interest += impl->getInterest(); - } - } - return interest; -} - -S32 LLVOVolume::getFaceIndexWithMediaImpl(const LLViewerMediaImpl* media_impl, S32 start_face_id) -{ - S32 end = (S32)mMediaImplList.size() ; - for(S32 face_id = start_face_id + 1; face_id < end; face_id++) - { - if(mMediaImplList[face_id] == media_impl) - { - return face_id ; - } - } - return -1 ; -} - -//---------------------------------------------------------------------------- - -void LLVOVolume::setLightTextureID(LLUUID id) -{ - if (id.notNull()) - { - if (!hasLightTexture()) - { - setParameterEntryInUse(LLNetworkData::PARAMS_LIGHT_IMAGE, TRUE, true); - } - LLLightImageParams* param_block = (LLLightImageParams*) getParameterEntry(LLNetworkData::PARAMS_LIGHT_IMAGE); - if (param_block && param_block->getLightTexture() != id) - { - param_block->setLightTexture(id); - parameterChanged(LLNetworkData::PARAMS_LIGHT_IMAGE, true); - } - } - else - { - if (hasLightTexture()) - { - setParameterEntryInUse(LLNetworkData::PARAMS_LIGHT_IMAGE, FALSE, true); - mLightTexture = NULL; - } - } -} - -void LLVOVolume::setSpotLightParams(LLVector3 params) -{ - LLLightImageParams* param_block = (LLLightImageParams*) getParameterEntry(LLNetworkData::PARAMS_LIGHT_IMAGE); - if (param_block && param_block->getParams() != params) - { - param_block->setParams(params); - parameterChanged(LLNetworkData::PARAMS_LIGHT_IMAGE, true); - } -} - -void LLVOVolume::setIsLight(BOOL is_light) -{ - if (is_light != getIsLight()) - { - if (is_light) - { - setParameterEntryInUse(LLNetworkData::PARAMS_LIGHT, TRUE, true); - } - else - { - setParameterEntryInUse(LLNetworkData::PARAMS_LIGHT, FALSE, true); - } - - if (is_light) - { - // Add it to the pipeline mLightSet - gPipeline.setLight(mDrawable, TRUE); - } - else - { - // Not a light. Remove it from the pipeline's light set. - gPipeline.setLight(mDrawable, FALSE); - } - } -} - -void LLVOVolume::setLightColor(const LLColor3& color) -{ - LLLightParams *param_block = (LLLightParams *)getParameterEntry(LLNetworkData::PARAMS_LIGHT); - if (param_block) - { - if (param_block->getColor() != color) - { - param_block->setColor(LLColor4(color, param_block->getColor().mV[3])); - parameterChanged(LLNetworkData::PARAMS_LIGHT, true); - gPipeline.markTextured(mDrawable); - mFaceMappingChanged = TRUE; - } - } -} - -void LLVOVolume::setLightIntensity(F32 intensity) -{ - LLLightParams *param_block = (LLLightParams *)getParameterEntry(LLNetworkData::PARAMS_LIGHT); - if (param_block) - { - if (param_block->getColor().mV[3] != intensity) - { - param_block->setColor(LLColor4(LLColor3(param_block->getColor()), intensity)); - parameterChanged(LLNetworkData::PARAMS_LIGHT, true); - } - } -} - -void LLVOVolume::setLightRadius(F32 radius) -{ - LLLightParams *param_block = (LLLightParams *)getParameterEntry(LLNetworkData::PARAMS_LIGHT); - if (param_block) - { - if (param_block->getRadius() != radius) - { - param_block->setRadius(radius); - parameterChanged(LLNetworkData::PARAMS_LIGHT, true); - } - } -} - -void LLVOVolume::setLightFalloff(F32 falloff) -{ - LLLightParams *param_block = (LLLightParams *)getParameterEntry(LLNetworkData::PARAMS_LIGHT); - if (param_block) - { - if (param_block->getFalloff() != falloff) - { - param_block->setFalloff(falloff); - parameterChanged(LLNetworkData::PARAMS_LIGHT, true); - } - } -} - -void LLVOVolume::setLightCutoff(F32 cutoff) -{ - LLLightParams *param_block = (LLLightParams *)getParameterEntry(LLNetworkData::PARAMS_LIGHT); - if (param_block) - { - if (param_block->getCutoff() != cutoff) - { - param_block->setCutoff(cutoff); - parameterChanged(LLNetworkData::PARAMS_LIGHT, true); - } - } -} - -//---------------------------------------------------------------------------- - -BOOL LLVOVolume::getIsLight() const -{ - return getParameterEntryInUse(LLNetworkData::PARAMS_LIGHT); -} - -LLColor3 LLVOVolume::getLightBaseColor() const -{ - const LLLightParams *param_block = (const LLLightParams *)getParameterEntry(LLNetworkData::PARAMS_LIGHT); - if (param_block) - { - return LLColor3(param_block->getColor()); - } - else - { - return LLColor3(1,1,1); - } -} - -LLColor3 LLVOVolume::getLightColor() const -{ - const LLLightParams *param_block = (const LLLightParams *)getParameterEntry(LLNetworkData::PARAMS_LIGHT); - if (param_block) - { - return LLColor3(param_block->getColor()) * param_block->getColor().mV[3]; - } - else - { - return LLColor3(1,1,1); - } -} - -LLUUID LLVOVolume::getLightTextureID() const -{ - if (getParameterEntryInUse(LLNetworkData::PARAMS_LIGHT_IMAGE)) - { - const LLLightImageParams *param_block = (const LLLightImageParams *)getParameterEntry(LLNetworkData::PARAMS_LIGHT_IMAGE); - if (param_block) - { - return param_block->getLightTexture(); - } - } - - return LLUUID::null; -} - - -LLVector3 LLVOVolume::getSpotLightParams() const -{ - if (getParameterEntryInUse(LLNetworkData::PARAMS_LIGHT_IMAGE)) - { - const LLLightImageParams *param_block = (const LLLightImageParams *)getParameterEntry(LLNetworkData::PARAMS_LIGHT_IMAGE); - if (param_block) - { - return param_block->getParams(); - } - } - - return LLVector3(); -} - -F32 LLVOVolume::getSpotLightPriority() const -{ - return mSpotLightPriority; -} - -void LLVOVolume::updateSpotLightPriority() -{ - LLVector3 pos = mDrawable->getPositionAgent(); - LLVector3 at(0,0,-1); - at *= getRenderRotation(); - - F32 r = getLightRadius()*0.5f; - - pos += at * r; - - at = LLViewerCamera::getInstance()->getAtAxis(); - - pos -= at * r; - - mSpotLightPriority = gPipeline.calcPixelArea(pos, LLVector3(r,r,r), *LLViewerCamera::getInstance()); - - if (mLightTexture.notNull()) - { - mLightTexture->addTextureStats(mSpotLightPriority); - mLightTexture->setBoostLevel(LLViewerTexture::BOOST_CLOUDS); - } -} - - -bool LLVOVolume::isLightSpotlight() const -{ - LLLightImageParams* params = (LLLightImageParams*) getParameterEntry(LLNetworkData::PARAMS_LIGHT_IMAGE); - if (params) - { - return params->isLightSpotlight(); - } - return false; -} - - -LLViewerTexture* LLVOVolume::getLightTexture() -{ - LLUUID id = getLightTextureID(); - - if (id.notNull()) - { - if (mLightTexture.isNull() || id != mLightTexture->getID()) - { - mLightTexture = LLViewerTextureManager::getFetchedTexture(id); - } - } - else - { - mLightTexture = NULL; - } - - return mLightTexture; -} - -F32 LLVOVolume::getLightIntensity() const -{ - const LLLightParams *param_block = (const LLLightParams *)getParameterEntry(LLNetworkData::PARAMS_LIGHT); - if (param_block) - { - return param_block->getColor().mV[3]; - } - else - { - return 1.f; - } -} - -F32 LLVOVolume::getLightRadius() const -{ - const LLLightParams *param_block = (const LLLightParams *)getParameterEntry(LLNetworkData::PARAMS_LIGHT); - if (param_block) - { - return param_block->getRadius(); - } - else - { - return 0.f; - } -} - -F32 LLVOVolume::getLightFalloff() const -{ - const LLLightParams *param_block = (const LLLightParams *)getParameterEntry(LLNetworkData::PARAMS_LIGHT); - if (param_block) - { - return param_block->getFalloff(); - } - else - { - return 0.f; - } -} - -F32 LLVOVolume::getLightCutoff() const -{ - const LLLightParams *param_block = (const LLLightParams *)getParameterEntry(LLNetworkData::PARAMS_LIGHT); - if (param_block) - { - return param_block->getCutoff(); - } - else - { - return 0.f; - } -} - -U32 LLVOVolume::getVolumeInterfaceID() const -{ - if (mVolumeImpl) - { - return mVolumeImpl->getID(); - } - - return 0; -} - -BOOL LLVOVolume::isFlexible() const -{ - if (getParameterEntryInUse(LLNetworkData::PARAMS_FLEXIBLE)) - { - LLVolume* volume = getVolume(); - if (volume && volume->getParams().getPathParams().getCurveType() != LL_PCODE_PATH_FLEXIBLE) - { - LLVolumeParams volume_params = getVolume()->getParams(); - U8 profile_and_hole = volume_params.getProfileParams().getCurveType(); - volume_params.setType(profile_and_hole, LL_PCODE_PATH_FLEXIBLE); - } - return TRUE; - } - else - { - return FALSE; - } -} - -BOOL LLVOVolume::isSculpted() const -{ - if (getParameterEntryInUse(LLNetworkData::PARAMS_SCULPT)) - { - return TRUE; - } - - return FALSE; -} - -BOOL LLVOVolume::isMesh() const -{ - if (isSculpted()) - { - LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT); - U8 sculpt_type = sculpt_params->getSculptType(); - - if ((sculpt_type & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH) - // mesh is a mesh - { - return TRUE; - } - } - - return FALSE; -} - -BOOL LLVOVolume::hasLightTexture() const -{ - if (getParameterEntryInUse(LLNetworkData::PARAMS_LIGHT_IMAGE)) - { - return TRUE; - } - - return FALSE; -} - -BOOL LLVOVolume::isVolumeGlobal() const -{ - if (mVolumeImpl) - { - return mVolumeImpl->isVolumeGlobal() ? TRUE : FALSE; - } - else if (mRiggedVolume.notNull()) - { - return TRUE; - } - - return FALSE; -} - -BOOL LLVOVolume::canBeFlexible() const -{ - U8 path = getVolume()->getParams().getPathParams().getCurveType(); - return (path == LL_PCODE_PATH_FLEXIBLE || path == LL_PCODE_PATH_LINE); -} - -BOOL LLVOVolume::setIsFlexible(BOOL is_flexible) -{ - BOOL res = FALSE; - BOOL was_flexible = isFlexible(); - LLVolumeParams volume_params; - if (is_flexible) - { - if (!was_flexible) - { - volume_params = getVolume()->getParams(); - U8 profile_and_hole = volume_params.getProfileParams().getCurveType(); - volume_params.setType(profile_and_hole, LL_PCODE_PATH_FLEXIBLE); - res = TRUE; - setFlags(FLAGS_USE_PHYSICS, FALSE); - setFlags(FLAGS_PHANTOM, TRUE); - setParameterEntryInUse(LLNetworkData::PARAMS_FLEXIBLE, TRUE, true); - if (mDrawable) - { - mDrawable->makeActive(); - } - } - } - else - { - if (was_flexible) - { - volume_params = getVolume()->getParams(); - U8 profile_and_hole = volume_params.getProfileParams().getCurveType(); - volume_params.setType(profile_and_hole, LL_PCODE_PATH_LINE); - res = TRUE; - setFlags(FLAGS_PHANTOM, FALSE); - setParameterEntryInUse(LLNetworkData::PARAMS_FLEXIBLE, FALSE, true); - } - } - if (res) - { - res = setVolume(volume_params, 1); - if (res) - { - markForUpdate(TRUE); - } - } - return res; -} - -//---------------------------------------------------------------------------- - -void LLVOVolume::generateSilhouette(LLSelectNode* nodep, const LLVector3& view_point) -{ - LLVolume *volume = getVolume(); - - if (volume) - { - LLVector3 view_vector; - view_vector = view_point; - - //transform view vector into volume space - view_vector -= getRenderPosition(); - mDrawable->mDistanceWRTCamera = view_vector.length(); - LLQuaternion worldRot = getRenderRotation(); - view_vector = view_vector * ~worldRot; - if (!isVolumeGlobal()) - { - LLVector3 objScale = getScale(); - LLVector3 invObjScale(1.f / objScale.mV[VX], 1.f / objScale.mV[VY], 1.f / objScale.mV[VZ]); - view_vector.scaleVec(invObjScale); - } - - updateRelativeXform(); - LLMatrix4 trans_mat = mRelativeXform; - if (mDrawable->isStatic()) - { - trans_mat.translate(getRegion()->getOriginAgent()); - } - - volume->generateSilhouetteVertices(nodep->mSilhouetteVertices, nodep->mSilhouetteNormals, view_vector, trans_mat, mRelativeXformInvTrans, nodep->getTESelectMask()); - - nodep->mSilhouetteExists = TRUE; - } -} - -void LLVOVolume::deleteFaces() -{ - S32 face_count = mNumFaces; - if (mDrawable.notNull()) - { - mDrawable->deleteFaces(0, face_count); - } - - mNumFaces = 0; -} - -void LLVOVolume::updateRadius() -{ - if (mDrawable.isNull()) - { - return; - } - - mVObjRadius = getScale().length(); - mDrawable->setRadius(mVObjRadius); -} - - -BOOL LLVOVolume::isAttachment() const -{ - return mState != 0 ; -} - -BOOL LLVOVolume::isHUDAttachment() const -{ - // *NOTE: we assume hud attachment points are in defined range - // since this range is constant for backwards compatibility - // reasons this is probably a reasonable assumption to make - S32 attachment_id = ATTACHMENT_ID_FROM_STATE(mState); - return ( attachment_id >= 31 && attachment_id <= 38 ); -} - - -const LLMatrix4 LLVOVolume::getRenderMatrix() const -{ - if (mDrawable->isActive() && !mDrawable->isRoot()) - { - return mDrawable->getParent()->getWorldMatrix(); - } - return mDrawable->getWorldMatrix(); -} - -// Returns a base cost and adds textures to passed in set. -// total cost is returned value + 5 * size of the resulting set. -// Cannot include cost of textures, as they may be re-used in linked -// children, and cost should only be increased for unique textures -Nyx -U32 LLVOVolume::getRenderCost(std::set<LLUUID> &textures) const -{ - // base cost of each prim should be 10 points - static const U32 ARC_PRIM_COST = 10; - // per-prim costs - static const U32 ARC_INVISI_COST = 1; - static const U32 ARC_SHINY_COST = 1; - static const U32 ARC_GLOW_COST = 1; - static const U32 ARC_FLEXI_COST = 8; - static const U32 ARC_PARTICLE_COST = 16; - static const U32 ARC_BUMP_COST = 4; - - // per-face costs - static const U32 ARC_PLANAR_COST = 1; - static const U32 ARC_ANIM_TEX_COST = 4; - static const U32 ARC_ALPHA_COST = 4; - - U32 shame = ARC_PRIM_COST; - - U32 invisi = 0; - U32 shiny = 0; - U32 glow = 0; - U32 alpha = 0; - U32 flexi = 0; - U32 animtex = 0; - U32 particles = 0; - U32 scale = 0; - U32 bump = 0; - U32 planar = 0; - - if (isFlexible()) - { - flexi = 1; - } - if (isParticleSource()) - { - particles = 1; - } - - const LLVector3& sc = getScale(); - scale += (U32) sc.mV[0] + (U32) sc.mV[1] + (U32) sc.mV[2]; - - const LLDrawable* drawablep = mDrawable; - - if (isSculpted()) - { - const LLSculptParams *sculpt_params = (LLSculptParams *) getParameterEntry(LLNetworkData::PARAMS_SCULPT); - LLUUID sculpt_id = sculpt_params->getSculptTexture(); - textures.insert(sculpt_id); - } - - for (S32 i = 0; i < drawablep->getNumFaces(); ++i) - { - const LLFace* face = drawablep->getFace(i); - const LLTextureEntry* te = face->getTextureEntry(); - const LLViewerTexture* img = face->getTexture(); - - if (img) - { - textures.insert(img->getID()); - } - - if (face->getPoolType() == LLDrawPool::POOL_ALPHA) - { - alpha++; - } - else if (img && img->getPrimaryFormat() == GL_ALPHA) - { - invisi = 1; - } - - if (te) - { - if (te->getBumpmap()) - { - bump = 1; - } - if (te->getShiny()) - { - shiny = 1; - } - if (te->getGlow() > 0.f) - { - glow = 1; - } - if (face->mTextureMatrix != NULL) - { - animtex++; - } - if (te->getTexGen()) - { - planar++; - } - } - } - - - shame += invisi * ARC_INVISI_COST; - shame += shiny * ARC_SHINY_COST; - shame += glow * ARC_GLOW_COST; - shame += alpha * ARC_ALPHA_COST; - shame += flexi * ARC_FLEXI_COST; - shame += animtex * ARC_ANIM_TEX_COST; - shame += particles * ARC_PARTICLE_COST; - shame += bump * ARC_BUMP_COST; - shame += planar * ARC_PLANAR_COST; - shame += scale; - - LLViewerObject::const_child_list_t& child_list = getChildren(); - for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); - iter != child_list.end(); - ++iter) - { - const LLViewerObject* child_objectp = *iter; - const LLDrawable* child_drawablep = child_objectp->mDrawable; - if (child_drawablep) - { - const LLVOVolume* child_volumep = child_drawablep->getVOVolume(); - if (child_volumep) - { - shame += child_volumep->getRenderCost(textures); - } - } - } - - return shame; - -} - -F32 LLVOVolume::getStreamingCost(S32* bytes, S32* visible_bytes) -{ - if (isMesh()) - { - LLSD& header = gMeshRepo.getMeshHeader(getVolume()->getParams().getSculptID()); - - F32 radius = getScale().length(); - - return LLMeshRepository::getStreamingCost(header, radius, bytes, visible_bytes, mLOD); - } - - return 0.f; -} - -U32 LLVOVolume::getTriangleCount() -{ - U32 count = 0; - LLVolume* volume = getVolume(); - if (volume) - { - count = volume->getNumTriangles(); - } - - return count; -} - -U32 LLVOVolume::getHighLODTriangleCount() -{ - U32 ret = 0; - - LLVolume* volume = getVolume(); - - if (!isSculpted()) - { +/** + * @file llvovolume.cpp + * @brief LLVOVolume class implementation + * + * $LicenseInfo:firstyear=2001&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +// A "volume" is a box, cylinder, sphere, or other primitive shape. + +#include "llviewerprecompiledheaders.h" + +#include "llvovolume.h" + +#include <sstream> + +#include "llviewercontrol.h" +#include "lldir.h" +#include "llflexibleobject.h" +#include "llfloatertools.h" +#include "llmaterialtable.h" +#include "llprimitive.h" +#include "llvolume.h" +#include "llvolumeoctree.h" +#include "llvolumemgr.h" +#include "llvolumemessage.h" +#include "material_codes.h" +#include "message.h" +#include "llpluginclassmedia.h" // for code in the mediaEvent handler +#include "object_flags.h" +#include "llagentconstants.h" +#include "lldrawable.h" +#include "lldrawpoolavatar.h" +#include "lldrawpoolbump.h" +#include "llface.h" +#include "llspatialpartition.h" +#include "llhudmanager.h" +#include "llflexibleobject.h" +#include "llsky.h" +#include "lltexturefetch.h" +#include "llvector4a.h" +#include "llviewercamera.h" +#include "llviewertexturelist.h" +#include "llviewerobjectlist.h" +#include "llviewerregion.h" +#include "llviewertextureanim.h" +#include "llworld.h" +#include "llselectmgr.h" +#include "pipeline.h" +#include "llsdutil.h" +#include "llmatrix4a.h" +#include "llmediaentry.h" +#include "llmediadataclient.h" +#include "llmeshrepository.h" +#include "llagent.h" +#include "llviewermediafocus.h" +#include "llvoavatar.h" + +const S32 MIN_QUIET_FRAMES_COALESCE = 30; +const F32 FORCE_SIMPLE_RENDER_AREA = 512.f; +const F32 FORCE_CULL_AREA = 8.f; +const F32 MAX_LOD_DISTANCE = 24.f; + + +BOOL gAnimateTextures = TRUE; +//extern BOOL gHideSelectedObjects; + +F32 LLVOVolume::sLODFactor = 1.f; +F32 LLVOVolume::sLODSlopDistanceFactor = 0.5f; //Changing this to zero, effectively disables the LOD transition slop +F32 LLVOVolume::sDistanceFactor = 1.0f; +S32 LLVOVolume::sNumLODChanges = 0; +LLPointer<LLObjectMediaDataClient> LLVOVolume::sObjectMediaClient = NULL; +LLPointer<LLObjectMediaNavigateClient> LLVOVolume::sObjectMediaNavigateClient = NULL; + +static LLFastTimer::DeclareTimer FTM_GEN_TRIANGLES("Generate Triangles"); +static LLFastTimer::DeclareTimer FTM_GEN_VOLUME("Generate Volumes"); +static LLFastTimer::DeclareTimer FTM_VOLUME_TEXTURES("Volume Textures"); + +// Implementation class of LLMediaDataClientObject. See llmediadataclient.h +class LLMediaDataClientObjectImpl : public LLMediaDataClientObject +{ +public: + LLMediaDataClientObjectImpl(LLVOVolume *obj, bool isNew) : mObject(obj), mNew(isNew) + { + mObject->addMDCImpl(); + } + ~LLMediaDataClientObjectImpl() + { + mObject->removeMDCImpl(); + } + + virtual U8 getMediaDataCount() const + { return mObject->getNumTEs(); } + + virtual LLSD getMediaDataLLSD(U8 index) const + { + LLSD result; + LLTextureEntry *te = mObject->getTE(index); + if (NULL != te) + { + llassert((te->getMediaData() != NULL) == te->hasMedia()); + if (te->getMediaData() != NULL) + { + result = te->getMediaData()->asLLSD(); + // XXX HACK: workaround bug in asLLSD() where whitelist is not set properly + // See DEV-41949 + if (!result.has(LLMediaEntry::WHITELIST_KEY)) + { + result[LLMediaEntry::WHITELIST_KEY] = LLSD::emptyArray(); + } + } + } + return result; + } + virtual bool isCurrentMediaUrl(U8 index, const std::string &url) const + { + LLTextureEntry *te = mObject->getTE(index); + if (te) + { + if (te->getMediaData()) + { + return (te->getMediaData()->getCurrentURL() == url); + } + } + return url.empty(); + } + + virtual LLUUID getID() const + { return mObject->getID(); } + + virtual void mediaNavigateBounceBack(U8 index) + { mObject->mediaNavigateBounceBack(index); } + + virtual bool hasMedia() const + { return mObject->hasMedia(); } + + virtual void updateObjectMediaData(LLSD const &data, const std::string &version_string) + { mObject->updateObjectMediaData(data, version_string); } + + virtual F64 getMediaInterest() const + { + F64 interest = mObject->getTotalMediaInterest(); + if (interest < (F64)0.0) + { + // media interest not valid yet, try pixel area + interest = mObject->getPixelArea(); + // HACK: force recalculation of pixel area if interest is the "magic default" of 1024. + if (interest == 1024.f) + { + const_cast<LLVOVolume*>(static_cast<LLVOVolume*>(mObject))->setPixelAreaAndAngle(gAgent); + interest = mObject->getPixelArea(); + } + } + return interest; + } + + virtual bool isInterestingEnough() const + { + return LLViewerMedia::isInterestingEnough(mObject, getMediaInterest()); + } + + virtual std::string getCapabilityUrl(const std::string &name) const + { return mObject->getRegion()->getCapability(name); } + + virtual bool isDead() const + { return mObject->isDead(); } + + virtual U32 getMediaVersion() const + { return LLTextureEntry::getVersionFromMediaVersionString(mObject->getMediaURL()); } + + virtual bool isNew() const + { return mNew; } + +private: + LLPointer<LLVOVolume> mObject; + bool mNew; +}; + + +LLVOVolume::LLVOVolume(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp) + : LLViewerObject(id, pcode, regionp), + mVolumeImpl(NULL) +{ + mTexAnimMode = 0; + mRelativeXform.setIdentity(); + mRelativeXformInvTrans.setIdentity(); + + mFaceMappingChanged = FALSE; + mLOD = MIN_LOD; + mTextureAnimp = NULL; + mVolumeChanged = FALSE; + mVObjRadius = LLVector3(1,1,0.5f).length(); + mNumFaces = 0; + mLODChanged = FALSE; + mSculptChanged = FALSE; + mSpotLightPriority = 0.f; + + mMediaImplList.resize(getNumTEs()); + mLastFetchedMediaVersion = -1; + mIndexInTex = 0; + mMDCImplCount = 0; +} + +LLVOVolume::~LLVOVolume() +{ + delete mTextureAnimp; + mTextureAnimp = NULL; + delete mVolumeImpl; + mVolumeImpl = NULL; + + if(!mMediaImplList.empty()) + { + for(U32 i = 0 ; i < mMediaImplList.size() ; i++) + { + if(mMediaImplList[i].notNull()) + { + mMediaImplList[i]->removeObject(this) ; + } + } + } +} + +void LLVOVolume::markDead() +{ + if (!mDead) + { + if(getMDCImplCount() > 0) + { + LLMediaDataClientObject::ptr_t obj = new LLMediaDataClientObjectImpl(const_cast<LLVOVolume*>(this), false); + if (sObjectMediaClient) sObjectMediaClient->removeFromQueue(obj); + if (sObjectMediaNavigateClient) sObjectMediaNavigateClient->removeFromQueue(obj); + } + + // Detach all media impls from this object + for(U32 i = 0 ; i < mMediaImplList.size() ; i++) + { + removeMediaImpl(i); + } + + if (mSculptTexture.notNull()) + { + mSculptTexture->removeVolume(this); + } + } + + LLViewerObject::markDead(); +} + + +// static +void LLVOVolume::initClass() +{ + // gSavedSettings better be around + if (gSavedSettings.getBOOL("PrimMediaMasterEnabled")) + { + const F32 queue_timer_delay = gSavedSettings.getF32("PrimMediaRequestQueueDelay"); + const F32 retry_timer_delay = gSavedSettings.getF32("PrimMediaRetryTimerDelay"); + const U32 max_retries = gSavedSettings.getU32("PrimMediaMaxRetries"); + const U32 max_sorted_queue_size = gSavedSettings.getU32("PrimMediaMaxSortedQueueSize"); + const U32 max_round_robin_queue_size = gSavedSettings.getU32("PrimMediaMaxRoundRobinQueueSize"); + sObjectMediaClient = new LLObjectMediaDataClient(queue_timer_delay, retry_timer_delay, max_retries, + max_sorted_queue_size, max_round_robin_queue_size); + sObjectMediaNavigateClient = new LLObjectMediaNavigateClient(queue_timer_delay, retry_timer_delay, + max_retries, max_sorted_queue_size, max_round_robin_queue_size); + } +} + +// static +void LLVOVolume::cleanupClass() +{ + sObjectMediaClient = NULL; + sObjectMediaNavigateClient = NULL; +} + +U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys, + void **user_data, + U32 block_num, EObjectUpdateType update_type, + LLDataPacker *dp) +{ + LLColor4U color; + const S32 teDirtyBits = (TEM_CHANGE_TEXTURE|TEM_CHANGE_COLOR|TEM_CHANGE_MEDIA); + + // Do base class updates... + U32 retval = LLViewerObject::processUpdateMessage(mesgsys, user_data, block_num, update_type, dp); + + LLUUID sculpt_id; + U8 sculpt_type = 0; + if (isSculpted()) + { + LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT); + sculpt_id = sculpt_params->getSculptTexture(); + sculpt_type = sculpt_params->getSculptType(); + } + + if (!dp) + { + if (update_type == OUT_FULL) + { + //////////////////////////////// + // + // Unpack texture animation data + // + // + + if (mesgsys->getSizeFast(_PREHASH_ObjectData, block_num, _PREHASH_TextureAnim)) + { + if (!mTextureAnimp) + { + mTextureAnimp = new LLViewerTextureAnim(); + } + else + { + if (!(mTextureAnimp->mMode & LLTextureAnim::SMOOTH)) + { + mTextureAnimp->reset(); + } + } + mTexAnimMode = 0; + mTextureAnimp->unpackTAMessage(mesgsys, block_num); + } + else + { + if (mTextureAnimp) + { + delete mTextureAnimp; + mTextureAnimp = NULL; + gPipeline.markTextured(mDrawable); + mFaceMappingChanged = TRUE; + mTexAnimMode = 0; + } + } + + // Unpack volume data + LLVolumeParams volume_params; + LLVolumeMessage::unpackVolumeParams(&volume_params, mesgsys, _PREHASH_ObjectData, block_num); + volume_params.setSculptID(sculpt_id, sculpt_type); + + if (setVolume(volume_params, 0)) + { + markForUpdate(TRUE); + } + } + + // Sigh, this needs to be done AFTER the volume is set as well, otherwise bad stuff happens... + //////////////////////////// + // + // Unpack texture entry data + // + S32 result = unpackTEMessage(mesgsys, _PREHASH_ObjectData, block_num); + if (result & teDirtyBits) + { + updateTEData(); + } + if (result & TEM_CHANGE_MEDIA) + { + retval |= MEDIA_FLAGS_CHANGED; + } + } + else + { + // CORY TO DO: Figure out how to get the value here + if (update_type != OUT_TERSE_IMPROVED) + { + LLVolumeParams volume_params; + BOOL res = LLVolumeMessage::unpackVolumeParams(&volume_params, *dp); + if (!res) + { + llwarns << "Bogus volume parameters in object " << getID() << llendl; + llwarns << getRegion()->getOriginGlobal() << llendl; + } + + volume_params.setSculptID(sculpt_id, sculpt_type); + + if (setVolume(volume_params, 0)) + { + markForUpdate(TRUE); + } + S32 res2 = unpackTEMessage(*dp); + if (TEM_INVALID == res2) + { + // There's something bogus in the data that we're unpacking. + dp->dumpBufferToLog(); + llwarns << "Flushing cache files" << llendl; + + if(LLVOCache::hasInstance() && getRegion()) + { + LLVOCache::getInstance()->removeEntry(getRegion()->getHandle()) ; + } + + llwarns << "Bogus TE data in " << getID() << llendl; + } + else + { + if (res2 & teDirtyBits) + { + updateTEData(); + } + if (res2 & TEM_CHANGE_MEDIA) + { + retval |= MEDIA_FLAGS_CHANGED; + } + } + + U32 value = dp->getPassFlags(); + + if (value & 0x40) + { + if (!mTextureAnimp) + { + mTextureAnimp = new LLViewerTextureAnim(); + } + else + { + if (!(mTextureAnimp->mMode & LLTextureAnim::SMOOTH)) + { + mTextureAnimp->reset(); + } + } + mTexAnimMode = 0; + mTextureAnimp->unpackTAMessage(*dp); + } + else if (mTextureAnimp) + { + delete mTextureAnimp; + mTextureAnimp = NULL; + gPipeline.markTextured(mDrawable); + mFaceMappingChanged = TRUE; + mTexAnimMode = 0; + } + } + else + { + S32 texture_length = mesgsys->getSizeFast(_PREHASH_ObjectData, block_num, _PREHASH_TextureEntry); + if (texture_length) + { + U8 tdpbuffer[1024]; + LLDataPackerBinaryBuffer tdp(tdpbuffer, 1024); + mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_TextureEntry, tdpbuffer, 0, block_num); + S32 result = unpackTEMessage(tdp); + if (result & teDirtyBits) + { + updateTEData(); + } + if (result & TEM_CHANGE_MEDIA) + { + retval |= MEDIA_FLAGS_CHANGED; + } + } + } + } + if (retval & (MEDIA_URL_REMOVED | MEDIA_URL_ADDED | MEDIA_URL_UPDATED | MEDIA_FLAGS_CHANGED)) + { + // If only the media URL changed, and it isn't a media version URL, + // ignore it + if ( ! ( retval & (MEDIA_URL_ADDED | MEDIA_URL_UPDATED) && + mMedia && ! mMedia->mMediaURL.empty() && + ! LLTextureEntry::isMediaVersionString(mMedia->mMediaURL) ) ) + { + // If the media changed at all, request new media data + LL_DEBUGS("MediaOnAPrim") << "Media update: " << getID() << ": retval=" << retval << " Media URL: " << + ((mMedia) ? mMedia->mMediaURL : std::string("")) << LL_ENDL; + requestMediaDataUpdate(retval & MEDIA_FLAGS_CHANGED); + } + else { + LL_INFOS("MediaOnAPrim") << "Ignoring media update for: " << getID() << " Media URL: " << + ((mMedia) ? mMedia->mMediaURL : std::string("")) << LL_ENDL; + } + } + // ...and clean up any media impls + cleanUpMediaImpls(); + + return retval; +} + + +void LLVOVolume::animateTextures() +{ + F32 off_s = 0.f, off_t = 0.f, scale_s = 1.f, scale_t = 1.f, rot = 0.f; + S32 result = mTextureAnimp->animateTextures(off_s, off_t, scale_s, scale_t, rot); + + if (result) + { + if (!mTexAnimMode) + { + mFaceMappingChanged = TRUE; + gPipeline.markTextured(mDrawable); + } + mTexAnimMode = result | mTextureAnimp->mMode; + + S32 start=0, end=mDrawable->getNumFaces()-1; + if (mTextureAnimp->mFace >= 0 && mTextureAnimp->mFace <= end) + { + start = end = mTextureAnimp->mFace; + } + + for (S32 i = start; i <= end; i++) + { + LLFace* facep = mDrawable->getFace(i); + if(facep->getVirtualSize() <= MIN_TEX_ANIM_SIZE && facep->mTextureMatrix) continue; + + const LLTextureEntry* te = facep->getTextureEntry(); + + if (!te) + { + continue; + } + + if (!(result & LLViewerTextureAnim::ROTATE)) + { + te->getRotation(&rot); + } + if (!(result & LLViewerTextureAnim::TRANSLATE)) + { + te->getOffset(&off_s,&off_t); + } + if (!(result & LLViewerTextureAnim::SCALE)) + { + te->getScale(&scale_s, &scale_t); + } + + if (!facep->mTextureMatrix) + { + facep->mTextureMatrix = new LLMatrix4(); + } + + LLMatrix4& tex_mat = *facep->mTextureMatrix; + tex_mat.setIdentity(); + LLVector3 trans ; + + if(facep->isAtlasInUse()) + { + // + //if use atlas for animated texture + //apply the following transform to the animation matrix. + // + + F32 tcoord_xoffset = 0.f ; + F32 tcoord_yoffset = 0.f ; + F32 tcoord_xscale = 1.f ; + F32 tcoord_yscale = 1.f ; + if(facep->isAtlasInUse()) + { + const LLVector2* tmp = facep->getTexCoordOffset() ; + tcoord_xoffset = tmp->mV[0] ; + tcoord_yoffset = tmp->mV[1] ; + + tmp = facep->getTexCoordScale() ; + tcoord_xscale = tmp->mV[0] ; + tcoord_yscale = tmp->mV[1] ; + } + trans.set(LLVector3(tcoord_xoffset + tcoord_xscale * (off_s+0.5f), tcoord_yoffset + tcoord_yscale * (off_t+0.5f), 0.f)); + + tex_mat.translate(LLVector3(-(tcoord_xoffset + tcoord_xscale * 0.5f), -(tcoord_yoffset + tcoord_yscale * 0.5f), 0.f)); + } + else //non atlas + { + trans.set(LLVector3(off_s+0.5f, off_t+0.5f, 0.f)); + tex_mat.translate(LLVector3(-0.5f, -0.5f, 0.f)); + } + + LLVector3 scale(scale_s, scale_t, 1.f); + LLQuaternion quat; + quat.setQuat(rot, 0, 0, -1.f); + + tex_mat.rotate(quat); + + LLMatrix4 mat; + mat.initAll(scale, LLQuaternion(), LLVector3()); + tex_mat *= mat; + + tex_mat.translate(trans); + } + } + else + { + if (mTexAnimMode && mTextureAnimp->mRate == 0) + { + U8 start, count; + + if (mTextureAnimp->mFace == -1) + { + start = 0; + count = getNumTEs(); + } + else + { + start = (U8) mTextureAnimp->mFace; + count = 1; + } + + for (S32 i = start; i < start + count; i++) + { + if (mTexAnimMode & LLViewerTextureAnim::TRANSLATE) + { + setTEOffset(i, mTextureAnimp->mOffS, mTextureAnimp->mOffT); + } + if (mTexAnimMode & LLViewerTextureAnim::SCALE) + { + setTEScale(i, mTextureAnimp->mScaleS, mTextureAnimp->mScaleT); + } + if (mTexAnimMode & LLViewerTextureAnim::ROTATE) + { + setTERotation(i, mTextureAnimp->mRot); + } + } + + gPipeline.markTextured(mDrawable); + mFaceMappingChanged = TRUE; + mTexAnimMode = 0; + } + } +} +BOOL LLVOVolume::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) +{ + LLViewerObject::idleUpdate(agent, world, time); + + static LLFastTimer::DeclareTimer ftm("Volume"); + LLFastTimer t(ftm); + + if (mDead || mDrawable.isNull()) + { + return TRUE; + } + + /////////////////////// + // + // Do texture animation stuff + // + + if (mTextureAnimp && gAnimateTextures) + { + animateTextures(); + } + + // Dispatch to implementation + if (mVolumeImpl) + { + mVolumeImpl->doIdleUpdate(agent, world, time); + } + + const S32 MAX_ACTIVE_OBJECT_QUIET_FRAMES = 40; + + if (mDrawable->isActive()) + { + if (mDrawable->isRoot() && + mDrawable->mQuietCount++ > MAX_ACTIVE_OBJECT_QUIET_FRAMES && + (!mDrawable->getParent() || !mDrawable->getParent()->isActive())) + { + mDrawable->makeStatic(); + } + } + + return TRUE; +} + +void LLVOVolume::updateTextures() +{ + const F32 TEXTURE_AREA_REFRESH_TIME = 5.f; // seconds + if (mTextureUpdateTimer.getElapsedTimeF32() > TEXTURE_AREA_REFRESH_TIME) + { + updateTextureVirtualSize(); + } +} + +BOOL LLVOVolume::isVisible() const +{ + if(mDrawable.notNull() && mDrawable->isVisible()) + { + return TRUE ; + } + + if(isAttachment()) + { + LLViewerObject* objp = (LLViewerObject*)getParent() ; + while(objp && !objp->isAvatar()) + { + objp = (LLViewerObject*)objp->getParent() ; + } + + return objp && objp->mDrawable.notNull() && objp->mDrawable->isVisible() ; + } + + return FALSE ; +} + +void LLVOVolume::updateTextureVirtualSize() +{ + LLFastTimer ftm(FTM_VOLUME_TEXTURES); + // Update the pixel area of all faces + + if(!isVisible()) + { + return ; + } + + if (!gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_SIMPLE)) + { + return; + } + + static LLCachedControl<bool> dont_load_textures(gSavedSettings,"TextureDisable"); + + if (dont_load_textures || LLAppViewer::getTextureFetch()->mDebugPause) // || !mDrawable->isVisible()) + { + return; + } + + mTextureUpdateTimer.reset(); + + F32 old_area = mPixelArea; + mPixelArea = 0.f; + + const S32 num_faces = mDrawable->getNumFaces(); + F32 min_vsize=999999999.f, max_vsize=0.f; + LLViewerCamera* camera = LLViewerCamera::getInstance(); + for (S32 i = 0; i < num_faces; i++) + { + LLFace* face = mDrawable->getFace(i); + const LLTextureEntry *te = face->getTextureEntry(); + LLViewerTexture *imagep = face->getTexture(); + if (!imagep || !te || + face->mExtents[0].equals3(face->mExtents[1])) + { + continue; + } + + F32 vsize; + F32 old_size = face->getVirtualSize(); + + if (isHUDAttachment()) + { + F32 area = (F32) camera->getScreenPixelArea(); + vsize = area; + imagep->setBoostLevel(LLViewerTexture::BOOST_HUD); + face->setPixelArea(area); // treat as full screen + face->setVirtualSize(vsize); + } + else + { + vsize = face->getTextureVirtualSize(); + } + + mPixelArea = llmax(mPixelArea, face->getPixelArea()); + + if (face->mTextureMatrix != NULL) + { + if ((vsize < MIN_TEX_ANIM_SIZE && old_size > MIN_TEX_ANIM_SIZE) || + (vsize > MIN_TEX_ANIM_SIZE && old_size < MIN_TEX_ANIM_SIZE)) + { + gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD, FALSE); + } + } + + if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXTURE_AREA)) + { + if (vsize < min_vsize) min_vsize = vsize; + if (vsize > max_vsize) max_vsize = vsize; + } + else if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXTURE_PRIORITY)) + { + LLViewerFetchedTexture* img = LLViewerTextureManager::staticCastToFetchedTexture(imagep) ; + if(img) + { + F32 pri = img->getDecodePriority(); + pri = llmax(pri, 0.0f); + if (pri < min_vsize) min_vsize = pri; + if (pri > max_vsize) max_vsize = pri; + } + } + else if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_FACE_AREA)) + { + F32 pri = mPixelArea; + if (pri < min_vsize) min_vsize = pri; + if (pri > max_vsize) max_vsize = pri; + } + } + + if (isSculpted()) + { + LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT); + LLUUID id = sculpt_params->getSculptTexture(); + + updateSculptTexture(); + + + + if (mSculptTexture.notNull()) + { + mSculptTexture->setBoostLevel(llmax((S32)mSculptTexture->getBoostLevel(), + (S32)LLViewerTexture::BOOST_SCULPTED)); + mSculptTexture->setForSculpt() ; + + if(!mSculptTexture->isCachedRawImageReady()) + { + S32 lod = llmin(mLOD, 3); + F32 lodf = ((F32)(lod + 1.0f)/4.f); + F32 tex_size = lodf * LLViewerTexture::sMaxSculptRez ; + mSculptTexture->addTextureStats(2.f * tex_size * tex_size, FALSE); + + //if the sculpty very close to the view point, load first + { + LLVector3 lookAt = getPositionAgent() - camera->getOrigin(); + F32 dist = lookAt.normVec() ; + F32 cos_angle_to_view_dir = lookAt * camera->getXAxis() ; + mSculptTexture->setAdditionalDecodePriority(0.8f * LLFace::calcImportanceToCamera(cos_angle_to_view_dir, dist)) ; + } + } + + S32 texture_discard = mSculptTexture->getDiscardLevel(); //try to match the texture + S32 current_discard = getVolume() ? getVolume()->getSculptLevel() : -2 ; + + if (texture_discard >= 0 && //texture has some data available + (texture_discard < current_discard || //texture has more data than last rebuild + current_discard < 0)) //no previous rebuild + { + gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, FALSE); + mSculptChanged = TRUE; + } + + if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SCULPTED)) + { + setDebugText(llformat("T%d C%d V%d\n%dx%d", + texture_discard, current_discard, getVolume()->getSculptLevel(), + mSculptTexture->getHeight(), mSculptTexture->getWidth())); + } + } + + } + + if (getLightTextureID().notNull()) + { + LLLightImageParams* params = (LLLightImageParams*) getParameterEntry(LLNetworkData::PARAMS_LIGHT_IMAGE); + LLUUID id = params->getLightTexture(); + mLightTexture = LLViewerTextureManager::getFetchedTexture(id); + if (mLightTexture.notNull()) + { + F32 rad = getLightRadius(); + mLightTexture->addTextureStats(gPipeline.calcPixelArea(getPositionAgent(), + LLVector3(rad,rad,rad), + *camera)); + } + } + + if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXTURE_AREA)) + { + setDebugText(llformat("%.0f:%.0f", (F32) sqrt(min_vsize),(F32) sqrt(max_vsize))); + } + else if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXTURE_PRIORITY)) + { + setDebugText(llformat("%.0f:%.0f", (F32) sqrt(min_vsize),(F32) sqrt(max_vsize))); + } + else if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_FACE_AREA)) + { + setDebugText(llformat("%.0f:%.0f", (F32) sqrt(min_vsize),(F32) sqrt(max_vsize))); + } + + if (mPixelArea == 0) + { //flexi phasing issues make this happen + mPixelArea = old_area; + } +} + +BOOL LLVOVolume::isActive() const +{ + return !mStatic || mTextureAnimp || (mVolumeImpl && mVolumeImpl->isActive()) || + (mDrawable.notNull() && mDrawable->isActive()); +} + +BOOL LLVOVolume::setMaterial(const U8 material) +{ + BOOL res = LLViewerObject::setMaterial(material); + + return res; +} + +void LLVOVolume::setTexture(const S32 face) +{ + llassert(face < getNumTEs()); + gGL.getTexUnit(0)->bind(getTEImage(face)); +} + +void LLVOVolume::setScale(const LLVector3 &scale, BOOL damped) +{ + if (scale != getScale()) + { + // store local radius + LLViewerObject::setScale(scale); + + if (mVolumeImpl) + { + mVolumeImpl->onSetScale(scale, damped); + } + + updateRadius(); + + //since drawable transforms do not include scale, changing volume scale + //requires an immediate rebuild of volume verts. + gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_POSITION, TRUE); + } +} + +LLFace* LLVOVolume::addFace(S32 f) +{ + const LLTextureEntry* te = getTE(f); + LLViewerTexture* imagep = getTEImage(f); + return mDrawable->addFace(te, imagep); +} + +LLDrawable *LLVOVolume::createDrawable(LLPipeline *pipeline) +{ + pipeline->allocDrawable(this); + + mDrawable->setRenderType(LLPipeline::RENDER_TYPE_VOLUME); + + S32 max_tes_to_set = getNumTEs(); + for (S32 i = 0; i < max_tes_to_set; i++) + { + addFace(i); + } + mNumFaces = max_tes_to_set; + + if (isAttachment()) + { + mDrawable->makeActive(); + } + + if (getIsLight()) + { + // Add it to the pipeline mLightSet + gPipeline.setLight(mDrawable, TRUE); + } + + updateRadius(); + bool force_update = true; // avoid non-alpha mDistance update being optimized away + mDrawable->updateDistance(*LLViewerCamera::getInstance(), force_update); + + return mDrawable; +} + +BOOL LLVOVolume::setVolume(const LLVolumeParams ¶ms_in, const S32 detail, bool unique_volume) +{ + LLVolumeParams volume_params = params_in; + + S32 last_lod = mVolumep.notNull() ? LLVolumeLODGroup::getVolumeDetailFromScale(mVolumep->getDetail()) : -1; + S32 lod = mLOD; + + BOOL is404 = FALSE; + + if (isSculpted()) + { + // if it's a mesh + if ((volume_params.getSculptType() & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH) + { //meshes might not have all LODs, get the force detail to best existing LOD + + LLUUID mesh_id = volume_params.getSculptID(); + + //profile and path params don't matter for meshes + volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE); + + lod = gMeshRepo.getActualMeshLOD(volume_params, lod); + if (lod == -1) + { + is404 = TRUE; + lod = 0; + } + } + } + + // Check if we need to change implementations + bool is_flexible = (volume_params.getPathParams().getCurveType() == LL_PCODE_PATH_FLEXIBLE); + if (is_flexible) + { + setParameterEntryInUse(LLNetworkData::PARAMS_FLEXIBLE, TRUE, false); + if (!mVolumeImpl) + { + LLFlexibleObjectData* data = (LLFlexibleObjectData*)getParameterEntry(LLNetworkData::PARAMS_FLEXIBLE); + mVolumeImpl = new LLVolumeImplFlexible(this, data); + } + } + else + { + // Mark the parameter not in use + setParameterEntryInUse(LLNetworkData::PARAMS_FLEXIBLE, FALSE, false); + if (mVolumeImpl) + { + delete mVolumeImpl; + mVolumeImpl = NULL; + if (mDrawable.notNull()) + { + // Undo the damage we did to this matrix + mDrawable->updateXform(FALSE); + } + } + } + + if (is404) + { + setIcon(LLViewerTextureManager::getFetchedTextureFromFile("icons/Inv_Mesh.png", TRUE, LLViewerTexture::BOOST_UI)); + } + + if ((LLPrimitive::setVolume(volume_params, lod, (mVolumeImpl && mVolumeImpl->isVolumeUnique()))) || mSculptChanged) + { + mFaceMappingChanged = TRUE; + + if (mVolumeImpl) + { + mVolumeImpl->onSetVolume(volume_params, mLOD); + } + + updateSculptTexture(); + + + if (isSculpted()) + { + updateSculptTexture(); + // if it's a mesh + if ((volume_params.getSculptType() & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH) + { + if (getVolume()->getNumVolumeFaces() == 0 || getVolume()->isTetrahedron()) + { + //load request not yet issued, request pipeline load this mesh + LLUUID asset_id = volume_params.getSculptID(); + S32 available_lod = gMeshRepo.loadMesh(this, volume_params, lod, last_lod); + if (available_lod != lod) + { + LLPrimitive::setVolume(volume_params, available_lod); + } + } + + } + else // otherwise is sculptie + { + if (mSculptTexture.notNull()) + { + sculpt(); + } + } + } + + return TRUE; + } + + return FALSE; +} + +void LLVOVolume::updateSculptTexture() +{ + LLPointer<LLViewerFetchedTexture> old_sculpt = mSculptTexture; + + if (isSculpted() && !isMesh()) + { + LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT); + LLUUID id = sculpt_params->getSculptTexture(); + if (id.notNull()) + { + mSculptTexture = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); + } + } + else + { + mSculptTexture = NULL; + } + + if (mSculptTexture != old_sculpt) + { + if (old_sculpt.notNull()) + { + old_sculpt->removeVolume(this); + } + if (mSculptTexture.notNull()) + { + mSculptTexture->addVolume(this); + } + } + +} + + + +void LLVOVolume::notifyMeshLoaded() +{ + mSculptChanged = TRUE; + gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_GEOMETRY, TRUE); +} + +// sculpt replaces generate() for sculpted surfaces +void LLVOVolume::sculpt() +{ + if (mSculptTexture.notNull()) + { + U16 sculpt_height = 0; + U16 sculpt_width = 0; + S8 sculpt_components = 0; + const U8* sculpt_data = NULL; + + S32 discard_level = mSculptTexture->getDiscardLevel() ; + LLImageRaw* raw_image = mSculptTexture->getCachedRawImage() ; + + S32 max_discard = mSculptTexture->getMaxDiscardLevel(); + if (discard_level > max_discard) + discard_level = max_discard; // clamp to the best we can do + + S32 current_discard = getVolume()->getSculptLevel() ; + if(current_discard < -2) + { + llwarns << "WARNING!!: Current discard of sculpty at " << current_discard + << " is less than -2." << llendl; + + // corrupted volume... don't update the sculpty + return; + } + else if (current_discard > MAX_DISCARD_LEVEL) + { + llwarns << "WARNING!!: Current discard of sculpty at " << current_discard + << " is more than than allowed max of " << MAX_DISCARD_LEVEL << llendl; + + // corrupted volume... don't update the sculpty + return; + } + + if (current_discard == discard_level) // no work to do here + return; + + if(!raw_image) + { + llassert(discard_level < 0) ; + + sculpt_width = 0; + sculpt_height = 0; + sculpt_data = NULL ; + + if(LLViewerTextureManager::sTesterp) + { + LLViewerTextureManager::sTesterp->updateGrayTextureBinding(); + } + } + else + { + sculpt_height = raw_image->getHeight(); + sculpt_width = raw_image->getWidth(); + sculpt_components = raw_image->getComponents(); + + sculpt_data = raw_image->getData(); + + if(LLViewerTextureManager::sTesterp) + { + mSculptTexture->updateBindStatsForTester() ; + } + } + getVolume()->sculpt(sculpt_width, sculpt_height, sculpt_components, sculpt_data, discard_level); + + //notify rebuild any other VOVolumes that reference this sculpty volume + for (S32 i = 0; i < mSculptTexture->getNumVolumes(); ++i) + { + LLVOVolume* volume = (*(mSculptTexture->getVolumeList()))[i]; + if (volume != this && volume->getVolume() == getVolume()) + { + gPipeline.markRebuild(volume->mDrawable, LLDrawable::REBUILD_GEOMETRY, FALSE); + } + } + } +} + +S32 LLVOVolume::computeLODDetail(F32 distance, F32 radius) +{ + S32 cur_detail; + if (LLPipeline::sDynamicLOD) + { + // We've got LOD in the profile, and in the twist. Use radius. + F32 tan_angle = (LLVOVolume::sLODFactor*radius)/distance; + cur_detail = LLVolumeLODGroup::getDetailFromTan(llround(tan_angle, 0.01f)); + } + else + { + cur_detail = llclamp((S32) (sqrtf(radius)*LLVOVolume::sLODFactor*4.f), 0, 3); + } + return cur_detail; +} + +BOOL LLVOVolume::calcLOD() +{ + if (mDrawable.isNull()) + { + return FALSE; + } + + S32 cur_detail = 0; + + F32 radius; + F32 distance; + + if (mDrawable->isState(LLDrawable::RIGGED)) + { + LLVOAvatar* avatar = getAvatar(); + distance = avatar->mDrawable->mDistanceWRTCamera; + radius = avatar->getBinRadius(); + } + else + { + distance = mDrawable->mDistanceWRTCamera; + radius = getVolume()->mLODScaleBias.scaledVec(getScale()).length(); + } + + //hold onto unmodified distance for debugging + F32 debug_distance = distance; + + distance *= sDistanceFactor; + + F32 rampDist = LLVOVolume::sLODFactor * 2; + + if (distance < rampDist) + { + // Boost LOD when you're REALLY close + distance *= 1.0f/rampDist; + distance *= distance; + distance *= rampDist; + } + + // DON'T Compensate for field of view changing on FOV zoom. + distance *= F_PI/3.f; + + cur_detail = computeLODDetail(llround(distance, 0.01f), + llround(radius, 0.01f)); + + + if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_LOD_INFO)) + { + setDebugText(llformat("%.2f:%.2f, %d", debug_distance, radius, cur_detail)); + } + + if (cur_detail != mLOD) + { + mAppAngle = llround((F32) atan2( mDrawable->getRadius(), mDrawable->mDistanceWRTCamera) * RAD_TO_DEG, 0.01f); + mLOD = cur_detail; + return TRUE; + } + else + { + return FALSE; + } +} + +BOOL LLVOVolume::updateLOD() +{ + if (mDrawable.isNull()) + { + return FALSE; + } + + BOOL lod_changed = calcLOD(); + + if (lod_changed) + { + gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, FALSE); + mLODChanged = TRUE; + } + + lod_changed = lod_changed || LLViewerObject::updateLOD(); + + return lod_changed; +} + +BOOL LLVOVolume::setDrawableParent(LLDrawable* parentp) +{ + if (!LLViewerObject::setDrawableParent(parentp)) + { + // no change in drawable parent + return FALSE; + } + + if (!mDrawable->isRoot()) + { + // rebuild vertices in parent relative space + gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, TRUE); + + if (mDrawable->isActive() && !parentp->isActive()) + { + parentp->makeActive(); + } + else if (mDrawable->isStatic() && parentp->isActive()) + { + mDrawable->makeActive(); + } + } + + return TRUE; +} + +void LLVOVolume::updateFaceFlags() +{ + for (S32 i = 0; i < getVolume()->getNumFaces(); i++) + { + LLFace *face = mDrawable->getFace(i); + if (!face) + { + return; + } + + BOOL fullbright = getTE(i)->getFullbright(); + face->clearState(LLFace::FULLBRIGHT | LLFace::HUD_RENDER | LLFace::LIGHT); + + if (fullbright || (mMaterial == LL_MCODE_LIGHT)) + { + face->setState(LLFace::FULLBRIGHT); + } + if (mDrawable->isLight()) + { + face->setState(LLFace::LIGHT); + } + if (isHUDAttachment()) + { + face->setState(LLFace::HUD_RENDER); + } + } +} + +BOOL LLVOVolume::setParent(LLViewerObject* parent) +{ + BOOL ret = FALSE ; + if (parent != getParent()) + { + ret = LLViewerObject::setParent(parent); + if (ret && mDrawable) + { + gPipeline.markMoved(mDrawable); + gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, TRUE); + } + } + + return ret ; +} + +// NOTE: regenFaces() MUST be followed by genTriangles()! +void LLVOVolume::regenFaces() +{ + // remove existing faces + BOOL count_changed = mNumFaces != getNumTEs(); + + if (count_changed) + { + deleteFaces(); + // add new faces + mNumFaces = getNumTEs(); + } + + for (S32 i = 0; i < mNumFaces; i++) + { + LLFace* facep = count_changed ? addFace(i) : mDrawable->getFace(i); + facep->setTEOffset(i); + facep->setTexture(getTEImage(i)); + facep->setViewerObject(this); + + // If the face had media on it, this will have broken the link between the LLViewerMediaTexture and the face. + // Re-establish the link. + if((int)mMediaImplList.size() > i) + { + if(mMediaImplList[i]) + { + LLViewerMediaTexture* media_tex = LLViewerTextureManager::findMediaTexture(mMediaImplList[i]->getMediaTextureID()) ; + if(media_tex) + { + media_tex->addMediaToFace(facep) ; + } + } + } + } + + if (!count_changed) + { + updateFaceFlags(); + } +} + +BOOL LLVOVolume::genBBoxes(BOOL force_global) +{ + BOOL res = TRUE; + + LLVector4a min,max; + + min.clear(); + max.clear(); + + BOOL rebuild = mDrawable->isState(LLDrawable::REBUILD_VOLUME | LLDrawable::REBUILD_POSITION | LLDrawable::REBUILD_RIGGED); + +// bool rigged = false; + LLVolume* volume = mRiggedVolume; + if (!volume) + { + volume = getVolume(); + } + + for (S32 i = 0; i < getVolume()->getNumVolumeFaces(); i++) + { + LLFace *face = mDrawable->getFace(i); + if (!face) + { + continue; + } + res &= face->genVolumeBBoxes(*volume, i, + mRelativeXform, mRelativeXformInvTrans, + (mVolumeImpl && mVolumeImpl->isVolumeGlobal()) || force_global); + + if (rebuild) + { + if (i == 0) + { + min = face->mExtents[0]; + max = face->mExtents[1]; + } + else + { + min.setMin(min, face->mExtents[0]); + max.setMax(max, face->mExtents[1]); + } + } + } + + if (rebuild) + { + mDrawable->setSpatialExtents(min,max); + min.add(max); + min.mul(0.5f); + mDrawable->setPositionGroup(min); + } + + updateRadius(); + mDrawable->movePartition(); + + return res; +} + +void LLVOVolume::preRebuild() +{ + if (mVolumeImpl != NULL) + { + mVolumeImpl->preRebuild(); + } +} + +void LLVOVolume::updateRelativeXform() +{ + if (mVolumeImpl) + { + mVolumeImpl->updateRelativeXform(); + return; + } + + LLDrawable* drawable = mDrawable; + + if (drawable->isState(LLDrawable::RIGGED) && mRiggedVolume.notNull()) + { //rigged volume (which is in agent space) is used for generating bounding boxes etc + //inverse of render matrix should go to partition space + mRelativeXform = getRenderMatrix(); + + F32* dst = (F32*) mRelativeXformInvTrans.mMatrix; + F32* src = (F32*) mRelativeXform.mMatrix; + dst[0] = src[0]; dst[1] = src[1]; dst[2] = src[2]; + dst[3] = src[4]; dst[4] = src[5]; dst[5] = src[6]; + dst[6] = src[8]; dst[7] = src[9]; dst[8] = src[10]; + + mRelativeXform.invert(); + mRelativeXformInvTrans.transpose(); + } + else if (drawable->isActive()) + { + // setup relative transforms + LLQuaternion delta_rot; + LLVector3 delta_pos, delta_scale; + + //matrix from local space to parent relative/global space + delta_rot = drawable->isSpatialRoot() ? LLQuaternion() : mDrawable->getRotation(); + delta_pos = drawable->isSpatialRoot() ? LLVector3(0,0,0) : mDrawable->getPosition(); + delta_scale = mDrawable->getScale(); + + // Vertex transform (4x4) + LLVector3 x_axis = LLVector3(delta_scale.mV[VX], 0.f, 0.f) * delta_rot; + LLVector3 y_axis = LLVector3(0.f, delta_scale.mV[VY], 0.f) * delta_rot; + LLVector3 z_axis = LLVector3(0.f, 0.f, delta_scale.mV[VZ]) * delta_rot; + + mRelativeXform.initRows(LLVector4(x_axis, 0.f), + LLVector4(y_axis, 0.f), + LLVector4(z_axis, 0.f), + LLVector4(delta_pos, 1.f)); + + + // compute inverse transpose for normals + // mRelativeXformInvTrans.setRows(x_axis, y_axis, z_axis); + // mRelativeXformInvTrans.invert(); + // mRelativeXformInvTrans.setRows(x_axis, y_axis, z_axis); + // grumble - invert is NOT a matrix invert, so we do it by hand: + + LLMatrix3 rot_inverse = LLMatrix3(~delta_rot); + + LLMatrix3 scale_inverse; + scale_inverse.setRows(LLVector3(1.0, 0.0, 0.0) / delta_scale.mV[VX], + LLVector3(0.0, 1.0, 0.0) / delta_scale.mV[VY], + LLVector3(0.0, 0.0, 1.0) / delta_scale.mV[VZ]); + + + mRelativeXformInvTrans = rot_inverse * scale_inverse; + + mRelativeXformInvTrans.transpose(); + } + else + { + LLVector3 pos = getPosition(); + LLVector3 scale = getScale(); + LLQuaternion rot = getRotation(); + + if (mParent) + { + pos *= mParent->getRotation(); + pos += mParent->getPosition(); + rot *= mParent->getRotation(); + } + + //LLViewerRegion* region = getRegion(); + //pos += region->getOriginAgent(); + + LLVector3 x_axis = LLVector3(scale.mV[VX], 0.f, 0.f) * rot; + LLVector3 y_axis = LLVector3(0.f, scale.mV[VY], 0.f) * rot; + LLVector3 z_axis = LLVector3(0.f, 0.f, scale.mV[VZ]) * rot; + + mRelativeXform.initRows(LLVector4(x_axis, 0.f), + LLVector4(y_axis, 0.f), + LLVector4(z_axis, 0.f), + LLVector4(pos, 1.f)); + + // compute inverse transpose for normals + LLMatrix3 rot_inverse = LLMatrix3(~rot); + + LLMatrix3 scale_inverse; + scale_inverse.setRows(LLVector3(1.0, 0.0, 0.0) / scale.mV[VX], + LLVector3(0.0, 1.0, 0.0) / scale.mV[VY], + LLVector3(0.0, 0.0, 1.0) / scale.mV[VZ]); + + + mRelativeXformInvTrans = rot_inverse * scale_inverse; + + mRelativeXformInvTrans.transpose(); + } +} + +static LLFastTimer::DeclareTimer FTM_GEN_FLEX("Generate Flexies"); +static LLFastTimer::DeclareTimer FTM_UPDATE_PRIMITIVES("Update Primitives"); +static LLFastTimer::DeclareTimer FTM_UPDATE_RIGGED_VOLUME("Update Rigged"); + +BOOL LLVOVolume::updateGeometry(LLDrawable *drawable) +{ + LLFastTimer t(FTM_UPDATE_PRIMITIVES); + + if (mDrawable->isState(LLDrawable::REBUILD_RIGGED)) + { + { + LLFastTimer t(FTM_UPDATE_RIGGED_VOLUME); + updateRiggedVolume(); + } + genBBoxes(FALSE); + mDrawable->clearState(LLDrawable::REBUILD_RIGGED); + } + + if (mVolumeImpl != NULL) + { + BOOL res; + { + LLFastTimer t(FTM_GEN_FLEX); + res = mVolumeImpl->doUpdateGeometry(drawable); + } + updateFaceFlags(); + return res; + } + + dirtySpatialGroup(drawable->isState(LLDrawable::IN_REBUILD_Q1)); + + BOOL compiled = FALSE; + + updateRelativeXform(); + + if (mDrawable.isNull()) // Not sure why this is happening, but it is... + { + return TRUE; // No update to complete + } + + if (mVolumeChanged || mFaceMappingChanged ) + { + compiled = TRUE; + + if (mVolumeChanged) + { + LLFastTimer ftm(FTM_GEN_VOLUME); + LLVolumeParams volume_params = getVolume()->getParams(); + setVolume(volume_params, 0); + drawable->setState(LLDrawable::REBUILD_VOLUME); + } + + { + LLFastTimer t(FTM_GEN_TRIANGLES); + regenFaces(); + genBBoxes(FALSE); + } + } + else if ((mLODChanged) || (mSculptChanged)) + { + LLVolume *old_volumep, *new_volumep; + F32 old_lod, new_lod; + S32 old_num_faces, new_num_faces ; + + old_volumep = getVolume(); + old_lod = old_volumep->getDetail(); + old_num_faces = old_volumep->getNumFaces() ; + old_volumep = NULL ; + + { + LLFastTimer ftm(FTM_GEN_VOLUME); + LLVolumeParams volume_params = getVolume()->getParams(); + setVolume(volume_params, 0); + } + + new_volumep = getVolume(); + new_lod = new_volumep->getDetail(); + new_num_faces = new_volumep->getNumFaces() ; + new_volumep = NULL ; + + if ((new_lod != old_lod) || mSculptChanged) + { + compiled = TRUE; + sNumLODChanges += new_num_faces ; + + drawable->setState(LLDrawable::REBUILD_VOLUME); // for face->genVolumeTriangles() + + { + LLFastTimer t(FTM_GEN_TRIANGLES); + if (new_num_faces != old_num_faces) + { + regenFaces(); + } + genBBoxes(FALSE); + + if (mSculptChanged) + { //changes in sculpt maps can thrash an object bounding box without + //triggering a spatial group bounding box update -- force spatial group + //to update bounding boxes + LLSpatialGroup* group = mDrawable->getSpatialGroup(); + if (group) + { + group->unbound(); + } + } + } + } + } + // it has its own drawable (it's moved) or it has changed UVs or it has changed xforms from global<->local + else + { + compiled = TRUE; + // All it did was move or we changed the texture coordinate offset + LLFastTimer t(FTM_GEN_TRIANGLES); + genBBoxes(FALSE); + } + + // Update face flags + updateFaceFlags(); + + if(compiled) + { + LLPipeline::sCompiles++; + } + + mVolumeChanged = FALSE; + mLODChanged = FALSE; + mSculptChanged = FALSE; + mFaceMappingChanged = FALSE; + + return LLViewerObject::updateGeometry(drawable); +} + +void LLVOVolume::updateFaceSize(S32 idx) +{ + LLFace* facep = mDrawable->getFace(idx); + if (idx >= getVolume()->getNumVolumeFaces()) + { + facep->setSize(0,0, true); + } + else + { + const LLVolumeFace& vol_face = getVolume()->getVolumeFace(idx); + facep->setSize(vol_face.mNumVertices, vol_face.mNumIndices, + true); // <--- volume faces should be padded for 16-byte alignment + + } +} + +BOOL LLVOVolume::isRootEdit() const +{ + if (mParent && !((LLViewerObject*)mParent)->isAvatar()) + { + return FALSE; + } + return TRUE; +} + +//virtual +void LLVOVolume::setNumTEs(const U8 num_tes) +{ + const U8 old_num_tes = getNumTEs() ; + + if(old_num_tes && old_num_tes < num_tes) //new faces added + { + LLViewerObject::setNumTEs(num_tes) ; + + if(mMediaImplList.size() >= old_num_tes && mMediaImplList[old_num_tes -1].notNull())//duplicate the last media textures if exists. + { + mMediaImplList.resize(num_tes) ; + const LLTextureEntry* te = getTE(old_num_tes - 1) ; + for(U8 i = old_num_tes; i < num_tes ; i++) + { + setTE(i, *te) ; + mMediaImplList[i] = mMediaImplList[old_num_tes -1] ; + } + mMediaImplList[old_num_tes -1]->setUpdated(TRUE) ; + } + } + else if(old_num_tes > num_tes && mMediaImplList.size() > num_tes) //old faces removed + { + U8 end = mMediaImplList.size() ; + for(U8 i = num_tes; i < end ; i++) + { + removeMediaImpl(i) ; + } + mMediaImplList.resize(num_tes) ; + + LLViewerObject::setNumTEs(num_tes) ; + } + else + { + LLViewerObject::setNumTEs(num_tes) ; + } + + return ; +} + +void LLVOVolume::setTEImage(const U8 te, LLViewerTexture *imagep) +{ + BOOL changed = (mTEImages[te] != imagep); + LLViewerObject::setTEImage(te, imagep); + if (changed) + { + gPipeline.markTextured(mDrawable); + mFaceMappingChanged = TRUE; + } +} + +S32 LLVOVolume::setTETexture(const U8 te, const LLUUID &uuid) +{ + S32 res = LLViewerObject::setTETexture(te, uuid); + if (res) + { + gPipeline.markTextured(mDrawable); + mFaceMappingChanged = TRUE; + } + return res; +} + +S32 LLVOVolume::setTEColor(const U8 te, const LLColor3& color) +{ + return setTEColor(te, LLColor4(color)); +} + +S32 LLVOVolume::setTEColor(const U8 te, const LLColor4& color) +{ + S32 retval = 0; + const LLTextureEntry *tep = getTE(te); + if (!tep) + { + llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl; + } + else if (color != tep->getColor()) + { + if (color.mV[3] != tep->getColor().mV[3]) + { + gPipeline.markTextured(mDrawable); + } + retval = LLPrimitive::setTEColor(te, color); + if (mDrawable.notNull() && retval) + { + // These should only happen on updates which are not the initial update. + mDrawable->setState(LLDrawable::REBUILD_COLOR); + dirtyMesh(); + } + } + + return retval; +} + +S32 LLVOVolume::setTEBumpmap(const U8 te, const U8 bumpmap) +{ + S32 res = LLViewerObject::setTEBumpmap(te, bumpmap); + if (res) + { + gPipeline.markTextured(mDrawable); + mFaceMappingChanged = TRUE; + } + return res; +} + +S32 LLVOVolume::setTETexGen(const U8 te, const U8 texgen) +{ + S32 res = LLViewerObject::setTETexGen(te, texgen); + if (res) + { + gPipeline.markTextured(mDrawable); + mFaceMappingChanged = TRUE; + } + return res; +} + +S32 LLVOVolume::setTEMediaTexGen(const U8 te, const U8 media) +{ + S32 res = LLViewerObject::setTEMediaTexGen(te, media); + if (res) + { + gPipeline.markTextured(mDrawable); + mFaceMappingChanged = TRUE; + } + return res; +} + +S32 LLVOVolume::setTEShiny(const U8 te, const U8 shiny) +{ + S32 res = LLViewerObject::setTEShiny(te, shiny); + if (res) + { + gPipeline.markTextured(mDrawable); + mFaceMappingChanged = TRUE; + } + return res; +} + +S32 LLVOVolume::setTEFullbright(const U8 te, const U8 fullbright) +{ + S32 res = LLViewerObject::setTEFullbright(te, fullbright); + if (res) + { + gPipeline.markTextured(mDrawable); + mFaceMappingChanged = TRUE; + } + return res; +} + +S32 LLVOVolume::setTEBumpShinyFullbright(const U8 te, const U8 bump) +{ + S32 res = LLViewerObject::setTEBumpShinyFullbright(te, bump); + if (res) + { + gPipeline.markTextured(mDrawable); + mFaceMappingChanged = TRUE; + } + return res; +} + +S32 LLVOVolume::setTEMediaFlags(const U8 te, const U8 media_flags) +{ + S32 res = LLViewerObject::setTEMediaFlags(te, media_flags); + if (res) + { + gPipeline.markTextured(mDrawable); + mFaceMappingChanged = TRUE; + } + return res; +} + +S32 LLVOVolume::setTEGlow(const U8 te, const F32 glow) +{ + S32 res = LLViewerObject::setTEGlow(te, glow); + if (res) + { + gPipeline.markTextured(mDrawable); + mFaceMappingChanged = TRUE; + } + return res; +} + +S32 LLVOVolume::setTEScale(const U8 te, const F32 s, const F32 t) +{ + S32 res = LLViewerObject::setTEScale(te, s, t); + if (res) + { + gPipeline.markTextured(mDrawable); + mFaceMappingChanged = TRUE; + } + return res; +} + +S32 LLVOVolume::setTEScaleS(const U8 te, const F32 s) +{ + S32 res = LLViewerObject::setTEScaleS(te, s); + if (res) + { + gPipeline.markTextured(mDrawable); + mFaceMappingChanged = TRUE; + } + return res; +} + +S32 LLVOVolume::setTEScaleT(const U8 te, const F32 t) +{ + S32 res = LLViewerObject::setTEScaleT(te, t); + if (res) + { + gPipeline.markTextured(mDrawable); + mFaceMappingChanged = TRUE; + } + return res; +} + +void LLVOVolume::updateTEData() +{ + /*if (mDrawable.notNull()) + { + mFaceMappingChanged = TRUE; + gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_MATERIAL, TRUE); + }*/ +} + +bool LLVOVolume::hasMedia() const +{ + bool result = false; + const U8 numTEs = getNumTEs(); + for (U8 i = 0; i < numTEs; i++) + { + const LLTextureEntry* te = getTE(i); + if(te->hasMedia()) + { + result = true; + break; + } + } + return result; +} + +LLVector3 LLVOVolume::getApproximateFaceNormal(U8 face_id) +{ + LLVolume* volume = getVolume(); + LLVector4a result; + result.clear(); + + LLVector3 ret; + + if (volume && face_id < volume->getNumVolumeFaces()) + { + const LLVolumeFace& face = volume->getVolumeFace(face_id); + for (S32 i = 0; i < (S32)face.mNumVertices; ++i) + { + result.add(face.mNormals[i]); + } + + LLVector3 ret(result.getF32ptr()); + ret = volumeDirectionToAgent(ret); + ret.normVec(); + } + + return ret; +} + +void LLVOVolume::requestMediaDataUpdate(bool isNew) +{ + if (sObjectMediaClient) + sObjectMediaClient->fetchMedia(new LLMediaDataClientObjectImpl(this, isNew)); +} + +bool LLVOVolume::isMediaDataBeingFetched() const +{ + // I know what I'm doing by const_casting this away: this is just + // a wrapper class that is only going to do a lookup. + return (sObjectMediaClient) ? sObjectMediaClient->isInQueue(new LLMediaDataClientObjectImpl(const_cast<LLVOVolume*>(this), false)) : false; +} + +void LLVOVolume::cleanUpMediaImpls() +{ + // Iterate through our TEs and remove any Impls that are no longer used + const U8 numTEs = getNumTEs(); + for (U8 i = 0; i < numTEs; i++) + { + const LLTextureEntry* te = getTE(i); + if( ! te->hasMedia()) + { + // Delete the media IMPL! + removeMediaImpl(i) ; + } + } +} + +void LLVOVolume::updateObjectMediaData(const LLSD &media_data_array, const std::string &media_version) +{ + // media_data_array is an array of media entry maps + // media_version is the version string in the response. + U32 fetched_version = LLTextureEntry::getVersionFromMediaVersionString(media_version); + + // Only update it if it is newer! + if ( (S32)fetched_version > mLastFetchedMediaVersion) + { + mLastFetchedMediaVersion = fetched_version; + //llinfos << "updating:" << this->getID() << " " << ll_pretty_print_sd(media_data_array) << llendl; + + LLSD::array_const_iterator iter = media_data_array.beginArray(); + LLSD::array_const_iterator end = media_data_array.endArray(); + U8 texture_index = 0; + for (; iter != end; ++iter, ++texture_index) + { + syncMediaData(texture_index, *iter, false/*merge*/, false/*ignore_agent*/); + } + } +} + +void LLVOVolume::syncMediaData(S32 texture_index, const LLSD &media_data, bool merge, bool ignore_agent) +{ + if(mDead) + { + // If the object has been marked dead, don't process media updates. + return; + } + + LLTextureEntry *te = getTE(texture_index); + if(!te) + { + return ; + } + + LL_DEBUGS("MediaOnAPrim") << "BEFORE: texture_index = " << texture_index + << " hasMedia = " << te->hasMedia() << " : " + << ((NULL == te->getMediaData()) ? "NULL MEDIA DATA" : ll_pretty_print_sd(te->getMediaData()->asLLSD())) << llendl; + + std::string previous_url; + LLMediaEntry* mep = te->getMediaData(); + if(mep) + { + // Save the "current url" from before the update so we can tell if + // it changes. + previous_url = mep->getCurrentURL(); + } + + if (merge) + { + te->mergeIntoMediaData(media_data); + } + else { + // XXX Question: what if the media data is undefined LLSD, but the + // update we got above said that we have media flags?? Here we clobber + // that, assuming the data from the service is more up-to-date. + te->updateMediaData(media_data); + } + + mep = te->getMediaData(); + if(mep) + { + bool update_from_self = false; + if (!ignore_agent) + { + LLUUID updating_agent = LLTextureEntry::getAgentIDFromMediaVersionString(getMediaURL()); + update_from_self = (updating_agent == gAgent.getID()); + } + viewer_media_t media_impl = LLViewerMedia::updateMediaImpl(mep, previous_url, update_from_self); + + addMediaImpl(media_impl, texture_index) ; + } + else + { + removeMediaImpl(texture_index); + } + + LL_DEBUGS("MediaOnAPrim") << "AFTER: texture_index = " << texture_index + << " hasMedia = " << te->hasMedia() << " : " + << ((NULL == te->getMediaData()) ? "NULL MEDIA DATA" : ll_pretty_print_sd(te->getMediaData()->asLLSD())) << llendl; +} + +void LLVOVolume::mediaNavigateBounceBack(U8 texture_index) +{ + // Find the media entry for this navigate + const LLMediaEntry* mep = NULL; + viewer_media_t impl = getMediaImpl(texture_index); + LLTextureEntry *te = getTE(texture_index); + if(te) + { + mep = te->getMediaData(); + } + + if (mep && impl) + { + std::string url = mep->getCurrentURL(); + // Look for a ":", if not there, assume "http://" + if (!url.empty() && std::string::npos == url.find(':')) + { + url = "http://" + url; + } + // If the url we're trying to "bounce back" to is either empty or not + // allowed by the whitelist, try the home url. If *that* doesn't work, + // set the media as failed and unload it + if (url.empty() || !mep->checkCandidateUrl(url)) + { + url = mep->getHomeURL(); + // Look for a ":", if not there, assume "http://" + if (!url.empty() && std::string::npos == url.find(':')) + { + url = "http://" + url; + } + } + if (url.empty() || !mep->checkCandidateUrl(url)) + { + // The url to navigate back to is not good, and we have nowhere else + // to go. + LL_WARNS("MediaOnAPrim") << "FAILED to bounce back URL \"" << url << "\" -- unloading impl" << LL_ENDL; + impl->setMediaFailed(true); + } + else { + // Okay, navigate now + LL_INFOS("MediaOnAPrim") << "bouncing back to URL: " << url << LL_ENDL; + impl->navigateTo(url, "", false, true); + } + } +} + +bool LLVOVolume::hasMediaPermission(const LLMediaEntry* media_entry, MediaPermType perm_type) +{ + // NOTE: This logic ALMOST duplicates the logic in the server (in particular, in llmediaservice.cpp). + if (NULL == media_entry ) return false; // XXX should we assert here? + + // The agent has permissions if: + // - world permissions are on, or + // - group permissions are on, and agent_id is in the group, or + // - agent permissions are on, and agent_id is the owner + + // *NOTE: We *used* to check for modify permissions here (i.e. permissions were + // granted if permModify() was true). However, this doesn't make sense in the + // viewer: we don't want to show controls or allow interaction if the author + // has deemed it so. See DEV-42115. + + U8 media_perms = (perm_type == MEDIA_PERM_INTERACT) ? media_entry->getPermsInteract() : media_entry->getPermsControl(); + + // World permissions + if (0 != (media_perms & LLMediaEntry::PERM_ANYONE)) + { + return true; + } + + // Group permissions + else if (0 != (media_perms & LLMediaEntry::PERM_GROUP)) + { + LLPermissions* obj_perm = LLSelectMgr::getInstance()->findObjectPermissions(this); + if (obj_perm && gAgent.isInGroup(obj_perm->getGroup())) + { + return true; + } + } + + // Owner permissions + else if (0 != (media_perms & LLMediaEntry::PERM_OWNER) && permYouOwner()) + { + return true; + } + + return false; + +} + +void LLVOVolume::mediaNavigated(LLViewerMediaImpl *impl, LLPluginClassMedia* plugin, std::string new_location) +{ + bool block_navigation = false; + // FIXME: if/when we allow the same media impl to be used by multiple faces, the logic here will need to be fixed + // to deal with multiple face indices. + int face_index = getFaceIndexWithMediaImpl(impl, -1); + + // Find the media entry for this navigate + LLMediaEntry* mep = NULL; + LLTextureEntry *te = getTE(face_index); + if(te) + { + mep = te->getMediaData(); + } + + if(mep) + { + if(!mep->checkCandidateUrl(new_location)) + { + block_navigation = true; + } + if (!block_navigation && !hasMediaPermission(mep, MEDIA_PERM_INTERACT)) + { + block_navigation = true; + } + } + else + { + LL_WARNS("MediaOnAPrim") << "Couldn't find media entry!" << LL_ENDL; + } + + if(block_navigation) + { + LL_INFOS("MediaOnAPrim") << "blocking navigate to URI " << new_location << LL_ENDL; + + // "bounce back" to the current URL from the media entry + mediaNavigateBounceBack(face_index); + } + else if (sObjectMediaNavigateClient) + { + + LL_DEBUGS("MediaOnAPrim") << "broadcasting navigate with URI " << new_location << LL_ENDL; + + sObjectMediaNavigateClient->navigate(new LLMediaDataClientObjectImpl(this, false), face_index, new_location); + } +} + +void LLVOVolume::mediaEvent(LLViewerMediaImpl *impl, LLPluginClassMedia* plugin, LLViewerMediaObserver::EMediaEvent event) +{ + switch(event) + { + + case LLViewerMediaObserver::MEDIA_EVENT_LOCATION_CHANGED: + { + switch(impl->getNavState()) + { + case LLViewerMediaImpl::MEDIANAVSTATE_FIRST_LOCATION_CHANGED: + { + // This is the first location changed event after the start of a non-server-directed nav. It may need to be broadcast or bounced back. + mediaNavigated(impl, plugin, plugin->getLocation()); + } + break; + + case LLViewerMediaImpl::MEDIANAVSTATE_FIRST_LOCATION_CHANGED_SPURIOUS: + // This navigate didn't change the current URL. + LL_DEBUGS("MediaOnAPrim") << " NOT broadcasting navigate (spurious)" << LL_ENDL; + break; + + case LLViewerMediaImpl::MEDIANAVSTATE_SERVER_FIRST_LOCATION_CHANGED: + // This is the first location changed event after the start of a server-directed nav. Don't broadcast it. + LL_INFOS("MediaOnAPrim") << " NOT broadcasting navigate (server-directed)" << LL_ENDL; + break; + + default: + // This is a subsequent location-changed due to a redirect. Don't broadcast. + LL_INFOS("MediaOnAPrim") << " NOT broadcasting navigate (redirect)" << LL_ENDL; + break; + } + } + break; + + case LLViewerMediaObserver::MEDIA_EVENT_NAVIGATE_COMPLETE: + { + switch(impl->getNavState()) + { + case LLViewerMediaImpl::MEDIANAVSTATE_COMPLETE_BEFORE_LOCATION_CHANGED: + { + // This is the first location changed event after the start of a non-server-directed nav. It may need to be broadcast or bounced back. + mediaNavigated(impl, plugin, plugin->getNavigateURI()); + } + break; + + case LLViewerMediaImpl::MEDIANAVSTATE_COMPLETE_BEFORE_LOCATION_CHANGED_SPURIOUS: + // This navigate didn't change the current URL. + LL_DEBUGS("MediaOnAPrim") << " NOT broadcasting navigate (spurious)" << LL_ENDL; + break; + + case LLViewerMediaImpl::MEDIANAVSTATE_SERVER_COMPLETE_BEFORE_LOCATION_CHANGED: + // This is the the navigate complete event from a server-directed nav. Don't broadcast it. + LL_INFOS("MediaOnAPrim") << " NOT broadcasting navigate (server-directed)" << LL_ENDL; + break; + + default: + // For all other states, the navigate should have been handled by LOCATION_CHANGED events already. + break; + } + } + break; + + default: + break; + } + +} + +void LLVOVolume::sendMediaDataUpdate() +{ + if (sObjectMediaClient) + sObjectMediaClient->updateMedia(new LLMediaDataClientObjectImpl(this, false)); +} + +void LLVOVolume::removeMediaImpl(S32 texture_index) +{ + if(mMediaImplList.size() <= (U32)texture_index || mMediaImplList[texture_index].isNull()) + { + return ; + } + + //make the face referencing to mMediaImplList[texture_index] to point back to the old texture. + if(mDrawable && texture_index < mDrawable->getNumFaces()) + { + LLFace* facep = mDrawable->getFace(texture_index) ; + if(facep) + { + LLViewerMediaTexture* media_tex = LLViewerTextureManager::findMediaTexture(mMediaImplList[texture_index]->getMediaTextureID()) ; + if(media_tex) + { + media_tex->removeMediaFromFace(facep) ; + } + } + } + + //check if some other face(s) of this object reference(s)to this media impl. + S32 i ; + S32 end = (S32)mMediaImplList.size() ; + for(i = 0; i < end ; i++) + { + if( i != texture_index && mMediaImplList[i] == mMediaImplList[texture_index]) + { + break ; + } + } + + if(i == end) //this object does not need this media impl. + { + mMediaImplList[texture_index]->removeObject(this) ; + } + + mMediaImplList[texture_index] = NULL ; + return ; +} + +void LLVOVolume::addMediaImpl(LLViewerMediaImpl* media_impl, S32 texture_index) +{ + if((S32)mMediaImplList.size() < texture_index + 1) + { + mMediaImplList.resize(texture_index + 1) ; + } + + if(mMediaImplList[texture_index].notNull()) + { + if(mMediaImplList[texture_index] == media_impl) + { + return ; + } + + removeMediaImpl(texture_index) ; + } + + mMediaImplList[texture_index] = media_impl; + media_impl->addObject(this) ; + + //add the face to show the media if it is in playing + if(mDrawable) + { + LLFace* facep = mDrawable->getFace(texture_index) ; + if(facep) + { + LLViewerMediaTexture* media_tex = LLViewerTextureManager::findMediaTexture(mMediaImplList[texture_index]->getMediaTextureID()) ; + if(media_tex) + { + media_tex->addMediaToFace(facep) ; + } + } + else //the face is not available now, start media on this face later. + { + media_impl->setUpdated(TRUE) ; + } + } + return ; +} + +viewer_media_t LLVOVolume::getMediaImpl(U8 face_id) const +{ + if(mMediaImplList.size() > face_id) + { + return mMediaImplList[face_id]; + } + return NULL; +} + +F64 LLVOVolume::getTotalMediaInterest() const +{ + // If this object is currently focused, this object has "high" interest + if (LLViewerMediaFocus::getInstance()->getFocusedObjectID() == getID()) + return F64_MAX; + + F64 interest = (F64)-1.0; // means not interested; + + // If this object is selected, this object has "high" interest, but since + // there can be more than one, we still add in calculated impl interest + // XXX Sadly, 'contains()' doesn't take a const :( + if (LLSelectMgr::getInstance()->getSelection()->contains(const_cast<LLVOVolume*>(this))) + interest = F64_MAX / 2.0; + + int i = 0; + const int end = getNumTEs(); + for ( ; i < end; ++i) + { + const viewer_media_t &impl = getMediaImpl(i); + if (!impl.isNull()) + { + if (interest == (F64)-1.0) interest = (F64)0.0; + interest += impl->getInterest(); + } + } + return interest; +} + +S32 LLVOVolume::getFaceIndexWithMediaImpl(const LLViewerMediaImpl* media_impl, S32 start_face_id) +{ + S32 end = (S32)mMediaImplList.size() ; + for(S32 face_id = start_face_id + 1; face_id < end; face_id++) + { + if(mMediaImplList[face_id] == media_impl) + { + return face_id ; + } + } + return -1 ; +} + +//---------------------------------------------------------------------------- + +void LLVOVolume::setLightTextureID(LLUUID id) +{ + if (id.notNull()) + { + if (!hasLightTexture()) + { + setParameterEntryInUse(LLNetworkData::PARAMS_LIGHT_IMAGE, TRUE, true); + } + LLLightImageParams* param_block = (LLLightImageParams*) getParameterEntry(LLNetworkData::PARAMS_LIGHT_IMAGE); + if (param_block && param_block->getLightTexture() != id) + { + param_block->setLightTexture(id); + parameterChanged(LLNetworkData::PARAMS_LIGHT_IMAGE, true); + } + } + else + { + if (hasLightTexture()) + { + setParameterEntryInUse(LLNetworkData::PARAMS_LIGHT_IMAGE, FALSE, true); + mLightTexture = NULL; + } + } +} + +void LLVOVolume::setSpotLightParams(LLVector3 params) +{ + LLLightImageParams* param_block = (LLLightImageParams*) getParameterEntry(LLNetworkData::PARAMS_LIGHT_IMAGE); + if (param_block && param_block->getParams() != params) + { + param_block->setParams(params); + parameterChanged(LLNetworkData::PARAMS_LIGHT_IMAGE, true); + } +} + +void LLVOVolume::setIsLight(BOOL is_light) +{ + if (is_light != getIsLight()) + { + if (is_light) + { + setParameterEntryInUse(LLNetworkData::PARAMS_LIGHT, TRUE, true); + } + else + { + setParameterEntryInUse(LLNetworkData::PARAMS_LIGHT, FALSE, true); + } + + if (is_light) + { + // Add it to the pipeline mLightSet + gPipeline.setLight(mDrawable, TRUE); + } + else + { + // Not a light. Remove it from the pipeline's light set. + gPipeline.setLight(mDrawable, FALSE); + } + } +} + +void LLVOVolume::setLightColor(const LLColor3& color) +{ + LLLightParams *param_block = (LLLightParams *)getParameterEntry(LLNetworkData::PARAMS_LIGHT); + if (param_block) + { + if (param_block->getColor() != color) + { + param_block->setColor(LLColor4(color, param_block->getColor().mV[3])); + parameterChanged(LLNetworkData::PARAMS_LIGHT, true); + gPipeline.markTextured(mDrawable); + mFaceMappingChanged = TRUE; + } + } +} + +void LLVOVolume::setLightIntensity(F32 intensity) +{ + LLLightParams *param_block = (LLLightParams *)getParameterEntry(LLNetworkData::PARAMS_LIGHT); + if (param_block) + { + if (param_block->getColor().mV[3] != intensity) + { + param_block->setColor(LLColor4(LLColor3(param_block->getColor()), intensity)); + parameterChanged(LLNetworkData::PARAMS_LIGHT, true); + } + } +} + +void LLVOVolume::setLightRadius(F32 radius) +{ + LLLightParams *param_block = (LLLightParams *)getParameterEntry(LLNetworkData::PARAMS_LIGHT); + if (param_block) + { + if (param_block->getRadius() != radius) + { + param_block->setRadius(radius); + parameterChanged(LLNetworkData::PARAMS_LIGHT, true); + } + } +} + +void LLVOVolume::setLightFalloff(F32 falloff) +{ + LLLightParams *param_block = (LLLightParams *)getParameterEntry(LLNetworkData::PARAMS_LIGHT); + if (param_block) + { + if (param_block->getFalloff() != falloff) + { + param_block->setFalloff(falloff); + parameterChanged(LLNetworkData::PARAMS_LIGHT, true); + } + } +} + +void LLVOVolume::setLightCutoff(F32 cutoff) +{ + LLLightParams *param_block = (LLLightParams *)getParameterEntry(LLNetworkData::PARAMS_LIGHT); + if (param_block) + { + if (param_block->getCutoff() != cutoff) + { + param_block->setCutoff(cutoff); + parameterChanged(LLNetworkData::PARAMS_LIGHT, true); + } + } +} + +//---------------------------------------------------------------------------- + +BOOL LLVOVolume::getIsLight() const +{ + return getParameterEntryInUse(LLNetworkData::PARAMS_LIGHT); +} + +LLColor3 LLVOVolume::getLightBaseColor() const +{ + const LLLightParams *param_block = (const LLLightParams *)getParameterEntry(LLNetworkData::PARAMS_LIGHT); + if (param_block) + { + return LLColor3(param_block->getColor()); + } + else + { + return LLColor3(1,1,1); + } +} + +LLColor3 LLVOVolume::getLightColor() const +{ + const LLLightParams *param_block = (const LLLightParams *)getParameterEntry(LLNetworkData::PARAMS_LIGHT); + if (param_block) + { + return LLColor3(param_block->getColor()) * param_block->getColor().mV[3]; + } + else + { + return LLColor3(1,1,1); + } +} + +LLUUID LLVOVolume::getLightTextureID() const +{ + if (getParameterEntryInUse(LLNetworkData::PARAMS_LIGHT_IMAGE)) + { + const LLLightImageParams *param_block = (const LLLightImageParams *)getParameterEntry(LLNetworkData::PARAMS_LIGHT_IMAGE); + if (param_block) + { + return param_block->getLightTexture(); + } + } + + return LLUUID::null; +} + + +LLVector3 LLVOVolume::getSpotLightParams() const +{ + if (getParameterEntryInUse(LLNetworkData::PARAMS_LIGHT_IMAGE)) + { + const LLLightImageParams *param_block = (const LLLightImageParams *)getParameterEntry(LLNetworkData::PARAMS_LIGHT_IMAGE); + if (param_block) + { + return param_block->getParams(); + } + } + + return LLVector3(); +} + +F32 LLVOVolume::getSpotLightPriority() const +{ + return mSpotLightPriority; +} + +void LLVOVolume::updateSpotLightPriority() +{ + LLVector3 pos = mDrawable->getPositionAgent(); + LLVector3 at(0,0,-1); + at *= getRenderRotation(); + + F32 r = getLightRadius()*0.5f; + + pos += at * r; + + at = LLViewerCamera::getInstance()->getAtAxis(); + + pos -= at * r; + + mSpotLightPriority = gPipeline.calcPixelArea(pos, LLVector3(r,r,r), *LLViewerCamera::getInstance()); + + if (mLightTexture.notNull()) + { + mLightTexture->addTextureStats(mSpotLightPriority); + mLightTexture->setBoostLevel(LLViewerTexture::BOOST_CLOUDS); + } +} + + +bool LLVOVolume::isLightSpotlight() const +{ + LLLightImageParams* params = (LLLightImageParams*) getParameterEntry(LLNetworkData::PARAMS_LIGHT_IMAGE); + if (params) + { + return params->isLightSpotlight(); + } + return false; +} + + +LLViewerTexture* LLVOVolume::getLightTexture() +{ + LLUUID id = getLightTextureID(); + + if (id.notNull()) + { + if (mLightTexture.isNull() || id != mLightTexture->getID()) + { + mLightTexture = LLViewerTextureManager::getFetchedTexture(id); + } + } + else + { + mLightTexture = NULL; + } + + return mLightTexture; +} + +F32 LLVOVolume::getLightIntensity() const +{ + const LLLightParams *param_block = (const LLLightParams *)getParameterEntry(LLNetworkData::PARAMS_LIGHT); + if (param_block) + { + return param_block->getColor().mV[3]; + } + else + { + return 1.f; + } +} + +F32 LLVOVolume::getLightRadius() const +{ + const LLLightParams *param_block = (const LLLightParams *)getParameterEntry(LLNetworkData::PARAMS_LIGHT); + if (param_block) + { + return param_block->getRadius(); + } + else + { + return 0.f; + } +} + +F32 LLVOVolume::getLightFalloff() const +{ + const LLLightParams *param_block = (const LLLightParams *)getParameterEntry(LLNetworkData::PARAMS_LIGHT); + if (param_block) + { + return param_block->getFalloff(); + } + else + { + return 0.f; + } +} + +F32 LLVOVolume::getLightCutoff() const +{ + const LLLightParams *param_block = (const LLLightParams *)getParameterEntry(LLNetworkData::PARAMS_LIGHT); + if (param_block) + { + return param_block->getCutoff(); + } + else + { + return 0.f; + } +} + +U32 LLVOVolume::getVolumeInterfaceID() const +{ + if (mVolumeImpl) + { + return mVolumeImpl->getID(); + } + + return 0; +} + +BOOL LLVOVolume::isFlexible() const +{ + if (getParameterEntryInUse(LLNetworkData::PARAMS_FLEXIBLE)) + { + LLVolume* volume = getVolume(); + if (volume && volume->getParams().getPathParams().getCurveType() != LL_PCODE_PATH_FLEXIBLE) + { + LLVolumeParams volume_params = getVolume()->getParams(); + U8 profile_and_hole = volume_params.getProfileParams().getCurveType(); + volume_params.setType(profile_and_hole, LL_PCODE_PATH_FLEXIBLE); + } + return TRUE; + } + else + { + return FALSE; + } +} + +BOOL LLVOVolume::isSculpted() const +{ + if (getParameterEntryInUse(LLNetworkData::PARAMS_SCULPT)) + { + return TRUE; + } + + return FALSE; +} + +BOOL LLVOVolume::isMesh() const +{ + if (isSculpted()) + { + LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT); + U8 sculpt_type = sculpt_params->getSculptType(); + + if ((sculpt_type & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH) + // mesh is a mesh + { + return TRUE; + } + } + + return FALSE; +} + +BOOL LLVOVolume::hasLightTexture() const +{ + if (getParameterEntryInUse(LLNetworkData::PARAMS_LIGHT_IMAGE)) + { + return TRUE; + } + + return FALSE; +} + +BOOL LLVOVolume::isVolumeGlobal() const +{ + if (mVolumeImpl) + { + return mVolumeImpl->isVolumeGlobal() ? TRUE : FALSE; + } + else if (mRiggedVolume.notNull()) + { + return TRUE; + } + + return FALSE; +} + +BOOL LLVOVolume::canBeFlexible() const +{ + U8 path = getVolume()->getParams().getPathParams().getCurveType(); + return (path == LL_PCODE_PATH_FLEXIBLE || path == LL_PCODE_PATH_LINE); +} + +BOOL LLVOVolume::setIsFlexible(BOOL is_flexible) +{ + BOOL res = FALSE; + BOOL was_flexible = isFlexible(); + LLVolumeParams volume_params; + if (is_flexible) + { + if (!was_flexible) + { + volume_params = getVolume()->getParams(); + U8 profile_and_hole = volume_params.getProfileParams().getCurveType(); + volume_params.setType(profile_and_hole, LL_PCODE_PATH_FLEXIBLE); + res = TRUE; + setFlags(FLAGS_USE_PHYSICS, FALSE); + setFlags(FLAGS_PHANTOM, TRUE); + setParameterEntryInUse(LLNetworkData::PARAMS_FLEXIBLE, TRUE, true); + if (mDrawable) + { + mDrawable->makeActive(); + } + } + } + else + { + if (was_flexible) + { + volume_params = getVolume()->getParams(); + U8 profile_and_hole = volume_params.getProfileParams().getCurveType(); + volume_params.setType(profile_and_hole, LL_PCODE_PATH_LINE); + res = TRUE; + setFlags(FLAGS_PHANTOM, FALSE); + setParameterEntryInUse(LLNetworkData::PARAMS_FLEXIBLE, FALSE, true); + } + } + if (res) + { + res = setVolume(volume_params, 1); + if (res) + { + markForUpdate(TRUE); + } + } + return res; +} + +//---------------------------------------------------------------------------- + +void LLVOVolume::generateSilhouette(LLSelectNode* nodep, const LLVector3& view_point) +{ + LLVolume *volume = getVolume(); + + if (volume) + { + LLVector3 view_vector; + view_vector = view_point; + + //transform view vector into volume space + view_vector -= getRenderPosition(); + mDrawable->mDistanceWRTCamera = view_vector.length(); + LLQuaternion worldRot = getRenderRotation(); + view_vector = view_vector * ~worldRot; + if (!isVolumeGlobal()) + { + LLVector3 objScale = getScale(); + LLVector3 invObjScale(1.f / objScale.mV[VX], 1.f / objScale.mV[VY], 1.f / objScale.mV[VZ]); + view_vector.scaleVec(invObjScale); + } + + updateRelativeXform(); + LLMatrix4 trans_mat = mRelativeXform; + if (mDrawable->isStatic()) + { + trans_mat.translate(getRegion()->getOriginAgent()); + } + + volume->generateSilhouetteVertices(nodep->mSilhouetteVertices, nodep->mSilhouetteNormals, view_vector, trans_mat, mRelativeXformInvTrans, nodep->getTESelectMask()); + + nodep->mSilhouetteExists = TRUE; + } +} + +void LLVOVolume::deleteFaces() +{ + S32 face_count = mNumFaces; + if (mDrawable.notNull()) + { + mDrawable->deleteFaces(0, face_count); + } + + mNumFaces = 0; +} + +void LLVOVolume::updateRadius() +{ + if (mDrawable.isNull()) + { + return; + } + + mVObjRadius = getScale().length(); + mDrawable->setRadius(mVObjRadius); +} + + +BOOL LLVOVolume::isAttachment() const +{ + return mState != 0 ; +} + +BOOL LLVOVolume::isHUDAttachment() const +{ + // *NOTE: we assume hud attachment points are in defined range + // since this range is constant for backwards compatibility + // reasons this is probably a reasonable assumption to make + S32 attachment_id = ATTACHMENT_ID_FROM_STATE(mState); + return ( attachment_id >= 31 && attachment_id <= 38 ); +} + + +const LLMatrix4 LLVOVolume::getRenderMatrix() const +{ + if (mDrawable->isActive() && !mDrawable->isRoot()) + { + return mDrawable->getParent()->getWorldMatrix(); + } + return mDrawable->getWorldMatrix(); +} + +// Returns a base cost and adds textures to passed in set. +// total cost is returned value + 5 * size of the resulting set. +// Cannot include cost of textures, as they may be re-used in linked +// children, and cost should only be increased for unique textures -Nyx +U32 LLVOVolume::getRenderCost(std::set<LLUUID> &textures) const +{ + // base cost of each prim should be 10 points + static const U32 ARC_PRIM_COST = 10; + // per-prim costs + static const U32 ARC_INVISI_COST = 1; + static const U32 ARC_SHINY_COST = 1; + static const U32 ARC_GLOW_COST = 1; + static const U32 ARC_FLEXI_COST = 8; + static const U32 ARC_PARTICLE_COST = 16; + static const U32 ARC_BUMP_COST = 4; + + // per-face costs + static const U32 ARC_PLANAR_COST = 1; + static const U32 ARC_ANIM_TEX_COST = 4; + static const U32 ARC_ALPHA_COST = 4; + + U32 shame = ARC_PRIM_COST; + + U32 invisi = 0; + U32 shiny = 0; + U32 glow = 0; + U32 alpha = 0; + U32 flexi = 0; + U32 animtex = 0; + U32 particles = 0; + U32 scale = 0; + U32 bump = 0; + U32 planar = 0; + + if (isFlexible()) + { + flexi = 1; + } + if (isParticleSource()) + { + particles = 1; + } + + const LLVector3& sc = getScale(); + scale += (U32) sc.mV[0] + (U32) sc.mV[1] + (U32) sc.mV[2]; + + const LLDrawable* drawablep = mDrawable; + + if (isSculpted()) + { + const LLSculptParams *sculpt_params = (LLSculptParams *) getParameterEntry(LLNetworkData::PARAMS_SCULPT); + LLUUID sculpt_id = sculpt_params->getSculptTexture(); + textures.insert(sculpt_id); + } + + for (S32 i = 0; i < drawablep->getNumFaces(); ++i) + { + const LLFace* face = drawablep->getFace(i); + const LLTextureEntry* te = face->getTextureEntry(); + const LLViewerTexture* img = face->getTexture(); + + if (img) + { + textures.insert(img->getID()); + } + + if (face->getPoolType() == LLDrawPool::POOL_ALPHA) + { + alpha++; + } + else if (img && img->getPrimaryFormat() == GL_ALPHA) + { + invisi = 1; + } + + if (te) + { + if (te->getBumpmap()) + { + bump = 1; + } + if (te->getShiny()) + { + shiny = 1; + } + if (te->getGlow() > 0.f) + { + glow = 1; + } + if (face->mTextureMatrix != NULL) + { + animtex++; + } + if (te->getTexGen()) + { + planar++; + } + } + } + + + shame += invisi * ARC_INVISI_COST; + shame += shiny * ARC_SHINY_COST; + shame += glow * ARC_GLOW_COST; + shame += alpha * ARC_ALPHA_COST; + shame += flexi * ARC_FLEXI_COST; + shame += animtex * ARC_ANIM_TEX_COST; + shame += particles * ARC_PARTICLE_COST; + shame += bump * ARC_BUMP_COST; + shame += planar * ARC_PLANAR_COST; + shame += scale; + + LLViewerObject::const_child_list_t& child_list = getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); + ++iter) + { + const LLViewerObject* child_objectp = *iter; + const LLDrawable* child_drawablep = child_objectp->mDrawable; + if (child_drawablep) + { + const LLVOVolume* child_volumep = child_drawablep->getVOVolume(); + if (child_volumep) + { + shame += child_volumep->getRenderCost(textures); + } + } + } + + return shame; + +} + +F32 LLVOVolume::getStreamingCost(S32* bytes, S32* visible_bytes) +{ + if (isMesh()) + { + LLSD& header = gMeshRepo.getMeshHeader(getVolume()->getParams().getSculptID()); + + F32 radius = getScale().length(); + + return LLMeshRepository::getStreamingCost(header, radius, bytes, visible_bytes, mLOD); + } + + return 0.f; +} + +U32 LLVOVolume::getTriangleCount() +{ + U32 count = 0; + LLVolume* volume = getVolume(); + if (volume) + { + count = volume->getNumTriangles(); + } + + return count; +} + +U32 LLVOVolume::getHighLODTriangleCount() +{ + U32 ret = 0; + + LLVolume* volume = getVolume(); + + if (!isSculpted()) + { LLVolume* ref = LLPrimitive::getVolumeManager()->refVolume(volume->getParams(), 3); ret = ref->getNumTriangles(); - LLPrimitive::getVolumeManager()->unrefVolume(ref); - } - else if (isMesh()) - { + LLPrimitive::getVolumeManager()->unrefVolume(ref); + } + else if (isMesh()) + { LLVolume* ref = LLPrimitive::getVolumeManager()->refVolume(volume->getParams(), 3); if (ref->isTetrahedron() || ref->getNumVolumeFaces() == 0) { gMeshRepo.loadMesh(this, volume->getParams(), LLModel::LOD_HIGH); } ret = ref->getNumTriangles(); - LLPrimitive::getVolumeManager()->unrefVolume(ref); - } - else - { //default sculpts have a constant number of triangles - ret = 31*2*31; //31 rows of 31 columns of quads for a 32x32 vertex patch - } - - return ret; -} - -//static -void LLVOVolume::preUpdateGeom() -{ - sNumLODChanges = 0; -} - -void LLVOVolume::parameterChanged(U16 param_type, bool local_origin) -{ - LLViewerObject::parameterChanged(param_type, local_origin); -} - -void LLVOVolume::parameterChanged(U16 param_type, LLNetworkData* data, BOOL in_use, bool local_origin) -{ - LLViewerObject::parameterChanged(param_type, data, in_use, local_origin); - if (mVolumeImpl) - { - mVolumeImpl->onParameterChanged(param_type, data, in_use, local_origin); - } - if (mDrawable.notNull()) - { - BOOL is_light = getIsLight(); - if (is_light != mDrawable->isState(LLDrawable::LIGHT)) - { - gPipeline.setLight(mDrawable, is_light); - } - } -} - -void LLVOVolume::setSelected(BOOL sel) -{ - LLViewerObject::setSelected(sel); - if (mDrawable.notNull()) - { - markForUpdate(TRUE); - } -} - -void LLVOVolume::updateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax) -{ -} - -F32 LLVOVolume::getBinRadius() -{ - F32 radius; - - F32 scale = 1.f; - - const LLVector4a* ext = mDrawable->getSpatialExtents(); - - BOOL shrink_wrap = mDrawable->isAnimating(); - BOOL alpha_wrap = FALSE; - - if (!isHUDAttachment()) - { - for (S32 i = 0; i < mDrawable->getNumFaces(); i++) - { - LLFace* face = mDrawable->getFace(i); - if (face->getPoolType() == LLDrawPool::POOL_ALPHA && - !face->canRenderAsMask()) - { - alpha_wrap = TRUE; - break; - } - } - } - else - { - shrink_wrap = FALSE; - } - - if (alpha_wrap) - { - LLVector3 bounds = getScale(); - radius = llmin(bounds.mV[1], bounds.mV[2]); - radius = llmin(radius, bounds.mV[0]); - radius *= 0.5f; - } - else if (shrink_wrap) - { - LLVector4a rad; - rad.setSub(ext[1], ext[0]); - - radius = rad.getLength3().getF32()*0.5f; - } - else if (mDrawable->isStatic()) - { - /*if (mDrawable->getRadius() < 2.0f) - { - radius = 16.f; - } - else - { - radius = llmax(mDrawable->getRadius(), 32.f); - }*/ - - radius = (((S32) mDrawable->getRadius())/2+1)*8; - } - else if (mDrawable->getVObj()->isAttachment()) - { - radius = (((S32) (mDrawable->getRadius()*4)+1))*2; - } - else - { - radius = 8.f; - } - - return llclamp(radius*scale, 0.5f, 256.f); -} - -const LLVector3 LLVOVolume::getPivotPositionAgent() const -{ - if (mVolumeImpl) - { - return mVolumeImpl->getPivotPosition(); - } - return LLViewerObject::getPivotPositionAgent(); -} - -void LLVOVolume::onShift(const LLVector4a &shift_vector) -{ - if (mVolumeImpl) - { - mVolumeImpl->onShift(shift_vector); - } - - updateRelativeXform(); -} - -const LLMatrix4& LLVOVolume::getWorldMatrix(LLXformMatrix* xform) const -{ - if (mVolumeImpl) - { - return mVolumeImpl->getWorldMatrix(xform); - } - return xform->getWorldMatrix(); -} - -LLVector3 LLVOVolume::agentPositionToVolume(const LLVector3& pos) const -{ - LLVector3 ret = pos - getRenderPosition(); - ret = ret * ~getRenderRotation(); - LLVector3 objScale = isVolumeGlobal() ? LLVector3(1,1,1) : getScale(); - LLVector3 invObjScale(1.f / objScale.mV[VX], 1.f / objScale.mV[VY], 1.f / objScale.mV[VZ]); - ret.scaleVec(invObjScale); - - return ret; -} - -LLVector3 LLVOVolume::agentDirectionToVolume(const LLVector3& dir) const -{ - LLVector3 ret = dir * ~getRenderRotation(); - - LLVector3 objScale = isVolumeGlobal() ? LLVector3(1,1,1) : getScale(); - ret.scaleVec(objScale); - - return ret; -} - -LLVector3 LLVOVolume::volumePositionToAgent(const LLVector3& dir) const -{ - LLVector3 ret = dir; - LLVector3 objScale = isVolumeGlobal() ? LLVector3(1,1,1) : getScale(); - ret.scaleVec(objScale); - ret = ret * getRenderRotation(); - ret += getRenderPosition(); - - return ret; -} - -LLVector3 LLVOVolume::volumeDirectionToAgent(const LLVector3& dir) const -{ - LLVector3 ret = dir; - LLVector3 objScale = isVolumeGlobal() ? LLVector3(1,1,1) : getScale(); - LLVector3 invObjScale(1.f / objScale.mV[VX], 1.f / objScale.mV[VY], 1.f / objScale.mV[VZ]); - ret.scaleVec(invObjScale); - ret = ret * getRenderRotation(); - - return ret; -} - - -BOOL LLVOVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& end, S32 face, BOOL pick_transparent, S32 *face_hitp, - LLVector3* intersection,LLVector2* tex_coord, LLVector3* normal, LLVector3* bi_normal) - -{ - if (!mbCanSelect - || mDrawable->isDead() - || !gPipeline.hasRenderType(mDrawable->getRenderType())) - { - return FALSE; - } - - BOOL ret = FALSE; - - LLVolume* volume = getVolume(); - - bool transform = true; - - if (mDrawable->isState(LLDrawable::RIGGED)) - { - if (LLFloater::isVisible(gFloaterTools) && getAvatar()->isSelf()) - { - gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_RIGGED, TRUE); - volume = mRiggedVolume; - transform = false; - } - else - { //cannot pick rigged attachments on other avatars or when not in build mode - return FALSE; - } - } - - if (volume) - { - LLVector3 v_start, v_end, v_dir; - - if (transform) - { - v_start = agentPositionToVolume(start); - v_end = agentPositionToVolume(end); - } - else - { - v_start = start; - v_end = end; - } - - LLVector3 p; - LLVector3 n; - LLVector2 tc; - LLVector3 bn; - - if (intersection != NULL) - { - p = *intersection; - } - - if (tex_coord != NULL) - { - tc = *tex_coord; - } - - if (normal != NULL) - { - n = *normal; - } - - if (bi_normal != NULL) - { - bn = *bi_normal; - } - - S32 face_hit = -1; - - S32 start_face, end_face; - if (face == -1) - { - start_face = 0; - end_face = volume->getNumVolumeFaces(); - } - else - { - start_face = face; - end_face = face+1; - } - - bool special_cursor = specialHoverCursor(); - for (S32 i = start_face; i < end_face; ++i) - { - if (!special_cursor && !pick_transparent && getTE(i)->getColor().mV[3] == 0.f) - { //don't attempt to pick completely transparent faces unless - //pick_transparent is true - continue; - } - - face_hit = volume->lineSegmentIntersect(v_start, v_end, i, - &p, &tc, &n, &bn); - - if (face_hit >= 0 && mDrawable->getNumFaces() > face_hit) - { - LLFace* face = mDrawable->getFace(face_hit); - - if (pick_transparent || !face->getTexture() || !face->getTexture()->hasGLTexture() || face->getTexture()->getMask(face->surfaceToTexture(tc, p, n))) - { - v_end = p; - if (face_hitp != NULL) - { - *face_hitp = face_hit; - } - - if (intersection != NULL) - { - if (transform) - { - *intersection = volumePositionToAgent(p); // must map back to agent space - } - else - { - *intersection = p; - } - } - - if (normal != NULL) - { - if (transform) - { - *normal = volumeDirectionToAgent(n); - } - else - { - *normal = n; - } - - (*normal).normVec(); - } - - if (bi_normal != NULL) - { - if (transform) - { - *bi_normal = volumeDirectionToAgent(bn); - } - else - { - *bi_normal = bn; - } - (*bi_normal).normVec(); - } - - if (tex_coord != NULL) - { - *tex_coord = tc; - } - - ret = TRUE; - } - } - } - } - - return ret; -} - -bool LLVOVolume::treatAsRigged() -{ - return LLFloater::isVisible(gFloaterTools) && - isAttachment() && - getAvatar() && - getAvatar()->isSelf() && - mDrawable.notNull() && - mDrawable->isState(LLDrawable::RIGGED); -} - -LLRiggedVolume* LLVOVolume::getRiggedVolume() -{ - return mRiggedVolume; -} - -void LLVOVolume::clearRiggedVolume() -{ - if (mRiggedVolume.notNull()) - { - mRiggedVolume = NULL; - updateRelativeXform(); - } -} - -void LLVOVolume::updateRiggedVolume() -{ - //Update mRiggedVolume to match current animation frame of avatar. - //Also update position/size in octree. - - if (!treatAsRigged()) - { - clearRiggedVolume(); - - return; - } - - LLVolume* volume = getVolume(); - - const LLMeshSkinInfo* skin = gMeshRepo.getSkinInfo(volume->getParams().getSculptID()); - - if (!skin) - { - clearRiggedVolume(); - return; - } - - LLVOAvatar* avatar = getAvatar(); - - if (!avatar) - { - clearRiggedVolume(); - return; - } - - if (!mRiggedVolume) - { - LLVolumeParams p; - mRiggedVolume = new LLRiggedVolume(p); - updateRelativeXform(); - } - - mRiggedVolume->update(skin, avatar, volume); - -} - -static LLFastTimer::DeclareTimer FTM_SKIN_RIGGED("Skin"); -static LLFastTimer::DeclareTimer FTM_RIGGED_OCTREE("Octree"); - -void LLRiggedVolume::update(const LLMeshSkinInfo* skin, LLVOAvatar* avatar, const LLVolume* volume) -{ - bool copy = false; - if (volume->getNumVolumeFaces() != getNumVolumeFaces()) - { - copy = true; - } - - for (S32 i = 0; i < volume->getNumVolumeFaces() && !copy; ++i) - { - const LLVolumeFace& src_face = volume->getVolumeFace(i); - const LLVolumeFace& dst_face = getVolumeFace(i); - - if (src_face.mNumIndices != dst_face.mNumIndices || - src_face.mNumVertices != dst_face.mNumVertices) - { - copy = true; - } - } - - if (copy) - { - copyVolumeFaces(volume); - } - - //build matrix palette - LLMatrix4a mp[64]; - LLMatrix4* mat = (LLMatrix4*) mp; - - for (U32 j = 0; j < skin->mJointNames.size(); ++j) - { - LLJoint* joint = avatar->getJoint(skin->mJointNames[j]); - if (joint) - { - mat[j] = skin->mInvBindMatrix[j]; - mat[j] *= joint->getWorldMatrix(); - } - } - - for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i) - { - const LLVolumeFace& vol_face = volume->getVolumeFace(i); - - LLVolumeFace& dst_face = mVolumeFaces[i]; - - LLVector4a* weight = vol_face.mWeights; - - LLMatrix4a bind_shape_matrix; - bind_shape_matrix.loadu(skin->mBindShapeMatrix); - - LLVector4a* pos = dst_face.mPositions; - - { - LLFastTimer t(FTM_SKIN_RIGGED); - - for (U32 j = 0; j < dst_face.mNumVertices; ++j) - { - LLMatrix4a final_mat; - final_mat.clear(); - - S32 idx[4]; - - LLVector4 wght; - - F32 scale = 0.f; - for (U32 k = 0; k < 4; k++) - { - F32 w = weight[j][k]; - - idx[k] = (S32) floorf(w); - wght[k] = w - floorf(w); - scale += wght[k]; - } - - wght *= 1.f/scale; - - for (U32 k = 0; k < 4; k++) - { - F32 w = wght[k]; - - LLMatrix4a src; - src.setMul(mp[idx[k]], w); - - final_mat.add(src); - } - - - LLVector4a& v = vol_face.mPositions[j]; - LLVector4a t; - LLVector4a dst; - bind_shape_matrix.affineTransform(v, t); - final_mat.affineTransform(t, dst); - pos[j] = dst; - } - - //update bounding box - LLVector4a& min = dst_face.mExtents[0]; - LLVector4a& max = dst_face.mExtents[1]; - - min = pos[0]; - max = pos[1]; - - for (U32 j = 1; j < dst_face.mNumVertices; ++j) - { - min.setMin(min, pos[j]); - max.setMax(max, pos[j]); - } - - dst_face.mCenter->setAdd(dst_face.mExtents[0], dst_face.mExtents[1]); - dst_face.mCenter->mul(0.5f); - - } - - { - LLFastTimer t(FTM_RIGGED_OCTREE); - delete dst_face.mOctree; - dst_face.mOctree = NULL; - - LLVector4a size; - size.setSub(dst_face.mExtents[1], dst_face.mExtents[0]); - size.splat(size.getLength3().getF32()*0.5f); - - dst_face.createOctree(1.f); - } - } -} - -U32 LLVOVolume::getPartitionType() const -{ - if (isHUDAttachment()) - { - return LLViewerRegion::PARTITION_HUD; - } - - return LLViewerRegion::PARTITION_VOLUME; -} - -LLVolumePartition::LLVolumePartition() -: LLSpatialPartition(LLVOVolume::VERTEX_DATA_MASK, TRUE, GL_DYNAMIC_DRAW_ARB) -{ - mLODPeriod = 32; - mDepthMask = FALSE; - mDrawableType = LLPipeline::RENDER_TYPE_VOLUME; - mPartitionType = LLViewerRegion::PARTITION_VOLUME; - mSlopRatio = 0.25f; - mBufferUsage = GL_DYNAMIC_DRAW_ARB; -} - -LLVolumeBridge::LLVolumeBridge(LLDrawable* drawablep) -: LLSpatialBridge(drawablep, TRUE, LLVOVolume::VERTEX_DATA_MASK) -{ - mDepthMask = FALSE; - mLODPeriod = 32; - mDrawableType = LLPipeline::RENDER_TYPE_VOLUME; - mPartitionType = LLViewerRegion::PARTITION_BRIDGE; - - mBufferUsage = GL_DYNAMIC_DRAW_ARB; - - mSlopRatio = 0.25f; -} - -void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep, U32 type) -{ - LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION); - - if (facep->getViewerObject()->isSelected() && LLSelectMgr::getInstance()->mHideSelectedObjects) - { - return; - } - - //add face to drawmap - LLSpatialGroup::drawmap_elem_t& draw_vec = group->mDrawMap[type]; - - S32 idx = draw_vec.size()-1; - - BOOL fullbright = (type == LLRenderPass::PASS_FULLBRIGHT) || - (type == LLRenderPass::PASS_INVISIBLE) || - (type == LLRenderPass::PASS_ALPHA && facep->isState(LLFace::FULLBRIGHT)); - - if (!fullbright && type != LLRenderPass::PASS_GLOW && !facep->getVertexBuffer()->hasDataType(LLVertexBuffer::TYPE_NORMAL)) - { - llwarns << "Non fullbright face has no normals!" << llendl; - return; - } - - const LLMatrix4* tex_mat = NULL; - if (facep->isState(LLFace::TEXTURE_ANIM) && facep->getVirtualSize() > MIN_TEX_ANIM_SIZE) - { - tex_mat = facep->mTextureMatrix; - } - - const LLMatrix4* model_mat = NULL; - - LLDrawable* drawable = facep->getDrawable(); - if (drawable->isActive()) - { - model_mat = &(drawable->getRenderMatrix()); - } - else - { - model_mat = &(drawable->getRegion()->mRenderMatrix); - if (model_mat->isIdentity()) - { - model_mat = NULL; - } - } - - U8 bump = (type == LLRenderPass::PASS_BUMP || type == LLRenderPass::PASS_POST_BUMP) ? facep->getTextureEntry()->getBumpmap() : 0; - - LLViewerTexture* tex = facep->getTexture(); - - U8 glow = (U8) (facep->getTextureEntry()->getGlow() * 255); - - if (idx >= 0 && - draw_vec[idx]->mVertexBuffer == facep->getVertexBuffer() && - draw_vec[idx]->mEnd == facep->getGeomIndex()-1 && - (LLPipeline::sTextureBindTest || draw_vec[idx]->mTexture == tex) && -#if LL_DARWIN - draw_vec[idx]->mEnd - draw_vec[idx]->mStart + facep->getGeomCount() <= (U32) gGLManager.mGLMaxVertexRange && - draw_vec[idx]->mCount + facep->getIndicesCount() <= (U32) gGLManager.mGLMaxIndexRange && -#endif - draw_vec[idx]->mGlowColor.mV[3] == glow && - draw_vec[idx]->mFullbright == fullbright && - draw_vec[idx]->mBump == bump && - draw_vec[idx]->mTextureMatrix == tex_mat && - draw_vec[idx]->mModelMatrix == model_mat) - { - draw_vec[idx]->mCount += facep->getIndicesCount(); - draw_vec[idx]->mEnd += facep->getGeomCount(); - draw_vec[idx]->mVSize = llmax(draw_vec[idx]->mVSize, facep->getVirtualSize()); - draw_vec[idx]->validate(); - update_min_max(draw_vec[idx]->mExtents[0], draw_vec[idx]->mExtents[1], facep->mExtents[0]); - update_min_max(draw_vec[idx]->mExtents[0], draw_vec[idx]->mExtents[1], facep->mExtents[1]); - } - else - { - U32 start = facep->getGeomIndex(); - U32 end = start + facep->getGeomCount()-1; - U32 offset = facep->getIndicesStart(); - U32 count = facep->getIndicesCount(); - LLPointer<LLDrawInfo> draw_info = new LLDrawInfo(start,end,count,offset, tex, - facep->getVertexBuffer(), fullbright, bump); - draw_info->mGroup = group; - draw_info->mVSize = facep->getVirtualSize(); - draw_vec.push_back(draw_info); - draw_info->mTextureMatrix = tex_mat; - draw_info->mModelMatrix = model_mat; - draw_info->mGlowColor.setVec(0,0,0,glow); - if (type == LLRenderPass::PASS_ALPHA) - { //for alpha sorting - facep->setDrawInfo(draw_info); - } - draw_info->mExtents[0] = facep->mExtents[0]; - draw_info->mExtents[1] = facep->mExtents[1]; - - if (LLPipeline::sUseTriStrips) - { - draw_info->mDrawMode = LLRender::TRIANGLE_STRIP; - } - - draw_info->validate(); - } -} - -void LLVolumeGeometryManager::getGeometry(LLSpatialGroup* group) -{ - -} - -static LLFastTimer::DeclareTimer FTM_REBUILD_VOLUME_VB("Volume"); -static LLFastTimer::DeclareTimer FTM_REBUILD_VBO("VBO Rebuilt"); - -static LLDrawPoolAvatar* get_avatar_drawpool(LLViewerObject* vobj) -{ - LLVOAvatar* avatar = vobj->getAvatar(); - - if (avatar) - { - LLDrawable* drawable = avatar->mDrawable; - if (drawable && drawable->getNumFaces() > 0) - { - LLFace* face = drawable->getFace(0); - if (face) - { - LLDrawPool* drawpool = face->getPool(); - if (drawpool) - { - if (drawpool->getType() == LLDrawPool::POOL_AVATAR) - { - return (LLDrawPoolAvatar*) drawpool; - } - } - } - } - } - - return NULL; -} - -void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) -{ - if (group->changeLOD()) - { - group->mLastUpdateDistance = group->mDistance; - } - - group->mLastUpdateViewAngle = group->mViewAngle; - - if (!group->isState(LLSpatialGroup::GEOM_DIRTY | LLSpatialGroup::ALPHA_DIRTY)) - { - if (group->isState(LLSpatialGroup::MESH_DIRTY) && !LLPipeline::sDelayVBUpdate) - { - LLFastTimer ftm(FTM_REBUILD_VBO); - LLFastTimer ftm2(FTM_REBUILD_VOLUME_VB); - - rebuildMesh(group); - } - return; - } - - group->mBuilt = 1.f; - LLFastTimer ftm(FTM_REBUILD_VBO); - - LLFastTimer ftm2(FTM_REBUILD_VOLUME_VB); - - group->clearDrawMap(); - - mFaceList.clear(); - - std::vector<LLFace*> fullbright_faces; - std::vector<LLFace*> bump_faces; - std::vector<LLFace*> simple_faces; - - std::vector<LLFace*> alpha_faces; - U32 useage = group->mSpatialPartition->mBufferUsage; - - U32 max_vertices = (gSavedSettings.getS32("RenderMaxVBOSize")*1024)/LLVertexBuffer::calcVertexSize(group->mSpatialPartition->mVertexDataMask); - U32 max_total = (gSavedSettings.getS32("RenderMaxNodeSize")*1024)/LLVertexBuffer::calcVertexSize(group->mSpatialPartition->mVertexDataMask); - max_vertices = llmin(max_vertices, (U32) 65535); - - U32 cur_total = 0; - - //get all the faces into a list - for (LLSpatialGroup::element_iter drawable_iter = group->getData().begin(); drawable_iter != group->getData().end(); ++drawable_iter) - { - LLDrawable* drawablep = *drawable_iter; - - if (drawablep->isDead() || drawablep->isState(LLDrawable::FORCE_INVISIBLE) ) - { - continue; - } - - if (drawablep->isAnimating()) - { //fall back to stream draw for animating verts - useage = GL_STREAM_DRAW_ARB; - } - - LLVOVolume* vobj = drawablep->getVOVolume(); - - if (vobj->getVolume() && vobj->getVolume()->isTetrahedron()) - { - continue; - } - - llassert_always(vobj); - vobj->updateTextureVirtualSize(); - vobj->preRebuild(); - - drawablep->clearState(LLDrawable::HAS_ALPHA); - - bool rigged = vobj->isAttachment() && - vobj->isMesh() && - gMeshRepo.getSkinInfo(vobj->getVolume()->getParams().getSculptID()); - - bool bake_sunlight = LLPipeline::sBakeSunlight && drawablep->isStatic(); - - bool is_rigged = false; - - //for each face - for (S32 i = 0; i < drawablep->getNumFaces(); i++) - { - LLFace* facep = drawablep->getFace(i); - - //ALWAYS null out vertex buffer on rebuild -- if the face lands in a render - // batch, it will recover its vertex buffer reference from the spatial group - facep->setVertexBuffer(NULL); - - //sum up face verts and indices - drawablep->updateFaceSize(i); - - - - if (rigged) - { - if (!facep->isState(LLFace::RIGGED)) - { //completely reset vertex buffer - facep->clearVertexBuffer(); - } - - facep->setState(LLFace::RIGGED); - is_rigged = true; - - //get drawpool of avatar with rigged face - LLDrawPoolAvatar* pool = get_avatar_drawpool(vobj); - - //Determine if we've received skininfo that contains an - //alternate bind matrix - if it does then apply the translational component - //to the joints of the avatar. - LLVOAvatar* pAvatarVO = vobj->getAvatar(); - bool pelvisGotSet = false; - - if ( pAvatarVO ) - { - LLUUID currentId = vobj->getVolume()->getParams().getSculptID(); - const LLMeshSkinInfo* pSkinData = gMeshRepo.getSkinInfo( currentId ); - - if ( pSkinData ) - { - const int bindCnt = pSkinData->mAlternateBindMatrix.size(); - if ( bindCnt > 0 ) - { - const int jointCnt = pSkinData->mJointNames.size(); - const F32 pelvisZOffset = pSkinData->mPelvisOffset; - bool fullRig = (jointCnt>=20) ? true : false; - if ( fullRig ) - { - for ( int i=0; i<jointCnt; ++i ) - { - std::string lookingForJoint = pSkinData->mJointNames[i].c_str(); - //llinfos<<"joint name "<<lookingForJoint.c_str()<<llendl; - LLJoint* pJoint = pAvatarVO->getJoint( lookingForJoint ); - if ( pJoint && pJoint->getId() != currentId ) - { - pJoint->setId( currentId ); - const LLVector3& jointPos = pSkinData->mAlternateBindMatrix[i].getTranslation(); - //Set the joint position - pJoint->storeCurrentXform( jointPos ); - //If joint is a pelvis then handle old/new pelvis to foot values - if ( lookingForJoint == "mPelvis" ) - { - pJoint->storeCurrentXform( jointPos ); - if ( !pAvatarVO->hasPelvisOffset() ) - { - pAvatarVO->setPelvisOffset( true, jointPos, pelvisZOffset ); - //Trigger to rebuild viewer AV - pelvisGotSet = true; - } - } - } - } - } - } - } - } - //If we've set the pelvis to a new position we need to also rebuild some information that the - //viewer does at launch (e.g. body size etc.) - if ( pelvisGotSet ) - { - pAvatarVO->postPelvisSetRecalc(); - } - - if (pool) - { - const LLTextureEntry* te = facep->getTextureEntry(); - - //remove face from old pool if it exists - LLDrawPool* old_pool = facep->getPool(); - if (old_pool && old_pool->getType() == LLDrawPool::POOL_AVATAR) - { - ((LLDrawPoolAvatar*) old_pool)->removeRiggedFace(facep); - } - - //add face to new pool - LLViewerTexture* tex = facep->getTexture(); - U32 type = gPipeline.getPoolTypeFromTE(te, tex); - - if (type == LLDrawPool::POOL_ALPHA) - { - if (te->getFullbright()) - { - pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT_ALPHA); - } - else - { - pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_ALPHA); - } - } - else if (te->getShiny()) - { - if (te->getFullbright()) - { - pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT_SHINY); - } - else - { - if (LLPipeline::sRenderDeferred) - { - pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_SIMPLE); - } - else - { - pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_SHINY); - } - } - } - else - { - if (te->getFullbright()) - { - pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT); - } - else - { - pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_SIMPLE); - } - } - - if (te->getGlow()) - { - pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_GLOW); - } - - if (LLPipeline::sRenderDeferred) - { - if (type != LLDrawPool::POOL_ALPHA && !te->getFullbright()) - { - if (te->getBumpmap()) - { - pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_DEFERRED_BUMP); - } - else - { - pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_DEFERRED_SIMPLE); - } - } - } - } - - continue; - } - else - { - if (facep->isState(LLFace::RIGGED)) - { //face is not rigged but used to be, remove from rigged face pool - LLDrawPoolAvatar* pool = (LLDrawPoolAvatar*) facep->getPool(); - if (pool) - { - pool->removeRiggedFace(facep); - } - facep->clearState(LLFace::RIGGED); - } - } - - if (cur_total > max_total || facep->getIndicesCount() <= 0 || facep->getGeomCount() <= 0) - { - facep->clearVertexBuffer(); - continue; - } - - cur_total += facep->getGeomCount(); - - if (facep->hasGeometry() && facep->getPixelArea() > FORCE_CULL_AREA) - { - const LLTextureEntry* te = facep->getTextureEntry(); - LLViewerTexture* tex = facep->getTexture(); - - if (facep->isState(LLFace::TEXTURE_ANIM)) - { - if (!vobj->mTexAnimMode) - { - facep->clearState(LLFace::TEXTURE_ANIM); - } - } - - BOOL force_simple = (facep->getPixelArea() < FORCE_SIMPLE_RENDER_AREA); - U32 type = gPipeline.getPoolTypeFromTE(te, tex); - if (type != LLDrawPool::POOL_ALPHA && force_simple) - { - type = LLDrawPool::POOL_SIMPLE; - } - facep->setPoolType(type); - - if (vobj->isHUDAttachment()) - { - facep->setState(LLFace::FULLBRIGHT); - } - - if (vobj->mTextureAnimp && vobj->mTexAnimMode) - { - if (vobj->mTextureAnimp->mFace <= -1) - { - S32 face; - for (face = 0; face < vobj->getNumTEs(); face++) - { - drawablep->getFace(face)->setState(LLFace::TEXTURE_ANIM); - } - } - else if (vobj->mTextureAnimp->mFace < vobj->getNumTEs()) - { - drawablep->getFace(vobj->mTextureAnimp->mFace)->setState(LLFace::TEXTURE_ANIM); - } - } - - if (type == LLDrawPool::POOL_ALPHA) - { - if (facep->canRenderAsMask()) - { //can be treated as alpha mask - simple_faces.push_back(facep); - } - else - { - drawablep->setState(LLDrawable::HAS_ALPHA); - alpha_faces.push_back(facep); - } - } - else - { - if (drawablep->isState(LLDrawable::REBUILD_VOLUME)) - { - facep->mLastUpdateTime = gFrameTimeSeconds; - } - - if (gPipeline.canUseWindLightShadersOnObjects() - && LLPipeline::sRenderBump) - { - if (te->getBumpmap()) - { //needs normal + binormal - bump_faces.push_back(facep); - } - else if (te->getShiny() || !te->getFullbright()) - { //needs normal - simple_faces.push_back(facep); - } - else - { //doesn't need normal - facep->setState(LLFace::FULLBRIGHT); - fullbright_faces.push_back(facep); - } - } - else - { - if (te->getBumpmap() && LLPipeline::sRenderBump) - { //needs normal + binormal - bump_faces.push_back(facep); - } - else if ((te->getShiny() && LLPipeline::sRenderBump) || - !(te->getFullbright() || bake_sunlight)) - { //needs normal - simple_faces.push_back(facep); - } - else - { //doesn't need normal - facep->setState(LLFace::FULLBRIGHT); - fullbright_faces.push_back(facep); - } - } - } - } - else - { //face has no renderable geometry - facep->clearVertexBuffer(); - } - } - - if (is_rigged) - { - drawablep->setState(LLDrawable::RIGGED); - } - else - { - drawablep->clearState(LLDrawable::RIGGED); - } - } - - group->mBufferUsage = useage; - - //PROCESS NON-ALPHA FACES - U32 simple_mask = LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_COLOR; - U32 alpha_mask = simple_mask | 0x80000000; //hack to give alpha verts their own VBO - U32 bump_mask = LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_TEXCOORD1 | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_COLOR; - U32 fullbright_mask = LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_COLOR; - - if (LLPipeline::sRenderDeferred) - { - bump_mask |= LLVertexBuffer::MAP_BINORMAL; - } - - genDrawInfo(group, simple_mask, simple_faces); - genDrawInfo(group, bump_mask, bump_faces); - genDrawInfo(group, fullbright_mask, fullbright_faces); - genDrawInfo(group, alpha_mask, alpha_faces, TRUE); - - if (!LLPipeline::sDelayVBUpdate) - { - //drawables have been rebuilt, clear rebuild status - for (LLSpatialGroup::element_iter drawable_iter = group->getData().begin(); drawable_iter != group->getData().end(); ++drawable_iter) - { - LLDrawable* drawablep = *drawable_iter; - drawablep->clearState(LLDrawable::REBUILD_ALL); - } - } - - group->mLastUpdateTime = gFrameTimeSeconds; - group->mBuilt = 1.f; - group->clearState(LLSpatialGroup::GEOM_DIRTY | LLSpatialGroup::ALPHA_DIRTY); - - if (LLPipeline::sDelayVBUpdate) - { - group->setState(LLSpatialGroup::MESH_DIRTY | LLSpatialGroup::NEW_DRAWINFO); - } - - mFaceList.clear(); -} - -static LLFastTimer::DeclareTimer FTM_VOLUME_GEOM("Volume Geometry"); -static LLFastTimer::DeclareTimer FTM_VOLUME_GEOM_PARTIAL("Terse Rebuild"); - -void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group) -{ - llassert(group); - if (group && group->isState(LLSpatialGroup::MESH_DIRTY) && !group->isState(LLSpatialGroup::GEOM_DIRTY)) - { - LLFastTimer tm(FTM_VOLUME_GEOM); - S32 num_mapped_veretx_buffer = LLVertexBuffer::sMappedCount ; - - group->mBuilt = 1.f; - - for (LLSpatialGroup::element_iter drawable_iter = group->getData().begin(); drawable_iter != group->getData().end(); ++drawable_iter) - { - LLFastTimer t(FTM_VOLUME_GEOM_PARTIAL); - LLDrawable* drawablep = *drawable_iter; - - if (!drawablep->isDead() && drawablep->isState(LLDrawable::REBUILD_ALL) ) - { - LLVOVolume* vobj = drawablep->getVOVolume(); - vobj->preRebuild(); - - LLVolume* volume = vobj->getVolume(); - for (S32 i = 0; i < drawablep->getNumFaces(); ++i) - { - LLFace* face = drawablep->getFace(i); - if (face && face->getVertexBuffer()) - { - face->getGeometryVolume(*volume, face->getTEOffset(), - vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), face->getGeomIndex()); - } - - if (!face) - { - llerrs << "WTF?" << llendl; - } - } - - drawablep->clearState(LLDrawable::REBUILD_ALL); - } - } - - //unmap all the buffers - for (LLSpatialGroup::buffer_map_t::iterator i = group->mBufferMap.begin(); i != group->mBufferMap.end(); ++i) - { - LLSpatialGroup::buffer_texture_map_t& map = i->second; - for (LLSpatialGroup::buffer_texture_map_t::iterator j = map.begin(); j != map.end(); ++j) - { - LLSpatialGroup::buffer_list_t& list = j->second; - for (LLSpatialGroup::buffer_list_t::iterator k = list.begin(); k != list.end(); ++k) - { - LLVertexBuffer* buffer = *k; - if (buffer->isLocked()) - { - buffer->setBuffer(0); - } - } - } - } - - // don't forget alpha - if(group != NULL && - !group->mVertexBuffer.isNull() && - group->mVertexBuffer->isLocked()) - { - group->mVertexBuffer->setBuffer(0); - } - - //if not all buffers are unmapped - if(num_mapped_veretx_buffer != LLVertexBuffer::sMappedCount) - { - llwarns << "Not all mapped vertex buffers are unmapped!" << llendl ; - for (LLSpatialGroup::element_iter drawable_iter = group->getData().begin(); drawable_iter != group->getData().end(); ++drawable_iter) - { - LLDrawable* drawablep = *drawable_iter; - for (S32 i = 0; i < drawablep->getNumFaces(); ++i) - { - LLFace* face = drawablep->getFace(i); - LLVertexBuffer* buff = face->getVertexBuffer(); - if (face && buff && buff->isLocked()) - { - buff->setBuffer(0) ; - } - } - } - } - - group->clearState(LLSpatialGroup::MESH_DIRTY | LLSpatialGroup::NEW_DRAWINFO); - } - - if (group && group->isState(LLSpatialGroup::NEW_DRAWINFO)) - { - llerrs << "WTF?" << llendl; - } -} - -void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::vector<LLFace*>& faces, BOOL distance_sort) -{ - //calculate maximum number of vertices to store in a single buffer - U32 max_vertices = (gSavedSettings.getS32("RenderMaxVBOSize")*1024)/LLVertexBuffer::calcVertexSize(group->mSpatialPartition->mVertexDataMask); - max_vertices = llmin(max_vertices, (U32) 65535); - - if (!distance_sort) - { - //sort faces by things that break batches - std::sort(faces.begin(), faces.end(), LLFace::CompareBatchBreaker()); - } - else - { - //sort faces by distance - std::sort(faces.begin(), faces.end(), LLFace::CompareDistanceGreater()); - } - - std::vector<LLFace*>::iterator face_iter = faces.begin(); - - LLSpatialGroup::buffer_map_t buffer_map; - - LLViewerTexture* last_tex = NULL; - S32 buffer_index = 0; - - if (distance_sort) - { - buffer_index = -1; - } - - while (face_iter != faces.end()) - { - //pull off next face - LLFace* facep = *face_iter; - LLViewerTexture* tex = facep->getTexture(); - - if (distance_sort) - { - tex = NULL; - } - - if (last_tex == tex) - { - buffer_index++; - } - else - { - last_tex = tex; - buffer_index = 0; - } - - bool bake_sunlight = LLPipeline::sBakeSunlight && facep->getDrawable()->isStatic(); - - U32 index_count = facep->getIndicesCount(); - U32 geom_count = facep->getGeomCount(); - - //sum up vertices needed for this render batch - std::vector<LLFace*>::iterator i = face_iter; - ++i; - - while (i != faces.end() && - (LLPipeline::sTextureBindTest || (distance_sort || (*i)->getTexture() == tex))) - { - facep = *i; - - if (geom_count + facep->getGeomCount() > max_vertices) - { //cut batches on geom count too big - break; - } - - ++i; - index_count += facep->getIndicesCount(); - geom_count += facep->getGeomCount(); - } - - //create/delete/resize vertex buffer if needed - LLVertexBuffer* buffer = NULL; - LLSpatialGroup::buffer_texture_map_t::iterator found_iter = group->mBufferMap[mask].find(tex); - - if (found_iter != group->mBufferMap[mask].end()) - { - if ((U32) buffer_index < found_iter->second.size()) - { - buffer = found_iter->second[buffer_index]; - } - } - - if (!buffer) - { //create new buffer if needed - buffer = createVertexBuffer(mask, - group->mBufferUsage); - buffer->allocateBuffer(geom_count, index_count, TRUE); - } - else - { //resize pre-existing buffer - if (LLVertexBuffer::sEnableVBOs && buffer->getUsage() != group->mBufferUsage || - buffer->getTypeMask() != mask) - { - buffer = createVertexBuffer(mask, - group->mBufferUsage); - buffer->allocateBuffer(geom_count, index_count, TRUE); - } - else - { - buffer->resizeBuffer(geom_count, index_count); - } - } - - buffer_map[mask][tex].push_back(buffer); - - //add face geometry - - U32 indices_index = 0; - U16 index_offset = 0; - - while (face_iter < i) - { //update face indices for new buffer - facep = *face_iter; - facep->setIndicesIndex(indices_index); - facep->setGeomIndex(index_offset); - facep->setVertexBuffer(buffer); - - { - //for debugging, set last time face was updated vs moved - facep->updateRebuildFlags(); - - if (!LLPipeline::sDelayVBUpdate) - { //copy face geometry into vertex buffer - LLDrawable* drawablep = facep->getDrawable(); - LLVOVolume* vobj = drawablep->getVOVolume(); - LLVolume* volume = vobj->getVolume(); - - U32 te_idx = facep->getTEOffset(); - - if (facep->getGeometryVolume(*volume, te_idx, - vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), index_offset)) - { - buffer->markDirty(facep->getGeomIndex(), facep->getGeomCount(), - facep->getIndicesStart(), facep->getIndicesCount()); - } - } - } - - index_offset += facep->getGeomCount(); - indices_index += facep->getIndicesCount(); - - - //append face to appropriate render batch - - BOOL force_simple = facep->getPixelArea() < FORCE_SIMPLE_RENDER_AREA; - BOOL fullbright = facep->isState(LLFace::FULLBRIGHT); - if ((mask & LLVertexBuffer::MAP_NORMAL) == 0) - { //paranoia check to make sure GL doesn't try to read non-existant normals - fullbright = TRUE; - } - - const LLTextureEntry* te = facep->getTextureEntry(); - - BOOL is_alpha = (facep->getPoolType() == LLDrawPool::POOL_ALPHA) ? TRUE : FALSE; - - if (is_alpha) - { - // can we safely treat this as an alpha mask? - if (facep->canRenderAsMask()) - { - if (te->getFullbright() || LLPipeline::sNoAlpha) - { - registerFace(group, facep, LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK); - } - else - { - registerFace(group, facep, LLRenderPass::PASS_ALPHA_MASK); - } - } - else - { - registerFace(group, facep, LLRenderPass::PASS_ALPHA); - } - - if (LLPipeline::sRenderDeferred) - { - registerFace(group, facep, LLRenderPass::PASS_ALPHA_SHADOW); - } - } - else if (gPipeline.canUseVertexShaders() - && group->mSpatialPartition->mPartitionType != LLViewerRegion::PARTITION_HUD - && LLPipeline::sRenderBump - && te->getShiny()) - { //shiny - if (tex->getPrimaryFormat() == GL_ALPHA) - { //invisiprim+shiny - registerFace(group, facep, LLRenderPass::PASS_INVISI_SHINY); - registerFace(group, facep, LLRenderPass::PASS_INVISIBLE); - } - else if (LLPipeline::sRenderDeferred) - { //deferred rendering - if (te->getFullbright()) - { //register in post deferred fullbright shiny pass - registerFace(group, facep, LLRenderPass::PASS_FULLBRIGHT_SHINY); - if (te->getBumpmap()) - { //register in post deferred bump pass - registerFace(group, facep, LLRenderPass::PASS_POST_BUMP); - } - } - else if (te->getBumpmap()) - { //register in deferred bump pass - registerFace(group, facep, LLRenderPass::PASS_BUMP); - } - else - { //register in deferred simple pass (deferred simple includes shiny) - llassert(mask & LLVertexBuffer::MAP_NORMAL); - registerFace(group, facep, LLRenderPass::PASS_SIMPLE); - } - } - else if (fullbright) - { //not deferred, register in standard fullbright shiny pass - registerFace(group, facep, LLRenderPass::PASS_FULLBRIGHT_SHINY); - } - else - { //not deferred or fullbright, register in standard shiny pass - registerFace(group, facep, LLRenderPass::PASS_SHINY); - } - } - else - { //not alpha and not shiny - if (!is_alpha && tex->getPrimaryFormat() == GL_ALPHA) - { //invisiprim - registerFace(group, facep, LLRenderPass::PASS_INVISIBLE); - } - else if (fullbright || bake_sunlight) - { //fullbright - registerFace(group, facep, LLRenderPass::PASS_FULLBRIGHT); - if (LLPipeline::sRenderDeferred && LLPipeline::sRenderBump && te->getBumpmap()) - { //if this is the deferred render and a bump map is present, register in post deferred bump - registerFace(group, facep, LLRenderPass::PASS_POST_BUMP); - } - } - else - { - if (LLPipeline::sRenderDeferred && LLPipeline::sRenderBump && te->getBumpmap()) - { //non-shiny or fullbright deferred bump - registerFace(group, facep, LLRenderPass::PASS_BUMP); - } - else - { //all around simple - llassert(mask & LLVertexBuffer::MAP_NORMAL); - registerFace(group, facep, LLRenderPass::PASS_SIMPLE); - } - } - - //not sure why this is here -- shiny HUD attachments maybe? -- davep 5/11/2010 - if (!is_alpha && te->getShiny() && LLPipeline::sRenderBump) - { - registerFace(group, facep, LLRenderPass::PASS_SHINY); - } - } - - //not sure why this is here, and looks like it might cause bump mapped objects to get rendered redundantly -- davep 5/11/2010 - if (!is_alpha && !LLPipeline::sRenderDeferred) - { - llassert((mask & LLVertexBuffer::MAP_NORMAL) || fullbright); - facep->setPoolType((fullbright) ? LLDrawPool::POOL_FULLBRIGHT : LLDrawPool::POOL_SIMPLE); - - if (!force_simple && te->getBumpmap() && LLPipeline::sRenderBump) - { - registerFace(group, facep, LLRenderPass::PASS_BUMP); - } - } - - if (!is_alpha && LLPipeline::sRenderGlow && te->getGlow() > 0.f) - { - registerFace(group, facep, LLRenderPass::PASS_GLOW); - } - - ++face_iter; - } - - buffer->setBuffer(0); - } - - group->mBufferMap[mask].clear(); - for (LLSpatialGroup::buffer_texture_map_t::iterator i = buffer_map[mask].begin(); i != buffer_map[mask].end(); ++i) - { - group->mBufferMap[mask][i->first] = i->second; - } -} - -void LLGeometryManager::addGeometryCount(LLSpatialGroup* group, U32 &vertex_count, U32 &index_count) -{ - //initialize to default usage for this partition - U32 usage = group->mSpatialPartition->mBufferUsage; - - //clear off any old faces - mFaceList.clear(); - - //for each drawable - for (LLSpatialGroup::element_iter drawable_iter = group->getData().begin(); drawable_iter != group->getData().end(); ++drawable_iter) - { - LLDrawable* drawablep = *drawable_iter; - - if (drawablep->isDead()) - { - continue; - } - - if (drawablep->isAnimating()) - { //fall back to stream draw for animating verts - usage = GL_STREAM_DRAW_ARB; - } - - //for each face - for (S32 i = 0; i < drawablep->getNumFaces(); i++) - { - //sum up face verts and indices - drawablep->updateFaceSize(i); - LLFace* facep = drawablep->getFace(i); - if (facep->hasGeometry() && facep->getPixelArea() > FORCE_CULL_AREA) - { - vertex_count += facep->getGeomCount(); - index_count += facep->getIndicesCount(); - - //remember face (for sorting) - mFaceList.push_back(facep); - } - else - { - facep->clearVertexBuffer(); - } - } - } - - group->mBufferUsage = usage; -} - -LLHUDPartition::LLHUDPartition() -{ - mPartitionType = LLViewerRegion::PARTITION_HUD; - mDrawableType = LLPipeline::RENDER_TYPE_HUD; - mSlopRatio = 0.f; - mLODPeriod = 1; -} - -void LLHUDPartition::shift(const LLVector4a &offset) -{ - //HUD objects don't shift with region crossing. That would be silly. -} - - + LLPrimitive::getVolumeManager()->unrefVolume(ref); + } + else + { //default sculpts have a constant number of triangles + ret = 31*2*31; //31 rows of 31 columns of quads for a 32x32 vertex patch + } + + return ret; +} + +//static +void LLVOVolume::preUpdateGeom() +{ + sNumLODChanges = 0; +} + +void LLVOVolume::parameterChanged(U16 param_type, bool local_origin) +{ + LLViewerObject::parameterChanged(param_type, local_origin); +} + +void LLVOVolume::parameterChanged(U16 param_type, LLNetworkData* data, BOOL in_use, bool local_origin) +{ + LLViewerObject::parameterChanged(param_type, data, in_use, local_origin); + if (mVolumeImpl) + { + mVolumeImpl->onParameterChanged(param_type, data, in_use, local_origin); + } + if (mDrawable.notNull()) + { + BOOL is_light = getIsLight(); + if (is_light != mDrawable->isState(LLDrawable::LIGHT)) + { + gPipeline.setLight(mDrawable, is_light); + } + } +} + +void LLVOVolume::setSelected(BOOL sel) +{ + LLViewerObject::setSelected(sel); + if (mDrawable.notNull()) + { + markForUpdate(TRUE); + } +} + +void LLVOVolume::updateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax) +{ +} + +F32 LLVOVolume::getBinRadius() +{ + F32 radius; + + F32 scale = 1.f; + + const LLVector4a* ext = mDrawable->getSpatialExtents(); + + BOOL shrink_wrap = mDrawable->isAnimating(); + BOOL alpha_wrap = FALSE; + + if (!isHUDAttachment()) + { + for (S32 i = 0; i < mDrawable->getNumFaces(); i++) + { + LLFace* face = mDrawable->getFace(i); + if (face->getPoolType() == LLDrawPool::POOL_ALPHA && + !face->canRenderAsMask()) + { + alpha_wrap = TRUE; + break; + } + } + } + else + { + shrink_wrap = FALSE; + } + + if (alpha_wrap) + { + LLVector3 bounds = getScale(); + radius = llmin(bounds.mV[1], bounds.mV[2]); + radius = llmin(radius, bounds.mV[0]); + radius *= 0.5f; + } + else if (shrink_wrap) + { + LLVector4a rad; + rad.setSub(ext[1], ext[0]); + + radius = rad.getLength3().getF32()*0.5f; + } + else if (mDrawable->isStatic()) + { + /*if (mDrawable->getRadius() < 2.0f) + { + radius = 16.f; + } + else + { + radius = llmax(mDrawable->getRadius(), 32.f); + }*/ + + radius = (((S32) mDrawable->getRadius())/2+1)*8; + } + else if (mDrawable->getVObj()->isAttachment()) + { + radius = (((S32) (mDrawable->getRadius()*4)+1))*2; + } + else + { + radius = 8.f; + } + + return llclamp(radius*scale, 0.5f, 256.f); +} + +const LLVector3 LLVOVolume::getPivotPositionAgent() const +{ + if (mVolumeImpl) + { + return mVolumeImpl->getPivotPosition(); + } + return LLViewerObject::getPivotPositionAgent(); +} + +void LLVOVolume::onShift(const LLVector4a &shift_vector) +{ + if (mVolumeImpl) + { + mVolumeImpl->onShift(shift_vector); + } + + updateRelativeXform(); +} + +const LLMatrix4& LLVOVolume::getWorldMatrix(LLXformMatrix* xform) const +{ + if (mVolumeImpl) + { + return mVolumeImpl->getWorldMatrix(xform); + } + return xform->getWorldMatrix(); +} + +LLVector3 LLVOVolume::agentPositionToVolume(const LLVector3& pos) const +{ + LLVector3 ret = pos - getRenderPosition(); + ret = ret * ~getRenderRotation(); + LLVector3 objScale = isVolumeGlobal() ? LLVector3(1,1,1) : getScale(); + LLVector3 invObjScale(1.f / objScale.mV[VX], 1.f / objScale.mV[VY], 1.f / objScale.mV[VZ]); + ret.scaleVec(invObjScale); + + return ret; +} + +LLVector3 LLVOVolume::agentDirectionToVolume(const LLVector3& dir) const +{ + LLVector3 ret = dir * ~getRenderRotation(); + + LLVector3 objScale = isVolumeGlobal() ? LLVector3(1,1,1) : getScale(); + ret.scaleVec(objScale); + + return ret; +} + +LLVector3 LLVOVolume::volumePositionToAgent(const LLVector3& dir) const +{ + LLVector3 ret = dir; + LLVector3 objScale = isVolumeGlobal() ? LLVector3(1,1,1) : getScale(); + ret.scaleVec(objScale); + ret = ret * getRenderRotation(); + ret += getRenderPosition(); + + return ret; +} + +LLVector3 LLVOVolume::volumeDirectionToAgent(const LLVector3& dir) const +{ + LLVector3 ret = dir; + LLVector3 objScale = isVolumeGlobal() ? LLVector3(1,1,1) : getScale(); + LLVector3 invObjScale(1.f / objScale.mV[VX], 1.f / objScale.mV[VY], 1.f / objScale.mV[VZ]); + ret.scaleVec(invObjScale); + ret = ret * getRenderRotation(); + + return ret; +} + + +BOOL LLVOVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& end, S32 face, BOOL pick_transparent, S32 *face_hitp, + LLVector3* intersection,LLVector2* tex_coord, LLVector3* normal, LLVector3* bi_normal) + +{ + if (!mbCanSelect + || mDrawable->isDead() + || !gPipeline.hasRenderType(mDrawable->getRenderType())) + { + return FALSE; + } + + BOOL ret = FALSE; + + LLVolume* volume = getVolume(); + + bool transform = true; + + if (mDrawable->isState(LLDrawable::RIGGED)) + { + if (LLFloater::isVisible(gFloaterTools) && getAvatar()->isSelf()) + { + gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_RIGGED, TRUE); + volume = mRiggedVolume; + transform = false; + } + else + { //cannot pick rigged attachments on other avatars or when not in build mode + return FALSE; + } + } + + if (volume) + { + LLVector3 v_start, v_end, v_dir; + + if (transform) + { + v_start = agentPositionToVolume(start); + v_end = agentPositionToVolume(end); + } + else + { + v_start = start; + v_end = end; + } + + LLVector3 p; + LLVector3 n; + LLVector2 tc; + LLVector3 bn; + + if (intersection != NULL) + { + p = *intersection; + } + + if (tex_coord != NULL) + { + tc = *tex_coord; + } + + if (normal != NULL) + { + n = *normal; + } + + if (bi_normal != NULL) + { + bn = *bi_normal; + } + + S32 face_hit = -1; + + S32 start_face, end_face; + if (face == -1) + { + start_face = 0; + end_face = volume->getNumVolumeFaces(); + } + else + { + start_face = face; + end_face = face+1; + } + + bool special_cursor = specialHoverCursor(); + for (S32 i = start_face; i < end_face; ++i) + { + if (!special_cursor && !pick_transparent && getTE(i)->getColor().mV[3] == 0.f) + { //don't attempt to pick completely transparent faces unless + //pick_transparent is true + continue; + } + + face_hit = volume->lineSegmentIntersect(v_start, v_end, i, + &p, &tc, &n, &bn); + + if (face_hit >= 0 && mDrawable->getNumFaces() > face_hit) + { + LLFace* face = mDrawable->getFace(face_hit); + + if (pick_transparent || !face->getTexture() || !face->getTexture()->hasGLTexture() || face->getTexture()->getMask(face->surfaceToTexture(tc, p, n))) + { + v_end = p; + if (face_hitp != NULL) + { + *face_hitp = face_hit; + } + + if (intersection != NULL) + { + if (transform) + { + *intersection = volumePositionToAgent(p); // must map back to agent space + } + else + { + *intersection = p; + } + } + + if (normal != NULL) + { + if (transform) + { + *normal = volumeDirectionToAgent(n); + } + else + { + *normal = n; + } + + (*normal).normVec(); + } + + if (bi_normal != NULL) + { + if (transform) + { + *bi_normal = volumeDirectionToAgent(bn); + } + else + { + *bi_normal = bn; + } + (*bi_normal).normVec(); + } + + if (tex_coord != NULL) + { + *tex_coord = tc; + } + + ret = TRUE; + } + } + } + } + + return ret; +} + +bool LLVOVolume::treatAsRigged() +{ + return LLFloater::isVisible(gFloaterTools) && + isAttachment() && + getAvatar() && + getAvatar()->isSelf() && + mDrawable.notNull() && + mDrawable->isState(LLDrawable::RIGGED); +} + +LLRiggedVolume* LLVOVolume::getRiggedVolume() +{ + return mRiggedVolume; +} + +void LLVOVolume::clearRiggedVolume() +{ + if (mRiggedVolume.notNull()) + { + mRiggedVolume = NULL; + updateRelativeXform(); + } +} + +void LLVOVolume::updateRiggedVolume() +{ + //Update mRiggedVolume to match current animation frame of avatar. + //Also update position/size in octree. + + if (!treatAsRigged()) + { + clearRiggedVolume(); + + return; + } + + LLVolume* volume = getVolume(); + + const LLMeshSkinInfo* skin = gMeshRepo.getSkinInfo(volume->getParams().getSculptID()); + + if (!skin) + { + clearRiggedVolume(); + return; + } + + LLVOAvatar* avatar = getAvatar(); + + if (!avatar) + { + clearRiggedVolume(); + return; + } + + if (!mRiggedVolume) + { + LLVolumeParams p; + mRiggedVolume = new LLRiggedVolume(p); + updateRelativeXform(); + } + + mRiggedVolume->update(skin, avatar, volume); + +} + +static LLFastTimer::DeclareTimer FTM_SKIN_RIGGED("Skin"); +static LLFastTimer::DeclareTimer FTM_RIGGED_OCTREE("Octree"); + +void LLRiggedVolume::update(const LLMeshSkinInfo* skin, LLVOAvatar* avatar, const LLVolume* volume) +{ + bool copy = false; + if (volume->getNumVolumeFaces() != getNumVolumeFaces()) + { + copy = true; + } + + for (S32 i = 0; i < volume->getNumVolumeFaces() && !copy; ++i) + { + const LLVolumeFace& src_face = volume->getVolumeFace(i); + const LLVolumeFace& dst_face = getVolumeFace(i); + + if (src_face.mNumIndices != dst_face.mNumIndices || + src_face.mNumVertices != dst_face.mNumVertices) + { + copy = true; + } + } + + if (copy) + { + copyVolumeFaces(volume); + } + + //build matrix palette + LLMatrix4a mp[64]; + LLMatrix4* mat = (LLMatrix4*) mp; + + for (U32 j = 0; j < skin->mJointNames.size(); ++j) + { + LLJoint* joint = avatar->getJoint(skin->mJointNames[j]); + if (joint) + { + mat[j] = skin->mInvBindMatrix[j]; + mat[j] *= joint->getWorldMatrix(); + } + } + + for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i) + { + const LLVolumeFace& vol_face = volume->getVolumeFace(i); + + LLVolumeFace& dst_face = mVolumeFaces[i]; + + LLVector4a* weight = vol_face.mWeights; + + LLMatrix4a bind_shape_matrix; + bind_shape_matrix.loadu(skin->mBindShapeMatrix); + + LLVector4a* pos = dst_face.mPositions; + + { + LLFastTimer t(FTM_SKIN_RIGGED); + + for (U32 j = 0; j < dst_face.mNumVertices; ++j) + { + LLMatrix4a final_mat; + final_mat.clear(); + + S32 idx[4]; + + LLVector4 wght; + + F32 scale = 0.f; + for (U32 k = 0; k < 4; k++) + { + F32 w = weight[j][k]; + + idx[k] = (S32) floorf(w); + wght[k] = w - floorf(w); + scale += wght[k]; + } + + wght *= 1.f/scale; + + for (U32 k = 0; k < 4; k++) + { + F32 w = wght[k]; + + LLMatrix4a src; + src.setMul(mp[idx[k]], w); + + final_mat.add(src); + } + + + LLVector4a& v = vol_face.mPositions[j]; + LLVector4a t; + LLVector4a dst; + bind_shape_matrix.affineTransform(v, t); + final_mat.affineTransform(t, dst); + pos[j] = dst; + } + + //update bounding box + LLVector4a& min = dst_face.mExtents[0]; + LLVector4a& max = dst_face.mExtents[1]; + + min = pos[0]; + max = pos[1]; + + for (U32 j = 1; j < dst_face.mNumVertices; ++j) + { + min.setMin(min, pos[j]); + max.setMax(max, pos[j]); + } + + dst_face.mCenter->setAdd(dst_face.mExtents[0], dst_face.mExtents[1]); + dst_face.mCenter->mul(0.5f); + + } + + { + LLFastTimer t(FTM_RIGGED_OCTREE); + delete dst_face.mOctree; + dst_face.mOctree = NULL; + + LLVector4a size; + size.setSub(dst_face.mExtents[1], dst_face.mExtents[0]); + size.splat(size.getLength3().getF32()*0.5f); + + dst_face.createOctree(1.f); + } + } +} + +U32 LLVOVolume::getPartitionType() const +{ + if (isHUDAttachment()) + { + return LLViewerRegion::PARTITION_HUD; + } + + return LLViewerRegion::PARTITION_VOLUME; +} + +LLVolumePartition::LLVolumePartition() +: LLSpatialPartition(LLVOVolume::VERTEX_DATA_MASK, TRUE, GL_DYNAMIC_DRAW_ARB) +{ + mLODPeriod = 32; + mDepthMask = FALSE; + mDrawableType = LLPipeline::RENDER_TYPE_VOLUME; + mPartitionType = LLViewerRegion::PARTITION_VOLUME; + mSlopRatio = 0.25f; + mBufferUsage = GL_DYNAMIC_DRAW_ARB; +} + +LLVolumeBridge::LLVolumeBridge(LLDrawable* drawablep) +: LLSpatialBridge(drawablep, TRUE, LLVOVolume::VERTEX_DATA_MASK) +{ + mDepthMask = FALSE; + mLODPeriod = 32; + mDrawableType = LLPipeline::RENDER_TYPE_VOLUME; + mPartitionType = LLViewerRegion::PARTITION_BRIDGE; + + mBufferUsage = GL_DYNAMIC_DRAW_ARB; + + mSlopRatio = 0.25f; +} + +void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep, U32 type) +{ + LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION); + + if (facep->getViewerObject()->isSelected() && LLSelectMgr::getInstance()->mHideSelectedObjects) + { + return; + } + + //add face to drawmap + LLSpatialGroup::drawmap_elem_t& draw_vec = group->mDrawMap[type]; + + S32 idx = draw_vec.size()-1; + + BOOL fullbright = (type == LLRenderPass::PASS_FULLBRIGHT) || + (type == LLRenderPass::PASS_INVISIBLE) || + (type == LLRenderPass::PASS_ALPHA && facep->isState(LLFace::FULLBRIGHT)); + + if (!fullbright && type != LLRenderPass::PASS_GLOW && !facep->getVertexBuffer()->hasDataType(LLVertexBuffer::TYPE_NORMAL)) + { + llwarns << "Non fullbright face has no normals!" << llendl; + return; + } + + const LLMatrix4* tex_mat = NULL; + if (facep->isState(LLFace::TEXTURE_ANIM) && facep->getVirtualSize() > MIN_TEX_ANIM_SIZE) + { + tex_mat = facep->mTextureMatrix; + } + + const LLMatrix4* model_mat = NULL; + + LLDrawable* drawable = facep->getDrawable(); + if (drawable->isActive()) + { + model_mat = &(drawable->getRenderMatrix()); + } + else + { + model_mat = &(drawable->getRegion()->mRenderMatrix); + if (model_mat->isIdentity()) + { + model_mat = NULL; + } + } + + U8 bump = (type == LLRenderPass::PASS_BUMP || type == LLRenderPass::PASS_POST_BUMP) ? facep->getTextureEntry()->getBumpmap() : 0; + + LLViewerTexture* tex = facep->getTexture(); + + U8 glow = (U8) (facep->getTextureEntry()->getGlow() * 255); + + if (idx >= 0 && + draw_vec[idx]->mVertexBuffer == facep->getVertexBuffer() && + draw_vec[idx]->mEnd == facep->getGeomIndex()-1 && + (LLPipeline::sTextureBindTest || draw_vec[idx]->mTexture == tex) && +#if LL_DARWIN + draw_vec[idx]->mEnd - draw_vec[idx]->mStart + facep->getGeomCount() <= (U32) gGLManager.mGLMaxVertexRange && + draw_vec[idx]->mCount + facep->getIndicesCount() <= (U32) gGLManager.mGLMaxIndexRange && +#endif + draw_vec[idx]->mGlowColor.mV[3] == glow && + draw_vec[idx]->mFullbright == fullbright && + draw_vec[idx]->mBump == bump && + draw_vec[idx]->mTextureMatrix == tex_mat && + draw_vec[idx]->mModelMatrix == model_mat) + { + draw_vec[idx]->mCount += facep->getIndicesCount(); + draw_vec[idx]->mEnd += facep->getGeomCount(); + draw_vec[idx]->mVSize = llmax(draw_vec[idx]->mVSize, facep->getVirtualSize()); + draw_vec[idx]->validate(); + update_min_max(draw_vec[idx]->mExtents[0], draw_vec[idx]->mExtents[1], facep->mExtents[0]); + update_min_max(draw_vec[idx]->mExtents[0], draw_vec[idx]->mExtents[1], facep->mExtents[1]); + } + else + { + U32 start = facep->getGeomIndex(); + U32 end = start + facep->getGeomCount()-1; + U32 offset = facep->getIndicesStart(); + U32 count = facep->getIndicesCount(); + LLPointer<LLDrawInfo> draw_info = new LLDrawInfo(start,end,count,offset, tex, + facep->getVertexBuffer(), fullbright, bump); + draw_info->mGroup = group; + draw_info->mVSize = facep->getVirtualSize(); + draw_vec.push_back(draw_info); + draw_info->mTextureMatrix = tex_mat; + draw_info->mModelMatrix = model_mat; + draw_info->mGlowColor.setVec(0,0,0,glow); + if (type == LLRenderPass::PASS_ALPHA) + { //for alpha sorting + facep->setDrawInfo(draw_info); + } + draw_info->mExtents[0] = facep->mExtents[0]; + draw_info->mExtents[1] = facep->mExtents[1]; + + if (LLPipeline::sUseTriStrips) + { + draw_info->mDrawMode = LLRender::TRIANGLE_STRIP; + } + + draw_info->validate(); + } +} + +void LLVolumeGeometryManager::getGeometry(LLSpatialGroup* group) +{ + +} + +static LLFastTimer::DeclareTimer FTM_REBUILD_VOLUME_VB("Volume"); +static LLFastTimer::DeclareTimer FTM_REBUILD_VBO("VBO Rebuilt"); + +static LLDrawPoolAvatar* get_avatar_drawpool(LLViewerObject* vobj) +{ + LLVOAvatar* avatar = vobj->getAvatar(); + + if (avatar) + { + LLDrawable* drawable = avatar->mDrawable; + if (drawable && drawable->getNumFaces() > 0) + { + LLFace* face = drawable->getFace(0); + if (face) + { + LLDrawPool* drawpool = face->getPool(); + if (drawpool) + { + if (drawpool->getType() == LLDrawPool::POOL_AVATAR) + { + return (LLDrawPoolAvatar*) drawpool; + } + } + } + } + } + + return NULL; +} + +void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) +{ + if (group->changeLOD()) + { + group->mLastUpdateDistance = group->mDistance; + } + + group->mLastUpdateViewAngle = group->mViewAngle; + + if (!group->isState(LLSpatialGroup::GEOM_DIRTY | LLSpatialGroup::ALPHA_DIRTY)) + { + if (group->isState(LLSpatialGroup::MESH_DIRTY) && !LLPipeline::sDelayVBUpdate) + { + LLFastTimer ftm(FTM_REBUILD_VBO); + LLFastTimer ftm2(FTM_REBUILD_VOLUME_VB); + + rebuildMesh(group); + } + return; + } + + group->mBuilt = 1.f; + LLFastTimer ftm(FTM_REBUILD_VBO); + + LLFastTimer ftm2(FTM_REBUILD_VOLUME_VB); + + group->clearDrawMap(); + + mFaceList.clear(); + + std::vector<LLFace*> fullbright_faces; + std::vector<LLFace*> bump_faces; + std::vector<LLFace*> simple_faces; + + std::vector<LLFace*> alpha_faces; + U32 useage = group->mSpatialPartition->mBufferUsage; + + U32 max_vertices = (gSavedSettings.getS32("RenderMaxVBOSize")*1024)/LLVertexBuffer::calcVertexSize(group->mSpatialPartition->mVertexDataMask); + U32 max_total = (gSavedSettings.getS32("RenderMaxNodeSize")*1024)/LLVertexBuffer::calcVertexSize(group->mSpatialPartition->mVertexDataMask); + max_vertices = llmin(max_vertices, (U32) 65535); + + U32 cur_total = 0; + + //get all the faces into a list + for (LLSpatialGroup::element_iter drawable_iter = group->getData().begin(); drawable_iter != group->getData().end(); ++drawable_iter) + { + LLDrawable* drawablep = *drawable_iter; + + if (drawablep->isDead() || drawablep->isState(LLDrawable::FORCE_INVISIBLE) ) + { + continue; + } + + if (drawablep->isAnimating()) + { //fall back to stream draw for animating verts + useage = GL_STREAM_DRAW_ARB; + } + + LLVOVolume* vobj = drawablep->getVOVolume(); + + if (vobj->getVolume() && vobj->getVolume()->isTetrahedron()) + { + continue; + } + + llassert_always(vobj); + vobj->updateTextureVirtualSize(); + vobj->preRebuild(); + + drawablep->clearState(LLDrawable::HAS_ALPHA); + + bool rigged = vobj->isAttachment() && + vobj->isMesh() && + gMeshRepo.getSkinInfo(vobj->getVolume()->getParams().getSculptID()); + + bool bake_sunlight = LLPipeline::sBakeSunlight && drawablep->isStatic(); + + bool is_rigged = false; + + //for each face + for (S32 i = 0; i < drawablep->getNumFaces(); i++) + { + LLFace* facep = drawablep->getFace(i); + + //ALWAYS null out vertex buffer on rebuild -- if the face lands in a render + // batch, it will recover its vertex buffer reference from the spatial group + facep->setVertexBuffer(NULL); + + //sum up face verts and indices + drawablep->updateFaceSize(i); + + + + if (rigged) + { + if (!facep->isState(LLFace::RIGGED)) + { //completely reset vertex buffer + facep->clearVertexBuffer(); + } + + facep->setState(LLFace::RIGGED); + is_rigged = true; + + //get drawpool of avatar with rigged face + LLDrawPoolAvatar* pool = get_avatar_drawpool(vobj); + + //Determine if we've received skininfo that contains an + //alternate bind matrix - if it does then apply the translational component + //to the joints of the avatar. + LLVOAvatar* pAvatarVO = vobj->getAvatar(); + bool pelvisGotSet = false; + + if ( pAvatarVO ) + { + LLUUID currentId = vobj->getVolume()->getParams().getSculptID(); + const LLMeshSkinInfo* pSkinData = gMeshRepo.getSkinInfo( currentId ); + + if ( pSkinData ) + { + const int bindCnt = pSkinData->mAlternateBindMatrix.size(); + if ( bindCnt > 0 ) + { + const int jointCnt = pSkinData->mJointNames.size(); + const F32 pelvisZOffset = pSkinData->mPelvisOffset; + bool fullRig = (jointCnt>=20) ? true : false; + if ( fullRig ) + { + for ( int i=0; i<jointCnt; ++i ) + { + std::string lookingForJoint = pSkinData->mJointNames[i].c_str(); + //llinfos<<"joint name "<<lookingForJoint.c_str()<<llendl; + LLJoint* pJoint = pAvatarVO->getJoint( lookingForJoint ); + if ( pJoint && pJoint->getId() != currentId ) + { + pJoint->setId( currentId ); + const LLVector3& jointPos = pSkinData->mAlternateBindMatrix[i].getTranslation(); + //Set the joint position + pJoint->storeCurrentXform( jointPos ); + //If joint is a pelvis then handle old/new pelvis to foot values + if ( lookingForJoint == "mPelvis" ) + { + pJoint->storeCurrentXform( jointPos ); + if ( !pAvatarVO->hasPelvisOffset() ) + { + pAvatarVO->setPelvisOffset( true, jointPos, pelvisZOffset ); + //Trigger to rebuild viewer AV + pelvisGotSet = true; + } + } + } + } + } + } + } + } + //If we've set the pelvis to a new position we need to also rebuild some information that the + //viewer does at launch (e.g. body size etc.) + if ( pelvisGotSet ) + { + pAvatarVO->postPelvisSetRecalc(); + } + + if (pool) + { + const LLTextureEntry* te = facep->getTextureEntry(); + + //remove face from old pool if it exists + LLDrawPool* old_pool = facep->getPool(); + if (old_pool && old_pool->getType() == LLDrawPool::POOL_AVATAR) + { + ((LLDrawPoolAvatar*) old_pool)->removeRiggedFace(facep); + } + + //add face to new pool + LLViewerTexture* tex = facep->getTexture(); + U32 type = gPipeline.getPoolTypeFromTE(te, tex); + + if (type == LLDrawPool::POOL_ALPHA) + { + if (te->getFullbright()) + { + pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT_ALPHA); + } + else + { + pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_ALPHA); + } + } + else if (te->getShiny()) + { + if (te->getFullbright()) + { + pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT_SHINY); + } + else + { + if (LLPipeline::sRenderDeferred) + { + pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_SIMPLE); + } + else + { + pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_SHINY); + } + } + } + else + { + if (te->getFullbright()) + { + pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT); + } + else + { + pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_SIMPLE); + } + } + + if (te->getGlow()) + { + pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_GLOW); + } + + if (LLPipeline::sRenderDeferred) + { + if (type != LLDrawPool::POOL_ALPHA && !te->getFullbright()) + { + if (te->getBumpmap()) + { + pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_DEFERRED_BUMP); + } + else + { + pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_DEFERRED_SIMPLE); + } + } + } + } + + continue; + } + else + { + if (facep->isState(LLFace::RIGGED)) + { //face is not rigged but used to be, remove from rigged face pool + LLDrawPoolAvatar* pool = (LLDrawPoolAvatar*) facep->getPool(); + if (pool) + { + pool->removeRiggedFace(facep); + } + facep->clearState(LLFace::RIGGED); + } + } + + if (cur_total > max_total || facep->getIndicesCount() <= 0 || facep->getGeomCount() <= 0) + { + facep->clearVertexBuffer(); + continue; + } + + cur_total += facep->getGeomCount(); + + if (facep->hasGeometry() && facep->getPixelArea() > FORCE_CULL_AREA) + { + const LLTextureEntry* te = facep->getTextureEntry(); + LLViewerTexture* tex = facep->getTexture(); + + if (facep->isState(LLFace::TEXTURE_ANIM)) + { + if (!vobj->mTexAnimMode) + { + facep->clearState(LLFace::TEXTURE_ANIM); + } + } + + BOOL force_simple = (facep->getPixelArea() < FORCE_SIMPLE_RENDER_AREA); + U32 type = gPipeline.getPoolTypeFromTE(te, tex); + if (type != LLDrawPool::POOL_ALPHA && force_simple) + { + type = LLDrawPool::POOL_SIMPLE; + } + facep->setPoolType(type); + + if (vobj->isHUDAttachment()) + { + facep->setState(LLFace::FULLBRIGHT); + } + + if (vobj->mTextureAnimp && vobj->mTexAnimMode) + { + if (vobj->mTextureAnimp->mFace <= -1) + { + S32 face; + for (face = 0; face < vobj->getNumTEs(); face++) + { + drawablep->getFace(face)->setState(LLFace::TEXTURE_ANIM); + } + } + else if (vobj->mTextureAnimp->mFace < vobj->getNumTEs()) + { + drawablep->getFace(vobj->mTextureAnimp->mFace)->setState(LLFace::TEXTURE_ANIM); + } + } + + if (type == LLDrawPool::POOL_ALPHA) + { + if (facep->canRenderAsMask()) + { //can be treated as alpha mask + simple_faces.push_back(facep); + } + else + { + drawablep->setState(LLDrawable::HAS_ALPHA); + alpha_faces.push_back(facep); + } + } + else + { + if (drawablep->isState(LLDrawable::REBUILD_VOLUME)) + { + facep->mLastUpdateTime = gFrameTimeSeconds; + } + + if (gPipeline.canUseWindLightShadersOnObjects() + && LLPipeline::sRenderBump) + { + if (te->getBumpmap()) + { //needs normal + binormal + bump_faces.push_back(facep); + } + else if (te->getShiny() || !te->getFullbright()) + { //needs normal + simple_faces.push_back(facep); + } + else + { //doesn't need normal + facep->setState(LLFace::FULLBRIGHT); + fullbright_faces.push_back(facep); + } + } + else + { + if (te->getBumpmap() && LLPipeline::sRenderBump) + { //needs normal + binormal + bump_faces.push_back(facep); + } + else if ((te->getShiny() && LLPipeline::sRenderBump) || + !(te->getFullbright() || bake_sunlight)) + { //needs normal + simple_faces.push_back(facep); + } + else + { //doesn't need normal + facep->setState(LLFace::FULLBRIGHT); + fullbright_faces.push_back(facep); + } + } + } + } + else + { //face has no renderable geometry + facep->clearVertexBuffer(); + } + } + + if (is_rigged) + { + drawablep->setState(LLDrawable::RIGGED); + } + else + { + drawablep->clearState(LLDrawable::RIGGED); + } + } + + group->mBufferUsage = useage; + + //PROCESS NON-ALPHA FACES + U32 simple_mask = LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_COLOR; + U32 alpha_mask = simple_mask | 0x80000000; //hack to give alpha verts their own VBO + U32 bump_mask = LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_TEXCOORD1 | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_COLOR; + U32 fullbright_mask = LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_COLOR; + + if (LLPipeline::sRenderDeferred) + { + bump_mask |= LLVertexBuffer::MAP_BINORMAL; + } + + genDrawInfo(group, simple_mask, simple_faces); + genDrawInfo(group, bump_mask, bump_faces); + genDrawInfo(group, fullbright_mask, fullbright_faces); + genDrawInfo(group, alpha_mask, alpha_faces, TRUE); + + if (!LLPipeline::sDelayVBUpdate) + { + //drawables have been rebuilt, clear rebuild status + for (LLSpatialGroup::element_iter drawable_iter = group->getData().begin(); drawable_iter != group->getData().end(); ++drawable_iter) + { + LLDrawable* drawablep = *drawable_iter; + drawablep->clearState(LLDrawable::REBUILD_ALL); + } + } + + group->mLastUpdateTime = gFrameTimeSeconds; + group->mBuilt = 1.f; + group->clearState(LLSpatialGroup::GEOM_DIRTY | LLSpatialGroup::ALPHA_DIRTY); + + if (LLPipeline::sDelayVBUpdate) + { + group->setState(LLSpatialGroup::MESH_DIRTY | LLSpatialGroup::NEW_DRAWINFO); + } + + mFaceList.clear(); +} + +static LLFastTimer::DeclareTimer FTM_VOLUME_GEOM("Volume Geometry"); +static LLFastTimer::DeclareTimer FTM_VOLUME_GEOM_PARTIAL("Terse Rebuild"); + +void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group) +{ + llassert(group); + if (group && group->isState(LLSpatialGroup::MESH_DIRTY) && !group->isState(LLSpatialGroup::GEOM_DIRTY)) + { + LLFastTimer tm(FTM_VOLUME_GEOM); + S32 num_mapped_veretx_buffer = LLVertexBuffer::sMappedCount ; + + group->mBuilt = 1.f; + + for (LLSpatialGroup::element_iter drawable_iter = group->getData().begin(); drawable_iter != group->getData().end(); ++drawable_iter) + { + LLFastTimer t(FTM_VOLUME_GEOM_PARTIAL); + LLDrawable* drawablep = *drawable_iter; + + if (!drawablep->isDead() && drawablep->isState(LLDrawable::REBUILD_ALL) ) + { + LLVOVolume* vobj = drawablep->getVOVolume(); + vobj->preRebuild(); + + LLVolume* volume = vobj->getVolume(); + for (S32 i = 0; i < drawablep->getNumFaces(); ++i) + { + LLFace* face = drawablep->getFace(i); + if (face && face->getVertexBuffer()) + { + face->getGeometryVolume(*volume, face->getTEOffset(), + vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), face->getGeomIndex()); + } + + if (!face) + { + llerrs << "WTF?" << llendl; + } + } + + drawablep->clearState(LLDrawable::REBUILD_ALL); + } + } + + //unmap all the buffers + for (LLSpatialGroup::buffer_map_t::iterator i = group->mBufferMap.begin(); i != group->mBufferMap.end(); ++i) + { + LLSpatialGroup::buffer_texture_map_t& map = i->second; + for (LLSpatialGroup::buffer_texture_map_t::iterator j = map.begin(); j != map.end(); ++j) + { + LLSpatialGroup::buffer_list_t& list = j->second; + for (LLSpatialGroup::buffer_list_t::iterator k = list.begin(); k != list.end(); ++k) + { + LLVertexBuffer* buffer = *k; + if (buffer->isLocked()) + { + buffer->setBuffer(0); + } + } + } + } + + // don't forget alpha + if(group != NULL && + !group->mVertexBuffer.isNull() && + group->mVertexBuffer->isLocked()) + { + group->mVertexBuffer->setBuffer(0); + } + + //if not all buffers are unmapped + if(num_mapped_veretx_buffer != LLVertexBuffer::sMappedCount) + { + llwarns << "Not all mapped vertex buffers are unmapped!" << llendl ; + for (LLSpatialGroup::element_iter drawable_iter = group->getData().begin(); drawable_iter != group->getData().end(); ++drawable_iter) + { + LLDrawable* drawablep = *drawable_iter; + for (S32 i = 0; i < drawablep->getNumFaces(); ++i) + { + LLFace* face = drawablep->getFace(i); + LLVertexBuffer* buff = face->getVertexBuffer(); + if (face && buff && buff->isLocked()) + { + buff->setBuffer(0) ; + } + } + } + } + + group->clearState(LLSpatialGroup::MESH_DIRTY | LLSpatialGroup::NEW_DRAWINFO); + } + + if (group && group->isState(LLSpatialGroup::NEW_DRAWINFO)) + { + llerrs << "WTF?" << llendl; + } +} + +void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::vector<LLFace*>& faces, BOOL distance_sort) +{ + //calculate maximum number of vertices to store in a single buffer + U32 max_vertices = (gSavedSettings.getS32("RenderMaxVBOSize")*1024)/LLVertexBuffer::calcVertexSize(group->mSpatialPartition->mVertexDataMask); + max_vertices = llmin(max_vertices, (U32) 65535); + + if (!distance_sort) + { + //sort faces by things that break batches + std::sort(faces.begin(), faces.end(), LLFace::CompareBatchBreaker()); + } + else + { + //sort faces by distance + std::sort(faces.begin(), faces.end(), LLFace::CompareDistanceGreater()); + } + + std::vector<LLFace*>::iterator face_iter = faces.begin(); + + LLSpatialGroup::buffer_map_t buffer_map; + + LLViewerTexture* last_tex = NULL; + S32 buffer_index = 0; + + if (distance_sort) + { + buffer_index = -1; + } + + while (face_iter != faces.end()) + { + //pull off next face + LLFace* facep = *face_iter; + LLViewerTexture* tex = facep->getTexture(); + + if (distance_sort) + { + tex = NULL; + } + + if (last_tex == tex) + { + buffer_index++; + } + else + { + last_tex = tex; + buffer_index = 0; + } + + bool bake_sunlight = LLPipeline::sBakeSunlight && facep->getDrawable()->isStatic(); + + U32 index_count = facep->getIndicesCount(); + U32 geom_count = facep->getGeomCount(); + + //sum up vertices needed for this render batch + std::vector<LLFace*>::iterator i = face_iter; + ++i; + + while (i != faces.end() && + (LLPipeline::sTextureBindTest || (distance_sort || (*i)->getTexture() == tex))) + { + facep = *i; + + if (geom_count + facep->getGeomCount() > max_vertices) + { //cut batches on geom count too big + break; + } + + ++i; + index_count += facep->getIndicesCount(); + geom_count += facep->getGeomCount(); + } + + //create/delete/resize vertex buffer if needed + LLVertexBuffer* buffer = NULL; + LLSpatialGroup::buffer_texture_map_t::iterator found_iter = group->mBufferMap[mask].find(tex); + + if (found_iter != group->mBufferMap[mask].end()) + { + if ((U32) buffer_index < found_iter->second.size()) + { + buffer = found_iter->second[buffer_index]; + } + } + + if (!buffer) + { //create new buffer if needed + buffer = createVertexBuffer(mask, + group->mBufferUsage); + buffer->allocateBuffer(geom_count, index_count, TRUE); + } + else + { //resize pre-existing buffer + if (LLVertexBuffer::sEnableVBOs && buffer->getUsage() != group->mBufferUsage || + buffer->getTypeMask() != mask) + { + buffer = createVertexBuffer(mask, + group->mBufferUsage); + buffer->allocateBuffer(geom_count, index_count, TRUE); + } + else + { + buffer->resizeBuffer(geom_count, index_count); + } + } + + buffer_map[mask][tex].push_back(buffer); + + //add face geometry + + U32 indices_index = 0; + U16 index_offset = 0; + + while (face_iter < i) + { //update face indices for new buffer + facep = *face_iter; + facep->setIndicesIndex(indices_index); + facep->setGeomIndex(index_offset); + facep->setVertexBuffer(buffer); + + { + //for debugging, set last time face was updated vs moved + facep->updateRebuildFlags(); + + if (!LLPipeline::sDelayVBUpdate) + { //copy face geometry into vertex buffer + LLDrawable* drawablep = facep->getDrawable(); + LLVOVolume* vobj = drawablep->getVOVolume(); + LLVolume* volume = vobj->getVolume(); + + U32 te_idx = facep->getTEOffset(); + + if (facep->getGeometryVolume(*volume, te_idx, + vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), index_offset)) + { + buffer->markDirty(facep->getGeomIndex(), facep->getGeomCount(), + facep->getIndicesStart(), facep->getIndicesCount()); + } + } + } + + index_offset += facep->getGeomCount(); + indices_index += facep->getIndicesCount(); + + + //append face to appropriate render batch + + BOOL force_simple = facep->getPixelArea() < FORCE_SIMPLE_RENDER_AREA; + BOOL fullbright = facep->isState(LLFace::FULLBRIGHT); + if ((mask & LLVertexBuffer::MAP_NORMAL) == 0) + { //paranoia check to make sure GL doesn't try to read non-existant normals + fullbright = TRUE; + } + + const LLTextureEntry* te = facep->getTextureEntry(); + + BOOL is_alpha = (facep->getPoolType() == LLDrawPool::POOL_ALPHA) ? TRUE : FALSE; + + if (is_alpha) + { + // can we safely treat this as an alpha mask? + if (facep->canRenderAsMask()) + { + if (te->getFullbright() || LLPipeline::sNoAlpha) + { + registerFace(group, facep, LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK); + } + else + { + registerFace(group, facep, LLRenderPass::PASS_ALPHA_MASK); + } + } + else + { + registerFace(group, facep, LLRenderPass::PASS_ALPHA); + } + + if (LLPipeline::sRenderDeferred) + { + registerFace(group, facep, LLRenderPass::PASS_ALPHA_SHADOW); + } + } + else if (gPipeline.canUseVertexShaders() + && group->mSpatialPartition->mPartitionType != LLViewerRegion::PARTITION_HUD + && LLPipeline::sRenderBump + && te->getShiny()) + { //shiny + if (tex->getPrimaryFormat() == GL_ALPHA) + { //invisiprim+shiny + registerFace(group, facep, LLRenderPass::PASS_INVISI_SHINY); + registerFace(group, facep, LLRenderPass::PASS_INVISIBLE); + } + else if (LLPipeline::sRenderDeferred) + { //deferred rendering + if (te->getFullbright()) + { //register in post deferred fullbright shiny pass + registerFace(group, facep, LLRenderPass::PASS_FULLBRIGHT_SHINY); + if (te->getBumpmap()) + { //register in post deferred bump pass + registerFace(group, facep, LLRenderPass::PASS_POST_BUMP); + } + } + else if (te->getBumpmap()) + { //register in deferred bump pass + registerFace(group, facep, LLRenderPass::PASS_BUMP); + } + else + { //register in deferred simple pass (deferred simple includes shiny) + llassert(mask & LLVertexBuffer::MAP_NORMAL); + registerFace(group, facep, LLRenderPass::PASS_SIMPLE); + } + } + else if (fullbright) + { //not deferred, register in standard fullbright shiny pass + registerFace(group, facep, LLRenderPass::PASS_FULLBRIGHT_SHINY); + } + else + { //not deferred or fullbright, register in standard shiny pass + registerFace(group, facep, LLRenderPass::PASS_SHINY); + } + } + else + { //not alpha and not shiny + if (!is_alpha && tex->getPrimaryFormat() == GL_ALPHA) + { //invisiprim + registerFace(group, facep, LLRenderPass::PASS_INVISIBLE); + } + else if (fullbright || bake_sunlight) + { //fullbright + registerFace(group, facep, LLRenderPass::PASS_FULLBRIGHT); + if (LLPipeline::sRenderDeferred && LLPipeline::sRenderBump && te->getBumpmap()) + { //if this is the deferred render and a bump map is present, register in post deferred bump + registerFace(group, facep, LLRenderPass::PASS_POST_BUMP); + } + } + else + { + if (LLPipeline::sRenderDeferred && LLPipeline::sRenderBump && te->getBumpmap()) + { //non-shiny or fullbright deferred bump + registerFace(group, facep, LLRenderPass::PASS_BUMP); + } + else + { //all around simple + llassert(mask & LLVertexBuffer::MAP_NORMAL); + registerFace(group, facep, LLRenderPass::PASS_SIMPLE); + } + } + + //not sure why this is here -- shiny HUD attachments maybe? -- davep 5/11/2010 + if (!is_alpha && te->getShiny() && LLPipeline::sRenderBump) + { + registerFace(group, facep, LLRenderPass::PASS_SHINY); + } + } + + //not sure why this is here, and looks like it might cause bump mapped objects to get rendered redundantly -- davep 5/11/2010 + if (!is_alpha && !LLPipeline::sRenderDeferred) + { + llassert((mask & LLVertexBuffer::MAP_NORMAL) || fullbright); + facep->setPoolType((fullbright) ? LLDrawPool::POOL_FULLBRIGHT : LLDrawPool::POOL_SIMPLE); + + if (!force_simple && te->getBumpmap() && LLPipeline::sRenderBump) + { + registerFace(group, facep, LLRenderPass::PASS_BUMP); + } + } + + if (!is_alpha && LLPipeline::sRenderGlow && te->getGlow() > 0.f) + { + registerFace(group, facep, LLRenderPass::PASS_GLOW); + } + + ++face_iter; + } + + buffer->setBuffer(0); + } + + group->mBufferMap[mask].clear(); + for (LLSpatialGroup::buffer_texture_map_t::iterator i = buffer_map[mask].begin(); i != buffer_map[mask].end(); ++i) + { + group->mBufferMap[mask][i->first] = i->second; + } +} + +void LLGeometryManager::addGeometryCount(LLSpatialGroup* group, U32 &vertex_count, U32 &index_count) +{ + //initialize to default usage for this partition + U32 usage = group->mSpatialPartition->mBufferUsage; + + //clear off any old faces + mFaceList.clear(); + + //for each drawable + for (LLSpatialGroup::element_iter drawable_iter = group->getData().begin(); drawable_iter != group->getData().end(); ++drawable_iter) + { + LLDrawable* drawablep = *drawable_iter; + + if (drawablep->isDead()) + { + continue; + } + + if (drawablep->isAnimating()) + { //fall back to stream draw for animating verts + usage = GL_STREAM_DRAW_ARB; + } + + //for each face + for (S32 i = 0; i < drawablep->getNumFaces(); i++) + { + //sum up face verts and indices + drawablep->updateFaceSize(i); + LLFace* facep = drawablep->getFace(i); + if (facep->hasGeometry() && facep->getPixelArea() > FORCE_CULL_AREA) + { + vertex_count += facep->getGeomCount(); + index_count += facep->getIndicesCount(); + + //remember face (for sorting) + mFaceList.push_back(facep); + } + else + { + facep->clearVertexBuffer(); + } + } + } + + group->mBufferUsage = usage; +} + +LLHUDPartition::LLHUDPartition() +{ + mPartitionType = LLViewerRegion::PARTITION_HUD; + mDrawableType = LLPipeline::RENDER_TYPE_HUD; + mSlopRatio = 0.f; + mLODPeriod = 1; +} + +void LLHUDPartition::shift(const LLVector4a &offset) +{ + //HUD objects don't shift with region crossing. That would be silly. +} + + -- cgit v1.2.3 From 31a2923b3d96ed4a04d0b27018fc71d0d66b6a5b Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Thu, 28 Apr 2011 14:56:46 -0700 Subject: EXP-749 FIX [REGRESSION] Voice status indicator shown in IM session instead of profile pic in Basic and Advanced modes reviewed by Leyla --- indra/llui/tests/llurlentry_stub.cpp | 2 +- indra/llui/tests/llurlmatch_test.cpp | 2 +- indra/llxuixml/llinitparam.cpp | 4 +- indra/llxuixml/llinitparam.h | 63 ++++++++++++++++------ .../skins/default/xui/en/widgets/avatar_icon.xml | 1 + .../skins/default/xui/en/widgets/scroll_bar.xml | 18 ++++--- 6 files changed, 63 insertions(+), 27 deletions(-) diff --git a/indra/llui/tests/llurlentry_stub.cpp b/indra/llui/tests/llurlentry_stub.cpp index 75946b2416..26b3b17577 100644 --- a/indra/llui/tests/llurlentry_stub.cpp +++ b/indra/llui/tests/llurlentry_stub.cpp @@ -127,7 +127,7 @@ namespace LLInitParam bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack, S32 generation){ return true; } void BaseBlock::serializeBlock(Parser& parser, Parser::name_stack_t name_stack, const LLInitParam::BaseBlock* diff_block) const {} bool BaseBlock::inspectBlock(Parser& parser, Parser::name_stack_t name_stack, S32 min_value, S32 max_value) const { return true; } - bool BaseBlock::merge(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite) { return true; } + bool BaseBlock::mergeBlock(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite) { return true; } bool BaseBlock::validateBlock(bool emit_errors) const { return true; } ParamValue<LLUIColor, TypeValues<LLUIColor> >::ParamValue(const LLUIColor& color) diff --git a/indra/llui/tests/llurlmatch_test.cpp b/indra/llui/tests/llurlmatch_test.cpp index aea605c9f2..e09ef33d49 100644 --- a/indra/llui/tests/llurlmatch_test.cpp +++ b/indra/llui/tests/llurlmatch_test.cpp @@ -101,7 +101,7 @@ namespace LLInitParam bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack, S32 generation){ return true; } void BaseBlock::serializeBlock(Parser& parser, Parser::name_stack_t name_stack, const LLInitParam::BaseBlock* diff_block) const {} bool BaseBlock::inspectBlock(Parser& parser, Parser::name_stack_t name_stack, S32 min_count, S32 max_count) const { return true; } - bool BaseBlock::merge(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite) { return true; } + bool BaseBlock::mergeBlock(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite) { return true; } bool BaseBlock::validateBlock(bool emit_errors) const { return true; } ParamValue<LLUIColor, TypeValues<LLUIColor> >::ParamValue(const LLUIColor& color) diff --git a/indra/llxuixml/llinitparam.cpp b/indra/llxuixml/llinitparam.cpp index 3c4eb70a5d..b3312798dd 100644 --- a/indra/llxuixml/llinitparam.cpp +++ b/indra/llxuixml/llinitparam.cpp @@ -375,7 +375,7 @@ namespace LLInitParam //static void BaseBlock::addParam(BlockDescriptor& block_data, const ParamDescriptorPtr in_param, const char* char_name) { - // create a copy of the paramdescriptor in allparams + // create a copy of the param descriptor in mAllParams // so other data structures can store a pointer to it block_data.mAllParams.push_back(in_param); ParamDescriptorPtr param(block_data.mAllParams.back()); @@ -469,7 +469,7 @@ namespace LLInitParam // take all provided params from other and apply to self // NOTE: this requires that "other" is of the same derived type as this - bool BaseBlock::merge(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite) + bool BaseBlock::mergeBlock(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite) { bool some_param_changed = false; BlockDescriptor::all_params_list_t::const_iterator end_it = block_data.mAllParams.end(); diff --git a/indra/llxuixml/llinitparam.h b/indra/llxuixml/llinitparam.h index 858f8405b4..35c3106198 100644 --- a/indra/llxuixml/llinitparam.h +++ b/indra/llxuixml/llinitparam.h @@ -476,8 +476,12 @@ namespace LLInitParam void init(BlockDescriptor& descriptor, BlockDescriptor& base_descriptor, size_t block_size); + bool mergeBlockParam(bool param_provided, BlockDescriptor& block_data, const BaseBlock& other, bool overwrite) + { + mergeBlock(block_data, other, overwrite); + } // take all provided params from other and apply to self - bool merge(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite); + bool mergeBlock(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite); // can be updated in getters mutable S32 mChangeVersion; @@ -896,12 +900,14 @@ namespace LLInitParam const self_t& src_typed_param = static_cast<const self_t&>(src); self_t& dst_typed_param = static_cast<self_t&>(dst); - if (src_typed_param.isProvided() - && (overwrite || !dst_typed_param.isProvided())) + if (src_typed_param.anyProvided()) { - if (dst_typed_param.merge(param_value_t::selfBlockDescriptor(), src_typed_param, overwrite)) + bool param_provided = src_typed_param.isProvided() && (overwrite || !dst_typed_param.isProvided()); + if (dst_typed_param.mergeBlockParam(param_provided, param_value_t::selfBlockDescriptor(), src_typed_param, overwrite)) { dst_typed_param.clearValueName(); + dst_typed_param.setProvided(true); + dst_typed_param.enclosingBlock().paramChanged(dst_typed_param, true); return true; } } @@ -1082,6 +1088,12 @@ namespace LLInitParam std::copy(dst_typed_param.begin(), dst_typed_param.end(), std::back_inserter(new_values)); std::swap(dst_typed_param.mValues, new_values); } + + if (src_typed_param.begin() != src_typed_param.end()) + { + dst_typed_param.setProvided(true); + dst_typed_param.enclosingBlock().paramChanged(dst_typed_param, true); + } return true; } @@ -1282,6 +1294,13 @@ namespace LLInitParam std::copy(dst_typed_param.begin(), dst_typed_param.end(), std::back_inserter(new_values)); std::swap(dst_typed_param.mValues, new_values); } + + if (src_typed_param.begin() != src_typed_param.end()) + { + dst_typed_param.setProvided(true); + dst_typed_param.enclosingBlock().paramChanged(dst_typed_param, true); + } + return true; } @@ -1301,24 +1320,28 @@ namespace LLInitParam // take all provided params from other and apply to self bool overwriteFrom(const self_t& other) { - return merge(selfBlockDescriptor(), other, true); + return mergeBlock(selfBlockDescriptor(), other, true); } // take all provided params that are not already provided, and apply to self bool fillFrom(const self_t& other) { - return merge(selfBlockDescriptor(), other, false); + return mergeBlock(selfBlockDescriptor(), other, false); } - // merge with other block - bool merge(BlockDescriptor& block_data, const self_t& other, bool overwrite) + bool mergeBlockParam(bool param_provided, BlockDescriptor& block_data, const self_t& other, bool overwrite) { - // only merge a choice if we are overwriting with other's contents - if (overwrite) + if (param_provided) { - mCurChoice = other.mCurChoice; - return BaseBlock::merge(selfBlockDescriptor(), other, overwrite); + mergeBlock(block_data, other, overwrite); } + } + + // merge with other block + bool mergeBlock(BlockDescriptor& block_data, const self_t& other, bool overwrite) + { + mCurChoice = other.mCurChoice; + return BaseBlock::mergeBlock(selfBlockDescriptor(), other, overwrite); return false; } @@ -1445,13 +1468,13 @@ namespace LLInitParam // take all provided params from other and apply to self bool overwriteFrom(const self_t& other) { - return static_cast<DERIVED_BLOCK*>(this)->merge(selfBlockDescriptor(), other, true); + return static_cast<DERIVED_BLOCK*>(this)->mergeBlock(selfBlockDescriptor(), other, true); } // take all provided params that are not already provided, and apply to self bool fillFrom(const self_t& other) { - return static_cast<DERIVED_BLOCK*>(this)->merge(selfBlockDescriptor(), other, false); + return static_cast<DERIVED_BLOCK*>(this)->mergeBlock(selfBlockDescriptor(), other, false); } virtual const BlockDescriptor& mostDerivedBlockDescriptor() const { return selfBlockDescriptor(); } @@ -1862,7 +1885,15 @@ namespace LLInitParam mValue = value; } - bool merge(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite) + bool mergeBlockParam(bool param_provided, BlockDescriptor& block_data, const BaseBlock& other, bool overwrite) + { + if (param_provided) + { + mergeBlock(block_data, other, overwrite); + } + } + + bool mergeBlock(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite) { const derived_t& src_typed_param = static_cast<const derived_t&>(other); @@ -1875,7 +1906,7 @@ namespace LLInitParam else { // merge individual parameters into destination - return block_t::merge(block_t::selfBlockDescriptor(), src_typed_param, overwrite); + return block_t::mergeBlock(block_t::selfBlockDescriptor(), src_typed_param, overwrite); } } diff --git a/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml b/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml index a1e32e44de..4d69dda7eb 100644 --- a/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml +++ b/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <avatar_icon + name="avatar_icon" default_icon_name="Generic_Person_Large" use_draw_context_alpha="false"> </avatar_icon> diff --git a/indra/newview/skins/default/xui/en/widgets/scroll_bar.xml b/indra/newview/skins/default/xui/en/widgets/scroll_bar.xml index 830ea12e41..e6d4bff8b5 100644 --- a/indra/newview/skins/default/xui/en/widgets/scroll_bar.xml +++ b/indra/newview/skins/default/xui/en/widgets/scroll_bar.xml @@ -6,20 +6,24 @@ track_color="ScrollbarTrackColor" thumb_color="ScrollbarThumbColor" thickness="15"> - <up_button image_unselected="ScrollArrow_Up" + <up_button name="up_button" + image_unselected="ScrollArrow_Up" image_selected="ScrollArrow_Up" scale_image="true" hover_glow_amount="0.35"/> - <down_button image_unselected="ScrollArrow_Down" + <down_button name="down_button" + image_unselected="ScrollArrow_Down" image_selected="ScrollArrow_Down" scale_image="true" hover_glow_amount="0.35"/> - <left_button image_unselected="ScrollArrow_Left" + <left_button name="left_button" + image_unselected="ScrollArrow_Left" image_selected="ScrollArrow_Left" scale_image="true" hover_glow_amount="0.35"/> - <right_button image_unselected="ScrollArrow_Right" - image_selected="ScrollArrow_Right" - scale_image="true" - hover_glow_amount="0.35"/> + <right_button name="right_button" + image_unselected="ScrollArrow_Right" + image_selected="ScrollArrow_Right" + scale_image="true" + hover_glow_amount="0.35"/> </scroll_bar> -- cgit v1.2.3 From edee5b10d4be026f3f8f31a7a6aecd3769c100cd Mon Sep 17 00:00:00 2001 From: Eli Linden <eli@lindenlab.com> Date: Thu, 28 Apr 2011 15:19:36 -0700 Subject: sync up with viewer-development --- .../default/xui/da/panel_preferences_chat.xml | 3 +- .../default/xui/da/panel_preferences_sound.xml | 3 +- .../default/xui/de/panel_preferences_chat.xml | 3 +- .../default/xui/de/panel_preferences_sound.xml | 3 +- .../skins/default/xui/en/floater_buy_contents.xml | 2 +- .../skins/default/xui/en/floater_preferences.xml | 4 +- .../skins/default/xui/en/menu_avatar_self.xml | 12 + .../skins/default/xui/en/menu_inventory.xml | 8 + .../skins/default/xui/en/menu_inventory_add.xml | 8 + .../skins/default/xui/en/menu_outfit_gear.xml | 8 + .../skins/default/xui/en/menu_text_editor.xml | 15 +- indra/newview/skins/default/xui/en/menu_viewer.xml | 20 + .../newview/skins/default/xui/en/notifications.xml | 63 +++- .../skins/default/xui/en/panel_bottomtray.xml | 412 ++++++++++----------- .../skins/default/xui/en/panel_edit_wearable.xml | 18 + indra/newview/skins/default/xui/en/panel_hint.xml | 6 +- .../skins/default/xui/en/panel_hint_image.xml | 40 +- indra/newview/skins/default/xui/en/panel_login.xml | 1 - .../default/xui/en/panel_preferences_alerts.xml | 4 +- .../default/xui/en/panel_preferences_chat.xml | 20 +- .../default/xui/en/panel_preferences_general.xml | 21 +- .../default/xui/en/panel_preferences_graphics1.xml | 42 ++- .../default/xui/en/panel_preferences_move.xml | 9 +- .../default/xui/en/panel_preferences_privacy.xml | 4 +- .../default/xui/en/panel_preferences_sound.xml | 16 +- .../newview/skins/default/xui/en/panel_profile.xml | 17 - indra/newview/skins/default/xui/en/strings.xml | 51 +++ .../default/xui/en/widgets/loading_indicator.xml | 20 +- .../default/xui/es/panel_preferences_chat.xml | 3 +- .../default/xui/es/panel_preferences_sound.xml | 3 +- .../default/xui/fr/panel_preferences_chat.xml | 3 +- .../default/xui/fr/panel_preferences_sound.xml | 3 +- .../default/xui/it/panel_preferences_chat.xml | 3 +- .../default/xui/it/panel_preferences_sound.xml | 3 +- .../default/xui/ja/panel_preferences_chat.xml | 3 +- .../default/xui/ja/panel_preferences_sound.xml | 3 +- .../default/xui/nl/panel_preferences_sound.xml | 3 +- .../default/xui/pl/panel_preferences_chat.xml | 3 +- .../default/xui/pl/panel_preferences_sound.xml | 3 +- .../default/xui/pt/panel_preferences_chat.xml | 3 +- .../default/xui/pt/panel_preferences_sound.xml | 3 +- 41 files changed, 554 insertions(+), 318 deletions(-) diff --git a/indra/newview/skins/default/xui/da/panel_preferences_chat.xml b/indra/newview/skins/default/xui/da/panel_preferences_chat.xml index 3705a5902a..ed499619f6 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_chat.xml @@ -29,7 +29,8 @@ <check_box label="IM chats" name="EnableIMChatPopups" tool_tip="Vælg for at se popup vindue når personlige beskeder (IM) modtages"/> <spinner label="Tid før chatvisning forsvinder:" name="nearby_toasts_lifetime"/> <spinner label="Tid før chatvisning forsvinder:" name="nearby_toasts_fadingtime"/> - <check_box label="Benyt maskin-oversættelse ved chat (håndteret af Google)" name="translate_chat_checkbox"/> + <check_box name="translate_chat_checkbox"/> + <text name="translate_chb_label" >Benyt maskin-oversættelse ved chat (håndteret af Google)</text> <text name="translate_language_text" width="110"> Oversæt chat til : </text> diff --git a/indra/newview/skins/default/xui/da/panel_preferences_sound.xml b/indra/newview/skins/default/xui/da/panel_preferences_sound.xml index 5810cc21e7..067463be02 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_sound.xml @@ -4,7 +4,8 @@ Midterste museknap </panel.string> <slider label="Generel" name="System Volume"/> - <check_box initial_value="true" label="Sluk lyd når minimeret" name="mute_when_minimized"/> + <check_box initial_value="true" name="mute_when_minimized"/> + <text name="mute_chb_label">Sluk lyd når minimeret</text> <slider label="Knapper" name="UI Volume"/> <slider label="Omgivelser" name="Wind Volume"/> <slider label="Lyd effekter" name="SFX Volume"/> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml index 8086128dd7..8c8cdd31fe 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml @@ -29,7 +29,8 @@ <check_box label="IM-Chats" name="EnableIMChatPopups" tool_tip="Markieren, um Popups zu sehen, wenn Instant Message eintrifft"/> <spinner label="Lebenszeit von Toasts für Chat in der Nähe:" name="nearby_toasts_lifetime"/> <spinner label="Ein-/Ausblenddauer von Toasts für Chat in der Nähe:" name="nearby_toasts_fadingtime"/> - <check_box label="Bei Chat Maschinenübersetzung verwenden (Service von Google)" name="translate_chat_checkbox"/> + <check_box name="translate_chat_checkbox"/> + <text name="translate_chb_label" >Bei Chat Maschinenübersetzung verwenden (Service von Google)</text> <text name="translate_language_text"> Chat übersetzen in: </text> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_sound.xml b/indra/newview/skins/default/xui/de/panel_preferences_sound.xml index 0f029d8664..07631b6a91 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_sound.xml @@ -4,7 +4,8 @@ Mittlere Maustaste </panel.string> <slider label="Master-Lautstärke" name="System Volume"/> - <check_box initial_value="true" label="Stummschalten, wenn minimiert" name="mute_when_minimized"/> + <check_box initial_value="true" name="mute_when_minimized"/> + <text name="mute_chb_label">Stummschalten, wenn minimiert</text> <slider label="Schaltflächen" name="UI Volume"/> <slider label="Umgebung" name="Wind Volume"/> <slider label="Soundeffekte" name="SFX Volume"/> diff --git a/indra/newview/skins/default/xui/en/floater_buy_contents.xml b/indra/newview/skins/default/xui/en/floater_buy_contents.xml index babbf0f5ca..92001534e7 100644 --- a/indra/newview/skins/default/xui/en/floater_buy_contents.xml +++ b/indra/newview/skins/default/xui/en/floater_buy_contents.xml @@ -34,7 +34,7 @@ layout="topleft" name="contains_text" width="276"> - [NAME] contains: + <nolink>[NAME]</nolink> contains: </text> <scroll_list background_visible="true" diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml index 8eee8f44b5..dcfa8bc060 100644 --- a/indra/newview/skins/default/xui/en/floater_preferences.xml +++ b/indra/newview/skins/default/xui/en/floater_preferences.xml @@ -45,7 +45,7 @@ name="pref core" tab_group="1" tab_position="left" - tab_width="115" + tab_width="140" tab_padding_right="0" top="21" width="658"> @@ -96,7 +96,7 @@ filename="panel_preferences_colors.xml" label="Colors" layout="topleft" - help_topic="preferences_im_tab" + help_topic="preferences_colors_tab" name="colors" /> <panel class="panel_preference" diff --git a/indra/newview/skins/default/xui/en/menu_avatar_self.xml b/indra/newview/skins/default/xui/en/menu_avatar_self.xml index d727294cc8..d9bdfece38 100644 --- a/indra/newview/skins/default/xui/en/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/en/menu_avatar_self.xml @@ -150,6 +150,18 @@ function="Edit.EnableTakeOff" parameter="tattoo" /> </menu_item_call> + <menu_item_call + enabled="false" + label="Physics" + layout="topleft" + name="Self Physics"> + <menu_item_call.on_click + function="Edit.TakeOff" + parameter="physics" /> + <menu_item_call.on_enable + function="Edit.EnableTakeOff" + parameter="physics" /> + </menu_item_call> <menu_item_call enabled="false" label="Alpha" diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml index c0046d8e28..e91f4458ae 100644 --- a/indra/newview/skins/default/xui/en/menu_inventory.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory.xml @@ -200,6 +200,14 @@ function="Inventory.DoCreate" parameter="tattoo" /> </menu_item_call> + <menu_item_call + label="New Physics" + layout="topleft" + name="New Physics"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="physics" /> + </menu_item_call> </menu> <menu label="New Body Parts" diff --git a/indra/newview/skins/default/xui/en/menu_inventory_add.xml b/indra/newview/skins/default/xui/en/menu_inventory_add.xml index ae98abf4fb..90e8db3709 100644 --- a/indra/newview/skins/default/xui/en/menu_inventory_add.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory_add.xml @@ -188,6 +188,14 @@ function="Inventory.DoCreate" parameter="tattoo" /> </menu_item_call> + <menu_item_call + label="New Physics" + layout="topleft" + name="New Physics"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="physics" /> + </menu_item_call> </menu> <menu height="85" diff --git a/indra/newview/skins/default/xui/en/menu_outfit_gear.xml b/indra/newview/skins/default/xui/en/menu_outfit_gear.xml index 5fc25b8f0f..fc7272b904 100644 --- a/indra/newview/skins/default/xui/en/menu_outfit_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_outfit_gear.xml @@ -132,6 +132,14 @@ function="Gear.Create" parameter="alpha" /> </menu_item_call> + <menu_item_call + label="New Physics" + layout="topleft" + name="New Physics"> + <menu_item_call.on_click + function="Gear.Create" + parameter="physics" /> + </menu_item_call> <menu_item_call label="New Tattoo" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/menu_text_editor.xml b/indra/newview/skins/default/xui/en/menu_text_editor.xml index ecd96088e7..fe8489166b 100644 --- a/indra/newview/skins/default/xui/en/menu_text_editor.xml +++ b/indra/newview/skins/default/xui/en/menu_text_editor.xml @@ -4,8 +4,7 @@ <menu_item_call label="Cut" layout="topleft" - name="Cut" - shortcut="control|X"> + name="Cut"> <menu_item_call.on_click function="Edit.Cut" /> <menu_item_call.on_enable @@ -14,8 +13,7 @@ <menu_item_call label="Copy" layout="topleft" - name="Copy" - shortcut="control|C"> + name="Copy"> <menu_item_call.on_click function="Edit.Copy" /> <menu_item_call.on_enable @@ -24,8 +22,7 @@ <menu_item_call label="Paste" layout="topleft" - name="Paste" - shortcut="control|V"> + name="Paste"> <menu_item_call.on_click function="Edit.Paste" /> <menu_item_call.on_enable @@ -34,8 +31,7 @@ <menu_item_call label="Delete" layout="topleft" - name="Delete" - shortcut="Del"> + name="Delete"> <menu_item_call.on_click function="Edit.Delete" /> <menu_item_call.on_enable @@ -44,8 +40,7 @@ <menu_item_call label="Select All" layout="topleft" - name="Select All" - shortcut="control|A"> + name="Select All"> <menu_item_call.on_click function="Edit.SelectAll" /> <menu_item_call.on_enable diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 934cae93db..a5115b0faa 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -3113,6 +3113,16 @@ function="ToggleControl" parameter="ImagePipelineUseHTTP" /> </menu_item_check> + <menu_item_check + label="HTTP Inventory" + name="HTTP Inventory"> + <menu_item_check.on_check + function="CheckControl" + parameter="UseHTTPInventory" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="UseHTTPInventory" /> + </menu_item_check> <menu_item_call label="Compress Images" name="Compress Images"> @@ -3428,6 +3438,16 @@ function="Edit.EnableTakeOff" parameter="tattoo" /> </menu_item_call> + <menu_item_call + label="Physics" + name="Physics"> + <menu_item_call.on_click + function="Edit.TakeOff" + parameter="physics" /> + <menu_item_call.on_enable + function="Edit.EnableTakeOff" + parameter="physics" /> + </menu_item_call> <menu_item_call label="All Clothes" name="All Clothes"> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 433f623273..3fb3717e68 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -7022,22 +7022,27 @@ Hiding the Speak button will disable the voice feature. </notification> <notification - name="HintDisplayName" - label="Display Name" + name="HintMoveClick" + label="" type="hint" unique="true"> - Set your customizable display name here. This is in addition to your unique username, which can't be changed. You can change how you see other people's names in your preferences. +1. Click to Walk +Click anywhere on the ground to walk to that spot. + +2. Click and Drag to Rotate View +Click and drag anywhere on the world to rotate your view + <tag>custom_skin</tag> </notification> <notification - name="HintMoveArrows" - label="Move" + name="HintDisplayName" + label="Display Name" type="hint" unique="true"> - To walk, use the directional keys on your keyboard. You can run by pressing the Up arrow twice. - <tag>custom_skin</tag> + Set your customizable display name here. This is in addition to your unique username, which can't be changed. You can change how you see other people's names in your preferences. </notification> + <notification name="HintView" label="View" @@ -7209,7 +7214,49 @@ The site at '<nolink>[HOST_NAME]</nolink>' in realm ' yestext="Quit" notext="Don't Quit"/> </notification> - + + <notification + name="NoInventory" + label="" + type="alertmodal" + unique="true"> + <tag>fail</tag> + <tag>confirm</tag> + Viewing inventory is only available in Advanced mode. Would you like to logout and change modes? + <usetemplate + name="okcancelbuttons" + yestext="Quit" + notext="Don't Quit"/> + </notification> + + <notification + name="NoAppearance" + label="" + type="alertmodal" + unique="true"> + <tag>fail</tag> + <tag>confirm</tag> + The appearance editor is only available in Advanced mode. Would you like to logout and change modes? + <usetemplate + name="okcancelbuttons" + yestext="Quit" + notext="Don't Quit"/> + </notification> + + <notification + name="NoSearch" + label="" + type="alertmodal" + unique="true"> + <tag>fail</tag> + <tag>confirm</tag> + Search is only available in Advanced mode. Would you like to logout and change modes? + <usetemplate + name="okcancelbuttons" + yestext="Quit" + notext="Don't Quit"/> + </notification> + <global name="UnsupportedCPU"> - Your CPU speed does not meet the minimum requirements. </global> diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index a92cc886e7..a6e5e7a219 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -5,121 +5,121 @@ bg_opaque_color="DkGray" chrome="true" follows="left|bottom|right" - focus_root="true" + focus_root="true" height="33" layout="topleft" left="0" name="bottom_tray" top="28" width="1310"> - <string + <string name="DragIndicationImageName" value="Accordion_ArrowOpened_Off" /> - <string + <string name="SpeakBtnToolTip" value="Turns microphone on/off" /> - <string + <string name="VoiceControlBtnToolTip" value="Shows/hides voice control panel" /> - <layout_stack + <layout_stack border_size="0" clip="false" follows="all" height="28" - layout="topleft" - left="0" + layout="topleft" + left="0" mouse_opaque="false" name="toolbar_stack" orientation="horizontal" top="0" width="1310"> - <layout_panel + <layout_panel auto_resize="false" - user_resize="false" + user_resize="false" min_width="2" width="2" /> - <layout_panel + <layout_panel auto_resize="false" layout="topleft" max_width="320" min_width="214" - height="28" + height="28" mouse_opaque="false" - name="chat_bar_layout_panel" + name="chat_bar_layout_panel" user_resize="true" - width="310" > + width="250" > <panel name="chat_bar" filename="panel_nearby_chat_bar.xml" left="0" height="28" - width="308" + width="248" top="0" mouse_opaque="false" follows="left|right" /> - </layout_panel> - <!-- + </layout_panel> + <!-- This 5px Panel is an indicator of where the resize handle is. The panel provides a gap between the resize handle icon and a button to the right. --> - <layout_panel - auto_resize="false" - layout="topleft" - max_width="5" - min_width="5" - name="chat_bar_resize_handle_panel" - user_resize="false" - width="5"> - <icon - follows="top|right" - height="25" - image_name="ChatBarHandle" - layout="topleft" - left="-7" - name="resize_handle" - top="4" - width="5" /> - </layout_panel> - <layout_panel - auto_resize="false" - follows="left|right" - height="28" - layout="topleft" - min_height="28" - min_width="59" - mouse_opaque="false" - name="speak_panel" - top_delta="0" - user_resize="false" - width="108"> - <talk_button - follows="left|right" - height="23" - layout="topleft" - left="0" - name="talk" - top="5" - width="105"> - <show_button - tab_stop="true"> - <init_callback - function="Button.SetDockableFloaterToggle" - parameter="voice_controls" /> - </show_button> - <!-- do not remove halign attribute with default value. otherwise it can't be overridden in other locales. + <layout_panel + auto_resize="false" + layout="topleft" + max_width="5" + min_width="5" + name="chat_bar_resize_handle_panel" + user_resize="false" + width="5"> + <icon + follows="top|right" + height="25" + image_name="ChatBarHandle" + layout="topleft" + left="-7" + name="resize_handle" + top="4" + width="5" /> + </layout_panel> + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_height="28" + min_width="59" + mouse_opaque="false" + name="speak_panel" + top_delta="0" + user_resize="false" + width="108"> + <talk_button + follows="left|right" + height="23" + layout="topleft" + left="0" + name="talk" + top="5" + width="105"> + <show_button + tab_stop="true"> + <init_callback + function="Button.SetDockableFloaterToggle" + parameter="voice_controls" /> + </show_button> + <!-- do not remove halign attribute with default value. otherwise it can't be overridden in other locales. & pad_right is default value for long label which can be right aligned. See EXT-6318 --> - <speak_button - halign="center" - label="Speak" - label_selected="Speak" - name="speak_btn" - pad_right="20" - tab_stop="true" - use_ellipses="true" /> - </talk_button> - </layout_panel> - <layout_panel + <speak_button + halign="center" + label="Speak" + label_selected="Speak" + name="speak_btn" + pad_right="20" + tab_stop="true" + use_ellipses="true" /> + </talk_button> + </layout_panel> + <layout_panel auto_resize="false" follows="right" height="28" @@ -131,7 +131,7 @@ top_delta="0" user_resize="false" width="85"> - <gesture_combo_list + <gesture_combo_list follows="left|right" height="23" label="Gesture" @@ -141,46 +141,46 @@ tool_tip="Shows/hides gestures" top="5" width="82"> - <combo_button + <combo_button pad_right="10" use_ellipses="true" /> - <combo_list + <combo_list page_lines="17" /> - </gesture_combo_list> - </layout_panel> - <layout_panel + </gesture_combo_list> + </layout_panel> + <layout_panel auto_resize="false" - follows="right" - height="28" - layout="topleft" - min_height="28" - min_width="52" - mouse_opaque="false" - name="movement_panel" - user_resize="false" - width="83"> - <bottomtray_button - follows="left|right" - height="23" - image_pressed="PushButton_Press" - image_pressed_selected="PushButton_Selected_Press" - image_selected="PushButton_Selected_Press" - is_toggle="true" - label="Move" - layout="topleft" - name="movement_btn" - tool_tip="Shows/hides movement controls" - top="5" - use_ellipses="true" - width="80"> - <init_callback - function="Button.SetDockableFloaterToggle" - parameter="moveview" /> - </bottomtray_button> + follows="right" + height="28" + layout="topleft" + min_height="28" + min_width="52" + mouse_opaque="false" + name="movement_panel" + user_resize="false" + width="83"> + <bottomtray_button + follows="left|right" + height="23" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + is_toggle="true" + label="Move" + layout="topleft" + name="movement_btn" + tool_tip="Shows/hides movement controls" + top="5" + use_ellipses="true" + width="80"> + <init_callback + function="Button.SetDockableFloaterToggle" + parameter="moveview" /> + </bottomtray_button> - </layout_panel> - <layout_panel - auto_resize="false" + </layout_panel> + <layout_panel + auto_resize="false" follows="left|right" height="28" layout="topleft" @@ -190,7 +190,7 @@ name="cam_panel" user_resize="false" width="83"> - <bottomtray_button + <bottomtray_button follows="left|right" height="23" image_pressed="PushButton_Press" @@ -205,83 +205,83 @@ top="5" use_ellipses="true" width="80"> - <init_callback + <init_callback function="Button.SetDockableFloaterToggle" parameter="camera" /> - </bottomtray_button> - </layout_panel> - <layout_panel + </bottomtray_button> + </layout_panel> + <layout_panel auto_resize="false" follows="left|right" height="28" layout="topleft" - min_width="40" - mouse_opaque="false" - name="snapshot_panel" - user_resize="false" - width="39"> - <bottomtray_button - follows="left|right" - height="23" - image_overlay="Snapshot_Off" - image_pressed="PushButton_Press" - image_pressed_selected="PushButton_Selected_Press" - image_selected="PushButton_Selected_Press" - is_toggle="true" - layout="topleft" - left="0" - name="snapshots" - tool_tip="Take snapshot" - top="5" - width="36"> - <init_callback - function="Button.SetFloaterToggle" - parameter="snapshot" /> - </bottomtray_button> - </layout_panel> - <layout_panel - auto_resize="false" - follows="left|right" - height="28" - layout="topleft" - min_height="28" - min_width="52" - mouse_opaque="false" - name="build_btn_panel" - user_resize="false" - width="83"> -<!--*FIX: Build Floater is not opened with default registration. Will be fixed soon. + min_width="40" + mouse_opaque="false" + name="snapshot_panel" + user_resize="false" + width="39"> + <bottomtray_button + follows="left|right" + height="23" + image_overlay="Snapshot_Off" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + is_toggle="true" + layout="topleft" + left="0" + name="snapshots" + tool_tip="Take snapshot" + top="5" + width="36"> + <init_callback + function="Button.SetFloaterToggle" + parameter="snapshot" /> + </bottomtray_button> + </layout_panel> + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_height="28" + min_width="52" + mouse_opaque="false" + name="build_btn_panel" + user_resize="false" + width="83"> + <!--*FIX: Build Floater is not opened with default registration. Will be fixed soon. Disabled for now. --> - <bottomtray_button - follows="left|right" - height="23" - image_pressed="PushButton_Press" - image_pressed_selected="PushButton_Selected_Press" - image_selected="PushButton_Selected_Press" - is_toggle="true" - label="Build" - layout="topleft" - left="0" - name="build_btn" - tool_tip="Shows/hides Build Tools" - top="5" - use_ellipses="true" - width="80"> - <commit_callback - function="Build.Toggle" - parameter="build" /> - </bottomtray_button> - </layout_panel> - <layout_panel - auto_resize="false" - follows="left|right" - height="28" - layout="topleft" + <bottomtray_button + follows="left|right" + height="23" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + is_toggle="true" + label="Build" + layout="topleft" + left="0" + name="build_btn" + tool_tip="Shows/hides Build Tools" + top="5" + use_ellipses="true" + width="80"> + <commit_callback + function="Build.Toggle" + parameter="build" /> + </bottomtray_button> + </layout_panel> + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" min_height="28" - min_width="52" + min_width="52" mouse_opaque="false" - name="search_btn_panel" + name="search_btn_panel" user_resize="false" width="83"> <bottomtray_button @@ -341,7 +341,7 @@ Disabled for now. height="28" layout="topleft" min_height="28" - min_width="52" + min_width="62" mouse_opaque="false" name="mini_map_btn_panel" user_resize="false" @@ -378,7 +378,7 @@ Disabled for now. width="189"> <!--*NOTE: min_width of the chiclet_panel (chiclet_list) must be the same as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. EXT-991--> - <chiclet_panel + <chiclet_panel chiclet_padding="4" follows="left|right" height="24" @@ -389,7 +389,7 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. name="chiclet_list" top="7" width="189"> - <button + <button auto_resize="true" follows="right" height="29" @@ -406,7 +406,7 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. top="-28" visible="false" width="7" /> - <button + <button auto_resize="true" follows="right" height="29" @@ -423,13 +423,13 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. top="-28" visible="false" width="7" /> - </chiclet_panel> - </layout_panel> - <layout_panel auto_resize="false" - user_resize="false" + </chiclet_panel> + </layout_panel> + <layout_panel auto_resize="false" + user_resize="false" width="4" min_width="4"/> - <layout_panel + <layout_panel auto_resize="false" follows="right" height="28" @@ -440,7 +440,7 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. top="0" user_resize="false" width="37"> - <chiclet_im_well + <chiclet_im_well follows="right" height="28" layout="topleft" @@ -449,7 +449,7 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. name="im_well" top="0" width="35"> - <!-- + <!-- Emulate 4 states of button by background images, see details in EXT-3147. The same should be for notification_well button xml attribute Description image_unselected "Unlit" - there are no new messages @@ -457,7 +457,7 @@ image_selected "Unlit" + "Selected" - there are no new messages and the image_pressed "Lit" - there are new messages image_pressed_selected "Lit" + "Selected" - there are new messages and the Well is open --> - <button + <button auto_resize="true" follows="right" halign="center" @@ -472,13 +472,13 @@ image_pressed_selected "Lit" + "Selected" - there are new messages and the Well name="Unread IM messages" tool_tip="Conversations" width="34"> - <init_callback + <init_callback function="Button.SetDockableFloaterToggle" parameter="im_well_window" /> - </button> - </chiclet_im_well> - </layout_panel> - <layout_panel + </button> + </chiclet_im_well> + </layout_panel> + <layout_panel auto_resize="false" follows="right" height="28" @@ -489,7 +489,7 @@ image_pressed_selected "Lit" + "Selected" - there are new messages and the Well top="0" user_resize="false" width="37"> - <chiclet_notification + <chiclet_notification follows="right" height="23" layout="topleft" @@ -498,7 +498,7 @@ image_pressed_selected "Lit" + "Selected" - there are new messages and the Well name="notification_well" top="5" width="35"> - <button + <button auto_resize="true" bottom_pad="3" follows="right" @@ -514,17 +514,17 @@ image_pressed_selected "Lit" + "Selected" - there are new messages and the Well name="Unread" tool_tip="Notifications" width="34"> - <init_callback + <init_callback function="Button.SetDockableFloaterToggle" parameter="notification_well_window" /> - </button> - </chiclet_notification> - </layout_panel> - <layout_panel - auto_resize="false" - user_resize="false" - min_width="4" - name="DUMMY2" - width="8" /> - </layout_stack> + </button> + </chiclet_notification> + </layout_panel> + <layout_panel + auto_resize="false" + user_resize="false" + min_width="4" + name="DUMMY2" + width="8" /> + </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml index ac8917d272..c8764a6a84 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml @@ -71,6 +71,10 @@ name="edit_tattoo_title"> Editing Tattoo </string> + <string + name="edit_physics_title"> + Editing Physics + </string> <string name="shape_desc_text"> Shape: @@ -131,6 +135,10 @@ name="tattoo_desc_text"> Tattoo: </string> + <string + name="physics_desc_text"> + Physics: + </string> <!-- Default width of the button should be to show it without label. Button will be extedned in code to show whole label when wearable is being changed. --> @@ -410,6 +418,16 @@ top="8" visible="false" width="333" /> + <panel + filename="panel_edit_physics.xml" + follows="all" + height="425" + layout="topleft" + left="0" + name="edit_physics_panel" + top="8" + visible="false" + width="333" /> </panel> <panel follows="bottom|left|right" diff --git a/indra/newview/skins/default/xui/en/panel_hint.xml b/indra/newview/skins/default/xui/en/panel_hint.xml index e2e9d0aef0..f7434f0330 100644 --- a/indra/newview/skins/default/xui/en/panel_hint.xml +++ b/indra/newview/skins/default/xui/en/panel_hint.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel width="205" - height="100"> + height="34"> <text name="hint_title" font="SansSerifMedium" left="8" @@ -15,8 +15,8 @@ left="8" right="197" top="26" - bottom="92" - follows="all" + bottom="26" + follows="left|right|bottom" text_color="Black" wrap="true"/> <button right="197" diff --git a/indra/newview/skins/default/xui/en/panel_hint_image.xml b/indra/newview/skins/default/xui/en/panel_hint_image.xml index 00b6e42497..df05d50dc5 100644 --- a/indra/newview/skins/default/xui/en/panel_hint_image.xml +++ b/indra/newview/skins/default/xui/en/panel_hint_image.xml @@ -1,33 +1,43 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel - width="205" - height="140" + width="305" + height="40" layout="topleft"> <text name="hint_title" font="SansSerifMedium" left="8" - right="180" + right="290" top="8" bottom="20" follows="left|right|top" text_color="Black" wrap="false"/> - <icon name="hint_image" - left="42" - top="25" - width="115" - height="86" - image_name="arrow_keys.png" - /> + <layout_stack left="0" + top="25" + width="305" + height="0" + follows="left|top|right" + orientation="horizontal"> + <layout_panel auto_resize="true" width="100"/> + <layout_panel auto_resize="true" width="0"> + <icon name="hint_image" + top="0" + left="0" + height="0" + width="0" + follows="all"/> + </layout_panel> + <layout_panel auto_resize="true" width="100"/> + </layout_stack> <text name="hint_text" left="8" - right="197" - top_pad="5" - bottom="120" - follows="all" + right="297" + top="30" + bottom="30" + follows="left|right|bottom" text_color="Black" wrap="true"/> - <button right="197" + <button right="297" top="8" width="16" height="16" diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml index 4c2faddfe4..8d0f1437e6 100644 --- a/indra/newview/skins/default/xui/en/panel_login.xml +++ b/indra/newview/skins/default/xui/en/panel_login.xml @@ -133,7 +133,6 @@ label="Remember password" max_chars="128" tool_tip="Select your mode. Choose Basic for fast, easy exploration and chat. Choose Advanced to access more features." top_pad="0" - control_name="SessionSettingsFile" name="mode_combo" width="110"> <combo_box.item diff --git a/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml index 559df5bec9..714dca7fac 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml @@ -67,7 +67,7 @@ image_overlay="Arrow_Up" hover_glow_amount="0.15" layout="topleft" - left="180" + left="200" name="enable_this_popup" top_pad="5" width="40"> @@ -81,7 +81,7 @@ image_overlay="Arrow_Down" hover_glow_amount="0.15" layout="topleft" - left_pad="40" + left_pad="20" name="disable_this_popup" top_delta="0" width="40"> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml index a1082d9c32..404537e1f2 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml @@ -208,15 +208,27 @@ <check_box control_name="TranslateChat" enabled="true" - height="16" - label="Use machine translation while chatting (powered by Google)" + height="16" layout="topleft" left="30" name="translate_chat_checkbox" - bottom_delta="30" + top_pad="5" width="400" /> + <!-- *HACK + After storm-1109 will be fixed: instead of using this text_box, word_wrap should be applied for "translate_chat_checkbox" check_box's label.--> + <text + follows="top|left" + height="15" + layout="topleft" + left="50" + name="translate_chb_label" + top_delta="1" + width="450" + wrap="true"> + Use machine translation while chatting (powered by Google) + </text> <text - bottom_delta="30" + top_pad="20" name="translate_language_text" follows="left|top" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_general.xml b/indra/newview/skins/default/xui/en/panel_preferences_general.xml index 36f8f99178..9c718fdb87 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml @@ -307,17 +307,6 @@ tool_tip="Check to use display names in chat, IM, name tags, etc." top_pad="3"/> - <check_box - control_name="EnableUIHints" - follows="top|left" - height="16" - label="Enable Viewer UI Hints" - layout="topleft" - left="27" - name="viewer_hints_check" - top_pad="5" - width="237"/> - <text type="string" length="1" @@ -326,7 +315,7 @@ layout="topleft" left="30" name="inworld_typing_rg_label" - top_pad="6" + top_pad="1" width="400"> Pressing letter keys: </text> @@ -348,9 +337,9 @@ width="150" /> <radio_item label="Affects movement (i.e. WASD)" - left_pad="0" + left="0" layout="topleft" - top_delta="0" + top="18" height="16" name="radio_move" value="0" @@ -365,7 +354,7 @@ layout="topleft" left="30" name="title_afk_text" - top_pad="4" + top_pad="15" width="190"> Away timeout: </text> @@ -408,7 +397,7 @@ left="30" mouse_opaque="false" name="text_box3" - top_pad="5" + top_pad="3" width="240"> Busy mode response: </text> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml index 6573822d1a..d74197d965 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml @@ -2,7 +2,7 @@ <panel border="true" follows="left|top|right|bottom" - height="408" + height="418" label="Graphics" layout="topleft" left="102" @@ -327,6 +327,37 @@ value="4"/> </combo_box> + <slider + control_name="RenderAvatarPhysicsLODFactor" + follows="left|top" + height="16" + initial_value="100" + increment=".05" + label=" Avatar Physics:" + label_width="85" + layout="topleft" + left_delta="-16" + name="AvatarPhysicsDetail" + show_text="false" + top_pad="12" + width="160"> + <slider.commit_callback + function="Pref.UpdateSliderText" + parameter="AvatarPhysicsDetailText" /> + </slider> + <text + type="string" + length="1" + follows="left|top" + height="12" + layout="topleft" + left_delta="165" + name="AvatarPhysicsDetailText" + top_pad="-16" + width="128"> + Low + </text> + <slider control_name="RenderFarClip" decimal_digits="0" @@ -618,6 +649,7 @@ width="128"> Low </text> + <text type="string" length="1" @@ -628,7 +660,7 @@ name="AvatarRenderingText" top_pad="18" width="128"> - Avatar rendering: + Avatar Rendering: </text> <check_box control_name="RenderUseImpostors" @@ -672,7 +704,7 @@ left="358" left_pad="-30" name="TerrainDetailText" - top="226" + top="250" width="155"> Terrain detail: </text> @@ -710,7 +742,7 @@ layout="topleft" left="10" name="Apply" - top="383" + top="390" width="115"> <button.commit_callback function="Pref.Apply" /> @@ -722,7 +754,7 @@ layout="topleft" left_pad="3" name="Defaults" - top="383" + top="390" width="115"> <button.commit_callback function="Pref.HardwareDefaults" /> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_move.xml b/indra/newview/skins/default/xui/en/panel_preferences_move.xml index d2fc6ea09a..04412bdb9c 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_move.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_move.xml @@ -120,12 +120,13 @@ type="string" length="1" follows="left|top" - height="10" + height="15" layout="topleft" left_delta="3" name=" Mouse Sensitivity" top_pad="10" - width="160"> + width="160" + wrap="true"> Mouselook mouse sensitivity: </text> <slider @@ -139,7 +140,7 @@ max_val="15" name="mouse_sensitivity" top_delta="-1" - width="145" /> + width="115" /> <check_box control_name="InvertMouse" height="16" @@ -158,7 +159,7 @@ left="78" name="arrow_keys_move_avatar_check" width="237" - top_pad="1"/> + top_pad="10"/> <check_box control_name="AllowTapTapHoldRun" follows="left|top" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml index ef25588ca3..30be5bc853 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml @@ -42,7 +42,7 @@ </text> <check_box height="16" - enabled="true" + enabled="false" label="Show me in Search results" layout="topleft" left="30" @@ -82,8 +82,8 @@ control_name="ShowFavoritesOnLogin" enabled="false" height="16" - label="Show my Favorite Landmarks at Login (via 'Start At' drop-down menu)" layout="topleft" + label="Show my Favorite Landmarks at Login (via 'Start At' drop-down menu)" left="30" name="favorites_on_login_check" top_pad="10" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml index 26af8dc29d..f89494da72 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml @@ -50,12 +50,24 @@ control_name="MuteWhenMinimized" height="15" initial_value="true" - label="Mute when minimized" layout="topleft" name="mute_when_minimized" top_delta="3" left_pad="5" - width="235" /> + width="20" /> + <!-- *HACK + After storm-1109 will be fixed: instead of using this text_box, word_wrap should be applied for "mute_when_minimized" check_box's label.--> + <text + follows="top|left" + height="15" + layout="topleft" + left_pad="0" + name="mute_chb_label" + top_delta="0" + width="150" + wrap="true"> + Mute when minimized + </text> <slider control_name="AudioLevelUI" disabled_control="MuteAudio" diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml index d36220385d..cb701e03da 100644 --- a/indra/newview/skins/default/xui/en/panel_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_profile.xml @@ -453,23 +453,6 @@ </layout_panel> </layout_stack> </layout_panel> - <layout_panel - follows="bottom|left" - height="30" - layout="topleft" - name="profile_me_buttons_panel" - visible="false" - width="313"> - <button - follows="bottom|right" - height="23" - left="20" - top="0" - label="Edit Profile" - name="edit_profile_btn" - tool_tip="Edit your personal information" - width="130" /> - </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 14ea43a8f8..b0ede60fa0 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -1853,6 +1853,7 @@ Requests name of an avatar. When data is available the dataserver event will be <string name="skirt">Skirt</string> <string name="alpha">Alpha</string> <string name="tattoo">Tattoo</string> + <string name="physics">Physics</string> <string name="invalid">invalid</string> <string name="none">none</string> @@ -1868,6 +1869,7 @@ Requests name of an avatar. When data is available the dataserver event will be <string name="skirt_not_worn">Skirt not worn</string> <string name="alpha_not_worn">Alpha not worn</string> <string name="tattoo_not_worn">Tattoo not worn</string> + <string name="physics_not_worn">Physics not worn</string> <string name="invalid_not_worn">invalid</string> <!-- Create new wearable of the specified type --> @@ -1886,6 +1888,7 @@ Requests name of an avatar. When data is available the dataserver event will be <string name="create_new_skirt">Create new skirt</string> <string name="create_new_alpha">Create new alpha</string> <string name="create_new_tattoo">Create new tattoo</string> + <string name="create_new_physics">Create new physics</string> <string name="create_new_invalid">invalid</string> <!-- Wearable List--> @@ -2508,10 +2511,55 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="Bulbous">Bulbous</string> <string name="Bulbous Nose">Bulbous Nose</string> +<string name="Breast Physics Mass">Breast Mass</string> +<string name="Breast Physics Smoothing">Breast Smoothing</string> +<string name="Breast Physics Gravity">Breast Gravity</string> +<string name="Breast Physics Drag">Breast Drag</string> + +<string name="Breast Physics InOut Max Effect">Max Effect</string> +<string name="Breast Physics InOut Spring">Spring</string> +<string name="Breast Physics InOut Gain">Gain</string> +<string name="Breast Physics InOut Damping">Damping</string> + +<string name="Breast Physics UpDown Max Effect">Max Effect</string> +<string name="Breast Physics UpDown Spring">Spring</string> +<string name="Breast Physics UpDown Gain">Gain</string> +<string name="Breast Physics UpDown Damping">Damping</string> + +<string name="Breast Physics LeftRight Max Effect">Max Effect</string> +<string name="Breast Physics LeftRight Spring">Spring</string> +<string name="Breast Physics LeftRight Gain">Gain</string> +<string name="Breast Physics LeftRight Damping">Damping</string> + +<string name="Belly Physics Mass">Belly Mass</string> +<string name="Belly Physics Smoothing">Belly Smoothing</string> +<string name="Belly Physics Gravity">Belly Gravity</string> +<string name="Belly Physics Drag">Belly Drag</string> + +<string name="Belly Physics UpDown Max Effect">Max Effect</string> +<string name="Belly Physics UpDown Spring">Spring</string> +<string name="Belly Physics UpDown Gain">Gain</string> +<string name="Belly Physics UpDown Damping">Damping</string> + +<string name="Butt Physics Mass">Butt Mass</string> +<string name="Butt Physics Smoothing">Butt Smoothing</string> +<string name="Butt Physics Gravity">Butt Gravity</string> +<string name="Butt Physics Drag">Butt Drag</string> + +<string name="Butt Physics UpDown Max Effect">Max Effect</string> +<string name="Butt Physics UpDown Spring">Spring</string> +<string name="Butt Physics UpDown Gain">Gain</string> +<string name="Butt Physics UpDown Damping">Damping</string> + +<string name="Butt Physics LeftRight Max Effect">Max Effect</string> +<string name="Butt Physics LeftRight Spring">Spring</string> +<string name="Butt Physics LeftRight Gain">Gain</string> +<string name="Butt Physics LeftRight Damping">Damping</string> <string name="Bushy Eyebrows">Bushy Eyebrows</string> <string name="Bushy Hair">Bushy Hair</string> <string name="Butt Size">Butt Size</string> +<string name="Butt Gravity">Butt Gravity</string> <string name="bustle skirt">Bustle Skirt</string> <string name="no bustle">No Bustle</string> <string name="more bustle">More Bustle</string> @@ -3166,6 +3214,8 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. The session initialization is timed out </string> + <string name="Home position set.">Home position set.</string> + <string name="voice_morphing_url">http://secondlife.com/landing/voicemorphing</string> <!-- Financial operations strings --> @@ -3215,6 +3265,7 @@ Abuse Report</string> <string name="New Skirt">New Skirt</string> <string name="New Alpha">New Alpha</string> <string name="New Tattoo">New Tattoo</string> + <string name="New Physics">New Physics</string> <string name="Invalid Wearable">Invalid Wearable</string> <string name="New Gesture">New Gesture</string> <string name="New Script">New Script</string> diff --git a/indra/newview/skins/default/xui/en/widgets/loading_indicator.xml b/indra/newview/skins/default/xui/en/widgets/loading_indicator.xml index 6040d24128..ea1d89c975 100644 --- a/indra/newview/skins/default/xui/en/widgets/loading_indicator.xml +++ b/indra/newview/skins/default/xui/en/widgets/loading_indicator.xml @@ -3,6 +3,20 @@ follows="left|top" mouse_opaque="false" name="loading_indicator" - rotations_per_sec="1.0" - tab_stop="false" -/> + images_per_sec="1.0" + tab_stop="false"> + <images> + <image name="Progress_1"/> + <image name="Progress_2"/> + <image name="Progress_3"/> + <image name="Progress_4"/> + <image name="Progress_5"/> + <image name="Progress_6"/> + <image name="Progress_7"/> + <image name="Progress_8"/> + <image name="Progress_9"/> + <image name="Progress_10"/> + <image name="Progress_11"/> + <image name="Progress_12"/> + </images> +</loading_indicator> \ No newline at end of file diff --git a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml index 0b304fe287..aba85f9ff1 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml @@ -29,7 +29,8 @@ <check_box label="Chats de MI" name="EnableIMChatPopups" tool_tip="Activa esta casilla para ver una ventana emergente cada vez que recibas un mensaje instantáneo"/> <spinner label="Duración de los interlocutores favoritos:" name="nearby_toasts_lifetime"/> <spinner label="Tiempo de los otros interlocutores:" name="nearby_toasts_fadingtime"/> - <check_box label="Usar la traducción automática (con Google) en el chat" name="translate_chat_checkbox"/> + <check_box name="translate_chat_checkbox"/> + <text name="translate_chb_label" >Usar la traducción automática (con Google) en el chat</text> <text name="translate_language_text"> Traducir el chat al: </text> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml index db3659abcd..2bc82307a8 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml @@ -4,7 +4,8 @@ Botón medio del ratón </panel.string> <slider label="Volumen general" name="System Volume"/> - <check_box initial_value="true" label="Silenciar cuando minimice" name="mute_when_minimized"/> + <check_box initial_value="true" name="mute_when_minimized"/> + <text name="mute_chb_label">Silenciar cuando minimice</text> <slider label="Botones" name="UI Volume"/> <slider label="Ambiental" name="Wind Volume"/> <slider label="Efectos de sonido" name="SFX Volume"/> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml index 4b3fc35150..d5cecfc698 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml @@ -29,7 +29,8 @@ <check_box label="Chats IM" name="EnableIMChatPopups" tool_tip="Cocher cette case pour qu'un popup s'affiche à réception d'un message instantané."/> <spinner label="Durée de vie du popup Chat près de moi :" name="nearby_toasts_lifetime"/> <spinner label="Disparition progressive du popup Chat près de moi :" name="nearby_toasts_fadingtime"/> - <check_box label="Utiliser la traduction automatique lors des chats (fournie par Google)" name="translate_chat_checkbox"/> + <check_box name="translate_chat_checkbox"/> + <text name="translate_chb_label" >Utiliser la traduction automatique lors des chats (fournie par Google)</text> <text name="translate_language_text"> Traduire le chat en : </text> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml b/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml index 48630918d7..ac7f72d367 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml @@ -4,7 +4,8 @@ Bouton central de la souris </panel.string> <slider label="Volume principal" name="System Volume"/> - <check_box initial_value="true" label="Couper quand minimisé" name="mute_when_minimized"/> + <check_box initial_value="true" name="mute_when_minimized"/> + <text name="mute_chb_label">Couper quand minimisé</text> <slider label="Boutons" name="UI Volume"/> <slider label="Ambiant" name="Wind Volume"/> <slider label="Effets sonores" name="SFX Volume"/> diff --git a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml index 4a1bbdf64a..208dd5ed28 100644 --- a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml @@ -56,7 +56,8 @@ <radio_item label="Finestre separate" name="radio" value="0"/> <radio_item label="Schede" name="radio2" value="1"/> </radio_group> - <check_box label="Usa la traduzione meccanica durante le chat (tecnologia Google)" name="translate_chat_checkbox"/> + <check_box name="translate_chat_checkbox"/> + <text name="translate_chb_label" >Usa la traduzione meccanica durante le chat (tecnologia Google)</text> <text name="translate_language_text" width="110"> Traduci chat in: </text> diff --git a/indra/newview/skins/default/xui/it/panel_preferences_sound.xml b/indra/newview/skins/default/xui/it/panel_preferences_sound.xml index 6e70a314c5..e2332b63d0 100644 --- a/indra/newview/skins/default/xui/it/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_sound.xml @@ -1,7 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Suoni" name="Preference Media panel"> <slider label="Vol. principale" name="System Volume"/> - <check_box initial_value="true" label="Disatt. se a icona" name="mute_when_minimized"/> + <check_box initial_value="true" label="" name="mute_when_minimized"/> + <text name="mute_chb_label">Disatt. se a icona</text> <slider label="Pulsanti" name="UI Volume"/> <slider label="Ambiente" name="Wind Volume"/> <slider label="Effetti sonori" name="SFX Volume"/> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml index c260cebef8..ce2a0f35e4 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml @@ -56,7 +56,8 @@ <radio_item label="別々のウィンドウ" name="radio" value="0"/> <radio_item label="タブ" name="radio2" value="1"/> </radio_group> - <check_box label="チャット中に内容を機械翻訳する(Google翻訳)" name="translate_chat_checkbox"/> + <check_box name="translate_chat_checkbox"/> + <text name="translate_chb_label" >チャット中に内容を機械翻訳する(Google翻訳)</text> <text name="translate_language_text"> 翻訳する言語: </text> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml index 9fbbd46220..74696a3b35 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml @@ -1,7 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="サウンド" name="Preference Media panel"> <slider label="全体の音量" name="System Volume"/> - <check_box initial_value="true" label="最小化でミュート" name="mute_when_minimized"/> + <check_box initial_value="true" name="mute_when_minimized"/> + <text name="mute_chb_label">最小化でミュート</text> <slider label="ボタン" name="UI Volume"/> <slider label="風" name="Wind Volume"/> <slider label="効果音" name="SFX Volume"/> diff --git a/indra/newview/skins/default/xui/nl/panel_preferences_sound.xml b/indra/newview/skins/default/xui/nl/panel_preferences_sound.xml index 2b709bde40..5ded015868 100644 --- a/indra/newview/skins/default/xui/nl/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/nl/panel_preferences_sound.xml @@ -1,7 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Geluid" name="Preference Media panel"> <slider label="Hoofd volume" name="System Volume"/> - <check_box initial_value="true" label="Dempen indien geminimaliseerd" name="mute_when_minimized"/> + <check_box initial_value="true" name="mute_when_minimized"/> + <text name="mute_chb_label">Dempen indien geminimaliseerd</text> <slider label="Omliggend" name="Wind Volume"/> <slider label="Knoppen" name="UI Volume"/> <slider label="Media" name="Media Volume"/> diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml index c7142c8419..4a4e6509ab 100644 --- a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml @@ -29,7 +29,8 @@ <check_box label="Czat IM" name="EnableIMChatPopups" tool_tip="Zaznacz aby widzieć wyskakujące okienka kiedy IM się pojawia"/> <spinner label="Czas widoczności czatu w pobliżu:" name="nearby_toasts_lifetime"/> <spinner label="Czas znikania czatu w pobliżu:" name="nearby_toasts_fadingtime"/> - <check_box label="Używaj translatora podczas rozmowy (wspierany przez Google)" name="translate_chat_checkbox"/> + <check_box name="translate_chat_checkbox"/> + <text name="translate_chb_label" >Używaj translatora podczas rozmowy (wspierany przez Google)</text> <text name="translate_language_text"> Przetłumacz czat na: </text> diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml b/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml index ac93949a1b..692f24715b 100644 --- a/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml @@ -4,7 +4,8 @@ Środkowy przycisk myszy </panel.string> <slider label="Główny" name="System Volume"/> - <check_box initial_value="true" label="Wycisz podczas minimalizacji" name="mute_when_minimized"/> + <check_box initial_value="true" name="mute_when_minimized"/> + <text name="mute_chb_label">Wycisz podczas minimalizacji</text> <slider label="Interfejs" name="UI Volume"/> <slider label="Otoczenie" name="Wind Volume"/> <slider label="Efekty dźwiękowe" name="SFX Volume"/> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml index 368c474ee9..412bdbb13e 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml @@ -29,7 +29,8 @@ <check_box label="Bate-papos de MI" name="EnableIMChatPopups" tool_tip="Exibir pop-up de mensagens instantâneas novas"/> <spinner label="Transição de avisos de bate-papos por perto:" name="nearby_toasts_lifetime"/> <spinner label="Transição de avisos de bate-papos por perto:" name="nearby_toasts_fadingtime"/> - <check_box label="Traduzir bate-papo automaticamente (via Google)" name="translate_chat_checkbox"/> + <check_box name="translate_chat_checkbox"/> + <text name="translate_chb_label" >Traduzir bate-papo automaticamente (via Google)</text> <text name="translate_language_text"> Traduzir bate-papo para: </text> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml b/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml index 3846bfb377..6053deb5b1 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml @@ -4,7 +4,8 @@ Botão do meio do mouse </panel.string> <slider label="Volume principal" name="System Volume"/> - <check_box initial_value="true" label="Silenciar ao minimizar" name="mute_when_minimized"/> + <check_box initial_value="true" name="mute_when_minimized"/> + <text name="mute_chb_label">Silenciar ao minimizar</text> <slider label="Botões" name="UI Volume"/> <slider label="Ambiente" name="Wind Volume"/> <slider label="Efeitos sonoros" name="SFX Volume"/> -- cgit v1.2.3 From f5cf067c07a7175b3d8749e18e093d59fb1bf583 Mon Sep 17 00:00:00 2001 From: Eli Linden <eli@lindenlab.com> Date: Thu, 28 Apr 2011 15:30:00 -0700 Subject: sync up with viewer-development, adding all existing minimal/xui l10n files --- .../skins/default/xui/en/menu_media_ctrl.xml | 31 ++ .../skins/default/xui/en/panel_edit_physics.xml | 138 ++++++ .../default/xui/en/panel_scrolling_param_base.xml | 24 + .../skins/minimal/xui/de/floater_camera.xml | 65 +++ .../skins/minimal/xui/de/floater_help_browser.xml | 9 + .../skins/minimal/xui/de/floater_media_browser.xml | 30 ++ .../skins/minimal/xui/de/floater_nearby_chat.xml | 4 + .../skins/minimal/xui/de/floater_web_content.xml | 14 + .../skins/minimal/xui/de/inspect_avatar.xml | 25 + .../skins/minimal/xui/de/inspect_object.xml | 48 ++ .../minimal/xui/de/menu_add_wearable_gear.xml | 6 + .../skins/minimal/xui/de/menu_attachment_other.xml | 17 + .../skins/minimal/xui/de/menu_attachment_self.xml | 16 + .../skins/minimal/xui/de/menu_avatar_icon.xml | 7 + .../skins/minimal/xui/de/menu_avatar_other.xml | 16 + .../skins/minimal/xui/de/menu_avatar_self.xml | 31 ++ .../skins/minimal/xui/de/menu_bottomtray.xml | 17 + .../skins/minimal/xui/de/menu_cof_attachment.xml | 4 + .../skins/minimal/xui/de/menu_cof_body_part.xml | 5 + .../skins/minimal/xui/de/menu_cof_clothing.xml | 8 + .../newview/skins/minimal/xui/de/menu_cof_gear.xml | 5 + indra/newview/skins/minimal/xui/de/menu_edit.xml | 12 + .../skins/minimal/xui/de/menu_favorites.xml | 10 + .../skins/minimal/xui/de/menu_gesture_gear.xml | 10 + .../skins/minimal/xui/de/menu_group_plus.xml | 5 + .../skins/minimal/xui/de/menu_hide_navbar.xml | 6 + .../skins/minimal/xui/de/menu_im_well_button.xml | 4 + .../skins/minimal/xui/de/menu_imchiclet_adhoc.xml | 4 + .../skins/minimal/xui/de/menu_imchiclet_group.xml | 6 + .../skins/minimal/xui/de/menu_imchiclet_p2p.xml | 7 + .../minimal/xui/de/menu_inspect_avatar_gear.xml | 17 + .../minimal/xui/de/menu_inspect_object_gear.xml | 18 + .../minimal/xui/de/menu_inspect_self_gear.xml | 8 + .../minimal/xui/de/menu_inv_offer_chiclet.xml | 4 + .../skins/minimal/xui/de/menu_inventory.xml | 86 ++++ .../skins/minimal/xui/de/menu_inventory_add.xml | 33 ++ .../minimal/xui/de/menu_inventory_gear_default.xml | 16 + indra/newview/skins/minimal/xui/de/menu_land.xml | 9 + .../newview/skins/minimal/xui/de/menu_landmark.xml | 7 + indra/newview/skins/minimal/xui/de/menu_login.xml | 25 + .../newview/skins/minimal/xui/de/menu_mini_map.xml | 11 + indra/newview/skins/minimal/xui/de/menu_navbar.xml | 11 + .../skins/minimal/xui/de/menu_nearby_chat.xml | 9 + .../xui/de/menu_notification_well_button.xml | 4 + indra/newview/skins/minimal/xui/de/menu_object.xml | 29 ++ .../skins/minimal/xui/de/menu_object_icon.xml | 5 + .../skins/minimal/xui/de/menu_outfit_gear.xml | 27 + .../skins/minimal/xui/de/menu_outfit_tab.xml | 9 + .../skins/minimal/xui/de/menu_participant_list.xml | 21 + .../xui/de/menu_people_friends_view_sort.xml | 8 + .../skins/minimal/xui/de/menu_people_groups.xml | 8 + .../xui/de/menu_people_groups_view_sort.xml | 5 + .../skins/minimal/xui/de/menu_people_nearby.xml | 13 + .../xui/de/menu_people_nearby_multiselect.xml | 10 + .../xui/de/menu_people_nearby_view_sort.xml | 8 + .../xui/de/menu_people_recent_view_sort.xml | 7 + indra/newview/skins/minimal/xui/de/menu_picks.xml | 8 + .../skins/minimal/xui/de/menu_picks_plus.xml | 5 + indra/newview/skins/minimal/xui/de/menu_place.xml | 7 + .../skins/minimal/xui/de/menu_place_add_button.xml | 5 + .../minimal/xui/de/menu_places_gear_folder.xml | 15 + .../minimal/xui/de/menu_places_gear_landmark.xml | 18 + .../skins/minimal/xui/de/menu_profile_overflow.xml | 12 + .../skins/minimal/xui/de/menu_save_outfit.xml | 5 + .../skins/minimal/xui/de/menu_script_chiclet.xml | 4 + indra/newview/skins/minimal/xui/de/menu_slurl.xml | 6 + .../minimal/xui/de/menu_teleport_history_gear.xml | 6 + .../minimal/xui/de/menu_teleport_history_item.xml | 6 + .../minimal/xui/de/menu_teleport_history_tab.xml | 5 + .../skins/minimal/xui/de/menu_text_editor.xml | 8 + .../skins/minimal/xui/de/menu_topinfobar.xml | 7 + .../skins/minimal/xui/de/menu_url_agent.xml | 6 + .../skins/minimal/xui/de/menu_url_group.xml | 6 + .../newview/skins/minimal/xui/de/menu_url_http.xml | 7 + .../skins/minimal/xui/de/menu_url_inventory.xml | 6 + .../newview/skins/minimal/xui/de/menu_url_map.xml | 6 + .../skins/minimal/xui/de/menu_url_objectim.xml | 8 + .../skins/minimal/xui/de/menu_url_parcel.xml | 6 + .../skins/minimal/xui/de/menu_url_slapp.xml | 5 + .../skins/minimal/xui/de/menu_url_slurl.xml | 7 + .../skins/minimal/xui/de/menu_url_teleport.xml | 6 + indra/newview/skins/minimal/xui/de/menu_viewer.xml | 14 + .../minimal/xui/de/menu_wearable_list_item.xml | 14 + .../skins/minimal/xui/de/menu_wearing_gear.xml | 5 + .../skins/minimal/xui/de/menu_wearing_tab.xml | 6 + .../newview/skins/minimal/xui/de/notifications.xml | 19 + .../skins/minimal/xui/de/panel_bottomtray.xml | 39 ++ .../minimal/xui/de/panel_group_control_panel.xml | 11 + .../minimal/xui/de/panel_im_control_panel.xml | 30 ++ indra/newview/skins/minimal/xui/de/panel_login.xml | 40 ++ .../skins/minimal/xui/de/panel_navigation_bar.xml | 18 + .../newview/skins/minimal/xui/de/panel_people.xml | 70 +++ .../minimal/xui/de/panel_side_tray_tab_caption.xml | 7 + .../skins/minimal/xui/de/panel_status_bar.xml | 33 ++ .../skins/minimal/xui/en/floater_camera.xml | 284 +++++++++++ .../skins/minimal/xui/en/floater_help_browser.xml | 52 ++ .../skins/minimal/xui/en/floater_media_browser.xml | 242 +++++++++ .../skins/minimal/xui/en/floater_nearby_chat.xml | 52 ++ .../skins/minimal/xui/en/floater_side_bar_tab.xml | 10 + .../skins/minimal/xui/en/floater_web_content.xml | 189 +++++++ .../skins/minimal/xui/en/inspect_avatar.xml | 206 ++++++++ .../skins/minimal/xui/en/inspect_object.xml | 144 ++++++ indra/newview/skins/minimal/xui/en/main_view.xml | 268 ++++++++++ .../minimal/xui/en/menu_add_wearable_gear.xml | 2 + .../skins/minimal/xui/en/menu_attachment_other.xml | 76 +++ .../skins/minimal/xui/en/menu_attachment_self.xml | 26 + .../skins/minimal/xui/en/menu_avatar_icon.xml | 2 + .../skins/minimal/xui/en/menu_avatar_other.xml | 75 +++ .../skins/minimal/xui/en/menu_avatar_self.xml | 2 + .../skins/minimal/xui/en/menu_bottomtray.xml | 2 + .../skins/minimal/xui/en/menu_cof_attachment.xml | 2 + .../skins/minimal/xui/en/menu_cof_body_part.xml | 2 + .../skins/minimal/xui/en/menu_cof_clothing.xml | 2 + .../newview/skins/minimal/xui/en/menu_cof_gear.xml | 2 + indra/newview/skins/minimal/xui/en/menu_edit.xml | 90 ++++ .../skins/minimal/xui/en/menu_favorites.xml | 2 + .../skins/minimal/xui/en/menu_gesture_gear.xml | 2 + .../skins/minimal/xui/en/menu_group_plus.xml | 2 + .../skins/minimal/xui/en/menu_hide_navbar.xml | 2 + .../skins/minimal/xui/en/menu_im_well_button.xml | 2 + .../skins/minimal/xui/en/menu_imchiclet_adhoc.xml | 2 + .../skins/minimal/xui/en/menu_imchiclet_group.xml | 2 + .../skins/minimal/xui/en/menu_imchiclet_p2p.xml | 2 + .../minimal/xui/en/menu_inspect_avatar_gear.xml | 116 +++++ .../minimal/xui/en/menu_inspect_object_gear.xml | 50 ++ .../minimal/xui/en/menu_inspect_self_gear.xml | 49 ++ .../minimal/xui/en/menu_inv_offer_chiclet.xml | 2 + .../skins/minimal/xui/en/menu_inventory.xml | 2 + .../skins/minimal/xui/en/menu_inventory_add.xml | 2 + .../minimal/xui/en/menu_inventory_gear_default.xml | 2 + indra/newview/skins/minimal/xui/en/menu_land.xml | 2 + .../newview/skins/minimal/xui/en/menu_landmark.xml | 2 + indra/newview/skins/minimal/xui/en/menu_login.xml | 2 + .../newview/skins/minimal/xui/en/menu_mini_map.xml | 2 + indra/newview/skins/minimal/xui/en/menu_navbar.xml | 2 + .../skins/minimal/xui/en/menu_nearby_chat.xml | 2 + .../xui/en/menu_notification_well_button.xml | 2 + indra/newview/skins/minimal/xui/en/menu_object.xml | 40 ++ .../skins/minimal/xui/en/menu_object_icon.xml | 2 + .../skins/minimal/xui/en/menu_outfit_gear.xml | 2 + .../skins/minimal/xui/en/menu_outfit_tab.xml | 2 + .../skins/minimal/xui/en/menu_participant_list.xml | 2 + .../xui/en/menu_people_friends_view_sort.xml | 2 + .../skins/minimal/xui/en/menu_people_groups.xml | 2 + .../xui/en/menu_people_groups_view_sort.xml | 2 + .../skins/minimal/xui/en/menu_people_nearby.xml | 61 +++ .../xui/en/menu_people_nearby_multiselect.xml | 2 + .../xui/en/menu_people_nearby_view_sort.xml | 2 + .../xui/en/menu_people_recent_view_sort.xml | 2 + indra/newview/skins/minimal/xui/en/menu_picks.xml | 2 + .../skins/minimal/xui/en/menu_picks_plus.xml | 2 + indra/newview/skins/minimal/xui/en/menu_place.xml | 2 + .../skins/minimal/xui/en/menu_place_add_button.xml | 2 + .../minimal/xui/en/menu_places_gear_folder.xml | 2 + .../minimal/xui/en/menu_places_gear_landmark.xml | 2 + .../skins/minimal/xui/en/menu_profile_overflow.xml | 2 + .../skins/minimal/xui/en/menu_save_outfit.xml | 2 + .../skins/minimal/xui/en/menu_script_chiclet.xml | 2 + indra/newview/skins/minimal/xui/en/menu_slurl.xml | 2 + .../minimal/xui/en/menu_teleport_history_gear.xml | 2 + .../minimal/xui/en/menu_teleport_history_item.xml | 2 + .../minimal/xui/en/menu_teleport_history_tab.xml | 2 + .../skins/minimal/xui/en/menu_text_editor.xml | 2 + .../skins/minimal/xui/en/menu_topinfobar.xml | 2 + .../skins/minimal/xui/en/menu_url_agent.xml | 2 + .../skins/minimal/xui/en/menu_url_group.xml | 2 + .../newview/skins/minimal/xui/en/menu_url_http.xml | 2 + .../skins/minimal/xui/en/menu_url_inventory.xml | 2 + .../newview/skins/minimal/xui/en/menu_url_map.xml | 2 + .../skins/minimal/xui/en/menu_url_objectim.xml | 2 + .../skins/minimal/xui/en/menu_url_parcel.xml | 2 + .../skins/minimal/xui/en/menu_url_slapp.xml | 2 + .../skins/minimal/xui/en/menu_url_slurl.xml | 2 + .../skins/minimal/xui/en/menu_url_teleport.xml | 2 + indra/newview/skins/minimal/xui/en/menu_viewer.xml | 71 +++ .../minimal/xui/en/menu_wearable_list_item.xml | 2 + .../skins/minimal/xui/en/menu_wearing_gear.xml | 2 + .../skins/minimal/xui/en/menu_wearing_tab.xml | 2 + .../minimal/xui/en/notification_visibility.xml | 29 ++ .../newview/skins/minimal/xui/en/notifications.xml | 44 ++ .../minimal/xui/en/panel_adhoc_control_panel.xml | 46 ++ .../skins/minimal/xui/en/panel_bottomtray.xml | 483 ++++++++++++++++++ .../minimal/xui/en/panel_group_control_panel.xml | 79 +++ .../minimal/xui/en/panel_im_control_panel.xml | 91 ++++ indra/newview/skins/minimal/xui/en/panel_login.xml | 205 ++++++++ .../skins/minimal/xui/en/panel_navigation_bar.xml | 76 +++ .../newview/skins/minimal/xui/en/panel_people.xml | 550 +++++++++++++++++++++ .../minimal/xui/en/panel_side_tray_tab_caption.xml | 11 + .../skins/minimal/xui/en/panel_status_bar.xml | 62 +++ .../skins/minimal/xui/en/panel_volume_pulldown.xml | 34 ++ .../minimal/xui/en/widgets/location_input.xml | 131 +++++ .../skins/minimal/xui/es/floater_camera.xml | 65 +++ .../skins/minimal/xui/es/floater_help_browser.xml | 9 + .../skins/minimal/xui/es/floater_media_browser.xml | 30 ++ .../skins/minimal/xui/es/floater_nearby_chat.xml | 4 + .../skins/minimal/xui/es/floater_web_content.xml | 14 + .../skins/minimal/xui/es/inspect_avatar.xml | 24 + .../skins/minimal/xui/es/inspect_object.xml | 41 ++ .../minimal/xui/es/menu_add_wearable_gear.xml | 6 + .../skins/minimal/xui/es/menu_attachment_other.xml | 17 + .../skins/minimal/xui/es/menu_attachment_self.xml | 16 + .../skins/minimal/xui/es/menu_avatar_icon.xml | 7 + .../skins/minimal/xui/es/menu_avatar_other.xml | 16 + .../skins/minimal/xui/es/menu_avatar_self.xml | 31 ++ .../skins/minimal/xui/es/menu_bottomtray.xml | 17 + .../skins/minimal/xui/es/menu_cof_attachment.xml | 4 + .../skins/minimal/xui/es/menu_cof_body_part.xml | 5 + .../skins/minimal/xui/es/menu_cof_clothing.xml | 6 + .../newview/skins/minimal/xui/es/menu_cof_gear.xml | 5 + indra/newview/skins/minimal/xui/es/menu_edit.xml | 12 + .../skins/minimal/xui/es/menu_favorites.xml | 10 + .../skins/minimal/xui/es/menu_gesture_gear.xml | 10 + .../skins/minimal/xui/es/menu_group_plus.xml | 5 + .../skins/minimal/xui/es/menu_hide_navbar.xml | 6 + .../skins/minimal/xui/es/menu_im_well_button.xml | 4 + .../skins/minimal/xui/es/menu_imchiclet_adhoc.xml | 4 + .../skins/minimal/xui/es/menu_imchiclet_group.xml | 6 + .../skins/minimal/xui/es/menu_imchiclet_p2p.xml | 7 + .../minimal/xui/es/menu_inspect_avatar_gear.xml | 17 + .../minimal/xui/es/menu_inspect_object_gear.xml | 18 + .../minimal/xui/es/menu_inspect_self_gear.xml | 8 + .../minimal/xui/es/menu_inv_offer_chiclet.xml | 4 + .../skins/minimal/xui/es/menu_inventory.xml | 86 ++++ .../skins/minimal/xui/es/menu_inventory_add.xml | 33 ++ .../minimal/xui/es/menu_inventory_gear_default.xml | 16 + indra/newview/skins/minimal/xui/es/menu_land.xml | 9 + .../newview/skins/minimal/xui/es/menu_landmark.xml | 7 + indra/newview/skins/minimal/xui/es/menu_login.xml | 24 + .../newview/skins/minimal/xui/es/menu_mini_map.xml | 11 + indra/newview/skins/minimal/xui/es/menu_navbar.xml | 11 + .../skins/minimal/xui/es/menu_nearby_chat.xml | 9 + .../xui/es/menu_notification_well_button.xml | 4 + indra/newview/skins/minimal/xui/es/menu_object.xml | 29 ++ .../skins/minimal/xui/es/menu_object_icon.xml | 5 + .../skins/minimal/xui/es/menu_outfit_gear.xml | 27 + .../skins/minimal/xui/es/menu_outfit_tab.xml | 9 + .../skins/minimal/xui/es/menu_participant_list.xml | 21 + .../xui/es/menu_people_friends_view_sort.xml | 8 + .../skins/minimal/xui/es/menu_people_groups.xml | 8 + .../xui/es/menu_people_groups_view_sort.xml | 5 + .../skins/minimal/xui/es/menu_people_nearby.xml | 13 + .../xui/es/menu_people_nearby_multiselect.xml | 10 + .../xui/es/menu_people_nearby_view_sort.xml | 8 + .../xui/es/menu_people_recent_view_sort.xml | 7 + indra/newview/skins/minimal/xui/es/menu_picks.xml | 8 + .../skins/minimal/xui/es/menu_picks_plus.xml | 5 + indra/newview/skins/minimal/xui/es/menu_place.xml | 7 + .../skins/minimal/xui/es/menu_place_add_button.xml | 5 + .../minimal/xui/es/menu_places_gear_folder.xml | 15 + .../minimal/xui/es/menu_places_gear_landmark.xml | 18 + .../skins/minimal/xui/es/menu_profile_overflow.xml | 12 + .../skins/minimal/xui/es/menu_save_outfit.xml | 5 + .../skins/minimal/xui/es/menu_script_chiclet.xml | 4 + indra/newview/skins/minimal/xui/es/menu_slurl.xml | 6 + .../minimal/xui/es/menu_teleport_history_gear.xml | 6 + .../minimal/xui/es/menu_teleport_history_item.xml | 6 + .../minimal/xui/es/menu_teleport_history_tab.xml | 5 + .../skins/minimal/xui/es/menu_text_editor.xml | 8 + .../skins/minimal/xui/es/menu_topinfobar.xml | 7 + .../skins/minimal/xui/es/menu_url_agent.xml | 6 + .../skins/minimal/xui/es/menu_url_group.xml | 6 + .../newview/skins/minimal/xui/es/menu_url_http.xml | 7 + .../skins/minimal/xui/es/menu_url_inventory.xml | 6 + .../newview/skins/minimal/xui/es/menu_url_map.xml | 6 + .../skins/minimal/xui/es/menu_url_objectim.xml | 8 + .../skins/minimal/xui/es/menu_url_parcel.xml | 6 + .../skins/minimal/xui/es/menu_url_slapp.xml | 5 + .../skins/minimal/xui/es/menu_url_slurl.xml | 7 + .../skins/minimal/xui/es/menu_url_teleport.xml | 6 + indra/newview/skins/minimal/xui/es/menu_viewer.xml | 14 + .../minimal/xui/es/menu_wearable_list_item.xml | 14 + .../skins/minimal/xui/es/menu_wearing_gear.xml | 5 + .../skins/minimal/xui/es/menu_wearing_tab.xml | 6 + .../newview/skins/minimal/xui/es/notifications.xml | 19 + .../skins/minimal/xui/es/panel_bottomtray.xml | 39 ++ .../minimal/xui/es/panel_group_control_panel.xml | 11 + .../minimal/xui/es/panel_im_control_panel.xml | 29 ++ indra/newview/skins/minimal/xui/es/panel_login.xml | 40 ++ .../skins/minimal/xui/es/panel_navigation_bar.xml | 18 + .../newview/skins/minimal/xui/es/panel_people.xml | 71 +++ .../minimal/xui/es/panel_side_tray_tab_caption.xml | 7 + .../skins/minimal/xui/es/panel_status_bar.xml | 33 ++ .../skins/minimal/xui/fr/floater_camera.xml | 65 +++ .../skins/minimal/xui/fr/floater_help_browser.xml | 9 + .../skins/minimal/xui/fr/floater_media_browser.xml | 30 ++ .../skins/minimal/xui/fr/floater_nearby_chat.xml | 4 + .../skins/minimal/xui/fr/floater_web_content.xml | 14 + .../skins/minimal/xui/fr/inspect_avatar.xml | 25 + .../skins/minimal/xui/fr/inspect_object.xml | 48 ++ .../minimal/xui/fr/menu_add_wearable_gear.xml | 6 + .../skins/minimal/xui/fr/menu_attachment_other.xml | 17 + .../skins/minimal/xui/fr/menu_attachment_self.xml | 16 + .../skins/minimal/xui/fr/menu_avatar_icon.xml | 7 + .../skins/minimal/xui/fr/menu_avatar_other.xml | 16 + .../skins/minimal/xui/fr/menu_avatar_self.xml | 31 ++ .../skins/minimal/xui/fr/menu_bottomtray.xml | 17 + .../skins/minimal/xui/fr/menu_cof_attachment.xml | 4 + .../skins/minimal/xui/fr/menu_cof_body_part.xml | 5 + .../skins/minimal/xui/fr/menu_cof_clothing.xml | 6 + .../newview/skins/minimal/xui/fr/menu_cof_gear.xml | 5 + indra/newview/skins/minimal/xui/fr/menu_edit.xml | 12 + .../skins/minimal/xui/fr/menu_favorites.xml | 10 + .../skins/minimal/xui/fr/menu_gesture_gear.xml | 10 + .../skins/minimal/xui/fr/menu_group_plus.xml | 5 + .../skins/minimal/xui/fr/menu_hide_navbar.xml | 6 + .../skins/minimal/xui/fr/menu_im_well_button.xml | 4 + .../skins/minimal/xui/fr/menu_imchiclet_adhoc.xml | 4 + .../skins/minimal/xui/fr/menu_imchiclet_group.xml | 6 + .../skins/minimal/xui/fr/menu_imchiclet_p2p.xml | 7 + .../minimal/xui/fr/menu_inspect_avatar_gear.xml | 17 + .../minimal/xui/fr/menu_inspect_object_gear.xml | 18 + .../minimal/xui/fr/menu_inspect_self_gear.xml | 8 + .../minimal/xui/fr/menu_inv_offer_chiclet.xml | 4 + .../skins/minimal/xui/fr/menu_inventory.xml | 86 ++++ .../skins/minimal/xui/fr/menu_inventory_add.xml | 33 ++ .../minimal/xui/fr/menu_inventory_gear_default.xml | 16 + indra/newview/skins/minimal/xui/fr/menu_land.xml | 9 + .../newview/skins/minimal/xui/fr/menu_landmark.xml | 7 + indra/newview/skins/minimal/xui/fr/menu_login.xml | 25 + .../newview/skins/minimal/xui/fr/menu_mini_map.xml | 11 + indra/newview/skins/minimal/xui/fr/menu_navbar.xml | 11 + .../skins/minimal/xui/fr/menu_nearby_chat.xml | 9 + .../xui/fr/menu_notification_well_button.xml | 4 + indra/newview/skins/minimal/xui/fr/menu_object.xml | 29 ++ .../skins/minimal/xui/fr/menu_object_icon.xml | 5 + .../skins/minimal/xui/fr/menu_outfit_gear.xml | 27 + .../skins/minimal/xui/fr/menu_outfit_tab.xml | 9 + .../skins/minimal/xui/fr/menu_participant_list.xml | 21 + .../xui/fr/menu_people_friends_view_sort.xml | 8 + .../skins/minimal/xui/fr/menu_people_groups.xml | 8 + .../xui/fr/menu_people_groups_view_sort.xml | 5 + .../skins/minimal/xui/fr/menu_people_nearby.xml | 13 + .../xui/fr/menu_people_nearby_multiselect.xml | 10 + .../xui/fr/menu_people_nearby_view_sort.xml | 8 + .../xui/fr/menu_people_recent_view_sort.xml | 7 + indra/newview/skins/minimal/xui/fr/menu_picks.xml | 8 + .../skins/minimal/xui/fr/menu_picks_plus.xml | 5 + indra/newview/skins/minimal/xui/fr/menu_place.xml | 7 + .../skins/minimal/xui/fr/menu_place_add_button.xml | 5 + .../minimal/xui/fr/menu_places_gear_folder.xml | 15 + .../minimal/xui/fr/menu_places_gear_landmark.xml | 18 + .../skins/minimal/xui/fr/menu_profile_overflow.xml | 12 + .../skins/minimal/xui/fr/menu_save_outfit.xml | 5 + .../skins/minimal/xui/fr/menu_script_chiclet.xml | 4 + indra/newview/skins/minimal/xui/fr/menu_slurl.xml | 6 + .../minimal/xui/fr/menu_teleport_history_gear.xml | 6 + .../minimal/xui/fr/menu_teleport_history_item.xml | 6 + .../minimal/xui/fr/menu_teleport_history_tab.xml | 5 + .../skins/minimal/xui/fr/menu_text_editor.xml | 8 + .../skins/minimal/xui/fr/menu_topinfobar.xml | 7 + .../skins/minimal/xui/fr/menu_url_agent.xml | 6 + .../skins/minimal/xui/fr/menu_url_group.xml | 6 + .../newview/skins/minimal/xui/fr/menu_url_http.xml | 7 + .../skins/minimal/xui/fr/menu_url_inventory.xml | 6 + .../newview/skins/minimal/xui/fr/menu_url_map.xml | 6 + .../skins/minimal/xui/fr/menu_url_objectim.xml | 8 + .../skins/minimal/xui/fr/menu_url_parcel.xml | 6 + .../skins/minimal/xui/fr/menu_url_slapp.xml | 5 + .../skins/minimal/xui/fr/menu_url_slurl.xml | 7 + .../skins/minimal/xui/fr/menu_url_teleport.xml | 6 + indra/newview/skins/minimal/xui/fr/menu_viewer.xml | 14 + .../minimal/xui/fr/menu_wearable_list_item.xml | 14 + .../skins/minimal/xui/fr/menu_wearing_gear.xml | 5 + .../skins/minimal/xui/fr/menu_wearing_tab.xml | 6 + .../newview/skins/minimal/xui/fr/notifications.xml | 19 + .../skins/minimal/xui/fr/panel_bottomtray.xml | 39 ++ .../minimal/xui/fr/panel_group_control_panel.xml | 11 + .../minimal/xui/fr/panel_im_control_panel.xml | 30 ++ indra/newview/skins/minimal/xui/fr/panel_login.xml | 40 ++ .../skins/minimal/xui/fr/panel_navigation_bar.xml | 18 + .../newview/skins/minimal/xui/fr/panel_people.xml | 71 +++ .../minimal/xui/fr/panel_side_tray_tab_caption.xml | 7 + .../skins/minimal/xui/fr/panel_status_bar.xml | 33 ++ .../skins/minimal/xui/pt/floater_camera.xml | 65 +++ .../skins/minimal/xui/pt/floater_help_browser.xml | 9 + .../skins/minimal/xui/pt/floater_media_browser.xml | 30 ++ .../skins/minimal/xui/pt/floater_nearby_chat.xml | 4 + .../skins/minimal/xui/pt/floater_web_content.xml | 14 + .../skins/minimal/xui/pt/inspect_avatar.xml | 24 + .../skins/minimal/xui/pt/inspect_object.xml | 41 ++ .../minimal/xui/pt/menu_add_wearable_gear.xml | 6 + .../skins/minimal/xui/pt/menu_attachment_other.xml | 17 + .../skins/minimal/xui/pt/menu_attachment_self.xml | 16 + .../skins/minimal/xui/pt/menu_avatar_icon.xml | 7 + .../skins/minimal/xui/pt/menu_avatar_other.xml | 16 + .../skins/minimal/xui/pt/menu_avatar_self.xml | 31 ++ .../skins/minimal/xui/pt/menu_bottomtray.xml | 17 + .../skins/minimal/xui/pt/menu_cof_attachment.xml | 4 + .../skins/minimal/xui/pt/menu_cof_body_part.xml | 5 + .../skins/minimal/xui/pt/menu_cof_clothing.xml | 6 + .../newview/skins/minimal/xui/pt/menu_cof_gear.xml | 5 + indra/newview/skins/minimal/xui/pt/menu_edit.xml | 12 + .../skins/minimal/xui/pt/menu_favorites.xml | 10 + .../skins/minimal/xui/pt/menu_gesture_gear.xml | 10 + .../skins/minimal/xui/pt/menu_group_plus.xml | 5 + .../skins/minimal/xui/pt/menu_hide_navbar.xml | 6 + .../skins/minimal/xui/pt/menu_im_well_button.xml | 4 + .../skins/minimal/xui/pt/menu_imchiclet_adhoc.xml | 4 + .../skins/minimal/xui/pt/menu_imchiclet_group.xml | 6 + .../skins/minimal/xui/pt/menu_imchiclet_p2p.xml | 7 + .../minimal/xui/pt/menu_inspect_avatar_gear.xml | 17 + .../minimal/xui/pt/menu_inspect_object_gear.xml | 18 + .../minimal/xui/pt/menu_inspect_self_gear.xml | 8 + .../minimal/xui/pt/menu_inv_offer_chiclet.xml | 4 + .../skins/minimal/xui/pt/menu_inventory.xml | 86 ++++ .../skins/minimal/xui/pt/menu_inventory_add.xml | 33 ++ .../minimal/xui/pt/menu_inventory_gear_default.xml | 16 + indra/newview/skins/minimal/xui/pt/menu_land.xml | 9 + .../newview/skins/minimal/xui/pt/menu_landmark.xml | 7 + indra/newview/skins/minimal/xui/pt/menu_login.xml | 24 + .../newview/skins/minimal/xui/pt/menu_mini_map.xml | 11 + indra/newview/skins/minimal/xui/pt/menu_navbar.xml | 11 + .../skins/minimal/xui/pt/menu_nearby_chat.xml | 9 + .../xui/pt/menu_notification_well_button.xml | 4 + indra/newview/skins/minimal/xui/pt/menu_object.xml | 29 ++ .../skins/minimal/xui/pt/menu_object_icon.xml | 5 + .../skins/minimal/xui/pt/menu_outfit_gear.xml | 27 + .../skins/minimal/xui/pt/menu_outfit_tab.xml | 9 + .../skins/minimal/xui/pt/menu_participant_list.xml | 21 + .../xui/pt/menu_people_friends_view_sort.xml | 8 + .../skins/minimal/xui/pt/menu_people_groups.xml | 8 + .../xui/pt/menu_people_groups_view_sort.xml | 5 + .../skins/minimal/xui/pt/menu_people_nearby.xml | 13 + .../xui/pt/menu_people_nearby_multiselect.xml | 10 + .../xui/pt/menu_people_nearby_view_sort.xml | 8 + .../xui/pt/menu_people_recent_view_sort.xml | 7 + indra/newview/skins/minimal/xui/pt/menu_picks.xml | 8 + .../skins/minimal/xui/pt/menu_picks_plus.xml | 5 + indra/newview/skins/minimal/xui/pt/menu_place.xml | 7 + .../skins/minimal/xui/pt/menu_place_add_button.xml | 5 + .../minimal/xui/pt/menu_places_gear_folder.xml | 15 + .../minimal/xui/pt/menu_places_gear_landmark.xml | 18 + .../skins/minimal/xui/pt/menu_profile_overflow.xml | 12 + .../skins/minimal/xui/pt/menu_save_outfit.xml | 5 + .../skins/minimal/xui/pt/menu_script_chiclet.xml | 4 + indra/newview/skins/minimal/xui/pt/menu_slurl.xml | 6 + .../minimal/xui/pt/menu_teleport_history_gear.xml | 6 + .../minimal/xui/pt/menu_teleport_history_item.xml | 6 + .../minimal/xui/pt/menu_teleport_history_tab.xml | 5 + .../skins/minimal/xui/pt/menu_text_editor.xml | 8 + .../skins/minimal/xui/pt/menu_topinfobar.xml | 7 + .../skins/minimal/xui/pt/menu_url_agent.xml | 6 + .../skins/minimal/xui/pt/menu_url_group.xml | 6 + .../newview/skins/minimal/xui/pt/menu_url_http.xml | 7 + .../skins/minimal/xui/pt/menu_url_inventory.xml | 6 + .../newview/skins/minimal/xui/pt/menu_url_map.xml | 6 + .../skins/minimal/xui/pt/menu_url_objectim.xml | 8 + .../skins/minimal/xui/pt/menu_url_parcel.xml | 6 + .../skins/minimal/xui/pt/menu_url_slapp.xml | 5 + .../skins/minimal/xui/pt/menu_url_slurl.xml | 7 + .../skins/minimal/xui/pt/menu_url_teleport.xml | 6 + indra/newview/skins/minimal/xui/pt/menu_viewer.xml | 14 + .../minimal/xui/pt/menu_wearable_list_item.xml | 14 + .../skins/minimal/xui/pt/menu_wearing_gear.xml | 5 + .../skins/minimal/xui/pt/menu_wearing_tab.xml | 6 + .../newview/skins/minimal/xui/pt/notifications.xml | 19 + .../minimal/xui/pt/panel_adhoc_control_panel.xml | 14 + .../skins/minimal/xui/pt/panel_bottomtray.xml | 39 ++ .../minimal/xui/pt/panel_group_control_panel.xml | 11 + .../minimal/xui/pt/panel_im_control_panel.xml | 29 ++ indra/newview/skins/minimal/xui/pt/panel_login.xml | 40 ++ .../skins/minimal/xui/pt/panel_navigation_bar.xml | 18 + .../newview/skins/minimal/xui/pt/panel_people.xml | 71 +++ .../minimal/xui/pt/panel_side_tray_tab_caption.xml | 7 + .../skins/minimal/xui/pt/panel_status_bar.xml | 33 ++ 465 files changed, 9396 insertions(+) create mode 100644 indra/newview/skins/default/xui/en/menu_media_ctrl.xml create mode 100644 indra/newview/skins/default/xui/en/panel_edit_physics.xml create mode 100644 indra/newview/skins/default/xui/en/panel_scrolling_param_base.xml create mode 100644 indra/newview/skins/minimal/xui/de/floater_camera.xml create mode 100644 indra/newview/skins/minimal/xui/de/floater_help_browser.xml create mode 100644 indra/newview/skins/minimal/xui/de/floater_media_browser.xml create mode 100644 indra/newview/skins/minimal/xui/de/floater_nearby_chat.xml create mode 100644 indra/newview/skins/minimal/xui/de/floater_web_content.xml create mode 100644 indra/newview/skins/minimal/xui/de/inspect_avatar.xml create mode 100644 indra/newview/skins/minimal/xui/de/inspect_object.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_add_wearable_gear.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_attachment_other.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_attachment_self.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_avatar_icon.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_avatar_other.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_avatar_self.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_bottomtray.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_cof_attachment.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_cof_body_part.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_cof_clothing.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_cof_gear.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_edit.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_favorites.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_gesture_gear.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_group_plus.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_hide_navbar.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_im_well_button.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_imchiclet_adhoc.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_imchiclet_group.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_imchiclet_p2p.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_inspect_avatar_gear.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_inspect_object_gear.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_inspect_self_gear.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_inv_offer_chiclet.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_inventory.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_inventory_add.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_inventory_gear_default.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_land.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_landmark.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_login.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_mini_map.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_navbar.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_nearby_chat.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_notification_well_button.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_object.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_object_icon.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_outfit_gear.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_outfit_tab.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_participant_list.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_people_friends_view_sort.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_people_groups.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_people_groups_view_sort.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_people_nearby.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_people_nearby_multiselect.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_people_nearby_view_sort.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_people_recent_view_sort.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_picks.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_picks_plus.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_place.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_place_add_button.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_places_gear_folder.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_places_gear_landmark.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_profile_overflow.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_save_outfit.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_script_chiclet.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_slurl.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_teleport_history_gear.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_teleport_history_item.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_teleport_history_tab.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_text_editor.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_topinfobar.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_url_agent.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_url_group.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_url_http.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_url_inventory.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_url_map.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_url_objectim.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_url_parcel.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_url_slapp.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_url_slurl.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_url_teleport.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_viewer.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_wearable_list_item.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_wearing_gear.xml create mode 100644 indra/newview/skins/minimal/xui/de/menu_wearing_tab.xml create mode 100644 indra/newview/skins/minimal/xui/de/notifications.xml create mode 100644 indra/newview/skins/minimal/xui/de/panel_bottomtray.xml create mode 100644 indra/newview/skins/minimal/xui/de/panel_group_control_panel.xml create mode 100644 indra/newview/skins/minimal/xui/de/panel_im_control_panel.xml create mode 100644 indra/newview/skins/minimal/xui/de/panel_login.xml create mode 100644 indra/newview/skins/minimal/xui/de/panel_navigation_bar.xml create mode 100644 indra/newview/skins/minimal/xui/de/panel_people.xml create mode 100644 indra/newview/skins/minimal/xui/de/panel_side_tray_tab_caption.xml create mode 100644 indra/newview/skins/minimal/xui/de/panel_status_bar.xml create mode 100644 indra/newview/skins/minimal/xui/en/floater_camera.xml create mode 100644 indra/newview/skins/minimal/xui/en/floater_help_browser.xml create mode 100644 indra/newview/skins/minimal/xui/en/floater_media_browser.xml create mode 100644 indra/newview/skins/minimal/xui/en/floater_nearby_chat.xml create mode 100644 indra/newview/skins/minimal/xui/en/floater_side_bar_tab.xml create mode 100644 indra/newview/skins/minimal/xui/en/floater_web_content.xml create mode 100644 indra/newview/skins/minimal/xui/en/inspect_avatar.xml create mode 100644 indra/newview/skins/minimal/xui/en/inspect_object.xml create mode 100644 indra/newview/skins/minimal/xui/en/main_view.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_add_wearable_gear.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_attachment_other.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_attachment_self.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_avatar_icon.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_avatar_other.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_avatar_self.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_bottomtray.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_cof_attachment.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_cof_body_part.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_cof_clothing.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_cof_gear.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_edit.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_favorites.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_gesture_gear.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_group_plus.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_hide_navbar.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_im_well_button.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_imchiclet_adhoc.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_imchiclet_group.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_imchiclet_p2p.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_inspect_avatar_gear.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_inspect_object_gear.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_inspect_self_gear.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_inv_offer_chiclet.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_inventory.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_inventory_add.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_inventory_gear_default.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_land.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_landmark.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_login.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_mini_map.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_navbar.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_nearby_chat.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_notification_well_button.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_object.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_object_icon.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_outfit_gear.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_outfit_tab.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_participant_list.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_people_friends_view_sort.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_people_groups.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_people_groups_view_sort.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_people_nearby.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_people_nearby_multiselect.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_people_nearby_view_sort.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_people_recent_view_sort.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_picks.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_picks_plus.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_place.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_place_add_button.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_places_gear_folder.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_places_gear_landmark.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_profile_overflow.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_save_outfit.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_script_chiclet.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_slurl.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_teleport_history_gear.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_teleport_history_item.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_teleport_history_tab.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_text_editor.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_topinfobar.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_url_agent.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_url_group.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_url_http.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_url_inventory.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_url_map.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_url_objectim.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_url_parcel.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_url_slapp.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_url_slurl.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_url_teleport.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_viewer.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_wearable_list_item.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_wearing_gear.xml create mode 100644 indra/newview/skins/minimal/xui/en/menu_wearing_tab.xml create mode 100644 indra/newview/skins/minimal/xui/en/notification_visibility.xml create mode 100644 indra/newview/skins/minimal/xui/en/notifications.xml create mode 100644 indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml create mode 100644 indra/newview/skins/minimal/xui/en/panel_bottomtray.xml create mode 100644 indra/newview/skins/minimal/xui/en/panel_group_control_panel.xml create mode 100644 indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml create mode 100644 indra/newview/skins/minimal/xui/en/panel_login.xml create mode 100644 indra/newview/skins/minimal/xui/en/panel_navigation_bar.xml create mode 100644 indra/newview/skins/minimal/xui/en/panel_people.xml create mode 100644 indra/newview/skins/minimal/xui/en/panel_side_tray_tab_caption.xml create mode 100644 indra/newview/skins/minimal/xui/en/panel_status_bar.xml create mode 100644 indra/newview/skins/minimal/xui/en/panel_volume_pulldown.xml create mode 100644 indra/newview/skins/minimal/xui/en/widgets/location_input.xml create mode 100644 indra/newview/skins/minimal/xui/es/floater_camera.xml create mode 100644 indra/newview/skins/minimal/xui/es/floater_help_browser.xml create mode 100644 indra/newview/skins/minimal/xui/es/floater_media_browser.xml create mode 100644 indra/newview/skins/minimal/xui/es/floater_nearby_chat.xml create mode 100644 indra/newview/skins/minimal/xui/es/floater_web_content.xml create mode 100644 indra/newview/skins/minimal/xui/es/inspect_avatar.xml create mode 100644 indra/newview/skins/minimal/xui/es/inspect_object.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_add_wearable_gear.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_attachment_other.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_attachment_self.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_avatar_icon.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_avatar_other.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_avatar_self.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_bottomtray.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_cof_attachment.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_cof_body_part.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_cof_clothing.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_cof_gear.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_edit.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_favorites.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_gesture_gear.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_group_plus.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_hide_navbar.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_im_well_button.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_imchiclet_adhoc.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_imchiclet_group.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_imchiclet_p2p.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_inspect_avatar_gear.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_inspect_object_gear.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_inspect_self_gear.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_inv_offer_chiclet.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_inventory.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_inventory_add.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_inventory_gear_default.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_land.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_landmark.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_login.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_mini_map.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_navbar.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_nearby_chat.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_notification_well_button.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_object.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_object_icon.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_outfit_gear.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_outfit_tab.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_participant_list.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_people_friends_view_sort.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_people_groups.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_people_groups_view_sort.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_people_nearby.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_people_nearby_multiselect.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_people_nearby_view_sort.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_people_recent_view_sort.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_picks.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_picks_plus.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_place.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_place_add_button.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_places_gear_folder.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_places_gear_landmark.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_profile_overflow.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_save_outfit.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_script_chiclet.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_slurl.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_teleport_history_gear.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_teleport_history_tab.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_text_editor.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_topinfobar.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_url_agent.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_url_group.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_url_http.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_url_inventory.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_url_map.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_url_objectim.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_url_parcel.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_url_slapp.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_url_slurl.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_url_teleport.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_viewer.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_wearable_list_item.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_wearing_gear.xml create mode 100644 indra/newview/skins/minimal/xui/es/menu_wearing_tab.xml create mode 100644 indra/newview/skins/minimal/xui/es/notifications.xml create mode 100644 indra/newview/skins/minimal/xui/es/panel_bottomtray.xml create mode 100644 indra/newview/skins/minimal/xui/es/panel_group_control_panel.xml create mode 100644 indra/newview/skins/minimal/xui/es/panel_im_control_panel.xml create mode 100644 indra/newview/skins/minimal/xui/es/panel_login.xml create mode 100644 indra/newview/skins/minimal/xui/es/panel_navigation_bar.xml create mode 100644 indra/newview/skins/minimal/xui/es/panel_people.xml create mode 100644 indra/newview/skins/minimal/xui/es/panel_side_tray_tab_caption.xml create mode 100644 indra/newview/skins/minimal/xui/es/panel_status_bar.xml create mode 100644 indra/newview/skins/minimal/xui/fr/floater_camera.xml create mode 100644 indra/newview/skins/minimal/xui/fr/floater_help_browser.xml create mode 100644 indra/newview/skins/minimal/xui/fr/floater_media_browser.xml create mode 100644 indra/newview/skins/minimal/xui/fr/floater_nearby_chat.xml create mode 100644 indra/newview/skins/minimal/xui/fr/floater_web_content.xml create mode 100644 indra/newview/skins/minimal/xui/fr/inspect_avatar.xml create mode 100644 indra/newview/skins/minimal/xui/fr/inspect_object.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_add_wearable_gear.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_attachment_other.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_attachment_self.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_avatar_icon.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_avatar_other.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_avatar_self.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_bottomtray.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_cof_attachment.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_cof_body_part.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_cof_clothing.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_cof_gear.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_edit.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_favorites.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_gesture_gear.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_group_plus.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_hide_navbar.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_im_well_button.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_imchiclet_adhoc.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_imchiclet_group.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_imchiclet_p2p.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_inspect_avatar_gear.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_inspect_object_gear.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_inspect_self_gear.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_inv_offer_chiclet.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_inventory.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_inventory_add.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_inventory_gear_default.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_land.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_landmark.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_login.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_mini_map.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_navbar.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_nearby_chat.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_notification_well_button.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_object.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_object_icon.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_outfit_gear.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_outfit_tab.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_participant_list.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_people_friends_view_sort.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_people_groups.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_people_groups_view_sort.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_people_nearby.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_people_nearby_multiselect.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_people_nearby_view_sort.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_people_recent_view_sort.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_picks.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_picks_plus.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_place.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_place_add_button.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_places_gear_folder.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_places_gear_landmark.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_profile_overflow.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_save_outfit.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_script_chiclet.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_slurl.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_teleport_history_gear.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_teleport_history_item.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_teleport_history_tab.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_text_editor.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_topinfobar.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_url_agent.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_url_group.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_url_http.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_url_inventory.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_url_map.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_url_objectim.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_url_parcel.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_url_slapp.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_url_slurl.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_url_teleport.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_viewer.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_wearable_list_item.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_wearing_gear.xml create mode 100644 indra/newview/skins/minimal/xui/fr/menu_wearing_tab.xml create mode 100644 indra/newview/skins/minimal/xui/fr/notifications.xml create mode 100644 indra/newview/skins/minimal/xui/fr/panel_bottomtray.xml create mode 100644 indra/newview/skins/minimal/xui/fr/panel_group_control_panel.xml create mode 100644 indra/newview/skins/minimal/xui/fr/panel_im_control_panel.xml create mode 100644 indra/newview/skins/minimal/xui/fr/panel_login.xml create mode 100644 indra/newview/skins/minimal/xui/fr/panel_navigation_bar.xml create mode 100644 indra/newview/skins/minimal/xui/fr/panel_people.xml create mode 100644 indra/newview/skins/minimal/xui/fr/panel_side_tray_tab_caption.xml create mode 100644 indra/newview/skins/minimal/xui/fr/panel_status_bar.xml create mode 100644 indra/newview/skins/minimal/xui/pt/floater_camera.xml create mode 100644 indra/newview/skins/minimal/xui/pt/floater_help_browser.xml create mode 100644 indra/newview/skins/minimal/xui/pt/floater_media_browser.xml create mode 100644 indra/newview/skins/minimal/xui/pt/floater_nearby_chat.xml create mode 100644 indra/newview/skins/minimal/xui/pt/floater_web_content.xml create mode 100644 indra/newview/skins/minimal/xui/pt/inspect_avatar.xml create mode 100644 indra/newview/skins/minimal/xui/pt/inspect_object.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_add_wearable_gear.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_attachment_other.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_attachment_self.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_avatar_icon.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_avatar_other.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_avatar_self.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_bottomtray.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_cof_attachment.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_cof_body_part.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_cof_clothing.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_cof_gear.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_edit.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_favorites.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_gesture_gear.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_group_plus.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_hide_navbar.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_im_well_button.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_imchiclet_adhoc.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_imchiclet_group.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_imchiclet_p2p.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_inspect_avatar_gear.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_inspect_object_gear.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_inspect_self_gear.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_inv_offer_chiclet.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_inventory.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_inventory_add.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_inventory_gear_default.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_land.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_landmark.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_login.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_mini_map.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_navbar.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_nearby_chat.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_notification_well_button.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_object.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_object_icon.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_outfit_gear.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_outfit_tab.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_participant_list.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_people_friends_view_sort.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_people_groups.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_people_groups_view_sort.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_people_nearby.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_people_nearby_multiselect.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_people_nearby_view_sort.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_people_recent_view_sort.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_picks.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_picks_plus.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_place.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_place_add_button.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_places_gear_folder.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_places_gear_landmark.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_profile_overflow.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_save_outfit.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_script_chiclet.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_slurl.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_teleport_history_gear.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_teleport_history_item.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_teleport_history_tab.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_text_editor.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_topinfobar.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_url_agent.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_url_group.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_url_http.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_url_inventory.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_url_map.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_url_objectim.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_url_parcel.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_url_slapp.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_url_slurl.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_url_teleport.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_viewer.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_wearable_list_item.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_wearing_gear.xml create mode 100644 indra/newview/skins/minimal/xui/pt/menu_wearing_tab.xml create mode 100644 indra/newview/skins/minimal/xui/pt/notifications.xml create mode 100644 indra/newview/skins/minimal/xui/pt/panel_adhoc_control_panel.xml create mode 100644 indra/newview/skins/minimal/xui/pt/panel_bottomtray.xml create mode 100644 indra/newview/skins/minimal/xui/pt/panel_group_control_panel.xml create mode 100644 indra/newview/skins/minimal/xui/pt/panel_im_control_panel.xml create mode 100644 indra/newview/skins/minimal/xui/pt/panel_login.xml create mode 100644 indra/newview/skins/minimal/xui/pt/panel_navigation_bar.xml create mode 100644 indra/newview/skins/minimal/xui/pt/panel_people.xml create mode 100644 indra/newview/skins/minimal/xui/pt/panel_side_tray_tab_caption.xml create mode 100644 indra/newview/skins/minimal/xui/pt/panel_status_bar.xml diff --git a/indra/newview/skins/default/xui/en/menu_media_ctrl.xml b/indra/newview/skins/default/xui/en/menu_media_ctrl.xml new file mode 100644 index 0000000000..c39c26f25f --- /dev/null +++ b/indra/newview/skins/default/xui/en/menu_media_ctrl.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu + name="media ctrl context menu"> + <menu_item_call + label="Cut" + layout="topleft" + name="Cut"> + <menu_item_call.on_click + function="Edit.Cut" /> + <menu_item_call.on_enable + function="Edit.EnableCut" /> + </menu_item_call> + <menu_item_call + label="Copy" + layout="topleft" + name="Copy"> + <menu_item_call.on_click + function="Edit.Copy" /> + <menu_item_call.on_enable + function="Edit.EnableCopy" /> + </menu_item_call> + <menu_item_call + label="Paste" + layout="topleft" + name="Paste"> + <menu_item_call.on_click + function="Edit.Paste" /> + <menu_item_call.on_enable + function="Edit.EnablePaste" /> + </menu_item_call> +</context_menu> diff --git a/indra/newview/skins/default/xui/en/panel_edit_physics.xml b/indra/newview/skins/default/xui/en/panel_edit_physics.xml new file mode 100644 index 0000000000..0092ceb0dd --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_edit_physics.xml @@ -0,0 +1,138 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> + <panel + background_visible="true" + follows="all" + height="400" + layout="topleft" + left="0" + name="edit_physics_panel" + top_pad="10" + width="333" > + <panel + border="false" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true" + follows="all" + height="388" + label="" + layout="topleft" + left="10" + name="accordion_panel" + top_pad="0" + width="313"> + <accordion + follows="all" + height ="388" + layout="topleft" + left="0" + single_expansion="true" + fit_parent="true" + name="physics_accordion" + top="0" + width="313"> + <accordion_tab + layout="topleft" + fit_panel="false" + min_height="50" + name="physics_breasts_updown_tab" + title="Breasts Bounce"> + <scrolling_panel_list + follows="all" + layout="topleft" + left="10" + name="physics_breasts_updown_param_list" + top="10" + width="303" /> + </accordion_tab> + <accordion_tab + layout="topleft" + fit_panel="false" + min_height="50" + name="physics_breasts_inout_tab" + title="Breasts Cleavage"> + <scrolling_panel_list + follows="all" + layout="topleft" + left="0" + name="physics_breasts_inout_param_list" + top_pad="50" + width="303" /> + </accordion_tab> + <accordion_tab + layout="topleft" + fit_panel="false" + min_height="50" + name="physics_breasts_leftright_tab" + title="Breasts Sway"> + <scrolling_panel_list + follows="all" + layout="topleft" + left="0" + name="physics_breasts_leftright_param_list" + top_pad="50" + width="303" /> + </accordion_tab> + <accordion_tab + layout="topleft" + fit_panel="false" + min_height="50" + name="physics_belly_tab" + title="Belly Bounce"> + <scrolling_panel_list + follows="all" + layout="topleft" + left="0" + name="physics_belly_updown_param_list" + top_pad="40" + width="303" /> + </accordion_tab> + + <accordion_tab + layout="topleft" + fit_panel="false" + min_height="50" + name="physics_butt_tab" + title="Butt Bounce"> + <scrolling_panel_list + follows="all" + layout="topleft" + left="0" + name="physics_butt_updown_param_list" + top_pad="30" + width="303" /> + </accordion_tab> + + <accordion_tab + layout="topleft" + fit_panel="false" + min_height="50" + name="physics_butt_leftright_tab" + title="Butt Sway"> + <scrolling_panel_list + follows="all" + layout="topleft" + left="0" + name="physics_butt_leftright_param_list" + top_pad="20" + width="303" /> + </accordion_tab> + <accordion_tab + layout="topleft" + fit_panel="false" + min_height="50" + name="physics_advanced_tab" + title="Advanced Parameters"> + <scrolling_panel_list + follows="all" + layout="topleft" + left="0" + name="physics_advanced_param_list" + top_pad="10" + width="303" /> + </accordion_tab> + </accordion> + </panel> +</panel> + diff --git a/indra/newview/skins/default/xui/en/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/en/panel_scrolling_param_base.xml new file mode 100644 index 0000000000..1351f75623 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_scrolling_param_base.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + layout="topleft" + left="0" + name="LLScrollingPanelParamBase" + height="16" + width="290"> + <slider + can_edit_text="true" + decimal_digits="0" + enabled="false" + height="12" + increment="1" + initial_value="0" + label="[DESC]" + label_width="125" + layout="bottom|left" + left="16" + max_val="100" + name="param slider" + bottom="0" + width="264" + /> +</panel> diff --git a/indra/newview/skins/minimal/xui/de/floater_camera.xml b/indra/newview/skins/minimal/xui/de/floater_camera.xml new file mode 100644 index 0000000000..d49c207f98 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/floater_camera.xml @@ -0,0 +1,65 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="camera_floater"> + <floater.string name="rotate_tooltip"> + Kamera um Fokus drehen + </floater.string> + <floater.string name="zoom_tooltip"> + Kamera auf Fokus zoomen + </floater.string> + <floater.string name="move_tooltip"> + Kamera nach oben, unten, links und rechts bewegen + </floater.string> + <floater.string name="camera_modes_title"> + Kameramodi + </floater.string> + <floater.string name="pan_mode_title"> + Kreisen - Zoomen - Schwenken + </floater.string> + <floater.string name="presets_mode_title"> + Ansichten + </floater.string> + <floater.string name="free_mode_title"> + Objekt ansehen + </floater.string> + <panel name="controls"> + <panel name="preset_views_list"> + <panel_camera_item name="front_view"> + <panel_camera_item.text name="front_view_text"> + Vorderansicht + </panel_camera_item.text> + </panel_camera_item> + <panel_camera_item name="group_view"> + <panel_camera_item.text name="side_view_text"> + Seitenansicht + </panel_camera_item.text> + </panel_camera_item> + <panel_camera_item name="rear_view"> + <panel_camera_item.text name="rear_view_text"> + Hinteransicht + </panel_camera_item.text> + </panel_camera_item> + </panel> + <panel name="camera_modes_list"> + <panel_camera_item name="object_view"> + <panel_camera_item.text name="object_view_text"> + Objektansicht + </panel_camera_item.text> + </panel_camera_item> + <panel_camera_item name="mouselook_view"> + <panel_camera_item.text name="mouselook_view_text"> + Mouselook + </panel_camera_item.text> + </panel_camera_item> + </panel> + <panel name="zoom" tool_tip="Kamera auf Fokus zoomen"> + <joystick_rotate name="cam_rotate_stick" tool_tip="Kamera um Fokus kreisen"/> + <slider_bar name="zoom_slider" tool_tip="Kamera auf Fokus zoomen"/> + <joystick_track name="cam_track_stick" tool_tip="Kamera nach oben, unten, links und rechts bewegen"/> + </panel> + </panel> + <panel name="buttons"> + <button label="" name="presets_btn" tool_tip="Ansichten"/> + <button label="" name="pan_btn" tool_tip="Kreisen - Zoomen - Schwenken"/> + <button label="" name="avatarview_btn" tool_tip="Kameramodi"/> + </panel> +</floater> diff --git a/indra/newview/skins/minimal/xui/de/floater_help_browser.xml b/indra/newview/skins/minimal/xui/de/floater_help_browser.xml new file mode 100644 index 0000000000..459dfb66c0 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/floater_help_browser.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_help_browser" title="ANWEISUNGEN"> + <floater.string name="loading_text"> + Wird geladen... + </floater.string> + <layout_stack name="stack1"> + <layout_panel name="external_controls"/> + </layout_stack> +</floater> diff --git a/indra/newview/skins/minimal/xui/de/floater_media_browser.xml b/indra/newview/skins/minimal/xui/de/floater_media_browser.xml new file mode 100644 index 0000000000..63cf4a6cba --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/floater_media_browser.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_about" title="MEDIEN-BROWSER"> + <floater.string name="home_page_url"> + http://www.secondlife.com + </floater.string> + <floater.string name="support_page_url"> + http://support.secondlife.com + </floater.string> + <layout_stack name="stack1"> + <layout_panel name="nav_controls"> + <button label="Zurück" name="back"/> + <button label="Vorwärts" name="forward"/> + <button label="Neu laden" name="reload"/> + <button label="Los" name="go"/> + </layout_panel> + <layout_panel name="time_controls"> + <button label="zurück" name="rewind"/> + <button label="anhalten" name="stop"/> + <button label="vorwärts" name="seek"/> + </layout_panel> + <layout_panel name="parcel_owner_controls"> + <button label="Aktuelle Seite an Parzelle senden" name="assign"/> + </layout_panel> + <layout_panel name="external_controls"> + <button label="In meinem Browser öffnen" name="open_browser"/> + <check_box label="Immer in meinem Browser öffnen" name="open_always"/> + <button label="Schließen" name="close"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/minimal/xui/de/floater_nearby_chat.xml b/indra/newview/skins/minimal/xui/de/floater_nearby_chat.xml new file mode 100644 index 0000000000..bbb4114200 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/floater_nearby_chat.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="nearby_chat" title="CHAT IN DER NÄHE"> + <check_box label="Chat übersetzen (Service von Google)" name="translate_chat_checkbox"/> +</floater> diff --git a/indra/newview/skins/minimal/xui/de/floater_web_content.xml b/indra/newview/skins/minimal/xui/de/floater_web_content.xml new file mode 100644 index 0000000000..6ab119eeab --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/floater_web_content.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_web_content" title=""> + <layout_stack name="stack1"> + <layout_panel name="nav_controls"> + <button name="back" tool_tip="Rückwärts"/> + <button name="forward" tool_tip="Vorwärts"/> + <button name="stop" tool_tip="Navigation stoppen"/> + <button name="reload" tool_tip="Seite neu laden"/> + <combo_box name="address" tool_tip="URL hier eingeben"/> + <icon name="media_secure_lock_flag" tool_tip="Sicheres Browsen"/> + <button name="popexternal" tool_tip="Aktuelle URL im Desktop-Browser öffnen"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/minimal/xui/de/inspect_avatar.xml b/indra/newview/skins/minimal/xui/de/inspect_avatar.xml new file mode 100644 index 0000000000..4b8fd8a0ad --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/inspect_avatar.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="inspect_avatar"> + <string name="Subtitle"> + [AGE] + </string> + <string name="Details"> + [SL_PROFILE] + </string> + <text name="user_subtitle" value="11 Monate und 3 Tage alt"/> + <text name="user_details"> + Dies ist meine Second Life-Beschreibung und ich finde sie wirklich gut! Meine Beschreibung ist deshalb so lang, weil ich gerne rede. + </text> + <slider name="volume_slider" tool_tip="Lautstärke" value="0.5"/> + <button label="Freund hinzufügen" name="add_friend_btn" width="110"/> + <button label="IM" name="im_btn"/> + <button label="Profil" left_delta="120" name="view_profile_btn" width="44"/> + <panel name="moderator_panel"> + <button label="Voice deaktivieren" name="disable_voice"/> + <button label="Voice aktivieren" name="enable_voice"/> + </panel> +</floater> diff --git a/indra/newview/skins/minimal/xui/de/inspect_object.xml b/indra/newview/skins/minimal/xui/de/inspect_object.xml new file mode 100644 index 0000000000..72b8235828 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/inspect_object.xml @@ -0,0 +1,48 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="inspect_object"> + <string name="Creator"> + Von [CREATOR] + </string> + <string name="CreatorAndOwner"> + Von [CREATOR] +Besitzer [OWNER] + </string> + <string name="Price"> + [AMOUNT] L$ + </string> + <string name="PriceFree"> + Kostenlos! + </string> + <string name="Touch"> + Berühren + </string> + <string name="Sit"> + Sitzen + </string> + <text name="object_name" value="Test für ein Objektname der sehr lange ist und über zwei Zeilen geht."/> + <text name="object_creator"> + von secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about +Besitzer secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about + </text> + <text name="price_text"> + 30.000 L$ + </text> + <text name="object_description"> + Dies ist eine wirklich lange Beschreibung für ein Objekt, mindestens 80 Zeichen lang oder jetzt schon mindestens 120 Zeichen lang und länger als der englische Originaltext. Niemand weiß es genau. + </text> + <text name="object_media_url"> + http://www.superdupertest.com + </text> + <button label="Kaufen" name="buy_btn"/> + <button label="Bezahlen" name="pay_btn"/> + <button label="Kopie nehmen" name="take_free_copy_btn" width="100"/> + <button label="Berühren" name="touch_btn"/> + <button label="Sitzen" name="sit_btn"/> + <button label="Öffnen" name="open_btn"/> + <icon name="secure_browsing" tool_tip="Sicheres Browsen"/> + <button label="Mehr" name="more_info_btn"/> +</floater> diff --git a/indra/newview/skins/minimal/xui/de/menu_add_wearable_gear.xml b/indra/newview/skins/minimal/xui/de/menu_add_wearable_gear.xml new file mode 100644 index 0000000000..f3775a05ec --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_add_wearable_gear.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Add Wearable Gear Menu"> + <menu_item_check label="Nach aktuellesten Objekten sortieren" name="sort_by_most_recent"/> + <menu_item_check label="Nach Name sortieren" name="sort_by_name"/> + <menu_item_check label="Nach Typ sortieren" name="sort_by_type"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_attachment_other.xml b/indra/newview/skins/minimal/xui/de/menu_attachment_other.xml new file mode 100644 index 0000000000..237c92f7d2 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_attachment_other.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- *NOTE: See also menu_avatar_other.xml --> +<context_menu name="Avatar Pie"> + <menu_item_call label="Profil anzeigen" name="Profile..."/> + <menu_item_call label="Freund hinzufügen" name="Add Friend"/> + <menu_item_call label="IM" name="Send IM..."/> + <menu_item_call label="Anrufen" name="Call"/> + <menu_item_call label="In Gruppe einladen" name="Invite..."/> + <menu_item_call label="Ignorieren" name="Avatar Mute"/> + <menu_item_call label="Melden" name="abuse"/> + <menu_item_call label="Einfrieren" name="Freeze..."/> + <menu_item_call label="Hinauswerfen" name="Eject..."/> + <menu_item_call label="Fehler in Texturen beseitigen" name="Debug..."/> + <menu_item_call label="Hineinzoomen" name="Zoom In"/> + <menu_item_call label="Bezahlen" name="Pay..."/> + <menu_item_call label="Objektprofil" name="Object Inspect"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_attachment_self.xml b/indra/newview/skins/minimal/xui/de/menu_attachment_self.xml new file mode 100644 index 0000000000..644fc68ba4 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_attachment_self.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Attachment Pie"> + <menu_item_call label="Berühren" name="Attachment Object Touch"/> + <menu_item_call label="Bearbeiten" name="Edit..."/> + <menu_item_call label="Abnehmen" name="Detach"/> + <menu_item_call label="Hinsetzen" name="Sit Down Here"/> + <menu_item_call label="Aufstehen" name="Stand Up"/> + <menu_item_call label="Outfit ändern" name="Change Outfit"/> + <menu_item_call label="Mein Outfit bearbeiten" name="Edit Outfit"/> + <menu_item_call label="Meine Form bearbeiten" name="Edit My Shape"/> + <menu_item_call label="Meine Freunde" name="Friends..."/> + <menu_item_call label="Meine Gruppen" name="Groups..."/> + <menu_item_call label="Mein Profil" name="Profile..."/> + <menu_item_call label="Fehler in Texturen beseitigen" name="Debug..."/> + <menu_item_call label="Fallen lassen" name="Drop"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_avatar_icon.xml b/indra/newview/skins/minimal/xui/de/menu_avatar_icon.xml new file mode 100644 index 0000000000..c036cf5515 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_avatar_icon.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Avatar Icon Menu"> + <menu_item_call label="Profil anzeigen" name="Show Profile"/> + <menu_item_call label="IM senden..." name="Send IM"/> + <menu_item_call label="Freund hinzufügen..." name="Add Friend"/> + <menu_item_call label="Freund entfernen..." name="Remove Friend"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_avatar_other.xml b/indra/newview/skins/minimal/xui/de/menu_avatar_other.xml new file mode 100644 index 0000000000..8aee0be3d2 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_avatar_other.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- *NOTE: See also menu_attachment_other.xml --> +<context_menu name="Avatar Pie"> + <menu_item_call label="Profil anzeigen" name="Profile..."/> + <menu_item_call label="Freund hinzufügen" name="Add Friend"/> + <menu_item_call label="IM" name="Send IM..."/> + <menu_item_call label="Anrufen" name="Call"/> + <menu_item_call label="In Gruppe einladen" name="Invite..."/> + <menu_item_call label="Ignorieren" name="Avatar Mute"/> + <menu_item_call label="Melden" name="abuse"/> + <menu_item_call label="Einfrieren" name="Freeze..."/> + <menu_item_call label="Hinauswerfen" name="Eject..."/> + <menu_item_call label="Fehler in Texturen beseitigen" name="Debug..."/> + <menu_item_call label="Hineinzoomen" name="Zoom In"/> + <menu_item_call label="Bezahlen" name="Pay..."/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_avatar_self.xml b/indra/newview/skins/minimal/xui/de/menu_avatar_self.xml new file mode 100644 index 0000000000..582c76ac94 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_avatar_self.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Self Pie"> + <menu_item_call label="Hinsetzen" name="Sit Down Here"/> + <menu_item_call label="Aufstehen" name="Stand Up"/> + <context_menu label="Ausziehen" name="Take Off >"> + <context_menu label="Kleidung" name="Clothes >"> + <menu_item_call label="Hemd" name="Shirt"/> + <menu_item_call label="Hose" name="Pants"/> + <menu_item_call label="Rock" name="Skirt"/> + <menu_item_call label="Schuhe" name="Shoes"/> + <menu_item_call label="Strümpfe" name="Socks"/> + <menu_item_call label="Jacke" name="Jacket"/> + <menu_item_call label="Handschuhe" name="Gloves"/> + <menu_item_call label="Unterhemd" name="Self Undershirt"/> + <menu_item_call label="Unterhose" name="Self Underpants"/> + <menu_item_call label="Tätowierung" name="Self Tattoo"/> + <menu_item_call label="Alpha" name="Self Alpha"/> + <menu_item_call label="Alle Kleider" name="All Clothes"/> + </context_menu> + <context_menu label="HUD" name="Object Detach HUD"/> + <context_menu label="Abnehmen" name="Object Detach"/> + <menu_item_call label="Alles abnehmen" name="Detach All"/> + </context_menu> + <menu_item_call label="Outfit ändern" name="Chenge Outfit"/> + <menu_item_call label="Mein Outfit bearbeiten" name="Edit Outfit"/> + <menu_item_call label="Meine Form bearbeiten" name="Edit My Shape"/> + <menu_item_call label="Meine Freunde" name="Friends..."/> + <menu_item_call label="Meine Gruppen" name="Groups..."/> + <menu_item_call label="Mein Profil" name="Profile..."/> + <menu_item_call label="Fehler in Texturen beseitigen" name="Debug..."/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_bottomtray.xml b/indra/newview/skins/minimal/xui/de/menu_bottomtray.xml new file mode 100644 index 0000000000..6c4308286a --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_bottomtray.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="hide_camera_move_controls_menu"> + <menu_item_check label="Schaltfläche Gesten" name="ShowGestureButton"/> + <menu_item_check label="Schaltfläche Bewegungssteuerung" name="ShowMoveButton"/> + <menu_item_check label="Schaltfläche Ansicht" name="ShowCameraButton"/> + <menu_item_check label="Schaltfläche Foto" name="ShowSnapshotButton"/> + <menu_item_check label="Schaltfläche „Seitenleiste“" name="ShowSidebarButton"/> + <menu_item_check label="Schaltfläche „Bauen“" name="ShowBuildButton"/> + <menu_item_check label="Schaltfläche „Suchen“" name="ShowSearchButton"/> + <menu_item_check label="Schaltfläche „Karte“" name="ShowWorldMapButton"/> + <menu_item_check label="Schaltfläche „Minikarte“" name="ShowMiniMapButton"/> + <menu_item_call label="Ausschneiden" name="NearbyChatBar_Cut"/> + <menu_item_call label="Kopieren" name="NearbyChatBar_Copy"/> + <menu_item_call label="Einfügen" name="NearbyChatBar_Paste"/> + <menu_item_call label="Löschen" name="NearbyChatBar_Delete"/> + <menu_item_call label="Alle auswählen" name="NearbyChatBar_Select_All"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_cof_attachment.xml b/indra/newview/skins/minimal/xui/de/menu_cof_attachment.xml new file mode 100644 index 0000000000..05d3dfca9d --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_cof_attachment.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Attachment"> + <menu_item_call label="Abnehmen" name="detach"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_cof_body_part.xml b/indra/newview/skins/minimal/xui/de/menu_cof_body_part.xml new file mode 100644 index 0000000000..07960a525c --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_cof_body_part.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Body"> + <menu_item_call label="Ersetzen" name="replace"/> + <menu_item_call label="Bearbeiten" name="edit"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_cof_clothing.xml b/indra/newview/skins/minimal/xui/de/menu_cof_clothing.xml new file mode 100644 index 0000000000..7fced273a7 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_cof_clothing.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Clothing"> + <menu_item_call label="Ausziehen" name="take_off"/> + <menu_item_call label="Ersetzen" name="replace"/> + <menu_item_call label="Eine Kategorie nach oben" name="move_up"/> + <menu_item_call label="Eine Kategorie nach unten" name="move_down"/> + <menu_item_call label="Bearbeiten" name="edit"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_cof_gear.xml b/indra/newview/skins/minimal/xui/de/menu_cof_gear.xml new file mode 100644 index 0000000000..54b218d22f --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_cof_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Gear COF"> + <menu label="Neue Kleider" name="COF.Gear.New_Clothes"/> + <menu label="Neue Körperteile" name="COF.Geear.New_Body_Parts"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_edit.xml b/indra/newview/skins/minimal/xui/de/menu_edit.xml new file mode 100644 index 0000000000..37f68d68d5 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_edit.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu label="Bearbeiten" name="Edit"> + <menu_item_call label="Rückgängig" name="Undo"/> + <menu_item_call label="Wiederherstellen" name="Redo"/> + <menu_item_call label="Ausschneiden" name="Cut"/> + <menu_item_call label="Kopieren" name="Copy"/> + <menu_item_call label="Einfügen" name="Paste"/> + <menu_item_call label="Löschen" name="Delete"/> + <menu_item_call label="Duplizieren" name="Duplicate"/> + <menu_item_call label="Alle auswählen" name="Select All"/> + <menu_item_call label="Auswahl aufheben" name="Deselect"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_favorites.xml b/indra/newview/skins/minimal/xui/de/menu_favorites.xml new file mode 100644 index 0000000000..0d0491d2eb --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_favorites.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="Teleportieren" name="Teleport To Landmark"/> + <menu_item_call label="Landmarken anzeigen/bearbeiten" name="Landmark Open"/> + <menu_item_call label="SLurl kopieren" name="Copy slurl"/> + <menu_item_call label="Auf Karte zeigen" name="Show On Map"/> + <menu_item_call label="Kopieren" name="Landmark Copy"/> + <menu_item_call label="Einfügen" name="Landmark Paste"/> + <menu_item_call label="Löschen" name="Delete"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_gesture_gear.xml b/indra/newview/skins/minimal/xui/de/menu_gesture_gear.xml new file mode 100644 index 0000000000..953c0eeed5 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_gesture_gear.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_gesture_gear"> + <menu_item_call label="Zu Favoriten hinzufügen/daraus entfernen" name="activate"/> + <menu_item_call label="Kopieren" name="copy_gesture"/> + <menu_item_call label="Einfügen" name="paste"/> + <menu_item_call label="UUID kopieren" name="copy_uuid"/> + <menu_item_call label="Aktuelles Outfit speichern" name="save_to_outfit"/> + <menu_item_call label="Bearbeiten" name="edit_gesture"/> + <menu_item_call label="Untersuchen" name="inspect"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_group_plus.xml b/indra/newview/skins/minimal/xui/de/menu_group_plus.xml new file mode 100644 index 0000000000..583ee793be --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_group_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_call label="Werden Sie Mitglied..." name="item_join"/> + <menu_item_call label="Neue Gruppe..." name="item_new"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_hide_navbar.xml b/indra/newview/skins/minimal/xui/de/menu_hide_navbar.xml new file mode 100644 index 0000000000..9acf96dc6d --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_hide_navbar.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="hide_navbar_menu"> + <menu_item_check label="Navigationsleiste anzeigen" name="ShowNavbarNavigationPanel"/> + <menu_item_check label="Favoritenleiste anzeigen" name="ShowNavbarFavoritesPanel"/> + <menu_item_check label="Mini-Standortleiste anzeigen" name="ShowMiniLocationPanel"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_im_well_button.xml b/indra/newview/skins/minimal/xui/de/menu_im_well_button.xml new file mode 100644 index 0000000000..f464b71f4a --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_im_well_button.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="IM Well Button Context Menu"> + <menu_item_call label="Alle schließen" name="Close All"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_imchiclet_adhoc.xml b/indra/newview/skins/minimal/xui/de/menu_imchiclet_adhoc.xml new file mode 100644 index 0000000000..11f93f47b4 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_imchiclet_adhoc.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="IMChiclet AdHoc Menu"> + <menu_item_call label="Sitzung beenden" name="End Session"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_imchiclet_group.xml b/indra/newview/skins/minimal/xui/de/menu_imchiclet_group.xml new file mode 100644 index 0000000000..81ef3b6569 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_imchiclet_group.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="IMChiclet Group Menu"> + <menu_item_call label="Gruppeninfo" name="Show Profile"/> + <menu_item_call label="Sitzung anzeigen" name="Chat"/> + <menu_item_call label="Sitzung beenden" name="End Session"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_imchiclet_p2p.xml b/indra/newview/skins/minimal/xui/de/menu_imchiclet_p2p.xml new file mode 100644 index 0000000000..d123238246 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_imchiclet_p2p.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="IMChiclet P2P Menu"> + <menu_item_call label="Profil anzeigen" name="Show Profile"/> + <menu_item_call label="Freund hinzufügen" name="Add Friend"/> + <menu_item_call label="Sitzung anzeigen" name="Send IM"/> + <menu_item_call label="Sitzung beenden" name="End Session"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_inspect_avatar_gear.xml b/indra/newview/skins/minimal/xui/de/menu_inspect_avatar_gear.xml new file mode 100644 index 0000000000..fbc119c483 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_inspect_avatar_gear.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> +<toggleable_menu name="Gear Menu"> + <menu_item_call label="Profil anzeigen" name="view_profile"/> + <menu_item_call label="Freund hinzufügen" name="add_friend"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="Teleportieren" name="teleport"/> + <menu_item_call label="Ignorieren" name="block"/> + <menu_item_call label="Freischalten" name="unblock"/> + <menu_item_call label="Melden" name="report"/> + <menu_item_call label="Einfrieren" name="freeze"/> + <menu_item_call label="Hinauswerfen" name="eject"/> + <menu_item_call label="Hinauswerfen" name="kick"/> + <menu_item_call label="CSR" name="csr"/> + <menu_item_call label="Fehler in Texturen beseitigen" name="debug"/> + <menu_item_call label="Auf Karte anzeigen" name="find_on_map"/> + <menu_item_call label="Hineinzoomen" name="zoom_in"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_inspect_object_gear.xml b/indra/newview/skins/minimal/xui/de/menu_inspect_object_gear.xml new file mode 100644 index 0000000000..7c47913e30 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_inspect_object_gear.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<menu name="Gear Menu"> + <menu_item_call label="Berühren" name="touch"/> + <menu_item_call label="Sitzen" name="sit"/> + <menu_item_call label="Bezahlen" name="pay"/> + <menu_item_call label="Kaufen" name="buy"/> + <menu_item_call label="Nehmen" name="take"/> + <menu_item_call label="Kopie nehmen" name="take_copy"/> + <menu_item_call label="Öffnen" name="open"/> + <menu_item_call label="Bearbeiten" name="edit"/> + <menu_item_call label="Anziehen" name="wear"/> + <menu_item_call label="Hinzufügen" name="add"/> + <menu_item_call label="Melden" name="report"/> + <menu_item_call label="Ignorieren" name="block"/> + <menu_item_call label="Hineinzoomen" name="zoom_in"/> + <menu_item_call label="Entfernen" name="remove"/> + <menu_item_call label="Weitere Infos" name="more_info"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_inspect_self_gear.xml b/indra/newview/skins/minimal/xui/de/menu_inspect_self_gear.xml new file mode 100644 index 0000000000..443092319b --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_inspect_self_gear.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Self Pie"> + <menu_item_call label="Hinsetzen" name="Sit Down Here"/> + <menu_item_call label="Aufstehen" name="Stand Up"/> + <menu_item_call label="Meine Freunde" name="Friends..."/> + <menu_item_call label="Mein Profil" name="Profile..."/> + <menu_item_call label="Fehler in Texturen beseitigen" name="Debug..."/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_inv_offer_chiclet.xml b/indra/newview/skins/minimal/xui/de/menu_inv_offer_chiclet.xml new file mode 100644 index 0000000000..71cff7136b --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_inv_offer_chiclet.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="InvOfferChiclet Menu"> + <menu_item_call label="Schließen" name="Close"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_inventory.xml b/indra/newview/skins/minimal/xui/de/menu_inventory.xml new file mode 100644 index 0000000000..43722e0dcf --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_inventory.xml @@ -0,0 +1,86 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="Teilen" name="Share"/> + <menu_item_call label="Kaufen" name="Task Buy"/> + <menu_item_call label="Öffnen" name="Task Open"/> + <menu_item_call label="Abspielen" name="Task Play"/> + <menu_item_call label="Eigenschaften" name="Task Properties"/> + <menu_item_call label="Umbenennen" name="Task Rename"/> + <menu_item_call label="Löschen" name="Task Remove"/> + <menu_item_call label="Papierkorb ausleeren" name="Empty Trash"/> + <menu_item_call label="Fundstücke ausleeren" name="Empty Lost And Found"/> + <menu_item_call label="Neuer Ordner" name="New Folder"/> + <menu_item_call label="Neues Skript" name="New Script"/> + <menu_item_call label="Neue Notizkarte" name="New Note"/> + <menu_item_call label="Neue Geste" name="New Gesture"/> + <menu label="Neue Kleider" name="New Clothes"> + <menu_item_call label="Neues Hemd" name="New Shirt"/> + <menu_item_call label="Neue Hose" name="New Pants"/> + <menu_item_call label="Neue Schuhe" name="New Shoes"/> + <menu_item_call label="Neue Socken" name="New Socks"/> + <menu_item_call label="Neue Jacke" name="New Jacket"/> + <menu_item_call label="Neuer Rock" name="New Skirt"/> + <menu_item_call label="Neue Handschuhe" name="New Gloves"/> + <menu_item_call label="Neues Unterhemd" name="New Undershirt"/> + <menu_item_call label="Neue Unterhose" name="New Underpants"/> + <menu_item_call label="Neue Alpha-Maske" name="New Alpha Mask"/> + <menu_item_call label="Neue Tätowierung" name="New Tattoo"/> + </menu> + <menu label="Neue Körperteile" name="New Body Parts"> + <menu_item_call label="Neue Form/Gestalt" name="New Shape"/> + <menu_item_call label="Neue Haut" name="New Skin"/> + <menu_item_call label="Neues Haar" name="New Hair"/> + <menu_item_call label="Neue Augen" name="New Eyes"/> + </menu> + <menu label="Typ ändern" name="Change Type"> + <menu_item_call label="Standard" name="Default"/> + <menu_item_call label="Handschuhe" name="Gloves"/> + <menu_item_call label="Jacke" name="Jacket"/> + <menu_item_call label="Hose" name="Pants"/> + <menu_item_call label="Form" name="Shape"/> + <menu_item_call label="Schuhe" name="Shoes"/> + <menu_item_call label="Hemd" name="Shirt"/> + <menu_item_call label="Rock" name="Skirt"/> + <menu_item_call label="Unterhose" name="Underpants"/> + <menu_item_call label="Unterhemd" name="Undershirt"/> + </menu> + <menu_item_call label="Teleportieren" name="Landmark Open"/> + <menu_item_call label="Öffnen" name="Animation Open"/> + <menu_item_call label="Öffnen" name="Sound Open"/> + <menu_item_call label="Aktuelles Outfit ersetzen" name="Replace Outfit"/> + <menu_item_call label="Zum aktuellen Outfit hinzufügen" name="Add To Outfit"/> + <menu_item_call label="Vom aktuellen Outfit entfernen" name="Remove From Outfit"/> + <menu_item_call label="Original suchen" name="Find Original"/> + <menu_item_call label="Objekt löschen" name="Purge Item"/> + <menu_item_call label="Objekt wiederherstellen" name="Restore Item"/> + <menu_item_call label="Öffnen" name="Open"/> + <menu_item_call label="Original öffnen" name="Open Original"/> + <menu_item_call label="Eigenschaften" name="Properties"/> + <menu_item_call label="Umbenennen" name="Rename"/> + <menu_item_call label="Asset-UUID kopieren" name="Copy Asset UUID"/> + <menu_item_call label="Kopieren" name="Copy"/> + <menu_item_call label="Einfügen" name="Paste"/> + <menu_item_call label="Als Link einfügen" name="Paste As Link"/> + <menu_item_call label="Löschen" name="Remove Link"/> + <menu_item_call label="Löschen" name="Delete"/> + <menu_item_call label="Systemordner löschen" name="Delete System Folder"/> + <menu_item_call label="Konferenz-Chat starten" name="Conference Chat Folder"/> + <menu_item_call label="Wiedergeben/Abspielen" name="Sound Play"/> + <menu_item_call label="Landmarken-Info" name="About Landmark"/> + <menu_item_call label="Inworld abspielen" name="Animation Play"/> + <menu_item_call label="Lokal abspielen" name="Animation Audition"/> + <menu_item_call label="Instant Message senden" name="Send Instant Message"/> + <menu_item_call label="Teleport anbieten..." name="Offer Teleport..."/> + <menu_item_call label="Konferenz-Chat starten" name="Conference Chat"/> + <menu_item_call label="Aktivieren" name="Activate"/> + <menu_item_call label="Deaktivieren" name="Deactivate"/> + <menu_item_call label="Speichern unter" name="Save As"/> + <menu_item_call label="Von Körper abnehmen" name="Detach From Yourself"/> + <menu_item_call label="Anziehen" name="Wearable And Object Wear"/> + <menu label="Anhängen an" name="Attach To"/> + <menu label="An HUD hängen" name="Attach To HUD"/> + <menu_item_call label="Bearbeiten" name="Wearable Edit"/> + <menu_item_call label="Hinzufügen" name="Wearable Add"/> + <menu_item_call label="Ausziehen" name="Take Off"/> + <menu_item_call label="--keine Optionen--" name="--no options--"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_inventory_add.xml b/indra/newview/skins/minimal/xui/de/menu_inventory_add.xml new file mode 100644 index 0000000000..dccee6712d --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_inventory_add.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_inventory_add"> + <menu label="Hochladen" name="upload"> + <menu_item_call label="Bild ([COST] L$)..." name="Upload Image"/> + <menu_item_call label="Sound ([COST] L$)..." name="Upload Sound"/> + <menu_item_call label="Animation ([COST] L$)..." name="Upload Animation"/> + <menu_item_call label="Mehrfach-Upload ([COST] L$ pro Datei)..." name="Bulk Upload"/> + <menu_item_call label="Hochlade-Berechtigungen (Standard) festlegen" name="perm prefs"/> + </menu> + <menu_item_call label="Neuer Ordner" name="New Folder"/> + <menu_item_call label="Neues Skript" name="New Script"/> + <menu_item_call label="Neue Notizkarte" name="New Note"/> + <menu_item_call label="Neue Geste" name="New Gesture"/> + <menu label="Neue Kleider" name="New Clothes"> + <menu_item_call label="Neues Hemd" name="New Shirt"/> + <menu_item_call label="Neue Hose" name="New Pants"/> + <menu_item_call label="Neue Schuhe" name="New Shoes"/> + <menu_item_call label="Neue Socken" name="New Socks"/> + <menu_item_call label="Neue Jacke" name="New Jacket"/> + <menu_item_call label="Neuer Rock" name="New Skirt"/> + <menu_item_call label="Neue Handschuhe" name="New Gloves"/> + <menu_item_call label="Neues Unterhemd" name="New Undershirt"/> + <menu_item_call label="Neue Unterhose" name="New Underpants"/> + <menu_item_call label="Neues Alpha" name="New Alpha"/> + <menu_item_call label="Neue Tätowierung" name="New Tattoo"/> + </menu> + <menu label="Neue Körperteile" name="New Body Parts"> + <menu_item_call label="Neue Form/Gestalt" name="New Shape"/> + <menu_item_call label="Neue Haut" name="New Skin"/> + <menu_item_call label="Neues Haar" name="New Hair"/> + <menu_item_call label="Neue Augen" name="New Eyes"/> + </menu> +</menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_inventory_gear_default.xml b/indra/newview/skins/minimal/xui/de/menu_inventory_gear_default.xml new file mode 100644 index 0000000000..df86a5cf71 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_inventory_gear_default.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_gear_default"> + <menu_item_call label="Neues Inventar-Fenster" name="new_window"/> + <menu_item_check label="Nach Name sortieren" name="sort_by_name"/> + <menu_item_check label="Nach aktuellesten Objekten sortieren" name="sort_by_recent"/> + <menu_item_check label="Systemordner nach oben" name="sort_system_folders_to_top"/> + <menu_item_call label="Filter anzeigen" name="show_filters"/> + <menu_item_call label="Filter zurücksetzen" name="reset_filters"/> + <menu_item_call label="Alle Ordner schließen" name="close_folders"/> + <menu_item_call label="Fundbüro ausleeren" name="empty_lostnfound"/> + <menu_item_call label="Textur speichern als" name="Save Texture As"/> + <menu_item_call label="Teilen" name="Share"/> + <menu_item_call label="Original suchen" name="Find Original"/> + <menu_item_call label="Alle Links suchen" name="Find All Links"/> + <menu_item_call label="Papierkorb ausleeren" name="empty_trash"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_land.xml b/indra/newview/skins/minimal/xui/de/menu_land.xml new file mode 100644 index 0000000000..de679da3d8 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_land.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Land Pie"> + <menu_item_call label="Land-Info" name="Place Information..."/> + <menu_item_call label="Hier sitzen" name="Sit Here"/> + <menu_item_call label="Dieses Land kaufen" name="Land Buy"/> + <menu_item_call label="Pass kaufen" name="Land Buy Pass"/> + <menu_item_call label="Bauen" name="Create"/> + <menu_item_call label="Land bearbeiten" name="Edit Terrain"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_landmark.xml b/indra/newview/skins/minimal/xui/de/menu_landmark.xml new file mode 100644 index 0000000000..2aff0eec95 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_landmark.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="landmark_overflow_menu"> + <menu_item_call label="SLurl kopieren" name="copy"/> + <menu_item_call label="Löschen" name="delete"/> + <menu_item_call label="Auswahl erstellen" name="pick"/> + <menu_item_call label="Zu Favoritenleiste hinzufügen" name="add_to_favbar"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_login.xml b/indra/newview/skins/minimal/xui/de/menu_login.xml new file mode 100644 index 0000000000..a373e15338 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_login.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu_bar name="Login Menu"> + <menu label="Ich" name="File"> + <menu_item_call label="Einstellungen" name="Preferences..."/> + <menu_item_call label="[APP_NAME] schließen" name="Quit"/> + </menu> + <menu label="Hilfe" name="Help"> + <menu_item_call label="[SECOND_LIFE]-Hilfe" name="Second Life Help"/> + <menu_item_call label="INFO ÜBER [APP_NAME]" name="About Second Life"/> + </menu> + <menu_item_check label="Debug-Menü anzeigen" name="Show Debug Menu"/> + <menu label="Debug" name="Debug"> + <menu_item_call label="Debug-Einstellungen anzeigen" name="Debug Settings"/> + <menu_item_call label="UI/Farb-Einstellungen" name="UI/Color Settings"/> + <menu_item_call label="XUI-Editor" name="UI Preview Tool"/> + <menu label="UI-Tests" name="UI Tests"/> + <menu_item_call label="Fenstergröße einstellen..." name="Set Window Size..."/> + <menu_item_call label="Servicebedingungen anzeigen" name="TOS"/> + <menu_item_call label="Wichtige Meldung anzeigen" name="Critical"/> + <menu_item_call label="Test Medienbrowser" name="Web Browser Test"/> + <menu_item_call label="Test Webinhalt-Floater" name="Web Content Floater Test"/> + <menu_item_check label="Grid-Auswahl anzeigen" name="Show Grid Picker"/> + <menu_item_call label="Benachrichtigungs-Konsole anzeigen" name="Show Notifications Console"/> + </menu> +</menu_bar> diff --git a/indra/newview/skins/minimal/xui/de/menu_mini_map.xml b/indra/newview/skins/minimal/xui/de/menu_mini_map.xml new file mode 100644 index 0000000000..2e0d72c40c --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_mini_map.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="Zoom Nah" name="Zoom Close"/> + <menu_item_call label="Zoom Mittel" name="Zoom Medium"/> + <menu_item_call label="Zoom Weit" name="Zoom Far"/> + <menu_item_call label="Zoom-Standard" name="Zoom Default"/> + <menu_item_check label="Karte drehen" name="Rotate Map"/> + <menu_item_check label="Automatisch zentrieren" name="Auto Center"/> + <menu_item_call label="Verfolgung abschalten" name="Stop Tracking"/> + <menu_item_call label="Weltkarte" name="World Map"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_navbar.xml b/indra/newview/skins/minimal/xui/de/menu_navbar.xml new file mode 100644 index 0000000000..5175f34b41 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_navbar.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Navbar Menu"> + <menu_item_check label="Koordinaten anzeigen" name="Show Coordinates"/> + <menu_item_check label="Parzelleneigenschaften anzeigen" name="Show Parcel Properties"/> + <menu_item_call label="Landmarke" name="Landmark"/> + <menu_item_call label="Ausschneiden" name="Cut"/> + <menu_item_call label="Kopieren" name="Copy"/> + <menu_item_call label="Einfügen" name="Paste"/> + <menu_item_call label="Löschen" name="Delete"/> + <menu_item_call label="Alle auswählen" name="Select All"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_nearby_chat.xml b/indra/newview/skins/minimal/xui/de/menu_nearby_chat.xml new file mode 100644 index 0000000000..99d6428c3f --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_nearby_chat.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="NearBy Chat Menu"> + <menu_item_call label="Leute in der Nähe anzeigen..." name="nearby_people"/> + <menu_item_check label="Ignorierten Text anzeigen" name="muted_text"/> + <menu_item_check label="Bilder von Freunden anzeigen" name="show_buddy_icons"/> + <menu_item_check label="Namen anzeigen" name="show_names"/> + <menu_item_check label="Namen und Symbole anzeigen" name="show_icons_and_names"/> + <menu_item_call label="Schriftgröße" name="font_size"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_notification_well_button.xml b/indra/newview/skins/minimal/xui/de/menu_notification_well_button.xml new file mode 100644 index 0000000000..0f2784f160 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_notification_well_button.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Notification Well Button Context Menu"> + <menu_item_call label="Alle schließen" name="Close All"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_object.xml b/indra/newview/skins/minimal/xui/de/menu_object.xml new file mode 100644 index 0000000000..19057d4228 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_object.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Object Pie"> + <menu_item_call label="Berühren" name="Object Touch"> + <menu_item_call.on_enable name="EnableTouch" parameter="Berühren"/> + </menu_item_call> + <menu_item_call label="Bearbeiten" name="Edit..."/> + <menu_item_call label="Bauen" name="Build"/> + <menu_item_call label="Öffnen" name="Open"/> + <menu_item_call label="Hier sitzen" name="Object Sit"/> + <menu_item_call label="Aufstehen" name="Object Stand Up"/> + <menu_item_call label="Objektprofil" name="Object Inspect"/> + <menu_item_call label="Hineinzoomen" name="Zoom In"/> + <context_menu label="Anziehen" name="Put On"> + <menu_item_call label="Anziehen" name="Wear"/> + <menu_item_call label="Hinzufügen" name="Add"/> + <context_menu label="Anhängen" name="Object Attach"/> + <context_menu label="HUD anhängen" name="Object Attach HUD"/> + </context_menu> + <context_menu label="Entfernen" name="Remove"> + <menu_item_call label="Missbrauch melden" name="Report Abuse..."/> + <menu_item_call label="Ignorieren" name="Object Mute"/> + <menu_item_call label="Zurückgeben" name="Return..."/> + <menu_item_call label="Löschen" name="Delete"/> + </context_menu> + <menu_item_call label="Nehmen" name="Pie Object Take"/> + <menu_item_call label="Kopie nehmen" name="Take Copy"/> + <menu_item_call label="Bezahlen" name="Pay..."/> + <menu_item_call label="Kaufen" name="Buy..."/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_object_icon.xml b/indra/newview/skins/minimal/xui/de/menu_object_icon.xml new file mode 100644 index 0000000000..8b6c558416 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_object_icon.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Object Icon Menu"> + <menu_item_call label="Objektprofil..." name="Object Profile"/> + <menu_item_call label="Ignorieren..." name="Block"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_outfit_gear.xml b/indra/newview/skins/minimal/xui/de/menu_outfit_gear.xml new file mode 100644 index 0000000000..897154ec56 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_outfit_gear.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Gear Outfit"> + <menu_item_call label="Anziehen - Aktuelles Outfit ersetzen" name="wear"/> + <menu_item_call label="Anziehen - Aktuelles Outfit hinzufügen" name="wear_add"/> + <menu_item_call label="Ausziehen - Aus aktuellem Outfit entfernen" name="take_off"/> + <menu label="Neue Kleider" name="New Clothes"> + <menu_item_call label="Neues Hemd" name="New Shirt"/> + <menu_item_call label="Neue Hose" name="New Pants"/> + <menu_item_call label="Neue Schuhe" name="New Shoes"/> + <menu_item_call label="Neue Socken" name="New Socks"/> + <menu_item_call label="Neue Jacke" name="New Jacket"/> + <menu_item_call label="Neuer Rock" name="New Skirt"/> + <menu_item_call label="Neue Handschuhe" name="New Gloves"/> + <menu_item_call label="Neues Unterhemd" name="New Undershirt"/> + <menu_item_call label="Neue Unterhose" name="New Underpants"/> + <menu_item_call label="Neues Alpha" name="New Alpha"/> + <menu_item_call label="Neue Tätowierung" name="New Tattoo"/> + </menu> + <menu label="Neue Körperteile" name="New Body Parts"> + <menu_item_call label="Neue Form" name="New Shape"/> + <menu_item_call label="Neue Haut" name="New Skin"/> + <menu_item_call label="Neues Haar" name="New Hair"/> + <menu_item_call label="Neue Augen" name="New Eyes"/> + </menu> + <menu_item_call label="Outfit neu benennen" name="rename"/> + <menu_item_call label="Outfit löschen" name="delete_outfit"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_outfit_tab.xml b/indra/newview/skins/minimal/xui/de/menu_outfit_tab.xml new file mode 100644 index 0000000000..32a65c96fc --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_outfit_tab.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Outfit"> + <menu_item_call label="Anziehen - Aktuelles Outfit ersetzen" name="wear_replace"/> + <menu_item_call label="Anziehen - Aktuelles Outfit hinzufügen" name="wear_add"/> + <menu_item_call label="Ausziehen - Aus aktuellem Outfit entfernen" name="take_off"/> + <menu_item_call label="Outfit bearbeiten" name="edit"/> + <menu_item_call label="Outfit neu benennen" name="rename"/> + <menu_item_call label="Outfit löschen" name="delete"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_participant_list.xml b/indra/newview/skins/minimal/xui/de/menu_participant_list.xml new file mode 100644 index 0000000000..160f2f97be --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_participant_list.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Participant List Context Menu"> + <menu_item_check label="Nach Name sortieren" name="SortByName"/> + <menu_item_check label="Nach letzten Sprechern sortieren" name="SortByRecentSpeakers"/> + <menu_item_call label="Profil anzeigen" name="View Profile"/> + <menu_item_call label="Freund hinzufügen" name="Add Friend"/> + <menu_item_call label="IM" name="IM"/> + <menu_item_call label="Anrufen" name="Call"/> + <menu_item_call label="Teilen" name="Share"/> + <menu_item_call label="Bezahlen" name="Pay"/> + <menu_item_check label="Symbole für Personen anzeigen" name="View Icons"/> + <menu_item_check label="Voice ignorieren" name="Block/Unblock"/> + <menu_item_check label="Text ignorieren" name="MuteText"/> + <context_menu label="Moderator-Optionen" name="Moderator Options"> + <menu_item_check label="Text-Chat zulassen" name="AllowTextChat"/> + <menu_item_call label="Diesen Teilnehmer stummschalten" name="ModerateVoiceMuteSelected"/> + <menu_item_call label="Stummschaltung für diesen Teilnehmer aufheben" name="ModerateVoiceUnMuteSelected"/> + <menu_item_call label="Alle stummschalten" name="ModerateVoiceMute"/> + <menu_item_call label="Alle freischalten" name="ModerateVoiceUnmute"/> + </context_menu> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_people_friends_view_sort.xml b/indra/newview/skins/minimal/xui/de/menu_people_friends_view_sort.xml new file mode 100644 index 0000000000..84d9d8938c --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_people_friends_view_sort.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_check label="Nach Name sortieren" name="sort_name"/> + <menu_item_check label="Nach Status sortieren" name="sort_status"/> + <menu_item_check label="Symbole für Personen anzeigen" name="view_icons"/> + <menu_item_check label="Erteilte Genehmigungen anzeigen" name="view_permissions"/> + <menu_item_call label="Ignorierte Einwohner & Objekte anzeigen" name="show_blocked_list"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_people_groups.xml b/indra/newview/skins/minimal/xui/de/menu_people_groups.xml new file mode 100644 index 0000000000..76225ba241 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_people_groups.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_call label="Info anzeigen" name="View Info"/> + <menu_item_call label="Chat" name="Chat"/> + <menu_item_call label="Anrufen" name="Call"/> + <menu_item_call label="Aktivieren" name="Activate"/> + <menu_item_call label="Verlassen" name="Leave"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_people_groups_view_sort.xml b/indra/newview/skins/minimal/xui/de/menu_people_groups_view_sort.xml new file mode 100644 index 0000000000..b68597d8aa --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_people_groups_view_sort.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_check label="Gruppensymbole anzeigen" name="Display Group Icons"/> + <menu_item_call label="Ausgewählte Gruppe verlassen" name="Leave Selected Group"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_people_nearby.xml b/indra/newview/skins/minimal/xui/de/menu_people_nearby.xml new file mode 100644 index 0000000000..1db964357f --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_people_nearby.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Avatar Context Menu"> + <menu_item_call label="Profil anzeigen" name="View Profile"/> + <menu_item_call label="Freund hinzufügen" name="Add Friend"/> + <menu_item_call label="Freund entfernen" name="Remove Friend"/> + <menu_item_call label="IM" name="IM"/> + <menu_item_call label="Anrufen" name="Call"/> + <menu_item_call label="Karte" name="Map"/> + <menu_item_call label="Teilen" name="Share"/> + <menu_item_call label="Bezahlen" name="Pay"/> + <menu_item_check label="Ignorieren/Freischalten" name="Block/Unblock"/> + <menu_item_call label="Teleport anbieten" name="teleport"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_people_nearby_multiselect.xml b/indra/newview/skins/minimal/xui/de/menu_people_nearby_multiselect.xml new file mode 100644 index 0000000000..b6e99edfe1 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_people_nearby_multiselect.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Multi-Selected People Context Menu"> + <menu_item_call label="Freunde hinzufügen" name="Add Friends"/> + <menu_item_call label="Freunde entfernen" name="Remove Friend"/> + <menu_item_call label="IM" name="IM"/> + <menu_item_call label="Anrufen" name="Call"/> + <menu_item_call label="Teilen" name="Share"/> + <menu_item_call label="Bezahlen" name="Pay"/> + <menu_item_call label="Teleport anbieten" name="teleport"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_people_nearby_view_sort.xml b/indra/newview/skins/minimal/xui/de/menu_people_nearby_view_sort.xml new file mode 100644 index 0000000000..0f252ab46d --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_people_nearby_view_sort.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_check label="Nach letzten Sprechern sortieren" name="sort_by_recent_speakers"/> + <menu_item_check label="Nach Name sortieren" name="sort_name"/> + <menu_item_check label="Nach Entfernung sortieren" name="sort_distance"/> + <menu_item_check label="Symbole für Personen anzeigen" name="view_icons"/> + <menu_item_call label="Ignorierte Einwohner & Objekte anzeigen" name="show_blocked_list"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_people_recent_view_sort.xml b/indra/newview/skins/minimal/xui/de/menu_people_recent_view_sort.xml new file mode 100644 index 0000000000..1ef020f5e1 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_people_recent_view_sort.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_check label="Nach aktuellesten Sprechern sortieren" name="sort_most"/> + <menu_item_check label="Nach Name sortieren" name="sort_name"/> + <menu_item_check label="Symbole für Personen anzeigen" name="view_icons"/> + <menu_item_call label="Ignorierte Einwohner & Objekte anzeigen" name="show_blocked_list"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_picks.xml b/indra/newview/skins/minimal/xui/de/menu_picks.xml new file mode 100644 index 0000000000..9aec4c83b0 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_picks.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Picks"> + <menu_item_call label="Info" name="pick_info"/> + <menu_item_call label="Bearbeiten" name="pick_edit"/> + <menu_item_call label="Teleportieren" name="pick_teleport"/> + <menu_item_call label="Karte" name="pick_map"/> + <menu_item_call label="Löschen" name="pick_delete"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_picks_plus.xml b/indra/newview/skins/minimal/xui/de/menu_picks_plus.xml new file mode 100644 index 0000000000..385ff25b95 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_picks_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="picks_plus_menu"> + <menu_item_call label="Neue Auswahl" name="create_pick"/> + <menu_item_call label="Neue Anzeige" name="create_classified"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_place.xml b/indra/newview/skins/minimal/xui/de/menu_place.xml new file mode 100644 index 0000000000..d9c85f5b92 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_place.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="place_overflow_menu"> + <menu_item_call label="Eine Landmarke setzen" name="landmark"/> + <menu_item_call label="Auswahl erstellen" name="pick"/> + <menu_item_call label="Pass kaufen" name="pass"/> + <menu_item_call label="Bearbeiten" name="edit"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_place_add_button.xml b/indra/newview/skins/minimal/xui/de/menu_place_add_button.xml new file mode 100644 index 0000000000..7c0ff4a46a --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_place_add_button.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_folder_gear"> + <menu_item_call label="Ordner hinzufügen" name="add_folder"/> + <menu_item_call label="Landmarke hinzufügen" name="add_landmark"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_places_gear_folder.xml b/indra/newview/skins/minimal/xui/de/menu_places_gear_folder.xml new file mode 100644 index 0000000000..132d3f6466 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_places_gear_folder.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_folder_gear"> + <menu_item_call label="Landmarke hinzufügen" name="add_landmark"/> + <menu_item_call label="Ordner hinzufügen" name="add_folder"/> + <menu_item_call label="Ausschneiden" name="cut"/> + <menu_item_call label="Kopieren" name="copy_folder"/> + <menu_item_call label="Einfügen" name="paste"/> + <menu_item_call label="Umbenennen" name="rename"/> + <menu_item_call label="Löschen" name="delete"/> + <menu_item_call label="Erweitern Sie sich" name="expand"/> + <menu_item_call label="Zuklappen" name="collapse"/> + <menu_item_call label="Alle Ordner aufklappen" name="expand_all"/> + <menu_item_call label="Alle Ordner schließen" name="collapse_all"/> + <menu_item_check label="Nach Datum sortieren" name="sort_by_date"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_places_gear_landmark.xml b/indra/newview/skins/minimal/xui/de/menu_places_gear_landmark.xml new file mode 100644 index 0000000000..6af4d644af --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_places_gear_landmark.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_ladmark_gear"> + <menu_item_call label="Teleportieren" name="teleport"/> + <menu_item_call label="Weitere Informationen" name="more_info"/> + <menu_item_call label="Auf Karte zeigen" name="show_on_map"/> + <menu_item_call label="Landmarke hinzufügen" name="add_landmark"/> + <menu_item_call label="Ordner hinzufügen" name="add_folder"/> + <menu_item_call label="Ausschneiden" name="cut"/> + <menu_item_call label="Landmarke kopieren" name="copy_landmark"/> + <menu_item_call label="SLurl kopieren" name="copy_slurl"/> + <menu_item_call label="Einfügen" name="paste"/> + <menu_item_call label="Umbenennen" name="rename"/> + <menu_item_call label="Löschen" name="delete"/> + <menu_item_call label="Alle Ordner aufklappen" name="expand_all"/> + <menu_item_call label="Alle Ordner schließen" name="collapse_all"/> + <menu_item_check label="Nach Datum sortieren" name="sort_by_date"/> + <menu_item_call label="Auswahl erstellen" name="create_pick"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_profile_overflow.xml b/indra/newview/skins/minimal/xui/de/menu_profile_overflow.xml new file mode 100644 index 0000000000..9f3fcbca1d --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_profile_overflow.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="profile_overflow_menu"> + <menu_item_call label="Karte" name="show_on_map"/> + <menu_item_call label="Bezahlen" name="pay"/> + <menu_item_call label="Teilen" name="share"/> + <menu_item_call label="Ignorieren" name="block"/> + <menu_item_call label="Freischalten" name="unblock"/> + <menu_item_call label="Hinauswerfen" name="kick"/> + <menu_item_call label="Einfrieren" name="freeze"/> + <menu_item_call label="Auftauen" name="unfreeze"/> + <menu_item_call label="CSR" name="csr"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_save_outfit.xml b/indra/newview/skins/minimal/xui/de/menu_save_outfit.xml new file mode 100644 index 0000000000..986c78b318 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_save_outfit.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="save_outfit_menu"> + <menu_item_call label="Speichern" name="save_outfit"/> + <menu_item_call label="Speichern unter" name="save_as_new_outfit"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_script_chiclet.xml b/indra/newview/skins/minimal/xui/de/menu_script_chiclet.xml new file mode 100644 index 0000000000..3256aa1a87 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_script_chiclet.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="ScriptChiclet Menu"> + <menu_item_call label="Schließen" name="Close"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_slurl.xml b/indra/newview/skins/minimal/xui/de/menu_slurl.xml new file mode 100644 index 0000000000..b2ec017f9f --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_slurl.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="URL-Info" name="about_url"/> + <menu_item_call label="Zu URL teleportieren" name="teleport_to_url"/> + <menu_item_call label="Karte" name="show_on_map"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_teleport_history_gear.xml b/indra/newview/skins/minimal/xui/de/menu_teleport_history_gear.xml new file mode 100644 index 0000000000..68b8e21802 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_teleport_history_gear.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Teleport History Gear Context Menu"> + <menu_item_call label="Alle Ordner aufklappen" name="Expand all folders"/> + <menu_item_call label="Alle Ordner schließen" name="Collapse all folders"/> + <menu_item_call label="Teleport-Liste löschen" name="Clear Teleport History"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_teleport_history_item.xml b/indra/newview/skins/minimal/xui/de/menu_teleport_history_item.xml new file mode 100644 index 0000000000..ff8fb0b181 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_teleport_history_item.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Teleport History Item Context Menu"> + <menu_item_call label="Teleportieren" name="Teleport"/> + <menu_item_call label="Weitere Informationen" name="More Information"/> + <menu_item_call label="In Zwischenablage kopieren" name="CopyToClipboard"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_teleport_history_tab.xml b/indra/newview/skins/minimal/xui/de/menu_teleport_history_tab.xml new file mode 100644 index 0000000000..194dd16fd1 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_teleport_history_tab.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Teleport History Item Context Menu"> + <menu_item_call label="Öffnen" name="TabOpen"/> + <menu_item_call label="Schließen" name="TabClose"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_text_editor.xml b/indra/newview/skins/minimal/xui/de/menu_text_editor.xml new file mode 100644 index 0000000000..c00186c13e --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_text_editor.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Text editor context menu"> + <menu_item_call label="Ausschneiden" name="Cut"/> + <menu_item_call label="Kopieren" name="Copy"/> + <menu_item_call label="Einfügen" name="Paste"/> + <menu_item_call label="Löschen" name="Delete"/> + <menu_item_call label="Alle auswählen" name="Select All"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_topinfobar.xml b/indra/newview/skins/minimal/xui/de/menu_topinfobar.xml new file mode 100644 index 0000000000..5b0a724244 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_topinfobar.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_topinfobar"> + <menu_item_check label="Koordinaten anzeigen" name="Show Coordinates"/> + <menu_item_check label="Parzellen-Eigenschaften anzeigen" name="Show Parcel Properties"/> + <menu_item_call label="Landmarke" name="Landmark"/> + <menu_item_call label="Kopieren" name="Copy"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_url_agent.xml b/indra/newview/skins/minimal/xui/de/menu_url_agent.xml new file mode 100644 index 0000000000..9a808088fb --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_url_agent.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Einwohnerprofil anzeigen" name="show_agent"/> + <menu_item_call label="Name in Zwischenablage kopieren" name="url_copy_label"/> + <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_url_group.xml b/indra/newview/skins/minimal/xui/de/menu_url_group.xml new file mode 100644 index 0000000000..6bd86414bc --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_url_group.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Gruppeninformation anzeigen" name="show_group"/> + <menu_item_call label="Gruppe in Zwischenablage kopieren" name="url_copy_label"/> + <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_url_http.xml b/indra/newview/skins/minimal/xui/de/menu_url_http.xml new file mode 100644 index 0000000000..30eb1668a5 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_url_http.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Webseite öffnen" name="url_open"/> + <menu_item_call label="Im internen Browser öffnen" name="url_open_internal"/> + <menu_item_call label="Im externen Browser öffnen" name="url_open_external"/> + <menu_item_call label="URL in Zwischenablage kopieren" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_url_inventory.xml b/indra/newview/skins/minimal/xui/de/menu_url_inventory.xml new file mode 100644 index 0000000000..dc069df02b --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_url_inventory.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Inventarobjekte anzeigen" name="show_item"/> + <menu_item_call label="Name in Zwischenablage kopieren" name="url_copy_label"/> + <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_url_map.xml b/indra/newview/skins/minimal/xui/de/menu_url_map.xml new file mode 100644 index 0000000000..2f6ffcd450 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_url_map.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Auf Karte zeigen" name="show_on_map"/> + <menu_item_call label="Zu Position teleportieren" name="teleport_to_location"/> + <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_url_objectim.xml b/indra/newview/skins/minimal/xui/de/menu_url_objectim.xml new file mode 100644 index 0000000000..90d3763d9c --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_url_objectim.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Objektinformationen anzeigen" name="show_object"/> + <menu_item_call label="Auf Karte zeigen" name="show_on_map"/> + <menu_item_call label="Zu Objekt-Position teleportieren" name="teleport_to_object"/> + <menu_item_call label="Objektname in Zwischenablage kopieren" name="url_copy_label"/> + <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_url_parcel.xml b/indra/newview/skins/minimal/xui/de/menu_url_parcel.xml new file mode 100644 index 0000000000..9169bca24f --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_url_parcel.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Parzelleninformationen anzeigen" name="show_parcel"/> + <menu_item_call label="Auf Karte zeigen" name="show_on_map"/> + <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_url_slapp.xml b/indra/newview/skins/minimal/xui/de/menu_url_slapp.xml new file mode 100644 index 0000000000..72e916b902 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_url_slapp.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Diesen Befehl ausführen" name="run_slapp"/> + <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_url_slurl.xml b/indra/newview/skins/minimal/xui/de/menu_url_slurl.xml new file mode 100644 index 0000000000..5d48230ebf --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_url_slurl.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Ortsinformationen anzeigen" name="show_place"/> + <menu_item_call label="Auf Karte zeigen" name="show_on_map"/> + <menu_item_call label="Zu Position teleportieren" name="teleport_to_location"/> + <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_url_teleport.xml b/indra/newview/skins/minimal/xui/de/menu_url_teleport.xml new file mode 100644 index 0000000000..4cc1ecc70e --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_url_teleport.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="An diesen Standort teleportieren" name="teleport"/> + <menu_item_call label="Auf Karte zeigen" name="show_on_map"/> + <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_viewer.xml b/indra/newview/skins/minimal/xui/de/menu_viewer.xml new file mode 100644 index 0000000000..67dc618eb0 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_viewer.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu_bar name="Main Menu"> + <menu label="Hilfe" name="Help"> + <menu_item_call label="[SECOND_LIFE]-Hilfe" name="Second Life Help"/> + </menu> + <menu label="Erweitert" name="Advanced"> + <menu label="Tastaturkürzel" name="Shortcuts"> + <menu_item_check label="Fliegen" name="Fly"/> + <menu_item_call label="Fenster schließen" name="Close Window"/> + <menu_item_call label="Alle Fenster schließen" name="Close All Windows"/> + <menu_item_call label="Ansicht zurücksetzen" name="Reset View"/> + </menu> + </menu> +</menu_bar> diff --git a/indra/newview/skins/minimal/xui/de/menu_wearable_list_item.xml b/indra/newview/skins/minimal/xui/de/menu_wearable_list_item.xml new file mode 100644 index 0000000000..283e454a06 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_wearable_list_item.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Outfit Wearable Context Menu"> + <menu_item_call label="Ersetzen" name="wear_replace"/> + <menu_item_call label="Anziehen" name="wear_wear"/> + <menu_item_call label="Hinzufügen" name="wear_add"/> + <menu_item_call label="Ausziehen / Abnehmen" name="take_off_or_detach"/> + <menu_item_call label="Abnehmen" name="detach"/> + <context_menu label="Anhängen an" name="wearable_attach_to"/> + <context_menu label="An HUD hängen" name="wearable_attach_to_hud"/> + <menu_item_call label="Ausziehen" name="take_off"/> + <menu_item_call label="Bearbeiten" name="edit"/> + <menu_item_call label="Objektprofil" name="object_profile"/> + <menu_item_call label="Original anzeigen" name="show_original"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_wearing_gear.xml b/indra/newview/skins/minimal/xui/de/menu_wearing_gear.xml new file mode 100644 index 0000000000..80d4ff4d9f --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_wearing_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Gear Wearing"> + <menu_item_call label="Outfit bearbeiten" name="edit"/> + <menu_item_call label="Ausziehen" name="takeoff"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/de/menu_wearing_tab.xml b/indra/newview/skins/minimal/xui/de/menu_wearing_tab.xml new file mode 100644 index 0000000000..695451a105 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/menu_wearing_tab.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Wearing"> + <menu_item_call label="Ausziehen" name="take_off"/> + <menu_item_call label="Abnehmen" name="detach"/> + <menu_item_call label="Outfit bearbeiten" name="edit"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/de/notifications.xml b/indra/newview/skins/minimal/xui/de/notifications.xml new file mode 100644 index 0000000000..1eee1d1c9b --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/notifications.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<notifications> + <notification name="UserGiveItem"> + [NAME_SLURL] bietet Ihnen [ITEM_SLURL] an. Zur Verwendung dieses Artikels müssen Sie in den erweiterten Modus umschalten, wo Sie den Artikel in Ihrem Inventar finden werden. Um in den erweiterten Modus umzuschalten, beenden Sie die Anwendung, starten Sie sie neu und ändern Sie die Moduseinstellung auf dem Anmeldebildschirm. + <form name="form"> + <button name="Show" text="Artikel behalten"/> + <button name="Discard" text="Artikel ablehnen"/> + <button name="Mute" text="Benutzer blockieren"/> + </form> + </notification> + <notification name="ObjectGiveItem"> + Ein Objekt namens <nolink>[OBJECTFROMNAME]</nolink>, das [NAME_SLURL] gehört, bietet Ihnen [ITEM_SLURL] an. Zur Verwendung dieses Artikels müssen Sie in den erweiterten Modus umschalten, wo Sie den Artikel in Ihrem Inventar finden werden. Um in den erweiterten Modus umzuschalten, beenden Sie die Anwendung, starten Sie sie neu und ändern Sie die Moduseinstellung auf dem Anmeldebildschirm. + <form name="form"> + <button name="Keep" text="Artikel behalten"/> + <button name="Discard" text="Artikel ablehnen"/> + <button name="Mute" text="Objekt blockieren"/> + </form> + </notification> +</notifications> diff --git a/indra/newview/skins/minimal/xui/de/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/de/panel_bottomtray.xml new file mode 100644 index 0000000000..a4d80921ec --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/panel_bottomtray.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="bottom_tray"> + <string name="DragIndicationImageName" value="Accordion_ArrowOpened_Off"/> + <string name="SpeakBtnToolTip" value="Schaltet Mikrofon ein/aus"/> + <string name="VoiceControlBtnToolTip" value="Voice-Chat-Steuerung anzeigen/ausblenden"/> + <layout_stack name="toolbar_stack"> + <layout_panel name="gesture_panel"> + <gesture_combo_list label="Gesten" name="Gesture" tool_tip="Gesten anzeigen/ausblenden"/> + </layout_panel> + <layout_panel name="cam_panel"> + <bottomtray_button label="Ansicht" name="camera_btn" tool_tip="Kamerasteuerung anzeigen/ausblenden"/> + </layout_panel> + <layout_panel name="avatar_and_destinations_panel"> + <bottomtray_button label="Ziele" name="destination_btn" tool_tip="Zeigt Leutefenster an"/> + </layout_panel> + <layout_panel name="avatar_and_destinations_panel"> + <bottomtray_button label="Mein Avatar" name="avatar_btn"/> + </layout_panel> + <layout_panel name="people_panel"> + <bottomtray_button label="Leute" name="show_people_button" tool_tip="Zeigt Leutefenster an"/> + </layout_panel> + <layout_panel name="profile_panel"> + <bottomtray_button label="Profil" name="show_profile_btn" tool_tip="Zeigt Profilfenster an"/> + </layout_panel> + <layout_panel name="howto_panel"> + <bottomtray_button label="Anweisungen" name="show_help_btn" tool_tip="Second Life-Anweisungsthemen öffnen"/> + </layout_panel> + <layout_panel name="im_well_panel"> + <chiclet_im_well name="im_well"> + <button name="Unread IM messages" tool_tip="IMs"/> + </chiclet_im_well> + </layout_panel> + <layout_panel name="notification_well_panel"> + <chiclet_notification name="notification_well"> + <button name="Unread" tool_tip="Benachrichtigungen"/> + </chiclet_notification> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/de/panel_group_control_panel.xml b/indra/newview/skins/minimal/xui/de/panel_group_control_panel.xml new file mode 100644 index 0000000000..81e6040f84 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/panel_group_control_panel.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <layout_stack name="vertical_stack"> + <layout_panel name="end_call_btn_panel"> + <button label="Anruf beenden" name="end_call_btn"/> + </layout_panel> + <layout_panel name="voice_ctrls_btn_panel"> + <button label="Voice-Steuerung öffnen" name="voice_ctrls_btn"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/de/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/de/panel_im_control_panel.xml new file mode 100644 index 0000000000..abf8011d9d --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/panel_im_control_panel.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <text name="avatar_name" value="Unbekannt"/> + <layout_stack name="button_stack"> + <layout_panel name="view_profile_btn_panel"> + <button label="Profil" name="view_profile_btn"/> + </layout_panel> + <layout_panel name="add_friend_btn_panel"> + <button label="Freund hinzufügen" name="add_friend_btn"/> + </layout_panel> + <layout_panel name="teleport_btn_panel"> + <button label="Teleportieren" name="teleport_btn" tool_tip="Dieser Person einen Teleport anbieten."/> + </layout_panel> + <layout_panel name="share_btn_panel"> + <button label="Teilen" name="share_btn"/> + </layout_panel> + <layout_panel name="pay_btn_panel"> + <button label="Bezahlen" name="pay_btn"/> + </layout_panel> + <layout_panel name="call_btn_panel"> + <button label="Anrufen" name="call_btn"/> + </layout_panel> + <layout_panel name="end_call_btn_panel"> + <button label="Anruf beenden" name="end_call_btn"/> + </layout_panel> + <layout_panel name="voice_ctrls_btn_panel"> + <button label="Voice-Steuerung" name="voice_ctrls_btn"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/de/panel_login.xml b/indra/newview/skins/minimal/xui/de/panel_login.xml new file mode 100644 index 0000000000..2e82453aab --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/panel_login.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_login"> + <panel.string name="create_account_url"> + http://de.secondlife.com/registration/ + </panel.string> + <panel.string name="forgot_password_url"> + http://secondlife.com/account/request.php?lang=de + </panel.string> + <layout_stack name="login_widgets"> + <layout_panel name="login"> + <text name="username_text"> + Benutzername: + </text> + <combo_box name="username_combo" tool_tip="Bei der Registrierung gewählter Benutzername wie „berndschmidt12“ oder „Liebe Sonne“"/> + <text name="password_text"> + Kennwort: + </text> + <check_box label="Kennwort merken" name="remember_check"/> + <button label="Anmelden" name="connect_btn"/> + <text name="mode_selection_text"> + Modus: + </text> + <combo_box name="mode_combo" tool_tip="Wählen Sie den gewünschten Modus aus. Basis: schnelles, einfaches Erkunden und Chatten. Erweitert: Zugriff auf zusätzliche Funktionen."> + <combo_box.item label="Basis" name="Basic"/> + <combo_box.item label="Erweitert" name="Advanced"/> + </combo_box> + </layout_panel> + <layout_panel name="links"> + <text name="create_new_account_text"> + Registrieren + </text> + <text name="forgot_password_text"> + Benutzernamen oder Kennwort vergessen? + </text> + <text name="login_help"> + Sie brauchen Hilfe? + </text> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/de/panel_navigation_bar.xml b/indra/newview/skins/minimal/xui/de/panel_navigation_bar.xml new file mode 100644 index 0000000000..ee1a543aac --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/panel_navigation_bar.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="navigation_bar"> + <panel name="navigation_panel"> + <pull_button name="back_btn" tool_tip="Zurück zum vorherigen Standort teleportieren"/> + <pull_button name="forward_btn" tool_tip="Um einen Standort weiter teleportieren"/> + <button name="home_btn" tool_tip="Zu meinem Zuhause teleportieren"/> + <location_input label="Standort" name="location_combo"/> + <search_combo_box label="Suche" name="search_combo_box" tool_tip="Suche"> + <combo_editor label="[SECOND_LIFE] durchsuchen" name="search_combo_editor"/> + </search_combo_box> + </panel> + <favorites_bar name="favorite" tool_tip="Ziehen Sie Landmarken hier hin, damit Sie schnell zu Ihren Lieblingsplätzen in Second Life gelangen können!"> + <label name="favorites_bar_label" tool_tip="Ziehen Sie Landmarken hier hin, damit Sie schnell zu Ihren Lieblingsplätzen in Second Life gelangen können!"> + Favoritenleiste + </label> + <chevron_button name=">>" tool_tip="Mehr meiner Favoriten anzeigen"/> + </favorites_bar> +</panel> diff --git a/indra/newview/skins/minimal/xui/de/panel_people.xml b/indra/newview/skins/minimal/xui/de/panel_people.xml new file mode 100644 index 0000000000..c6253e17de --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/panel_people.xml @@ -0,0 +1,70 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- Side tray panel --> +<panel label="Leute" name="people_panel"> + <string name="no_recent_people" value="Sie haben in letzter Zeit mit niemandem interagiert. Suchen Sie nach Leuten, mit denen Sie sich unterhalten können? Klicken Sie unten auf die Schaltfläche „Ziele“."/> + <string name="no_filtered_recent_people" value="Es gibt keine Leute mit diesem Namen, mit denen Sie in letzter Zeit interagiert haben."/> + <string name="no_one_near" value="Es ist niemand in der Nähe. Suchen Sie nach Leuten, mit denen Sie sich unterhalten können? Klicken Sie unten auf die Schaltfläche „Ziele“."/> + <string name="no_one_filtered_near" value="Es ist niemand mit diesem Namen in der Nähe."/> + <string name="no_friends_online" value="Keine Freunde online"/> + <string name="no_friends" value="Keine Freunde"/> + <string name="no_friends_msg"> + Klicken Sie mit der rechten Maustaste auf einen Einwohner, um ihn als Freund hinzuzufügen. Suchen Sie nach Leuten, mit denen Sie sich unterhalten können? Klicken Sie unten auf die Schaltfläche „Ziele“. + </string> + <string name="no_filtered_friends_msg"> + Sie haben nicht das Richtige gefunden? Klicken Sie unten auf die Schaltfläche „Ziele“. + </string> + <string name="people_filter_label" value="Nach Leuten filtern"/> + <string name="groups_filter_label" value="Nach Gruppen filtern"/> + <string name="no_filtered_groups_msg" value="Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/groups/[SEARCH_TERM] Suche]."/> + <string name="no_groups_msg" value="Suchen Sie nach Gruppen? Versuchen Sie es mit der [secondlife:///app/search/groups Suche]."/> + <string name="MiniMapToolTipMsg" value="[REGION](Doppelklicken, um Karte zu öffnen; Umschalttaste gedrückt halten und ziehen, um zu schwenken)"/> + <string name="AltMiniMapToolTipMsg" value="[REGION](Doppelklicken, um zu teleportieren; Umschalttaste gedrückt halten und ziehen, um zu schwenken)"/> + <filter_editor label="Filter" name="filter_input"/> + <tab_container name="tabs"> + <panel label="IN DER NÄHE" name="nearby_panel"> + <panel label="bottom_panel" name="bottom_panel"/> + </panel> + <panel label="MEINE FREUNDE" name="friends_panel"> + <accordion name="friends_accordion"> + <accordion_tab name="tab_online" title="Online"/> + <accordion_tab name="tab_all" title="Alle"/> + </accordion> + <panel label="bottom_panel" name="bottom_panel"> + <layout_stack name="bottom_panel"> + <layout_panel name="trash_btn_panel"> + <dnd_button name="del_btn" tool_tip="Ausgewählte Person aus Ihrer Freundesliste entfernen"/> + </layout_panel> + </layout_stack> + </panel> + </panel> + <panel label="AKTUELL" name="recent_panel"> + <panel label="bottom_panel" name="bottom_panel"> + <button name="add_friend_btn" tool_tip="Ausgewählten Einwohner zur Freundeliste hinzufügen"/> + </panel> + </panel> + </tab_container> + <panel name="button_bar"> + <layout_stack name="bottom_bar_ls"> + <layout_panel name="view_profile_btn_lp"> + <button label="Profil" name="view_profile_btn" tool_tip="Bilder, Gruppen und andere Einwohner-Informationen anzeigen"/> + </layout_panel> + <layout_panel name="chat_btn_lp"> + <button label="IM" name="im_btn" tool_tip="Instant Messenger öffnen"/> + </layout_panel> + <layout_panel name="chat_btn_lp"> + <button label="Teleportieren" name="teleport_btn" tool_tip="Teleport anbieten"/> + </layout_panel> + </layout_stack> + <layout_stack name="bottom_bar_ls1"> + <layout_panel name="group_info_btn_lp"> + <button label="Gruppenprofil" name="group_info_btn" tool_tip="Gruppeninformationen anzeigen"/> + </layout_panel> + <layout_panel name="chat_btn_lp"> + <button label="Gruppen-Chat" name="chat_btn" tool_tip="Chat öffnen"/> + </layout_panel> + <layout_panel name="group_call_btn_lp"> + <button label="Gruppe anrufen" name="group_call_btn" tool_tip="Diese Gruppe anrufen"/> + </layout_panel> + </layout_stack> + </panel> +</panel> diff --git a/indra/newview/skins/minimal/xui/de/panel_side_tray_tab_caption.xml b/indra/newview/skins/minimal/xui/de/panel_side_tray_tab_caption.xml new file mode 100644 index 0000000000..652fb7c836 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/panel_side_tray_tab_caption.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="sidetray_tab_panel"> + <text name="sidetray_tab_title" value="Klappmenü??"/> + <button name="undock" tool_tip="Abkoppeln"/> + <button name="dock" tool_tip="Andocken"/> + <button name="show_help" tool_tip="Hilfe anzeigen"/> +</panel> diff --git a/indra/newview/skins/minimal/xui/de/panel_status_bar.xml b/indra/newview/skins/minimal/xui/de/panel_status_bar.xml new file mode 100644 index 0000000000..04ed58f944 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/panel_status_bar.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="status"> + <panel.string name="StatBarDaysOfWeek"> + Sonntag:Montag:Dienstag:Mittwoch:Donnerstag:Freitag:Samstag + </panel.string> + <panel.string name="StatBarMonthsOfYear"> + Januar:Februar:März:April:Mai:Juni:Juli:August:September:Oktober:November:Dezember + </panel.string> + <panel.string name="packet_loss_tooltip"> + Paketverlust + </panel.string> + <panel.string name="bandwidth_tooltip"> + Bandbreite + </panel.string> + <panel.string name="time"> + [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt] + </panel.string> + <panel.string name="timeTooltip"> + [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt] + </panel.string> + <panel.string name="buycurrencylabel"> + [AMT] L$ + </panel.string> + <panel name="balance_bg"> + <text name="balance" tool_tip="Klicken, um L$-Guthaben zu aktualisieren" value="20 L$"/> + <button label="L$ kaufen" name="buyL" tool_tip="Hier klicken, um mehr L$ zu kaufen"/> + </panel> + <text name="TimeText" tool_tip="Aktuelle Zeit (Pazifik)"> + 24:00 H PST + </text> + <button name="media_toggle_btn" tool_tip="Alle Medien starten/stoppen (Musik, Video, Webseiten)"/> + <button name="volume_btn" tool_tip="Steuerung der Gesamtlautstärke"/> +</panel> diff --git a/indra/newview/skins/minimal/xui/en/floater_camera.xml b/indra/newview/skins/minimal/xui/en/floater_camera.xml new file mode 100644 index 0000000000..4cf792444f --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/floater_camera.xml @@ -0,0 +1,284 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + legacy_header_height="18" + can_dock="true" + can_minimize="true" + can_close="false" + follows="bottom" + height="164" + layout="topleft" + name="camera_floater" + save_rect="true" + save_visibility="true" + save_dock_state="true" + single_instance="true" + width="228"> + <floater.string + name="rotate_tooltip"> + Rotate Camera Around Focus + </floater.string> + <floater.string + name="zoom_tooltip"> + Zoom Camera Towards Focus + </floater.string> + <floater.string + name="move_tooltip"> + Move Camera Up and Down, Left and Right + </floater.string> + <floater.string + name="camera_modes_title"> + Camera modes + </floater.string> + <floater.string + name="pan_mode_title"> + Orbit Zoom Pan + </floater.string> + <floater.string + name="presets_mode_title"> + Preset Views + </floater.string> + <floater.string + name="free_mode_title"> + View Object + </floater.string> + <panel + border="false" + height="123" + layout="topleft" + left="2" + top="0" + mouse_opaque="false" + name="controls" + width="226"> + <panel + color="Transparent" + follows="all" + height="102" + layout="topleft" + left="8" + name="preset_views_list" + opaque="true" + top="24" + width="212" + visible="false"> + <panel_camera_item + name="front_view"> + <panel_camera_item.mousedown_callback + function="CameraPresets.ChangeView" + parameter="front_view" /> + <panel_camera_item.picture + image_name="Cam_Preset_Front_Off" /> + <panel_camera_item.selected_picture + image_name="Cam_Preset_Front_On" /> + <panel_camera_item.text + name="front_view_text"> + Front View + </panel_camera_item.text> + </panel_camera_item> + <panel_camera_item + name="group_view" + top_pad="4"> + <panel_camera_item.mousedown_callback + function="CameraPresets.ChangeView" + parameter="group_view" /> + <panel_camera_item.picture + image_name="Cam_Preset_Side_Off" /> + <panel_camera_item.selected_picture + image_name="Cam_Preset_Side_On" /> + <panel_camera_item.text + name="side_view_text"> + Side View + </panel_camera_item.text> + </panel_camera_item> + <panel_camera_item + name="rear_view" + layout="topleft" + top_pad="4"> + <panel_camera_item.mousedown_callback + function="CameraPresets.ChangeView" + parameter="rear_view" /> + <panel_camera_item.picture + image_name="Cam_Preset_Back_Off" /> + <panel_camera_item.selected_picture + image_name="Cam_Preset_Back_On" /> + <panel_camera_item.text + name="rear_view_text"> + Rear View + </panel_camera_item.text> + </panel_camera_item> + </panel> + <panel + color="Transparent" + follows="all" + height="68" + item_pad="4" + layout="topleft" + left="8" + name="camera_modes_list" + opaque="true" + top="24" + width="212" + visible="false"> + <panel_camera_item + name="object_view"> + <panel_camera_item.mousedown_callback + function="CameraPresets.ChangeView" + parameter="object_view" /> + <panel_camera_item.text + name="object_view_text"> + Object View + </panel_camera_item.text> + <panel_camera_item.picture + image_name="Object_View_Off" /> + <panel_camera_item.selected_picture + image_name="Object_View_On" /> + </panel_camera_item> + <panel_camera_item + name="mouselook_view" + layout="topleft"> + <panel_camera_item.mousedown_callback + function="CameraPresets.ChangeView" + parameter="mouselook_view" /> + <panel_camera_item.text + name="mouselook_view_text"> + Mouselook View + </panel_camera_item.text> + <panel_camera_item.picture + image_name="MouseLook_View_Off" /> + <panel_camera_item.selected_picture + image_name="MouseLook_View_On" /> + </panel_camera_item> + </panel> + <!--TODO: replace + - images --> + <panel + border="false" + class="camera_zoom_panel" + height="114" + layout="topleft" + left="0" + mouse_opaque="false" + name="zoom" + top="20" + width="226"> + <joystick_rotate + follows="top|left" + height="78" + image_selected="Cam_Rotate_In" + image_unselected="Cam_Rotate_Out" + layout="topleft" + left="7" + mouse_opaque="false" + name="cam_rotate_stick" + quadrant="left" + scale_image="false" + sound_flags="3" + visible="true" + tool_tip="Orbit camera around focus" + top="20" + width="78"> + <commit_callback + function="Camera.rotate" /> + <mouse_held_callback + function="Camera.rotate" /> + </joystick_rotate> + <button + follows="top|left" + height="18" + image_disabled="AddItem_Disabled" + image_selected="AddItem_Press" + image_unselected="AddItem_Off" + layout="topleft" + left_pad="14" + name="zoom_plus_btn" + width="18" + top="18"> + <commit_callback + function="Zoom.plus" /> + <mouse_held_callback + function="Zoom.plus" /> + </button> + <slider_bar + height="50" + layout="topleft" + name="zoom_slider" + orientation="vertical" + tool_tip="Zoom camera toward focus" + top_pad="0" + min_val="0" + max_val="1" + width="18"> + <commit_callback function="Slider.value_changed"/> + </slider_bar> + <button + follows="top|left" + height="18" + image_disabled="MinusItem_Disabled" + image_selected="MinusItem_Press" + image_unselected="MinusItem_Off" + layout="topleft" + name="zoom_minus_btn" + top_pad="0" + width="18"> + <commit_callback + function="Zoom.minus" /> + <mouse_held_callback + function="Zoom.minus" /> + </button> + <joystick_track + follows="top|left" + height="78" + image_selected="Cam_Tracking_In" + image_unselected="Cam_Tracking_Out" + layout="topleft" + left="133" + name="cam_track_stick" + quadrant="left" + scale_image="false" + sound_flags="3" + tool_tip="Move camera up and down, left and right" + top="20" + width="78"> + <commit_callback + function="Camera.track" /> + <mouse_held_callback + function="Camera.track" /> + </joystick_track> + </panel> + </panel> + <panel + border="false" + height="42" + layout="topleft" + left="2" + top_pad="0" + name="buttons" + width="226"> + <button + height="23" + label="" + layout="topleft" + left="83" + is_toggle="true" + image_overlay="Cam_Avatar_Off" + image_selected="PushButton_Selected_Press" + name="presets_btn" + tab_stop="false" + tool_tip="Preset Views" + top="13" + width="25"> + </button> + <button + height="23" + label="" + layout="topleft" + left_pad="1" + is_toggle="true" + image_overlay="PanOrbit_Off" + image_selected="PushButton_Selected_Press" + name="pan_btn" + tab_stop="false" + tool_tip="Orbit Zoom Pan" + width="25"> + </button> + </panel> +</floater> diff --git a/indra/newview/skins/minimal/xui/en/floater_help_browser.xml b/indra/newview/skins/minimal/xui/en/floater_help_browser.xml new file mode 100644 index 0000000000..cc551f7d58 --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/floater_help_browser.xml @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + legacy_header_height="18" + can_resize="true" + can_minimize="false" + height="360" + layout="topleft" + min_height="360" + left="645" + top="10" + min_width="345" + name="floater_help_browser" + save_rect="true" + single_instance="true" + title="HOW TO" + width="335"> + <floater.string + name="loading_text"> + Loading... + </floater.string> + <floater.string + name="done_text"> + </floater.string> + <layout_stack + bottom="360" + follows="left|right|top|bottom" + layout="topleft" + left="5" + orientation="vertical" + name="stack1" + top="20" + width="325"> + <layout_panel + layout="topleft" + left_delta="0" + top_delta="0" + name="external_controls" + user_resize="false" + width="325"> + <web_browser + trusted_content="true" + bottom="-5" + follows="left|right|top|bottom" + layout="topleft" + left="0" + name="browser" + top="0" + height="300" + width="325" /> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/minimal/xui/en/floater_media_browser.xml b/indra/newview/skins/minimal/xui/en/floater_media_browser.xml new file mode 100644 index 0000000000..4862146c94 --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/floater_media_browser.xml @@ -0,0 +1,242 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + legacy_header_height="18" + can_resize="true" + height="440" + layout="topleft" + min_height="140" + min_width="467" + name="floater_about" + save_rect="true" + auto_tile="true" + title="MEDIA BROWSER" + width="820"> + <floater.string + name="home_page_url"> + http://www.secondlife.com + </floater.string> + <floater.string + name="support_page_url"> + http://support.secondlife.com + </floater.string> + <layout_stack + bottom="440" + follows="left|right|top|bottom" + layout="topleft" + left="10" + name="stack1" + orientation="vertical" + top="20" + width="800"> + <layout_panel + auto_resize="false" + default_tab_group="1" + height="20" + layout="topleft" + left="0" + min_height="20" + name="nav_controls" + top="400" + user_resize="false" + width="800"> + <button + follows="left|top" + height="20" + label="Back" + layout="topleft" + left="0" + name="back" + top="0" + width="55"> + <button.commit_callback + function="MediaBrowser.Back" /> + </button> + <button + follows="left|top" + height="20" + label="Forward" + layout="topleft" + left_pad="3" + name="forward" + top_delta="0" + width="68"> + <button.commit_callback + function="MediaBrowser.Forward" /> + </button> + <button + enabled="false" + follows="left|top" + height="20" + label="Reload" + layout="topleft" + left_pad="2" + name="reload" + top_delta="0" + width="70"> + <button.commit_callback + function="MediaBrowser.Refresh" /> + </button> + <combo_box + allow_text_entry="true" + follows="left|top|right" + tab_group="1" + height="20" + layout="topleft" + left_pad="5" + max_chars="1024" + name="address" + combo_editor.select_on_focus="true" + top_delta="0" + width="540"> + <combo_box.commit_callback + function="MediaBrowser.EnterAddress" /> + </combo_box> + <button + enabled="false" + follows="right|top" + height="20" + label="Go" + layout="topleft" + left_pad="5" + name="go" + top_delta="0" + width="50"> + <button.commit_callback + function="MediaBrowser.Go" /> + </button> + </layout_panel> + <layout_panel + auto_resize="false" + height="20" + layout="topleft" + left_delta="0" + min_height="20" + name="time_controls" + top_delta="0" + user_resize="false" + width="800"> + <button + follows="left|top" + height="20" + label="rewind" + layout="topleft" + left="0" + name="rewind" + top="0" + width="55" /> + <button + follows="left|top" + height="20" + image_selected="button_anim_play_selected.tga" + image_unselected="button_anim_play.tga" + layout="topleft" + left_delta="55" + name="play" + top_delta="0" + width="55" /> + <button + follows="left|top" + height="20" + image_selected="button_anim_pause_selected.tga" + image_unselected="button_anim_pause.tga" + layout="topleft" + left_delta="0" + name="pause" + top_delta="0" + width="55" /> + <button + follows="left|top" + height="20" + label="stop" + layout="topleft" + left_pad="10" + name="stop" + top_delta="0" + width="55" /> + <button + follows="left|top" + height="20" + label="forward" + layout="topleft" + left_pad="20" + name="seek" + top_delta="0" + width="55" /> + </layout_panel> + <layout_panel + auto_resize="false" + height="20" + layout="topleft" + left_delta="0" + min_height="20" + name="parcel_owner_controls" + top_delta="0" + user_resize="false" + width="540"> + <button + enabled="false" + follows="left|top" + height="20" + label="Send Current Page to Parcel" + layout="topleft" + left="0" + name="assign" + top="0" + width="200"> + <button.commit_callback + function="MediaBrowser.Assign" /> + </button> + </layout_panel> + <layout_panel + height="40" + layout="topleft" + left_delta="0" + name="external_controls" + top_delta="0" + user_resize="false" + width="540"> + <web_browser + bottom="-30" + follows="all" + layout="topleft" + left="0" + name="browser" + top="0" + width="540" /> + <button + follows="bottom|left" + height="20" + label="Open in My Web Browser" + layout="topleft" + left_delta="0" + name="open_browser" + top_pad="5" + width="185"> + <button.commit_callback + function="MediaBrowser.OpenWebBrowser" /> + </button> + <check_box + control_name="UseExternalBrowser" + follows="bottom|left" + height="20" + label="Always open in my web browser" + layout="topleft" + left_pad="5" + name="open_always" + top_delta="0" + width="200" /> + <button + follows="bottom|right" + height="20" + label="Close" + layout="topleft" + left_pad="80" + name="close" + top_delta="0" + width="70"> + <button.commit_callback + function="MediaBrowser.Close" /> + </button> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/minimal/xui/en/floater_nearby_chat.xml b/indra/newview/skins/minimal/xui/en/floater_nearby_chat.xml new file mode 100644 index 0000000000..74ac885202 --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/floater_nearby_chat.xml @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater + border_visible="false" + border="false" + bg_opaque_image="Window_Foreground" + bg_alpha_image="Window_Background" + bg_alpha_image_overlay="DkGray_66" + legacy_header_height="18" + can_minimize="true" + can_tear_off="false" + can_resize="true" + can_drag_on_left="false" + can_close="false" + can_dock="true" + bevel_style="in" + height="300" + min_width="235" + layout="topleft" + name="nearby_chat" + save_rect="true" + title="NEARBY CHAT" + save_dock_state="true" + save_visibility="true" + single_instance="true" + width="320"> + <check_box + bottom_delta="36" + control_name="TranslateChat" + enabled="true" + height="16" + label="Translate chat (powered by Google)" + layout="topleft" + left="5" + name="translate_chat_checkbox" + width="230" /> + <chat_history + parse_urls="true" + bg_readonly_color="ChatHistoryBgColor" + bg_writeable_color="ChatHistoryBgColor" + follows="all" + left="5" + top_delta="17" + layout="topleft" + height="260" + name="chat_history" + parse_highlights="true" + text_color="ChatHistoryTextColor" + text_readonly_color="ChatHistoryTextColor" + right_widget_pad="5" + left_widget_pad="0" + width="315" /> +</floater> diff --git a/indra/newview/skins/minimal/xui/en/floater_side_bar_tab.xml b/indra/newview/skins/minimal/xui/en/floater_side_bar_tab.xml new file mode 100644 index 0000000000..83b1260620 --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/floater_side_bar_tab.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<floater + can_close="true" + can_resize="true" + min_width="333" + min_height="440" + save_rect="true" + save_visibility="true" + > +</floater> diff --git a/indra/newview/skins/minimal/xui/en/floater_web_content.xml b/indra/newview/skins/minimal/xui/en/floater_web_content.xml new file mode 100644 index 0000000000..50cb5b14ce --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/floater_web_content.xml @@ -0,0 +1,189 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + legacy_header_height="18" + can_resize="true" + height="775" + layout="topleft" + min_height="400" + min_width="500" + name="floater_web_content" + save_rect="true" + auto_tile="true" + title="" + initial_mime_type="text/html" + width="780"> + <layout_stack + bottom="775" + follows="left|right|top|bottom" + layout="topleft" + left="5" + name="stack1" + orientation="vertical" + top="20" + width="770"> + <layout_panel + auto_resize="false" + default_tab_group="1" + height="22" + layout="topleft" + left="0" + min_height="20" + name="nav_controls" + top="400" + user_resize="false" + width="770"> + <button + image_overlay="Arrow_Left_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + hover_glow_amount="0.15" + tool_tip="Navigate back" + follows="left|top" + height="22" + layout="topleft" + left="1" + name="back" + top="0" + width="22"> + <button.commit_callback + function="WebContent.Back" /> + </button> + <button + image_overlay="Arrow_Right_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + tool_tip="Navigate forward" + follows="left|top" + height="22" + layout="topleft" + left="27" + name="forward" + top_delta="0" + width="22"> + <button.commit_callback + function="WebContent.Forward" /> + </button> + <button + image_overlay="Stop_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + tool_tip="Stop navigation" + enabled="true" + follows="left|top" + height="22" + layout="topleft" + left="51" + name="stop" + top_delta="0" + width="22"> + <button.commit_callback + function="WebContent.Stop" /> + </button> + <button + image_overlay="Refresh_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + tool_tip="Reload page" + follows="left|top" + height="22" + layout="topleft" + left="51" + name="reload" + top_delta="0" + width="22"> + <button.commit_callback + function="WebContent.Reload" /> + </button> + <combo_box + allow_text_entry="true" + follows="left|top|right" + tab_group="1" + height="22" + layout="topleft" + left_pad="4" + max_chars="1024" + name="address" + combo_editor.select_on_focus="true" + tool_tip="Enter URL here" + top_delta="0" + width="672"> + <combo_box.commit_callback + function="WebContent.EnterAddress" /> + </combo_box> + <icon + name="media_secure_lock_flag" + height="16" + follows="top|right" + image_name="Lock2" + layout="topleft" + left_delta="620" + top_delta="2" + visible="false" + tool_tip="Secured Browsing" + width="16" /> + <button + image_overlay="ExternalBrowser_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + tool_tip="Open current URL in your desktop browser" + follows="right|top" + enabled="true" + height="22" + layout="topleft" + name="popexternal" + right="770" + top_delta="-2" + width="22"> + <button.commit_callback + function="WebContent.PopExternal" /> + </button> + </layout_panel> + <layout_panel + height="40" + layout="topleft" + left_delta="0" + name="external_controls" + top_delta="0" + user_resize="false" + width="585"> + <web_browser + bottom="-22" + follows="all" + layout="topleft" + left="0" + name="webbrowser" + top="0"/> + <text + type="string" + length="200" + follows="bottom|left" + height="20" + layout="topleft" + left_delta="0" + name="statusbartext" + parse_urls="false" + text_color="0.4 0.4 0.4 1" + top_pad="5" + width="495"/> + <progress_bar + color_bar="0.3 1.0 0.3 1" + follows="bottom|right" + height="16" + top_delta="-1" + left_pad="24" + layout="topleft" + name="statusbarprogress" + width="64"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/minimal/xui/en/inspect_avatar.xml b/indra/newview/skins/minimal/xui/en/inspect_avatar.xml new file mode 100644 index 0000000000..853d5f8735 --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/inspect_avatar.xml @@ -0,0 +1,206 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater + legacy_header_height="25" + bevel_style="in" + bg_opaque_image="Inspector_Background" + can_close="false" + can_minimize="false" + height="164" + layout="topleft" + name="inspect_avatar" + single_instance="true" + sound_flags="0" + visible="true" + width="245"> + <!-- Allowed fields include: + [BORN_ON] ("12/3/2008") + [SL_PROFILE] (Second Life profile), + [RW_PROFILE] (real world profile), + [ACCTTYPE] ("Resident"), + [PAYMENTINFO] ("Payment Info on File"), + [AGE] ("1 year 2 months") + --> + <string + name="Subtitle"> +[AGE] + </string> + <string + name="Details"> +[SL_PROFILE] + </string> + <text + follows="top|left" + font="SansSerif" + height="20" + left="8" + name="user_name_small" + top="7" + text_color="White" + use_ellipses="true" + word_wrap="true" + visible="false" + value="Grumpity ProductEngine with a long name" + width="185" /> + <text + follows="top|left" + font="SansSerifBigLarge" + height="21" + left="8" + name="user_name" + top="10" + text_color="White" + use_ellipses="true" + value="Grumpity ProductEngine" + width="190" /> + <text + follows="top|left" + height="16" + left="8" + name="user_slid" + font="SansSerifSmallBold" + text_color="EmphasisColor" + value="james.linden" + width="185" + use_ellipses="true" /> + <text + follows="top|left" + height="16" + left="8" + name="user_subtitle" + font="SansSerifSmall" + text_color="White" + top_pad="0" + value="11 Months, 3 days old" + width="175" + use_ellipses="true" /> + <text + follows="left|top|right" + height="35" + left="8" + name="user_details" + right="-10" + word_wrap="true" + top_pad="4" + use_ellipses="true" + width="220">This is my second life description and I really think it is great. But for some reason my description is super extra long because I like to talk a whole lot + </text> + <slider + follows="top|left" + height="23" + increment="0.01" + left="1" + max_val="0.95" + min_val="0.05" + name="volume_slider" + show_text="false" + tool_tip="Voice volume" + top_pad="0" + value="0.5" + width="200" /> + <button + follows="top|left" + height="16" + image_disabled="Audio_Off" + image_disabled_selected="AudioMute_Off" + image_hover_selected="AudioMute_Over" + image_selected="AudioMute_Off" + image_unselected="Audio_Off" + is_toggle="true" + left_pad="0" + top_delta="4" + name="mute_btn" + width="16" /> + <avatar_icon + follows="top|left" + height="38" + right="-10" + bevel_style="in" + border_style="line" + mouse_opaque="true" + name="avatar_icon" + top="10" + width="38" /> +<!-- Overlapping buttons for default actions + llinspectavatar.cpp makes visible the most likely default action +--> + <button + follows="top|left" + height="20" + label="Add Friend" + left="8" + top="135" + name="add_friend_btn" + width="90" /> + <button + follows="top|left" + height="20" + label="IM" + left_delta="0" + top_delta="0" + name="im_btn" + width="80" + commit_callback.function="InspectAvatar.IM"/> + <button + follows="top|left" + height="20" + label="Profile" + layout="topleft" + name="view_profile_btn" + left_delta="96" + top_delta="0" + tab_stop="false" + width="80" /> + <!-- gear buttons here --> + <menu_button + follows="top|left" + height="20" + layout="topleft" + image_overlay="OptionsMenu_Off" + menu_filename="menu_inspect_avatar_gear.xml" + name="gear_btn" + right="-5" + top_delta="0" + width="35" /> + <menu_button + follows="top|left" + height="20" + image_overlay="OptionsMenu_Off" + menu_filename="menu_inspect_self_gear.xml" + name="gear_self_btn" + right="-5" + top_delta="0" + width="35" /> + <panel + follows="top|left" + top="164" + left="0" + height="60" + width="228" + visible="false" + background_visible="true" + name="moderator_panel" + background_opaque="true" + bg_opaque_color="MouseGray"> + <button + name="disable_voice" + label="Disable Voice" + top="20" + width="95" + height="20" + left="10" + commit_callback.function="InspectAvatar.DisableVoice"/> + <button + name="enable_voice" + label="Enable Voice" + top="20" + width="95" + height="20" + left="10" + visible="false" + commit_callback.function="InspectAvatar.EnableVoice"/> + </panel> +</floater> diff --git a/indra/newview/skins/minimal/xui/en/inspect_object.xml b/indra/newview/skins/minimal/xui/en/inspect_object.xml new file mode 100644 index 0000000000..f424069ec6 --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/inspect_object.xml @@ -0,0 +1,144 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater + legacy_header_height="25" + bevel_style="in" + bg_opaque_image="Inspector_Background" + can_close="false" + can_minimize="false" + height="150" + layout="topleft" + name="inspect_object" + single_instance="true" + sound_flags="0" + visible="true" + width="228"> + <string name="Creator">By [CREATOR]</string> + <string name="CreatorAndOwner"> +By [CREATOR] +Owner [OWNER] + </string> + <string name="Price">L$[AMOUNT]</string> + <string name="PriceFree">Free!</string> + <string name="Touch">Touch</string> + <string name="Sit">Sit</string> + <text + parse_urls="false" + follows="all" + font="SansSerifLarge" + height="30" + left="8" + name="object_name" + text_color="White" + top="6" + use_ellipses="true" + word_wrap="true" + width="220" /> + <text + follows="all" + height="50" + left="8" + name="object_creator" + top_pad="6" + use_ellipses="true" + width="220"> + by secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about +owner secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about + </text> + <text + follows="all" + font="SansSerifSmall" + font.style="BOLD" + height="14" + halign="right" + right="-5" + name="price_text" + text_color="white" + top="60" + font_shadow="none" + width="60"> +L$30,000 + </text> + <text + clip_partial="true" + follows="all" + font="SansSerifSmall" + height="25" + left="8" + name="object_description" + top="76" + use_ellipses="true" + width="220" + word_wrap="true"> + </text> + <!-- Overlapping buttons for all default actions. Show "Buy" if + for sale, "Sit" if can sit, etc. --> + <icon + name="secure_browsing" + image_name="Lock" + left="0" + visible="false" + width="18" + height="18" + top="103" + tool_tip="Secure Browsing" + follows="left|top" /> + <text + follows="all" + font="SansSerifSmall" + height="13" + name="object_media_url" + width="207" + left_pad="2" + top_delta="0" + max_length = "50" + use_ellipses="true"> + http://www.superdupertest.com +</text> + <button + follows="top|left" + height="20" + label="Take Copy" + left_delta="0" + name="take_free_copy_btn" + top_delta="0" + width="80" /> + <button + follows="top|left" + height="20" + label="Touch" + left_delta="0" + name="touch_btn" + top_delta="0" + width="80" /> + <button + follows="top|left" + height="20" + label="Sit" + left_delta="0" + name="sit_btn" + top_delta="0" + width="80" /> + <button + follows="top|left" + height="20" + label="Open" + left_delta="0" + name="open_btn" + top_delta="0" + width="80" /> + + <!-- non-overlapping buttons here --> + <menu_button + follows="top|left" + height="20" + image_overlay="OptionsMenu_Off" + menu_filename="menu_inspect_object_gear.xml" + name="gear_btn" + right="-5" + top_delta="0" + width="35" /> +</floater> diff --git a/indra/newview/skins/minimal/xui/en/main_view.xml b/indra/newview/skins/minimal/xui/en/main_view.xml new file mode 100644 index 0000000000..45ba785c1f --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/main_view.xml @@ -0,0 +1,268 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + follows="left|right|top|bottom" + height="768" + layout="topleft" + left="0" + mouse_opaque="false" + tab_stop="false" + name="main_view" + width="1024"> + <panel top="0" + follows="all" + height="768" + mouse_opaque="false" + name="login_panel_holder" + width="1024"/> + + <layout_stack border_size="0" + follows="all" + mouse_opaque="false" + height="768" + name="menu_stack" + orientation="vertical" + top="0"> + <layout_panel auto_resize="false" + height="30" + mouse_opaque="false" + name="nav_bar_container" + tab_stop="false" + min_height="0" + width="1024" + user_resize="false" + visible="true"> + </layout_panel> + <layout_panel auto_resize="true" + follows="all" + height="500" + layout="topleft" + mouse_opaque="false" + tab_stop="false" + name="hud" + width="1024"> + <panel auto_resize="false" + follows="all" + height="500" + top="0" + layout="topleft" + mouse_opaque="false" + tab_stop="false" + name="non_side_tray_view" + user_resize="false" + width="1024"> + + <layout_stack border_size="0" + bottom="500" + follows="all" + height="500" + left="0" + top="0" + mouse_opaque="false" + name="world_stack" + open_time_constant="0.03" + close_time_constant="0.03" + orientation="vertical"> + <layout_panel auto_resize="true" + follows="all" + height="500" + layout="topleft" + tab_stop="false" + mouse_opaque="false" + user_resize="false" + name="hud container" + width="500"> + <view top="0" + follows="all" + height="500" + left="0" + mouse_opaque="false" + name="floater_snap_region" + width="500"/> + <panel follows="left|top" + height="0" + left="0" + mouse_opaque="false" + name="topinfo_bar_container" + tab_stop="false" + top="0" + visible="false" + width="1024"/> + <panel bottom="500" + follows="left|right|bottom" + height="25" + left="0" + mouse_opaque="false" + tab_stop="false" + name="stand_stop_flying_container" + visible="false" + width="500"/> + <panel follows="all" + height="500" + left="0" + mouse_opaque="false" + name="floater_view_holder" + tab_group="-1" + tab_stop="false" + top="0" + width="500"> + <floater_view follows="all" + height="500" + left="0" + mouse_opaque="false" + name="Floater View" + tab_group="-1" + tab_stop="false" + top="0" + width="500"/> + </panel> + <panel bottom="500" + follows="all" + height="500" + left="0" + mouse_opaque="false" + name="world_view_rect" + top="0" + width="500"/> + </layout_panel> + <layout_panel auto_resize="false" + min_height="33" + height="33" + mouse_opaque="false" + name="bottom_tray_container" + visible="false"/> + <layout_panel auto_resize="false" + height="215" + mouse_opaque="false" + user_resize="false" + name="avatar_picker_and_destination_guide_container" + visible="false"> + <panel top="0" + height="215" + left="0" + background_visible="true" + width="500" + follows="all"> + <web_browser + top="0" + height="200" + follows="all" + name="destination_guide_contents" + trusted_content="true" + visible="false"/> + <web_browser + top="0" + height="200" + follows="all" + name="avatar_picker_contents" + visible="false" + trusted_content="true"/> + <button + name="close" + width="22" + height="23" + right="-10" + top="2" + follows="top|right" + chrome="true" + tab_stop="false" + image_unselected="bottomtray_close_off" + image_selected="bottomtray_close_press" + /> + </panel> + </layout_panel> + </layout_stack> + </panel> + <debug_view follows="all" + left="0" + top="0" + mouse_opaque="false" + height="500" + name="DebugView" + width="1024"/> + </layout_panel> + </layout_stack> + <panel mouse_opaque="false" + follows="right|top" + name="status_bar_container" + tab_stop="false" + height="30" + left="-70" + top="0" + width="70" + visible="false"/> + <panel follows="top|bottom" + height="500" + mouse_opaque="false" + tab_stop="false" + name="hidden_side_tray" + visible="false" + width="333"> + <panel + name="side_tray_container" + width="333" + height="500"/> + </panel> + + <panel top="0" + follows="all" + mouse_opaque="false" + left="0" + name="snapshot_floater_view_holder" + width="1024" + height="798"> + <snapshot_floater_view enabled="false" + follows="all" + height="768" + left="0" + mouse_opaque="false" + name="Snapshot Floater View" + tab_stop="false" + top="0" + visible="false" + width="1024"/> + </panel> + <panel top="0" + follows="all" + height="768" + mouse_opaque="false" + name="popup_holder" + class="popup_holder" + width="1024"> + <icon follows="right|bottom" + image_name="Resize_Corner" + right="-1" + name="resize_corner" + width="11" + bottom="-1" + height="11" /> + </panel> + <view top="0" + left="0" + width="1024" + height="768" + name="hint_holder" + mouse_opaque="false" + follows="all"/> + <panel top="0" + follows="all" + height="768" + mouse_opaque="true" + name="progress_view" + filename="panel_progress.xml" + class="progress_view" + width="1024" + visible="false"/> + <menu_holder top="0" + follows="all" + height="768" + mouse_opaque="false" + name="Menu Holder" + width="1024"/> + <tooltip_view top="0" + follows="all" + height="768" + mouse_opaque="false" + name="tooltip view" + tab_group="-2" + width="1024"/> +</panel> diff --git a/indra/newview/skins/minimal/xui/en/menu_add_wearable_gear.xml b/indra/newview/skins/minimal/xui/en/menu_add_wearable_gear.xml new file mode 100644 index 0000000000..28c4762eaa --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_add_wearable_gear.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<toggleable_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_attachment_other.xml b/indra/newview/skins/minimal/xui/en/menu_attachment_other.xml new file mode 100644 index 0000000000..b55e677276 --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_attachment_other.xml @@ -0,0 +1,76 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<!-- *NOTE: See also menu_avatar_other.xml --> +<context_menu + layout="topleft" + name="Avatar Pie"> + <menu_item_call + label="View Profile" + name="Profile..."> + <menu_item_call.on_click + function="ShowAgentProfile" + parameter="hit object" /> + </menu_item_call> + <menu_item_call + enabled="false" + label="Add Friend" + name="Add Friend"> + <menu_item_call.on_click + function="Avatar.AddFriend" /> + <menu_item_call.on_enable + function="Avatar.EnableAddFriend" /> + </menu_item_call> + <menu_item_call + label="IM" + name="Send IM..."> + <menu_item_call.on_click + function="Avatar.SendIM" /> + </menu_item_call> + <menu_item_separator /> + <menu_item_call + enabled="false" + label="Block" + name="Avatar Mute"> + <menu_item_call.on_click + function="Avatar.Mute" /> + <menu_item_call.on_enable + function="Avatar.EnableMute" /> + </menu_item_call> + <menu_item_call + label="Report" + name="abuse"> + <menu_item_call.on_click + function="Avatar.ReportAbuse" /> + </menu_item_call> + <menu_item_call + label="Freeze" + name="Freeze..."> + <menu_item_call.on_click + function="Avatar.Freeze" /> + <menu_item_call.on_visible + function="Avatar.EnableFreezeEject"/> + </menu_item_call> + <menu_item_call + label="Eject" + name="Eject..."> + <menu_item_call.on_click + function="Avatar.Eject" /> + <menu_item_call.on_visible + function="Avatar.EnableFreezeEject"/> + </menu_item_call> + <menu_item_call + label="Debug Textures" + name="Debug..."> + <menu_item_call.on_click + function="Avatar.Debug" /> + <menu_item_call.on_visible + function="IsGodCustomerService"/> + </menu_item_call> + <menu_item_call + label="Zoom In" + name="Zoom In"> + <menu_item_call.on_click + function="Tools.LookAtSelection" + parameter="zoom" /> + </menu_item_call> + <menu_item_separator /> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/en/menu_attachment_self.xml b/indra/newview/skins/minimal/xui/en/menu_attachment_self.xml new file mode 100644 index 0000000000..542a7dc7dc --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_attachment_self.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu + layout="topleft" + name="Attachment Pie"> + <menu_item_call + enabled="false" + label="Touch" + layout="topleft" + name="Attachment Object Touch"> + <menu_item_call.on_click + function="Object.Touch" /> + <menu_item_call.on_enable + function="Object.EnableTouch" + name="EnableTouch"/> + </menu_item_call> + <menu_item_call + enabled="false" + label="Detach" + layout="topleft" + name="Detach"> + <menu_item_call.on_click + function="Attachment.Detach" /> + <menu_item_call.on_enable + function="Attachment.EnableDetach" /> + </menu_item_call> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/en/menu_avatar_icon.xml b/indra/newview/skins/minimal/xui/en/menu_avatar_icon.xml new file mode 100644 index 0000000000..d3d9e2ef8a --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_avatar_icon.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_avatar_other.xml b/indra/newview/skins/minimal/xui/en/menu_avatar_other.xml new file mode 100644 index 0000000000..b76629f401 --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_avatar_other.xml @@ -0,0 +1,75 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<!-- *NOTE: See also menu_attachment_other.xml --> +<context_menu + layout="topleft" + name="Avatar Pie"> + <menu_item_call + label="View Profile" + name="Profile..."> + <menu_item_call.on_click + function="ShowAgentProfile" + parameter="hit object" /> + </menu_item_call> + <menu_item_call + enabled="false" + label="Add Friend" + name="Add Friend"> + <menu_item_call.on_click + function="Avatar.AddFriend" /> + <menu_item_call.on_enable + function="Avatar.EnableAddFriend" /> + </menu_item_call> + <menu_item_call + label="IM" + name="Send IM..."> + <menu_item_call.on_click + function="Avatar.SendIM" /> + </menu_item_call> + <menu_item_separator /> + <menu_item_call + enabled="false" + label="Block" + name="Avatar Mute"> + <menu_item_call.on_click + function="Avatar.Mute" /> + <menu_item_call.on_enable + function="Avatar.EnableMute" /> + </menu_item_call> + <menu_item_call + label="Report" + name="abuse"> + <menu_item_call.on_click + function="Avatar.ReportAbuse" /> + </menu_item_call> + <menu_item_call + label="Freeze" + name="Freeze..."> + <menu_item_call.on_click + function="Avatar.Freeze" /> + <menu_item_call.on_visible + function="Avatar.EnableFreezeEject"/> + </menu_item_call> + <menu_item_call + label="Eject" + name="Eject..."> + <menu_item_call.on_click + function="Avatar.Eject" /> + <menu_item_call.on_visible + function="Avatar.EnableFreezeEject"/> + </menu_item_call> + <menu_item_call + label="Debug Textures" + name="Debug..."> + <menu_item_call.on_click + function="Avatar.Debug" /> + <menu_item_call.on_visible + function="IsGodCustomerService"/> + </menu_item_call> + <menu_item_call + label="Zoom In" + name="Zoom In"> + <menu_item_call.on_click + function="Tools.LookAtSelection" + parameter="zoom" /> + </menu_item_call> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/en/menu_avatar_self.xml b/indra/newview/skins/minimal/xui/en/menu_avatar_self.xml new file mode 100644 index 0000000000..fb19c5eb2c --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_avatar_self.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_bottomtray.xml b/indra/newview/skins/minimal/xui/en/menu_bottomtray.xml new file mode 100644 index 0000000000..d3d9e2ef8a --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_bottomtray.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_cof_attachment.xml b/indra/newview/skins/minimal/xui/en/menu_cof_attachment.xml new file mode 100644 index 0000000000..fb19c5eb2c --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_cof_attachment.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_cof_body_part.xml b/indra/newview/skins/minimal/xui/en/menu_cof_body_part.xml new file mode 100644 index 0000000000..fb19c5eb2c --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_cof_body_part.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_cof_clothing.xml b/indra/newview/skins/minimal/xui/en/menu_cof_clothing.xml new file mode 100644 index 0000000000..fb19c5eb2c --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_cof_clothing.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_cof_gear.xml b/indra/newview/skins/minimal/xui/en/menu_cof_gear.xml new file mode 100644 index 0000000000..28c4762eaa --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_cof_gear.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<toggleable_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_edit.xml b/indra/newview/skins/minimal/xui/en/menu_edit.xml new file mode 100644 index 0000000000..747eb3fc6a --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_edit.xml @@ -0,0 +1,90 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<menu create_jump_keys="true" + label="Edit" + name="Edit" + visible="false"> + <menu_item_call + label="Undo" + name="Undo" + shortcut="control|Z"> + <menu_item_call.on_click + function="Edit.Undo" /> + <menu_item_call.on_enable + function="Edit.EnableUndo" /> + </menu_item_call> + <menu_item_call + label="Redo" + name="Redo" + shortcut="control|Y"> + <menu_item_call.on_click + function="Edit.Redo" /> + <menu_item_call.on_enable + function="Edit.EnableRedo" /> + </menu_item_call> + <menu_item_separator/> + <menu_item_call + label="Cut" + name="Cut" + shortcut="control|X"> + <menu_item_call.on_click + function="Edit.Cut" /> + <menu_item_call.on_enable + function="Edit.EnableCut" /> + </menu_item_call> + <menu_item_call + label="Copy" + name="Copy" + shortcut="control|C"> + <menu_item_call.on_click + function="Edit.Copy" /> + <menu_item_call.on_enable + function="Edit.EnableCopy" /> + </menu_item_call> + <menu_item_call + label="Paste" + name="Paste" + shortcut="control|V"> + <menu_item_call.on_click + function="Edit.Paste" /> + <menu_item_call.on_enable + function="Edit.EnablePaste" /> + </menu_item_call> + <menu_item_call + label="Delete" + name="Delete" + allow_key_repeat="true" + shortcut="Del"> + <menu_item_call.on_click + function="Edit.Delete" /> + <menu_item_call.on_enable + function="Edit.EnableDelete" /> + </menu_item_call> + <menu_item_call + label="Duplicate" + name="Duplicate" + shortcut="control|D"> + <menu_item_call.on_click + function="Edit.Duplicate" /> + <menu_item_call.on_enable + function="Edit.EnableDuplicate" /> + </menu_item_call> + <menu_item_separator/> + <menu_item_call + label="Select All" + name="Select All" + shortcut="control|A"> + <menu_item_call.on_click + function="Edit.SelectAll" /> + <menu_item_call.on_enable + function="Edit.EnableSelectAll" /> + </menu_item_call> + <menu_item_call + label="Deselect" + name="Deselect" + shortcut="control|E"> + <menu_item_call.on_click + function="Edit.Deselect" /> + <menu_item_call.on_enable + function="Edit.EnableDeselect" /> + </menu_item_call> +</menu> \ No newline at end of file diff --git a/indra/newview/skins/minimal/xui/en/menu_favorites.xml b/indra/newview/skins/minimal/xui/en/menu_favorites.xml new file mode 100644 index 0000000000..d3d9e2ef8a --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_favorites.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_gesture_gear.xml b/indra/newview/skins/minimal/xui/en/menu_gesture_gear.xml new file mode 100644 index 0000000000..28c4762eaa --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_gesture_gear.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<toggleable_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_group_plus.xml b/indra/newview/skins/minimal/xui/en/menu_group_plus.xml new file mode 100644 index 0000000000..d3d9e2ef8a --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_group_plus.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_hide_navbar.xml b/indra/newview/skins/minimal/xui/en/menu_hide_navbar.xml new file mode 100644 index 0000000000..d3d9e2ef8a --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_hide_navbar.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_im_well_button.xml b/indra/newview/skins/minimal/xui/en/menu_im_well_button.xml new file mode 100644 index 0000000000..fb19c5eb2c --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_im_well_button.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_imchiclet_adhoc.xml b/indra/newview/skins/minimal/xui/en/menu_imchiclet_adhoc.xml new file mode 100644 index 0000000000..d3d9e2ef8a --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_imchiclet_adhoc.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_imchiclet_group.xml b/indra/newview/skins/minimal/xui/en/menu_imchiclet_group.xml new file mode 100644 index 0000000000..d3d9e2ef8a --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_imchiclet_group.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_imchiclet_p2p.xml b/indra/newview/skins/minimal/xui/en/menu_imchiclet_p2p.xml new file mode 100644 index 0000000000..d3d9e2ef8a --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_imchiclet_p2p.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_inspect_avatar_gear.xml b/indra/newview/skins/minimal/xui/en/menu_inspect_avatar_gear.xml new file mode 100644 index 0000000000..5a4a059781 --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_inspect_avatar_gear.xml @@ -0,0 +1,116 @@ +<?xml version="1.0" encoding="utf-8"?> +<toggleable_menu + create_jump_keys="true" + layout="topleft" + mouse_opaque="false" + visible="false" + name="Gear Menu"> + <menu_item_call + label="View Profile" + enabled="true" + name="view_profile"> + <menu_item_call.on_click + function="InspectAvatar.ViewProfile"/> + </menu_item_call> + <menu_item_call + label="Add Friend" + name="add_friend"> + <menu_item_call.on_click + function="InspectAvatar.AddFriend"/> + <menu_item_call.on_enable + function="InspectAvatar.Gear.Enable"/> + </menu_item_call> + <menu_item_call + label="IM" + name="im"> + <menu_item_call.on_click + function="InspectAvatar.IM"/> + </menu_item_call> + <menu_item_call + label="Teleport" + name="teleport"> + <menu_item_call.on_click + function="InspectAvatar.Teleport"/> + <menu_item_call.on_enable + function="InspectAvatar.Gear.EnableTeleportOffer"/> + </menu_item_call> + <menu_item_separator /> + <menu_item_call + label="Block" + name="block"> + <menu_item_call.on_click + function="InspectAvatar.ToggleMute"/> + <menu_item_call.on_visible + function="InspectAvatar.EnableMute" /> + </menu_item_call> + <menu_item_call + label="Unblock" + name="unblock"> + <menu_item_call.on_click + function="InspectAvatar.ToggleMute"/> + <menu_item_call.on_visible + function="InspectAvatar.EnableUnmute" /> + </menu_item_call> + <menu_item_call + label="Report" + name="report"> + <menu_item_call.on_click + function="InspectAvatar.Report"/> + </menu_item_call> + <menu_item_call + label="Freeze" + name="freeze"> + <menu_item_call.on_click + function="InspectAvatar.Freeze"/> + <menu_item_call.on_visible + function="InspectAvatar.VisibleFreeze"/> + </menu_item_call> + <menu_item_call + label="Eject" + name="eject"> + <menu_item_call.on_click + function="InspectAvatar.Eject"/> + <menu_item_call.on_visible + function="InspectAvatar.VisibleEject"/> + </menu_item_call> + <menu_item_call + label="Kick" + name="kick"> + <menu_item_call.on_click + function="InspectAvatar.Kick"/> + <menu_item_call.on_visible + function="InspectAvatar.EnableGod"/> + </menu_item_call> + <menu_item_call + label="CSR" + name="csr"> + <menu_item_call.on_click + function="InspectAvatar.CSR" /> + <menu_item_call.on_visible + function="InspectAvatar.EnableGod" /> + </menu_item_call> + <menu_item_call + label="Debug Textures" + name="debug"> + <menu_item_call.on_click + function="Avatar.Debug"/> + <menu_item_call.on_visible + function="IsGodCustomerService"/> + </menu_item_call> + <menu_item_call + label="Find On Map" + name="find_on_map"> + <menu_item_call.on_click + function="InspectAvatar.FindOnMap"/> + <menu_item_call.on_visible + function="InspectAvatar.VisibleFindOnMap"/> + </menu_item_call> + <menu_item_call + label="Zoom In" + name="zoom_in"> + <menu_item_call.on_click + function="InspectAvatar.ZoomIn"/> + <menu_item_call.on_visible + function="InspectAvatar.VisibleZoomIn"/> + </menu_item_call> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/en/menu_inspect_object_gear.xml b/indra/newview/skins/minimal/xui/en/menu_inspect_object_gear.xml new file mode 100644 index 0000000000..8ec360a604 --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_inspect_object_gear.xml @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="utf-8"?> +<toggleable_menu + create_jump_keys="true" + layout="topleft" + mouse_opaque="false" + visible="false" + name="Gear Menu"> + <menu_item_call + label="Touch" + layout="topleft" + enabled="true" + name="touch"> + <menu_item_call.on_click + function="InspectObject.Touch"/> + <menu_item_call.on_visible + function="Object.EnableTouch" /> + </menu_item_call> + <menu_item_call + label="Sit" + layout="topleft" + name="sit"> + <menu_item_call.on_click + function="InspectObject.Sit"/> + <menu_item_call.on_visible + function="Object.EnableSit"/> + </menu_item_call> + <menu_item_call + label="Report" + layout="topleft" + name="report"> + <menu_item_call.on_click + function="Object.ReportAbuse" /> + </menu_item_call> + <menu_item_call + label="Block" + layout="topleft" + name="block"> + <menu_item_call.on_click + function="Object.Mute" /> + <menu_item_call.on_visible + function="Object.EnableMute" /> + </menu_item_call> + <menu_item_call + label="Zoom In" + layout="topleft" + name="zoom_in"> + <menu_item_call.on_click + function="InspectObject.ZoomIn" /> + </menu_item_call> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/en/menu_inspect_self_gear.xml b/indra/newview/skins/minimal/xui/en/menu_inspect_self_gear.xml new file mode 100644 index 0000000000..ae8b640d26 --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_inspect_self_gear.xml @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<toggleable_menu + layout="topleft" + name="Self Pie"> + <menu_item_call + label="Sit Down" + layout="topleft" + name="Sit Down Here"> + <menu_item_call.on_click + function="Self.SitDown" + parameter="" /> + <menu_item_call.on_enable + function="Self.EnableSitDown" /> + </menu_item_call> + <menu_item_call + label="Stand Up" + layout="topleft" + name="Stand Up"> + <menu_item_call.on_click + function="Self.StandUp" + parameter="" /> + <menu_item_call.on_enable + function="Self.EnableStandUp" /> + </menu_item_call> + <menu_item_call + label="My Friends" + layout="topleft" + name="Friends..."> + <menu_item_call.on_click + function="SideTray.PanelPeopleTab" + parameter="friends_panel" /> + </menu_item_call> + <menu_item_call + label="My Profile" + layout="topleft" + name="Profile..."> + <menu_item_call.on_click + function="ShowAgentProfile" + parameter="agent" /> + </menu_item_call> + <menu_item_call + label="Debug Textures" + name="Debug..."> + <menu_item_call.on_click + function="Avatar.Debug" /> + <menu_item_call.on_visible + function="IsGodCustomerService"/> + </menu_item_call> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/en/menu_inv_offer_chiclet.xml b/indra/newview/skins/minimal/xui/en/menu_inv_offer_chiclet.xml new file mode 100644 index 0000000000..d3d9e2ef8a --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_inv_offer_chiclet.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_inventory.xml b/indra/newview/skins/minimal/xui/en/menu_inventory.xml new file mode 100644 index 0000000000..d3d9e2ef8a --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_inventory.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_inventory_add.xml b/indra/newview/skins/minimal/xui/en/menu_inventory_add.xml new file mode 100644 index 0000000000..d3d9e2ef8a --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_inventory_add.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_inventory_gear_default.xml b/indra/newview/skins/minimal/xui/en/menu_inventory_gear_default.xml new file mode 100644 index 0000000000..28c4762eaa --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_inventory_gear_default.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<toggleable_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_land.xml b/indra/newview/skins/minimal/xui/en/menu_land.xml new file mode 100644 index 0000000000..fb19c5eb2c --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_land.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_landmark.xml b/indra/newview/skins/minimal/xui/en/menu_landmark.xml new file mode 100644 index 0000000000..28c4762eaa --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_landmark.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<toggleable_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_login.xml b/indra/newview/skins/minimal/xui/en/menu_login.xml new file mode 100644 index 0000000000..62dbce3f56 --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_login.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<menu_bar/> diff --git a/indra/newview/skins/minimal/xui/en/menu_mini_map.xml b/indra/newview/skins/minimal/xui/en/menu_mini_map.xml new file mode 100644 index 0000000000..d3d9e2ef8a --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_mini_map.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_navbar.xml b/indra/newview/skins/minimal/xui/en/menu_navbar.xml new file mode 100644 index 0000000000..d3d9e2ef8a --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_navbar.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_nearby_chat.xml b/indra/newview/skins/minimal/xui/en/menu_nearby_chat.xml new file mode 100644 index 0000000000..d3d9e2ef8a --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_nearby_chat.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_notification_well_button.xml b/indra/newview/skins/minimal/xui/en/menu_notification_well_button.xml new file mode 100644 index 0000000000..fb19c5eb2c --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_notification_well_button.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_object.xml b/indra/newview/skins/minimal/xui/en/menu_object.xml new file mode 100644 index 0000000000..888ce42cf1 --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_object.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu + layout="topleft" + name="Object Pie"> + <menu_item_call + enabled="false" + label="Sit Here" + name="Object Sit"> + <menu_item_call.on_click + function="Object.SitOrStand" /> + <menu_item_call.on_enable + function="Object.EnableSit" /> + </menu_item_call> + <menu_item_call + enabled="false" + label="Stand Up" + name="Object Stand Up"> + <menu_item_call.on_click + function="Object.SitOrStand" /> + <menu_item_call.on_enable + function="Object.EnableStandUp" /> + </menu_item_call> + <menu_item_call + label="Zoom In" + name="Zoom In"> + <menu_item_call.on_click + function="Object.ZoomIn" /> + </menu_item_call> + <menu_item_call + enabled="false" + label="Touch" + name="Object Touch"> + <menu_item_call.on_click + function="Object.Touch" /> + <menu_item_call.on_enable + function="Object.EnableTouch" + name="EnableTouch" + parameter="Touch" /> + </menu_item_call> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/en/menu_object_icon.xml b/indra/newview/skins/minimal/xui/en/menu_object_icon.xml new file mode 100644 index 0000000000..d3d9e2ef8a --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_object_icon.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_outfit_gear.xml b/indra/newview/skins/minimal/xui/en/menu_outfit_gear.xml new file mode 100644 index 0000000000..28c4762eaa --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_outfit_gear.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<toggleable_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_outfit_tab.xml b/indra/newview/skins/minimal/xui/en/menu_outfit_tab.xml new file mode 100644 index 0000000000..fb19c5eb2c --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_outfit_tab.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_participant_list.xml b/indra/newview/skins/minimal/xui/en/menu_participant_list.xml new file mode 100644 index 0000000000..fb19c5eb2c --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_participant_list.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_people_friends_view_sort.xml b/indra/newview/skins/minimal/xui/en/menu_people_friends_view_sort.xml new file mode 100644 index 0000000000..28c4762eaa --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_people_friends_view_sort.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<toggleable_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_people_groups.xml b/indra/newview/skins/minimal/xui/en/menu_people_groups.xml new file mode 100644 index 0000000000..d3d9e2ef8a --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_people_groups.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_people_groups_view_sort.xml b/indra/newview/skins/minimal/xui/en/menu_people_groups_view_sort.xml new file mode 100644 index 0000000000..28c4762eaa --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_people_groups_view_sort.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<toggleable_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_people_nearby.xml b/indra/newview/skins/minimal/xui/en/menu_people_nearby.xml new file mode 100644 index 0000000000..3d64133f54 --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_people_nearby.xml @@ -0,0 +1,61 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu + layout="topleft" + name="Avatar Context Menu"> + <menu_item_call + label="View Profile" + layout="topleft" + name="View Profile"> + <menu_item_call.on_click + function="Avatar.Profile" /> + </menu_item_call> + <menu_item_call + label="Add Friend" + layout="topleft" + name="Add Friend"> + <menu_item_call.on_click + function="Avatar.AddFriend" /> + <menu_item_call.on_enable + function="Avatar.EnableItem" + parameter="can_add" /> + </menu_item_call> + <menu_item_call + label="Remove Friend" + layout="topleft" + name="Remove Friend"> + <menu_item_call.on_click + function="Avatar.RemoveFriend" /> + <menu_item_call.on_enable + function="Avatar.EnableItem" + parameter="can_delete" /> + </menu_item_call> + <menu_item_call + label="IM" + layout="topleft" + name="IM"> + <menu_item_call.on_click + function="Avatar.IM" /> + </menu_item_call> + <menu_item_check + label="Block/Unblock" + layout="topleft" + name="Block/Unblock"> + <menu_item_check.on_click + function="Avatar.BlockUnblock" /> + <menu_item_check.on_check + function="Avatar.CheckItem" + parameter="is_blocked" /> + <menu_item_check.on_enable + function="Avatar.EnableItem" + parameter="can_block" /> + </menu_item_check> + <menu_item_call + label="Offer Teleport" + name="teleport"> + <menu_item_call.on_click + function="Avatar.OfferTeleport"/> + <menu_item_call.on_enable + function="Avatar.EnableItem" + parameter="can_offer_teleport"/> + </menu_item_call> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/en/menu_people_nearby_multiselect.xml b/indra/newview/skins/minimal/xui/en/menu_people_nearby_multiselect.xml new file mode 100644 index 0000000000..fb19c5eb2c --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_people_nearby_multiselect.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_people_nearby_view_sort.xml b/indra/newview/skins/minimal/xui/en/menu_people_nearby_view_sort.xml new file mode 100644 index 0000000000..28c4762eaa --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_people_nearby_view_sort.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<toggleable_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_people_recent_view_sort.xml b/indra/newview/skins/minimal/xui/en/menu_people_recent_view_sort.xml new file mode 100644 index 0000000000..28c4762eaa --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_people_recent_view_sort.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<toggleable_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_picks.xml b/indra/newview/skins/minimal/xui/en/menu_picks.xml new file mode 100644 index 0000000000..fb19c5eb2c --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_picks.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_picks_plus.xml b/indra/newview/skins/minimal/xui/en/menu_picks_plus.xml new file mode 100644 index 0000000000..28c4762eaa --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_picks_plus.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<toggleable_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_place.xml b/indra/newview/skins/minimal/xui/en/menu_place.xml new file mode 100644 index 0000000000..28c4762eaa --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_place.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<toggleable_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_place_add_button.xml b/indra/newview/skins/minimal/xui/en/menu_place_add_button.xml new file mode 100644 index 0000000000..d3d9e2ef8a --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_place_add_button.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_places_gear_folder.xml b/indra/newview/skins/minimal/xui/en/menu_places_gear_folder.xml new file mode 100644 index 0000000000..28c4762eaa --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_places_gear_folder.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<toggleable_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_places_gear_landmark.xml b/indra/newview/skins/minimal/xui/en/menu_places_gear_landmark.xml new file mode 100644 index 0000000000..28c4762eaa --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_places_gear_landmark.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<toggleable_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_profile_overflow.xml b/indra/newview/skins/minimal/xui/en/menu_profile_overflow.xml new file mode 100644 index 0000000000..28c4762eaa --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_profile_overflow.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<toggleable_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_save_outfit.xml b/indra/newview/skins/minimal/xui/en/menu_save_outfit.xml new file mode 100644 index 0000000000..28c4762eaa --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_save_outfit.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<toggleable_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_script_chiclet.xml b/indra/newview/skins/minimal/xui/en/menu_script_chiclet.xml new file mode 100644 index 0000000000..d3d9e2ef8a --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_script_chiclet.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_slurl.xml b/indra/newview/skins/minimal/xui/en/menu_slurl.xml new file mode 100644 index 0000000000..d3d9e2ef8a --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_slurl.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_teleport_history_gear.xml b/indra/newview/skins/minimal/xui/en/menu_teleport_history_gear.xml new file mode 100644 index 0000000000..28c4762eaa --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_teleport_history_gear.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<toggleable_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_teleport_history_item.xml b/indra/newview/skins/minimal/xui/en/menu_teleport_history_item.xml new file mode 100644 index 0000000000..fb19c5eb2c --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_teleport_history_item.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_teleport_history_tab.xml b/indra/newview/skins/minimal/xui/en/menu_teleport_history_tab.xml new file mode 100644 index 0000000000..fb19c5eb2c --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_teleport_history_tab.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_text_editor.xml b/indra/newview/skins/minimal/xui/en/menu_text_editor.xml new file mode 100644 index 0000000000..fb19c5eb2c --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_text_editor.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_topinfobar.xml b/indra/newview/skins/minimal/xui/en/menu_topinfobar.xml new file mode 100644 index 0000000000..d3d9e2ef8a --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_topinfobar.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_url_agent.xml b/indra/newview/skins/minimal/xui/en/menu_url_agent.xml new file mode 100644 index 0000000000..fb19c5eb2c --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_url_agent.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_url_group.xml b/indra/newview/skins/minimal/xui/en/menu_url_group.xml new file mode 100644 index 0000000000..fb19c5eb2c --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_url_group.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_url_http.xml b/indra/newview/skins/minimal/xui/en/menu_url_http.xml new file mode 100644 index 0000000000..fb19c5eb2c --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_url_http.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_url_inventory.xml b/indra/newview/skins/minimal/xui/en/menu_url_inventory.xml new file mode 100644 index 0000000000..fb19c5eb2c --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_url_inventory.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_url_map.xml b/indra/newview/skins/minimal/xui/en/menu_url_map.xml new file mode 100644 index 0000000000..fb19c5eb2c --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_url_map.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_url_objectim.xml b/indra/newview/skins/minimal/xui/en/menu_url_objectim.xml new file mode 100644 index 0000000000..fb19c5eb2c --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_url_objectim.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_url_parcel.xml b/indra/newview/skins/minimal/xui/en/menu_url_parcel.xml new file mode 100644 index 0000000000..fb19c5eb2c --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_url_parcel.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_url_slapp.xml b/indra/newview/skins/minimal/xui/en/menu_url_slapp.xml new file mode 100644 index 0000000000..fb19c5eb2c --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_url_slapp.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_url_slurl.xml b/indra/newview/skins/minimal/xui/en/menu_url_slurl.xml new file mode 100644 index 0000000000..fb19c5eb2c --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_url_slurl.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_url_teleport.xml b/indra/newview/skins/minimal/xui/en/menu_url_teleport.xml new file mode 100644 index 0000000000..fb19c5eb2c --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_url_teleport.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_viewer.xml b/indra/newview/skins/minimal/xui/en/menu_viewer.xml new file mode 100644 index 0000000000..cd83ea4e99 --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_viewer.xml @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<menu_bar + bg_visible="false" + follows="left|top|right" + name="Main Menu"> + <menu + create_jump_keys="true" + label="Help" + name="Help" + tear_off="true"> + <menu_item_call + label="[SECOND_LIFE] Help" + name="Second Life Help" + shortcut="F1"> + <menu_item_call.on_click + function="ShowHelp" + parameter="f1_help" /> + </menu_item_call> + </menu> + <menu + create_jump_keys="true" + label="Advanced" + name="Advanced" + tear_off="true" + visible="false"> + <menu + create_jump_keys="true" + label="Shortcuts" + name="Shortcuts" + tear_off="true" + visible="false"> + <menu_item_check + label="Fly" + name="Fly" + shortcut="Home"> + <menu_item_check.on_check + function="Agent.getFlying" /> + <menu_item_check.on_click + function="Agent.toggleFlying" /> + <menu_item_check.on_enable + function="Agent.enableFlying" /> + </menu_item_check> + <menu_item_call + label="Close Window" + name="Close Window" + shortcut="control|W"> + <menu_item_call.on_click + function="File.CloseWindow" /> + <menu_item_call.on_enable + function="File.EnableCloseWindow" /> + </menu_item_call> + <menu_item_call + label="Close All Windows" + name="Close All Windows" + shortcut="control|shift|W"> + <menu_item_call.on_click + function="File.CloseAllWindows" /> + <menu_item_call.on_enable + function="File.EnableCloseAllWindows" /> + </menu_item_call> + + <menu_item_call + label="Reset View" + name="Reset View" + shortcut="Esc"> + <menu_item_call.on_click + function="View.ResetView" /> + </menu_item_call> + </menu> <!--Shortcuts--> + </menu> +</menu_bar> diff --git a/indra/newview/skins/minimal/xui/en/menu_wearable_list_item.xml b/indra/newview/skins/minimal/xui/en/menu_wearable_list_item.xml new file mode 100644 index 0000000000..fb19c5eb2c --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_wearable_list_item.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_wearing_gear.xml b/indra/newview/skins/minimal/xui/en/menu_wearing_gear.xml new file mode 100644 index 0000000000..28c4762eaa --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_wearing_gear.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<toggleable_menu/> diff --git a/indra/newview/skins/minimal/xui/en/menu_wearing_tab.xml b/indra/newview/skins/minimal/xui/en/menu_wearing_tab.xml new file mode 100644 index 0000000000..fb19c5eb2c --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/menu_wearing_tab.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu/> diff --git a/indra/newview/skins/minimal/xui/en/notification_visibility.xml b/indra/newview/skins/minimal/xui/en/notification_visibility.xml new file mode 100644 index 0000000000..616b544847 --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/notification_visibility.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" ?> +<notification_visibility> + <respond name="VoiceInviteP2P" response="Decline"/> + <respond name="VoiceInviteAdHoc" response="Decline"/> + <respond name="VoiceInviteGroup" response="Decline"/> + + <!-- group and voice are disabled features --> + <hide tag="group"/> + <hide tag="voice"/> + + <!-- no spammy scripts --> + <!-- <hide name="ScriptDialog"/> --> + + <!-- hints pertaining to UI we don't show --> + <hide name="FirstBalanceIncrease"/> + <hide name="FirstInventory"/> + <hide name="HintSidePanel"/> + <hide name="HintMove"/> + <hide name="HintDisplayName"/> + <hide name="HintInventory"/> + <hide name="HintLindenDollar"/> + + <!-- spam from servers, such as "Autopilot cancelled" --> + <hide name="SystemMessageTip"/> + + <!-- show everything else --> + <show/> +</notification_visibility> + diff --git a/indra/newview/skins/minimal/xui/en/notifications.xml b/indra/newview/skins/minimal/xui/en/notifications.xml new file mode 100644 index 0000000000..84da9472cc --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/notifications.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" ?> +<notifications> + <notification + icon="notify.tga" + name="UserGiveItem" + type="offer"> + [NAME_SLURL] is offering you [ITEM_SLURL]. Using this item requires you to switch to Advanced mode where you will find the item in your Inventory. To switch to Advanced mode, quit and restart this application and change the mode setting on the login screen. + <form name="form"> + <button + index="4" + name="Show" + text="Keep Item"/> + <button + index="1" + name="Discard" + text="Reject Item"/> + <button + index="2" + name="Mute" + text="Block User"/> + </form> + </notification> + <notification + icon="notify.tga" + name="ObjectGiveItem" + type="offer"> + An object named <nolink>[OBJECTFROMNAME]</nolink> owned by [NAME_SLURL] is offering you [ITEM_SLURL]. Using this item requires you to switch to Advanced mode where you will find the item in your Inventory. To switch to Advanced mode, quit and restart this application and change the mode setting on the login screen. + <form name="form"> + <button + index="0" + name="Keep" + text="Keep Item"/> + <button + index="1" + name="Discard" + text="Reject Item"/> + <button + index="2" + name="Mute" + text="Block Object"/> + </form> + </notification> + +</notifications> diff --git a/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml new file mode 100644 index 0000000000..5730adab8a --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + border="false" + follows="all" + height="215" + name="panel_im_control_panel" + width="150"> + <layout_stack + mouse_opaque="false" + border_size="0" + clip="false" + follows="all" + height="215" + layout="topleft" + left="3" + name="vertical_stack" + orientation="vertical" + top="0" + width="147"> + <layout_panel + auto_resize="true" + follows="top|left" + height="130" + layout="topleft" + left="0" + min_height="0" + mouse_opaque="false" + width="147" + top="0" + name="speakers_list_panel" + user_resize="false"> + <avatar_list + color="DkGray2" + follows="all" + height="130" + ignore_online_status="true" + layout="topleft" + name="speakers_list" + opaque="false" + show_info_btn="true" + show_profile_btn="false" + show_speaking_indicator="false" + width="147" /> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml new file mode 100644 index 0000000000..e0c0bd13d9 --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml @@ -0,0 +1,483 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + background_visible="true" + bg_alpha_color="DkGray" + bg_opaque_color="DkGray" + chrome="true" + follows="left|bottom|right" + height="33" + layout="topleft" + left="0" + name="bottom_tray" + focus_root="true" + top="28" + width="1310"> + <string + name="DragIndicationImageName" + value="Accordion_ArrowOpened_Off" /> + <string + name="SpeakBtnToolTip" + value="Turns microphone on/off" /> + <string + name="VoiceControlBtnToolTip" + value="Shows/hides voice control panel" /> + <layout_stack + border_size="0" + clip="false" + follows="all" + height="28" + layout="topleft" + left="0" + mouse_opaque="false" + name="toolbar_stack" + orientation="horizontal" + top="0" + width="1310"> + <layout_panel + auto_resize="false" + user_resize="false" + min_width="2" + width="2" /> + <layout_panel + auto_resize="false" + layout="topleft" + max_width="320" + min_width="214" + height="28" + mouse_opaque="false" + name="chat_bar_layout_panel" + user_resize="true" + width="308" > + <panel + name="chat_bar" + filename="panel_nearby_chat_bar.xml" + left="0" + height="28" + width="306" + top="0" + mouse_opaque="false" + follows="left|right" + /> + </layout_panel> + <layout_panel + auto_resize="false" + follows="right" + height="28" + layout="topleft" + min_height="28" + min_width="65" + mouse_opaque="false" + name="gesture_panel" + top_delta="0" + user_resize="false" + width="85"> + <gesture_combo_list + follows="left|right" + height="23" + label="Gesture" + layout="topleft" + get_more="false" + view_all="false" + left="0" + name="Gesture" + tool_tip="Shows/hides gestures" + top="5" + width="82"> + <combo_button + pad_right="10" + can_drag="false" + use_ellipses="true" /> + <combo_list + page_lines="17" /> + </gesture_combo_list> + </layout_panel> + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_height="28" + min_width="52" + mouse_opaque="false" + name="cam_panel" + user_resize="false" + width="83"> + <bottomtray_button + can_drag="false" + follows="left|right" + height="23" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + is_toggle="true" + label="View" + layout="topleft" + left="0" + name="camera_btn" + tool_tip="Shows/hides camera controls" + top="5" + use_ellipses="true" + width="80"> + <init_callback + function="Button.SetDockableFloaterToggle" + parameter="camera" /> + </bottomtray_button> + </layout_panel> + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_width="17" + name="splitter_panel" + user_resize="false" + width="17"> + <icon + follows="left|bottom" + height="18" + width="2" + left="6" + image_name="Button_Separator" + name="separator" + top="7"/> + </layout_panel> + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_height="28" + min_width="83" + mouse_opaque="false" + name="avatar_and_destinations_panel" + user_resize="false" + width="103"> + <bottomtray_button + can_drag="false" + follows="left|right" + height="23" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + label="Destinations" + layout="topleft" + left="0" + name="destination_btn" + tool_tip="Shows destinations window" + top="5" + is_toggle="true" + use_ellipses="true" + width="100"> + <bottomtray_button.commit_callback + function="Destination.show" /> + </bottomtray_button> + </layout_panel> + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_height="28" + min_width="73" + mouse_opaque="false" + name="avatar_and_destinations_panel" + user_resize="false" + width="103"> + <bottomtray_button + can_drag="false" + follows="left|right" + height="23" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + label="My Avatar" + layout="topleft" + left="0" + name="avatar_btn" + top="5" + is_toggle="true" + use_ellipses="true" + width="100"> + <bottomtray_button.commit_callback + function="Avatar.show" /> + </bottomtray_button> + </layout_panel> + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_width="17" + name="splitter_panel" + user_resize="false" + width="17"> + <icon + follows="left|bottom" + height="18" + width="2" + left="6" + image_name="Button_Separator" + name="separator" + top="7"/> + </layout_panel> + <layout_panel + auto_resize="false" + follows="right" + height="28" + layout="topleft" + min_height="28" + min_width="65" + mouse_opaque="false" + name="people_panel" + top_delta="0" + user_resize="false" + width="105"> + <bottomtray_button + can_drag="false" + follows="left|right" + height="23" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + label="People" + layout="topleft" + left="0" + name="show_people_button" + tool_tip="Shows people window" + top="5" + is_toggle="true" + use_ellipses="true" + width="100"> + <bottomtray_button.commit_callback + function="ShowSidetrayPanel" + parameter="panel_people" /> + </bottomtray_button> + </layout_panel> + <layout_panel + auto_resize="false" + follows="right" + height="28" + layout="topleft" + min_height="28" + min_width="65" + mouse_opaque="false" + name="profile_panel" + top_delta="0" + user_resize="false" + width="105"> + <bottomtray_button + can_drag="false" + follows="left|right" + height="23" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + label="Profile" + layout="topleft" + left="0" + name="show_profile_btn" + tool_tip="Shows profile window" + is_toggle="true" + top="5" + use_ellipses="true" + width="100"> + <bottomtray_button.commit_callback + function="ToggleAgentProfile" + parameter="agent"/> + </bottomtray_button> + </layout_panel> + <layout_panel + auto_resize="false" + follows="right" + height="28" + layout="topleft" + min_height="28" + min_width="65" + mouse_opaque="false" + name="howto_panel" + top_delta="0" + user_resize="false" + width="105"> + <bottomtray_button + can_drag="false" + follows="left|right" + height="23" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + label="How To" + layout="topleft" + left="0" + name="show_help_btn" + tool_tip="Open Second Life How To topics" + is_toggle="true" + top="5" + use_ellipses="true" + width="100"> + <bottomtray_button.commit_callback + function="ToggleHelp" + parameter="f1_help" /> + </bottomtray_button> + </layout_panel> + <layout_panel + follows="left|right" + height="30" + layout="topleft" + min_width="95" + mouse_opaque="false" + name="chiclet_list_panel" + top="0" + user_resize="false" + width="189"> + <!--*NOTE: min_width of the chiclet_panel (chiclet_list) must be the same +as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. EXT-991--> + <chiclet_panel + chiclet_padding="4" + follows="left|right" + height="24" + layout="topleft" + left="1" + min_width="95" + mouse_opaque="false" + name="chiclet_list" + top="7" + width="189"> + <button + auto_resize="true" + follows="right" + height="29" + image_hover_selected="SegmentedBtn_Left_Over" + image_hover_unselected="SegmentedBtn_Left_Over" + image_overlay="Arrow_Small_Left" + image_pressed="SegmentedBtn_Left_Press" + image_pressed_selected="SegmentedBtn_Left_Press" + image_selected="SegmentedBtn_Left_Off" + image_unselected="SegmentedBtn_Left_Off" + layout="topleft" + name="chicklet_left_scroll_button" + tab_stop="false" + top="-28" + visible="false" + width="7" /> + <button + auto_resize="true" + follows="right" + height="29" + image_hover_selected="SegmentedBtn_Right_Over" + image_hover_unselected="SegmentedBtn_Right_Over" + image_overlay="Arrow_Small_Right" + image_pressed="SegmentedBtn_Right_Press" + image_pressed_selected="SegmentedBtn_Right_Press" + image_selected="SegmentedBtn_Right_Off" + image_unselected="SegmentedBtn_Right_Off" + layout="topleft" + name="chicklet_right_scroll_button" + tab_stop="false" + top="-28" + visible="false" + width="7" /> + </chiclet_panel> + </layout_panel> + <layout_panel auto_resize="false" + user_resize="false" + width="4" + min_width="4"/> + <layout_panel + auto_resize="false" + follows="right" + height="28" + layout="topleft" + min_height="28" + min_width="37" + name="im_well_panel" + top="0" + user_resize="false" + width="37"> + <chiclet_im_well + follows="right" + height="28" + layout="topleft" + left="0" + max_displayed_count="99" + name="im_well" + top="0" + width="35"> + <!-- +Emulate 4 states of button by background images, see details in EXT-3147. The same should be for notification_well button +xml attribute Description +image_unselected "Unlit" - there are no new messages +image_selected "Unlit" + "Selected" - there are no new messages and the Well is open +image_pressed "Lit" - there are new messages +image_pressed_selected "Lit" + "Selected" - there are new messages and the Well is open + --> + <button + auto_resize="true" + follows="right" + halign="center" + height="23" + image_overlay="Unread_IM" + image_overlay_alignment="center" + image_pressed="WellButton_Lit" + image_pressed_selected="WellButton_Lit_Selected" + image_selected="PushButton_Press" + label_color="Black" + left="0" + name="Unread IM messages" + tool_tip="Conversations" + width="34"> + <init_callback + function="Button.SetDockableFloaterToggle" + parameter="im_well_window" /> + </button> + </chiclet_im_well> + </layout_panel> + <layout_panel + auto_resize="false" + follows="right" + height="28" + layout="topleft" + min_height="28" + min_width="37" + name="notification_well_panel" + top="0" + user_resize="false" + width="37"> + <chiclet_notification + follows="right" + height="23" + layout="topleft" + left="0" + max_displayed_count="99" + name="notification_well" + top="5" + width="35"> + <button + auto_resize="true" + bottom_pad="3" + follows="right" + halign="center" + height="23" + image_overlay="Notices_Unread" + image_overlay_alignment="center" + image_pressed="WellButton_Lit" + image_pressed_selected="WellButton_Lit_Selected" + image_selected="PushButton_Press" + label_color="Black" + left="0" + name="Unread" + tool_tip="Notifications" + width="34"> + <init_callback + function="Button.SetDockableFloaterToggle" + parameter="notification_well_window" /> + </button> + </chiclet_notification> + </layout_panel> + <layout_panel + auto_resize="false" + user_resize="false" + min_width="4" + name="DUMMY2" + width="8" /> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/en/panel_group_control_panel.xml b/indra/newview/skins/minimal/xui/en/panel_group_control_panel.xml new file mode 100644 index 0000000000..abddc59296 --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/panel_group_control_panel.xml @@ -0,0 +1,79 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + border="false" + follows="all" + height="238" + name="panel_im_control_panel" + width="150"> + <layout_stack + mouse_opaque="false" + border_size="0" + clip="false" + follows="all" + height="238" + layout="topleft" + left="5" + name="vertical_stack" + orientation="vertical" + top="0" + width="145"> + <layout_panel + auto_resize="true" + follows="top|left" + height="100" + layout="topleft" + min_height="0" + mouse_opaque="false" + width="145" + top="0" + name="speakers_list_panel" + user_resize="false"> + <avatar_list + color="DkGray2" + follows="all" + height="100" + ignore_online_status="true" + layout="topleft" + name="speakers_list" + opaque="false" + show_info_btn="true" + show_profile_btn="false" + show_speaking_indicator="false" + width="145" /> + </layout_panel> + <layout_panel + auto_resize="false" + follows="top|left|right" + height="28" + layout="topleft" + min_height="28" + width="130" + name="end_call_btn_panel" + user_resize="false" + visible="false"> + <button + follows="all" + height="23" + label="Leave Call" + name="end_call_btn" + use_ellipses="true" /> + </layout_panel> + <layout_panel + auto_resize="false" + follows="top|left|right" + height="28" + layout="topleft" + min_height="28" + width="130" + name="voice_ctrls_btn_panel" + user_resize="false" + visible="false"> + <button + follows="all" + height="23" + label="Open Voice Controls" + name="voice_ctrls_btn" + use_ellipses="true" /> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml new file mode 100644 index 0000000000..c3f46f11e0 --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml @@ -0,0 +1,91 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + border="false" + height="300" + name="panel_im_control_panel" + width="150"> + <avatar_icon + follows="left|top" + height="105" + left_delta="20" + name="avatar_icon" + top="-5" + width="114"/> + <layout_stack + mouse_opaque="false" + border_size="0" + clip="false" + follows="all" + height="183" + layout="topleft" + left="5" + name="button_stack" + orientation="vertical" + top_pad="5" + width="145"> + <layout_panel + auto_resize="false" + follows="top|left|right" + height="20" + layout="topleft" + left="2" + min_height="20" + width="140" + name="view_profile_btn_panel" + top="0" + user_resize="false"> + <button + follows="left|top|right" + height="23" + label="Profile" + name="view_profile_btn" + top="0" + width="140" /> + </layout_panel> + <layout_panel + auto_resize="false" + follows="top|left|right" + height="25" + layout="topleft" + min_height="25" + width="140" + name="add_friend_btn_panel" + user_resize="false"> + <button + follows="left|top|right" + height="23" + label="Add Friend" + name="add_friend_btn" + top="5" + width="140" /> + </layout_panel> + <layout_panel + auto_resize="false" + follows="top|left|right" + height="25" + layout="topleft" + min_height="25" + width="140" + name="teleport_btn_panel" + user_resize="false"> + <button + auto_resize="false" + follows="left|top|right" + height="23" + label="Teleport" + name="teleport_btn" + tool_tip = "Offer to teleport this person" + width="140" /> + </layout_panel> + <layout_panel + mouse_opaque="false" + auto_resize="true" + follows="top|left" + height="0" + layout="topleft" + min_height="0" + width="140" + name="spacer" + user_resize="false" /> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/en/panel_login.xml b/indra/newview/skins/minimal/xui/en/panel_login.xml new file mode 100644 index 0000000000..3903658e71 --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/panel_login.xml @@ -0,0 +1,205 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel +follows="all" +height="600" +layout="topleft" +left="0" +name="panel_login" +focus_root="true" +top="600" + width="996"> +<panel.string + name="create_account_url"> + http://join.secondlife.com/ +</panel.string> +<string name="reg_in_client_url" translate="false"> + http://secondlife.eniac15.lindenlab.com/reg-in-client/ +</string> +<panel.string + name="forgot_password_url"> + http://secondlife.com/account/request.php +</panel.string> +<!-- *NOTE: Custom resize logic for login_html in llpanellogin.cpp --> +<web_browser + tab_stop="false" +trusted_content="true" +bg_opaque_color="Black" +border_visible="false" +bottom="600" +follows="all" +hide_loading="true" +left="0" +name="login_html" +start_url="" +top="0" +height="600" + width="980" /> +<layout_stack +follows="left|bottom|right" +name="login_widgets" +layout="topleft" +orientation="horizontal" +top="519" +width="996" +height="80"> +<layout_panel +auto_resize="false" +follows="left|bottom" +name="login" +layout="topleft" +width="570" +min_width="570" +user_resize="false" +height="80"> +<text +follows="left|bottom" +font="SansSerifSmall" +height="16" +name="username_text" +top="20" +left="20" +width="150"> +Username: +</text> + <combo_box + allow_text_entry="true" + follows="left|bottom" + height="22" + left_delta="0" + max_chars="128" + combo_editor.prevalidate_callback="ascii" + tool_tip="The username you chose when you registered, like bobsmith12 or Steller Sunshine" + top_pad="0" + name="username_combo" + width="178"> + <combo_box.combo_button + visible ="false"/> + <combo_box.drop_down_button + visible ="false"/> + </combo_box> +<text +follows="left|bottom" +font="SansSerifSmall" +height="15" +left_pad="-19" +name="password_text" +top="20" + width="150"> + Password: +</text> +<line_editor +follows="left|bottom" + height="22" +left_delta="0" + max_length_bytes="16" +name="password_edit" +is_password="true" +select_on_focus="true" + top_pad="0" + width="135" /> + <check_box +control_name="RememberPassword" +follows="left|bottom" +font="SansSerifSmall" +height="16" +label="Remember password" + top_pad="3" + name="remember_check" + width="135" /> +<button + follows="left|bottom" + height="23" + image_unselected="PushButton_On" + image_selected="PushButton_On_Selected" + label="Log In" + label_color="White" + layout="topleft" + left_pad="10" + name="connect_btn" + top="35" + width="90" /> + <text + follows="left|bottom" + font="SansSerifSmall" + height="15" + left_pad="10" + name="mode_selection_text" +top="20" + width="130"> + Mode: + </text> +<combo_box + follows="left|bottom" + height="23" + max_chars="128" + top_pad="0" + tool_tip="Select your mode. Choose Basic for fast, easy exploration and chat. Choose Advanced to access more features." + name="mode_combo" + width="120"> +<combo_box.item + label="Basic" + name="Basic" + value="settings_minimal.xml" /> +<combo_box.item + label="Advanced" + name="Advanced" + value="" /> +</combo_box> +</layout_panel> +<layout_panel +tab_stop="false" +follows="right|bottom" +name="links" +width="205" +min_width="205" +user_resize="false" +height="80"> + <text +follows="right|bottom" +font="SansSerifSmall" +text_color="EmphasisColor" +halign="right" +height="16" +top="12" +right="-10" +name="create_new_account_text" + width="200"> + Sign up + </text> +<text +follows="right|bottom" +font="SansSerifSmall" +text_color="EmphasisColor" +halign="right" +height="16" +name="forgot_password_text" +top_pad="12" +right="-10" + width="200"> + Forgot your username or password? +</text> +<text +follows="right|bottom" +font="SansSerifSmall" +text_color="EmphasisColor" +halign="right" +height="16" +name="login_help" +top_pad="2" +right="-10" + width="200"> + Need help logging in? </text> +<!-- <text + follows="right|bottom" + font="SansSerifSmall" + halign="right" + height="28" + top_pad="2" + name="channel_text" + width="180" + word_wrap="true"> + [VERSION] + </text>--> + </layout_panel> +</layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/en/panel_navigation_bar.xml b/indra/newview/skins/minimal/xui/en/panel_navigation_bar.xml new file mode 100644 index 0000000000..6dc1a1c9b0 --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/panel_navigation_bar.xml @@ -0,0 +1,76 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + background_opaque="true" + background_visible="true" + bg_opaque_color="MouseGray" + follows="left|top|right" + height="26" + layout="topleft" + name="navigation_bar" + chrome="true" + width="600"> + <icon + follows="all" + image_name="NavBar_BG_NoFav_Bevel" + mouse_opaque="false" + name="bg_icon_no_fav_bevel" + scale_image="true" + visible="true" + left="0" + top="0" + height="26" + width="600"/> + <panel + background_visible="false" + follows="left|top|right" + top="3" + height="26" + layout="topleft" + name="navigation_panel" + width="600"> + <pull_button +follows="left|top" +direction="down" +height="23" +image_overlay="Arrow_Left_Off" +image_bottom_pad="1" +layout="topleft" +left="10" +name="back_btn" +tool_tip="Go back to previous location" +top="2" +width="31" /> + <pull_button + follows="left|top" + direction="down" + height="23" + image_overlay="Arrow_Right_Off" + image_bottom_pad="1" + layout="topleft" + left_pad="0" + name="forward_btn" + tool_tip="Go forward one location" + top_delta="0" + width="31" /> + <location_input + follows="left|right|top" + halign="right" + height="23" + label="Location" + layout="topleft" + left_pad="7" + max_chars="254" + mouse_opaque="false" + name="location_combo" + top_delta="0" + width="440"> + </location_input> + <icon follows="right" + height="20" + width="2" + left_pad="2" + image_name="Button_Separator" + name="separator" + top="2"/> + </panel> +</panel> diff --git a/indra/newview/skins/minimal/xui/en/panel_people.xml b/indra/newview/skins/minimal/xui/en/panel_people.xml new file mode 100644 index 0000000000..4a72653d76 --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/panel_people.xml @@ -0,0 +1,550 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<!-- Side tray panel --> +<panel + default_tab_group="1" + follows="all" + height="449" + label="People" + layout="topleft" + left="0" + min_height="350" + name="people_panel" + top="0" + width="333"> + <string + name="no_recent_people" + value="No recent people. Looking for people to hang out with? Try the Destinations button below." /> + <string + name="no_filtered_recent_people" + value="No recent people with that name." /> + <string + name="no_one_near" + value="No one nearby. Looking for people to hang out with? Try the Destinations button below." /> + <string + name="no_one_filtered_near" + value="No one nearby with that name." /> + <string + name="no_friends_online" + value="No friends online" /> + <string + name="no_friends" + value="No friends" /> + <string + name="no_friends_msg"> + Right-click on a Resident to add them as a friend. +Looking for people to hang out with? Try the Destinations button below. + </string> + <string + name="no_filtered_friends_msg"> + Didn't find what you're looking for? Try the Destinations button below.. + </string> + <string + name="people_filter_label" + value="Filter People" /> + <string + name="groups_filter_label" + value="Filter Groups" /> + <!-- + *WORKAROUND: for group_list.no_items_msg & group_list.no_filtered_items_msg attributes. + They are not defined as translatable in VLT. See EXT-5931 + --> + <string + name="no_filtered_groups_msg" + value="Didn't find what you're looking for? Try [secondlife:///app/search/groups/[SEARCH_TERM] Search]." /> + <string + name="no_groups_msg" + value="Looking for Groups to join? Try [secondlife:///app/search/groups Search]." /> + <string + name="MiniMapToolTipMsg" + value="[REGION](Double-click to open Map, shift-drag to pan)"/> + <string + name="AltMiniMapToolTipMsg" + value="[REGION](Double-click to teleport, shift-drag to pan)"/> + <filter_editor + follows="left|top|right" + height="23" + layout="topleft" + left="10" + label="Filter" + max_length="300" + name="filter_input" + text_color="Black" + text_pad_left="10" + top="3" + width="303" /> + <tab_container + follows="all" + height="383" + layout="topleft" + left="5" + name="tabs" + tab_group="1" + tab_min_width="70" + tab_height="30" + tab_position="top" + top_pad="10" + halign="center" + width="317"> + <panel + background_opaque="true" + background_visible="true" + bg_alpha_color="DkGray" + bg_opaque_color="DkGray" + follows="all" + height="383" + label="NEARBY" + layout="topleft" + left="0" + help_topic="people_nearby_tab" + name="nearby_panel" + top="0" + width="313"> + <net_map + bg_color="NetMapBackgroundColor" + follows="top|left|right" + layout="topleft" + left="3" + mouse_opaque="false" + name="Net Map" + width="307" + height="140" + top="0"/> + <avatar_list + allow_select="true" + follows="top|left|bottom|right" + height="216" + ignore_online_status="true" + layout="topleft" + left="3" + multi_select="true" + name="avatar_list" + top="145" + width="307" /> + <panel + background_visible="true" + follows="left|right|bottom" + height="27" + label="bottom_panel" + layout="topleft" + left="3" + name="bottom_panel" + top_pad="0" + width="313"> + <icon + follows="bottom|left|right" + height="25" + image_name="Toolbar_Right_Off" + layout="topleft" + left_pad="1" + name="dummy_icon" + width="241" + /> + </panel> + </panel> + <panel + background_opaque="true" + background_visible="true" + bg_alpha_color="DkGray" + bg_opaque_color="DkGray" + follows="all" + height="383" + label="MY FRIENDS" + layout="topleft" + left="0" + help_topic="people_friends_tab" + name="friends_panel" + top="0" + width="313"> + <accordion + background_visible="true" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" + follows="all" + height="356" + layout="topleft" + left="3" + name="friends_accordion" + top="0" + width="307"> + <accordion_tab + layout="topleft" + height="172" + min_height="150" + name="tab_online" + title="Online"> + <avatar_list + allow_select="true" + follows="all" + height="172" + layout="topleft" + left="0" + multi_select="true" + name="avatars_online" + show_permissions_granted="true" + top="0" + width="307" /> + </accordion_tab> + <accordion_tab + layout="topleft" + height="173" + name="tab_all" + title="All"> + <avatar_list + allow_select="true" + follows="all" + height="173" + layout="topleft" + left="0" + multi_select="true" + name="avatars_all" + show_permissions_granted="true" + top="0" + width="307" /> + </accordion_tab> + </accordion> + <panel + background_visible="true" + follows="left|right|bottom" + height="27" + label="bottom_panel" + layout="topleft" + left="3" + name="bottom_panel" + top_pad="0" + width="313"> + + <layout_stack + animate="false" + border_size="0" + follows="left|right|bottom" + height="25" + layout="topleft" + orientation="horizontal" + top_pad="1" + left="0" + name="bottom_panel" + width="305"> + <layout_panel + auto_resize="true" + height="25" + layout="topleft" + name="dummy_panel" + user_resize="false" + width="212"> + <icon + follows="bottom|left|right" + height="25" + image_name="Toolbar_Middle_Off" + layout="topleft" + left="0" + top="0" + name="dummy_icon" + width="211" /> + </layout_panel> + <layout_panel + auto_resize="false" + height="25" + layout="topleft" + name="trash_btn_panel" + user_resize="false" + width="31"> + <dnd_button + follows="bottom|left" + height="25" + image_hover_unselected="Toolbar_Right_Over" + image_overlay="TrashItem_Off" + image_selected="Toolbar_Right_Selected" + image_unselected="Toolbar_Right_Off" + left="0" + layout="topleft" + name="del_btn" + tool_tip="Remove selected person from your Friends list" + top="0" + width="31"/> + </layout_panel> + </layout_stack><!-- + + <button + follows="bottom|left" + tool_tip="Options" + height="25" + image_hover_unselected="Toolbar_Left_Over" + image_overlay="OptionsMenu_Off" + image_selected="Toolbar_Left_Selected" + image_unselected="Toolbar_Left_Off" + layout="topleft" + left="0" + name="friends_viewsort_btn" + top="1" + width="31" /> + <button + follows="bottom|left" + height="25" + image_hover_unselected="Toolbar_Middle_Over" + image_overlay="AddItem_Off" + image_selected="Toolbar_Middle_Selected" + image_unselected="Toolbar_Middle_Off" + layout="topleft" + left_pad="1" + name="add_btn" + tool_tip="Offer friendship to a Resident" + width="31" /> + <icon + follows="bottom|left|right" + height="25" + image_name="Toolbar_Middle_Off" + layout="topleft" + left_pad="1" + name="dummy_icon" + width="209" + /> + <button + follows="bottom|left" + height="25" + image_hover_unselected="Toolbar_Right_Over" + image_overlay="TrashItem_Off" + image_selected="Toolbar_Right_Selected" + image_unselected="Toolbar_Right_Off" + layout="topleft" + left_pad="1" + name="del_btn" + tool_tip="Remove selected person from your Friends list" + width="31" /> + --></panel> + <text + follows="all" + height="450" + left="13" + name="no_friends_help_text" + top="10" + width="293" + wrap="true" /> + </panel> + <panel + background_opaque="true" + background_visible="true" + bg_alpha_color="DkGray" + bg_opaque_color="DkGray" + follows="all" + height="383" + label="RECENT" + layout="topleft" + left="0" + help_topic="people_recent_tab" + name="recent_panel" + top="0" + width="313"> + <avatar_list + allow_select="true" + follows="all" + height="356" + layout="topleft" + left="3" + multi_select="true" + name="avatar_list" + show_last_interaction_time="true" + top="0" + width="307" /> + <panel + background_visible="true" + follows="left|right|bottom" + height="27" + label="bottom_panel" + layout="topleft" + left="0" + name="bottom_panel" + top_pad="0" + width="313"> + <button + follows="bottom|left" + height="25" + image_hover_unselected="Toolbar_Middle_Over" + image_overlay="AddItem_Off" + image_selected="Toolbar_Middle_Selected" + image_unselected="Toolbar_Middle_Off" + layout="topleft" + left_pad="1" + name="add_friend_btn" + tool_tip="Add selected Resident to your friends List" + width="31"> + <commit_callback + function="People.addFriend" /> + </button> + <icon + follows="bottom|left|right" + height="25" + image_name="Toolbar_Right_Off" + layout="topleft" + left_pad="1" + name="dummy_icon" + width="241" + /> + </panel> + </panel> + </tab_container> + <panel + follows="bottom|left|right" + height="23" + layout="topleft" + left="8" + top_pad="4" + name="button_bar" + width="313"> + +<!--********************************Profile; IM; Call, Share, Teleport********************************--> + <layout_stack + follows="bottom|left|right" + height="23" + layout="topleft" + name="bottom_bar_ls" + left="0" + orientation="horizontal" + top_pad="0" + width="313"> + + <layout_panel + follows="bottom|left|right" + height="23" + layout="bottomleft" + left="0" + name="view_profile_btn_lp" + user_resize="false" + auto_resize="true" + width="68"> + <button + follows="bottom|left|right" + height="23" + label="Profile" + layout="topleft" + left="1" + name="view_profile_btn" + tool_tip="Show picture, groups, and other Residents information" + top="0" + width="67" /> + </layout_panel> + + <layout_panel + follows="bottom|left|right" + height="23" + layout="bottomleft" + left_pad="3" + name="chat_btn_lp" + user_resize="false" + auto_resize="true" + width="41"> + <button + follows="bottom|left|right" + left="1" + height="23" + label="IM" + layout="topleft" + name="im_btn" + tool_tip="Open instant message session" + top="0" + width="40" /> + </layout_panel> + + <layout_panel + follows="bottom|left|right" + height="23" + layout="bottomleft" + left_pad="3" + name="chat_btn_lp" + user_resize="false" + auto_resize="true" + width="77"> + <button + follows="bottom|left|right" + left="1" + height="23" + label="Teleport" + layout="topleft" + name="teleport_btn" + tool_tip="Offer teleport" + top="0" + width="76" /> + </layout_panel> + </layout_stack> + +<!--********************************Group Profile; Group Chat; Group Call buttons************************--> + <layout_stack + follows="bottom|left|right" + height="23" + layout="topleft" + mouse_opaque="false" + name="bottom_bar_ls1" + left="0" + orientation="horizontal" + top="0" + width="313"> + <layout_panel + follows="bottom|left|right" + height="23" + layout="bottomleft" + left="0" + mouse_opaque="false" + name="group_info_btn_lp" + user_resize="false" + auto_resize="true" + width="108"> + <button + follows="bottom|left|right" + left="1" + height="23" + label="Group Profile" + layout="topleft" + mouse_opaque="false" + name="group_info_btn" + tool_tip="Show group information" + top="0" + width="107" /> + </layout_panel> + + <layout_panel + follows="bottom|left|right" + height="23" + layout="bottomleft" + left_pad="3" + mouse_opaque="false" + name="chat_btn_lp" + user_resize="false" + auto_resize="true" + width="101"> + <button + follows="bottom|left|right" + left="1" + height="23" + label="Group Chat" + layout="topleft" + mouse_opaque="false" + name="chat_btn" + tool_tip="Open chat session" + top="0" + width="100" /> + </layout_panel> + + <layout_panel + follows="bottom|left|right" + height="23" + layout="bottomleft" + left_pad="3" + mouse_opaque="false" + name="group_call_btn_lp" + user_resize="false" + auto_resize="true" + width="96"> + <button + follows="bottom|left|right" + left="1" + height="23" + label="Group Call" + layout="topleft" + mouse_opaque="false" + name="group_call_btn" + tool_tip="Call this group" + top="0" + width="95" /> + </layout_panel> + </layout_stack> + </panel> +</panel> diff --git a/indra/newview/skins/minimal/xui/en/panel_side_tray_tab_caption.xml b/indra/newview/skins/minimal/xui/en/panel_side_tray_tab_caption.xml new file mode 100644 index 0000000000..9f2f41ba31 --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/panel_side_tray_tab_caption.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + background_visible="true" + bottom="0" + follows="left|top|right" + height="5" + width="333" + layout="topleft" + left="0" + name="sidetray_tab_panel"> +</panel> diff --git a/indra/newview/skins/minimal/xui/en/panel_status_bar.xml b/indra/newview/skins/minimal/xui/en/panel_status_bar.xml new file mode 100644 index 0000000000..6ccd0e938d --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/panel_status_bar.xml @@ -0,0 +1,62 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + background_opaque="true" + background_visible="true" + bg_opaque_color="MouseGray" + chrome="true" + follows="top|right" + height="30" + layout="topleft" + left="0" + mouse_opaque="false" + name="status" + top="19" + tab_stop="false" + width="70"> + <panel.string + name="packet_loss_tooltip"> + Packet Loss + </panel.string> + <panel.string + name="bandwidth_tooltip"> + Bandwidth + </panel.string> + <panel.string + name="time"> + [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt] + </panel.string> + <panel.string + name="timeTooltip"> + [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt] + </panel.string> + <panel.string + name="buycurrencylabel"> + L$ [AMT] + </panel.string> + <button + follows="right|top" + height="16" + image_selected="Play_Off" + image_unselected="Pause_Off" + image_pressed="Pause_Press" + image_pressed_selected="Play_Press" + is_toggle="true" + left="15" + top="7" + name="media_toggle_btn" + tool_tip="Start/Stop All Media (Music, Video, Web pages)" + width="16" > + </button> + <button + follows="right|top" + height="16" + image_selected="AudioMute_Off" + image_pressed="Audio_Press" + image_unselected="Audio_Off" + is_toggle="true" + left_pad="5" + top="8" + name="volume_btn" + tool_tip="Global Volume Control" + width="16" /> +</panel> diff --git a/indra/newview/skins/minimal/xui/en/panel_volume_pulldown.xml b/indra/newview/skins/minimal/xui/en/panel_volume_pulldown.xml new file mode 100644 index 0000000000..36ad39abe8 --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/panel_volume_pulldown.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + background_opaque="true" + background_visible="true" + bg_opaque_image="Volume_Background" + bg_alpha_image="Volume_Background" + border_visible="false" + border="false" + chrome="true" + follows="bottom" + height="150" + layout="topleft" + name="volumepulldown_floater" + width="32"> + <slider + control_name="AudioLevelMaster" + follows="left|top" + left="0" + top="1" + orientation="vertical" + height="140" + increment="0.05" + initial_value="0.5" + layout="topleft" + name="mastervolume" + show_text="false" + slider_label.halign="right" + top_pad="2" + volume="true"> + <slider.commit_callback + function="Vol.setControlFalse" + parameter="MuteAudio" /> + </slider> +</panel> diff --git a/indra/newview/skins/minimal/xui/en/widgets/location_input.xml b/indra/newview/skins/minimal/xui/en/widgets/location_input.xml new file mode 100644 index 0000000000..fe06a2d816 --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/widgets/location_input.xml @@ -0,0 +1,131 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<!-- +*TODO: Replace hardcoded buttons width/height with getting this info from the button images. + Currently that doesn't work because LLUIImage::getWidth/getHeight() return 1 for the images. +--> +<location_input font="SansSerifSmall" + maturity_help_topic="maturity_rating" + add_landmark_hpad="0" + icon_hpad="2" + allow_text_entry="true" + list_position="below" + show_text_as_tentative="false" + max_chars="20" + follows="left|top" + allow_new_values="true" + > + <!-- *NOTE: Tooltips are in strings.xml so they can be localized. + See LocationCtrlAddLandmarkTooltip etc. --> + <info_button + name="Place Information" + width="0" + height="0" + visible="false" + left="6" + top="20" + follows="left|top" + hover_glow_amount="0.15" /> + <add_landmark_button name="Add Landmark" + hover_glow_amount="0.15" + width="0" + height="0" + visible="false" + follows="right|top" + scale_image="false" + top="19" + left="-3" /> + <maturity_button + name="maturity_icon" + width="0" + height="0" + visible="false" + top="20" + follows="left|top" + /> + <for_sale_button + name="for_sale_btn" + width="0" + height="0" + visible="false" + follows="right|top" + scale_image="false" + top="21" + /> + <voice_icon + enabled="true" + name="voice_icon" + width="0" + height="0" + visible="false" + top="21" + follows="right|top" + /> + <fly_icon + name="fly_icon" + width="0" + height="0" + visible="false" + top="21" + follows="right|top" + /> + <push_icon + name="push_icon" + width="0" + height="0" + visible="false" + top="21" + follows="right|top" + /> + <build_icon + name="build_icon" + width="0" + height="0" + visible="false" + top="21" + follows="right|top" + /> + <scripts_icon + name="scripts_icon" + width="0" + height="0" + visible="false" + top="21" + follows="right|top" + /> + <damage_icon + name="damage_icon" + width="0" + height="0" + visible="false" + top="19" + left="2" + follows="right|top" + /> + <!-- Default text color is invisible on top of nav bar background --> + <damage_text + name="damage_text" + width="0" + height="0" + max_length="0" + top="17" + follows="right|top" + halign="right" + font="SansSerifSmall" + text_color="TextFgColor" + /> + <combo_button + name="Location History" + label="" + pad_right="0"/> + <combo_list + bg_writeable_color="MenuDefaultBgColor" + page_lines="10" + scroll_bar_bg_visible="true" /> + <combo_editor name="Combo Text Entry" + text_pad_left="4" + select_on_focus="false" + font="SansSerifSmall" + bevel_style="none" + border_style="line" + border.border_thickness="0" /> +</location_input> diff --git a/indra/newview/skins/minimal/xui/es/floater_camera.xml b/indra/newview/skins/minimal/xui/es/floater_camera.xml new file mode 100644 index 0000000000..ccf3d4bf91 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/floater_camera.xml @@ -0,0 +1,65 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="camera_floater" title=""> + <floater.string name="rotate_tooltip"> + Girar la cámara alrededor de lo enfocado + </floater.string> + <floater.string name="zoom_tooltip"> + Hacer zoom con la cámara en lo enfocado + </floater.string> + <floater.string name="move_tooltip"> + Mover la cámara arriba y abajo, izquierda y derecha + </floater.string> + <floater.string name="camera_modes_title"> + Modos de cámara + </floater.string> + <floater.string name="pan_mode_title"> + Orbital - Zoom - Panóramica + </floater.string> + <floater.string name="presets_mode_title"> + Vistas predefinidas + </floater.string> + <floater.string name="free_mode_title"> + Centrar el objeto + </floater.string> + <panel name="controls"> + <panel name="preset_views_list"> + <panel_camera_item name="front_view"> + <panel_camera_item.text name="front_view_text"> + De frente + </panel_camera_item.text> + </panel_camera_item> + <panel_camera_item name="group_view"> + <panel_camera_item.text name="side_view_text"> + Vista lateral + </panel_camera_item.text> + </panel_camera_item> + <panel_camera_item name="rear_view"> + <panel_camera_item.text name="rear_view_text"> + Desde detrás + </panel_camera_item.text> + </panel_camera_item> + </panel> + <panel name="camera_modes_list"> + <panel_camera_item name="object_view"> + <panel_camera_item.text name="object_view_text"> + Vista de objeto + </panel_camera_item.text> + </panel_camera_item> + <panel_camera_item name="mouselook_view"> + <panel_camera_item.text name="mouselook_view_text"> + Vista subjetiva + </panel_camera_item.text> + </panel_camera_item> + </panel> + <panel name="zoom" tool_tip="Hacer zoom con la cámara en lo enfocado"> + <joystick_rotate name="cam_rotate_stick" tool_tip="La cámara gira alrededor del punto de vista"/> + <slider_bar name="zoom_slider" tool_tip="Hacer zoom en lo enfocado"/> + <joystick_track name="cam_track_stick" tool_tip="Mueve la cámara arriba y abajo, a izquierda y derecha"/> + </panel> + </panel> + <panel name="buttons"> + <button label="" name="presets_btn" tool_tip="Vistas predefinidas"/> + <button label="" name="pan_btn" tool_tip="Orbital - Zoom - Panóramica"/> + <button label="" name="avatarview_btn" tool_tip="Modos de cámara"/> + </panel> +</floater> diff --git a/indra/newview/skins/minimal/xui/es/floater_help_browser.xml b/indra/newview/skins/minimal/xui/es/floater_help_browser.xml new file mode 100644 index 0000000000..67590ebfbb --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/floater_help_browser.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_help_browser" title="INDICACIONES"> + <floater.string name="loading_text"> + Cargando... + </floater.string> + <layout_stack name="stack1"> + <layout_panel name="external_controls"/> + </layout_stack> +</floater> diff --git a/indra/newview/skins/minimal/xui/es/floater_media_browser.xml b/indra/newview/skins/minimal/xui/es/floater_media_browser.xml new file mode 100644 index 0000000000..a7086c2d6d --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/floater_media_browser.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_about" title="EXPLORADOR DE MEDIA"> + <floater.string name="home_page_url"> + http://www.secondlife.com + </floater.string> + <floater.string name="support_page_url"> + http://support.secondlife.com + </floater.string> + <layout_stack name="stack1"> + <layout_panel name="nav_controls"> + <button label="Atrás" name="back"/> + <button label="Adelante" name="forward"/> + <button label="Recargar" name="reload"/> + <button label="Ir" name="go"/> + </layout_panel> + <layout_panel name="time_controls"> + <button label="rebobinar" name="rewind"/> + <button label="parar" name="stop"/> + <button label="avanzar" name="seek"/> + </layout_panel> + <layout_panel name="parcel_owner_controls"> + <button label="Enviar a la parcela la página actual" name="assign"/> + </layout_panel> + <layout_panel name="external_controls"> + <button label="Abrir en mi propio navegador" name="open_browser"/> + <check_box label="Abrir siempre en mi propio navegador" name="open_always"/> + <button label="Cerrar" name="close"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/minimal/xui/es/floater_nearby_chat.xml b/indra/newview/skins/minimal/xui/es/floater_nearby_chat.xml new file mode 100644 index 0000000000..1fee9ab056 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/floater_nearby_chat.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="nearby_chat" title="CHAT"> + <check_box label="Traducir chat (mediante Google)" name="translate_chat_checkbox"/> +</floater> diff --git a/indra/newview/skins/minimal/xui/es/floater_web_content.xml b/indra/newview/skins/minimal/xui/es/floater_web_content.xml new file mode 100644 index 0000000000..b012809679 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/floater_web_content.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_web_content" title=""> + <layout_stack name="stack1"> + <layout_panel name="nav_controls"> + <button name="back" tool_tip="Navegar hacia atrás"/> + <button name="forward" tool_tip="Navegar hacia adelante"/> + <button name="stop" tool_tip="Parar navegación"/> + <button name="reload" tool_tip="Recargar página"/> + <combo_box name="address" tool_tip="Escribe la URL aquí"/> + <icon name="media_secure_lock_flag" tool_tip="Navegación segura"/> + <button name="popexternal" tool_tip="Abrir la URL actual en tu explorador de escritorio"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/minimal/xui/es/inspect_avatar.xml b/indra/newview/skins/minimal/xui/es/inspect_avatar.xml new file mode 100644 index 0000000000..1d70fa6a90 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/inspect_avatar.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="inspect_avatar"> + <string name="Subtitle"> + [AGE] + </string> + <string name="Details"> + [SL_PROFILE] + </string> + <text name="user_details"> + Ésta es mi descripción de Second Life que, por cierto, me encanta. Pero, por lo que sea, me he enrollado más de la cuenta y la descripción es larguísima. + </text> + <slider name="volume_slider" tool_tip="Volumen de la voz" value="0.5"/> + <button label="Añadir como amigo" name="add_friend_btn"/> + <button label="MI" name="im_btn"/> + <button label="Perfil" name="view_profile_btn"/> + <panel name="moderator_panel"> + <button label="Desactivar la voz" name="disable_voice"/> + <button label="Activar la voz" name="enable_voice"/> + </panel> +</floater> diff --git a/indra/newview/skins/minimal/xui/es/inspect_object.xml b/indra/newview/skins/minimal/xui/es/inspect_object.xml new file mode 100644 index 0000000000..d608b4a0f7 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/inspect_object.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="inspect_object"> + <string name="Creator"> + Por [CREATOR] + </string> + <string name="CreatorAndOwner"> + Por [CREATOR] +Propietario [OWNER] + </string> + <string name="Price"> + [AMOUNT] L$ + </string> + <string name="PriceFree"> + ¡Gratis! + </string> + <string name="Touch"> + Tocar + </string> + <string name="Sit"> + Sentarme + </string> + <text name="object_name" value="Test Object Name That Is actually two lines and Really Long"/> + <text name="price_text"> + 30.000 L$ + </text> + <text name="object_description"> + This is a really long description for an object being as how it is at least 80 characters in length and so but maybe more like 120 at this point. Who knows, really? + </text> + <button label="Comprar" name="buy_btn"/> + <button label="Pagar" name="pay_btn"/> + <button label="Coger una copia" name="take_free_copy_btn"/> + <button label="Tocar" name="touch_btn"/> + <button label="Sentarme" name="sit_btn"/> + <button label="Abrir" name="open_btn"/> + <icon name="secure_browsing" tool_tip="Navegación segura"/> + <button label="Más" name="more_info_btn"/> +</floater> diff --git a/indra/newview/skins/minimal/xui/es/menu_add_wearable_gear.xml b/indra/newview/skins/minimal/xui/es/menu_add_wearable_gear.xml new file mode 100644 index 0000000000..f2367c72a3 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_add_wearable_gear.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Add Wearable Gear Menu"> + <menu_item_check label="Ordenar por los más recientes" name="sort_by_most_recent"/> + <menu_item_check label="Ordenar alfabéticamente" name="sort_by_name"/> + <menu_item_check label="Ordenar por tipo" name="sort_by_type"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_attachment_other.xml b/indra/newview/skins/minimal/xui/es/menu_attachment_other.xml new file mode 100644 index 0000000000..00bdb74881 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_attachment_other.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- *NOTE: See also menu_avatar_other.xml --> +<context_menu name="Avatar Pie"> + <menu_item_call label="Ver el perfil" name="Profile..."/> + <menu_item_call label="Añadir como amigo" name="Add Friend"/> + <menu_item_call label="MI" name="Send IM..."/> + <menu_item_call label="Llamada" name="Call"/> + <menu_item_call label="Invitar al grupo" name="Invite..."/> + <menu_item_call label="Ignorar" name="Avatar Mute"/> + <menu_item_call label="Denunciar" name="abuse"/> + <menu_item_call label="Congelar" name="Freeze..."/> + <menu_item_call label="Expulsar" name="Eject..."/> + <menu_item_call label="Depurar las texturas" name="Debug..."/> + <menu_item_call label="Acercar el zoom" name="Zoom In"/> + <menu_item_call label="Pagar" name="Pay..."/> + <menu_item_call label="Perfil del objeto" name="Object Inspect"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_attachment_self.xml b/indra/newview/skins/minimal/xui/es/menu_attachment_self.xml new file mode 100644 index 0000000000..ab76c92d65 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_attachment_self.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Attachment Pie"> + <menu_item_call label="Tocar" name="Attachment Object Touch"/> + <menu_item_call label="Editar" name="Edit..."/> + <menu_item_call label="Quitar" name="Detach"/> + <menu_item_call label="Sentarte" name="Sit Down Here"/> + <menu_item_call label="Levantarme" name="Stand Up"/> + <menu_item_call label="Cambiar vestuario" name="Change Outfit"/> + <menu_item_call label="Editar mi vestuario" name="Edit Outfit"/> + <menu_item_call label="Editar mi anatomía" name="Edit My Shape"/> + <menu_item_call label="Mis amigos" name="Friends..."/> + <menu_item_call label="Mis grupos" name="Groups..."/> + <menu_item_call label="Mi perfil" name="Profile..."/> + <menu_item_call label="Depurar las texturas" name="Debug..."/> + <menu_item_call label="Soltar" name="Drop"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_avatar_icon.xml b/indra/newview/skins/minimal/xui/es/menu_avatar_icon.xml new file mode 100644 index 0000000000..fe7331a108 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_avatar_icon.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Avatar Icon Menu"> + <menu_item_call label="Ver el perfil" name="Show Profile"/> + <menu_item_call label="Enviar un MI..." name="Send IM"/> + <menu_item_call label="Añadir como amigo..." name="Add Friend"/> + <menu_item_call label="Quitar de los amigos..." name="Remove Friend"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_avatar_other.xml b/indra/newview/skins/minimal/xui/es/menu_avatar_other.xml new file mode 100644 index 0000000000..7df2d7c4e0 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_avatar_other.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- *NOTE: See also menu_attachment_other.xml --> +<context_menu name="Avatar Pie"> + <menu_item_call label="Ver el perfil" name="Profile..."/> + <menu_item_call label="Añadir como amigo" name="Add Friend"/> + <menu_item_call label="MI" name="Send IM..."/> + <menu_item_call label="Llamada" name="Call"/> + <menu_item_call label="Invitar al grupo" name="Invite..."/> + <menu_item_call label="Ignorar" name="Avatar Mute"/> + <menu_item_call label="Denunciar" name="abuse"/> + <menu_item_call label="Congelar" name="Freeze..."/> + <menu_item_call label="Expulsar" name="Eject..."/> + <menu_item_call label="Depurar las texturas" name="Debug..."/> + <menu_item_call label="Acercar el zoom" name="Zoom In"/> + <menu_item_call label="Pagar" name="Pay..."/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_avatar_self.xml b/indra/newview/skins/minimal/xui/es/menu_avatar_self.xml new file mode 100644 index 0000000000..50f8384b0f --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_avatar_self.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Self Pie"> + <menu_item_call label="Sentarte" name="Sit Down Here"/> + <menu_item_call label="Levantarme" name="Stand Up"/> + <context_menu label="Quitarme" name="Take Off >"> + <context_menu label="Ropas" name="Clothes >"> + <menu_item_call label="Camisa" name="Shirt"/> + <menu_item_call label="Pantalón" name="Pants"/> + <menu_item_call label="Falda" name="Skirt"/> + <menu_item_call label="Zapatos" name="Shoes"/> + <menu_item_call label="Calcetines" name="Socks"/> + <menu_item_call label="Chaqueta" name="Jacket"/> + <menu_item_call label="Guantes" name="Gloves"/> + <menu_item_call label="Camiseta" name="Self Undershirt"/> + <menu_item_call label="Ropa interior" name="Self Underpants"/> + <menu_item_call label="Tatuaje" name="Self Tattoo"/> + <menu_item_call label="Alfa" name="Self Alpha"/> + <menu_item_call label="Toda la ropa" name="All Clothes"/> + </context_menu> + <context_menu label="HUD" name="Object Detach HUD"/> + <context_menu label="Quitar" name="Object Detach"/> + <menu_item_call label="Quitarse todo" name="Detach All"/> + </context_menu> + <menu_item_call label="Cambiar vestuario" name="Chenge Outfit"/> + <menu_item_call label="Editar mi vestuario" name="Edit Outfit"/> + <menu_item_call label="Editar mi anatomía" name="Edit My Shape"/> + <menu_item_call label="Mis amigos" name="Friends..."/> + <menu_item_call label="Mis grupos" name="Groups..."/> + <menu_item_call label="Mi perfil" name="Profile..."/> + <menu_item_call label="Depurar las texturas" name="Debug..."/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_bottomtray.xml b/indra/newview/skins/minimal/xui/es/menu_bottomtray.xml new file mode 100644 index 0000000000..62683f3076 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_bottomtray.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="hide_camera_move_controls_menu"> + <menu_item_check label="Botón Gestos" name="ShowGestureButton"/> + <menu_item_check label="Botón Moverse" name="ShowMoveButton"/> + <menu_item_check label="Botón Vista" name="ShowCameraButton"/> + <menu_item_check label="Botón Foto" name="ShowSnapshotButton"/> + <menu_item_check label="Botón Barra lateral" name="ShowSidebarButton"/> + <menu_item_check label="Botón Construir" name="ShowBuildButton"/> + <menu_item_check label="Botón Buscar" name="ShowSearchButton"/> + <menu_item_check label="Botón Mapa" name="ShowWorldMapButton"/> + <menu_item_check label="Botón Minimapa" name="ShowMiniMapButton"/> + <menu_item_call label="Cortar" name="NearbyChatBar_Cut"/> + <menu_item_call label="Copiar" name="NearbyChatBar_Copy"/> + <menu_item_call label="Pegar" name="NearbyChatBar_Paste"/> + <menu_item_call label="Borrar" name="NearbyChatBar_Delete"/> + <menu_item_call label="Seleccionar todo" name="NearbyChatBar_Select_All"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_cof_attachment.xml b/indra/newview/skins/minimal/xui/es/menu_cof_attachment.xml new file mode 100644 index 0000000000..7541530601 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_cof_attachment.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Attachment"> + <menu_item_call label="Quitar" name="detach"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_cof_body_part.xml b/indra/newview/skins/minimal/xui/es/menu_cof_body_part.xml new file mode 100644 index 0000000000..56b95bdc3b --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_cof_body_part.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Body"> + <menu_item_call label="Reemplazar" name="replace"/> + <menu_item_call label="Editar" name="edit"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_cof_clothing.xml b/indra/newview/skins/minimal/xui/es/menu_cof_clothing.xml new file mode 100644 index 0000000000..3c0c588284 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_cof_clothing.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Clothing"> + <menu_item_call label="Quitarme" name="take_off"/> + <menu_item_call label="Editar" name="edit"/> + <menu_item_call label="Reemplazar" name="replace"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_cof_gear.xml b/indra/newview/skins/minimal/xui/es/menu_cof_gear.xml new file mode 100644 index 0000000000..ff8ad0977a --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_cof_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Gear COF"> + <menu label="Ropas nuevas" name="COF.Gear.New_Clothes"/> + <menu label="Nuevas partes del cuerpo" name="COF.Geear.New_Body_Parts"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_edit.xml b/indra/newview/skins/minimal/xui/es/menu_edit.xml new file mode 100644 index 0000000000..96fc9d8881 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_edit.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu label="Editar" name="Edit"> + <menu_item_call label="Deshacer" name="Undo"/> + <menu_item_call label="Rehacer" name="Redo"/> + <menu_item_call label="Cortar" name="Cut"/> + <menu_item_call label="Copiar" name="Copy"/> + <menu_item_call label="Pegar" name="Paste"/> + <menu_item_call label="Borrar" name="Delete"/> + <menu_item_call label="Duplicar" name="Duplicate"/> + <menu_item_call label="Seleccionar todo" name="Select All"/> + <menu_item_call label="Deseleccionar" name="Deselect"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_favorites.xml b/indra/newview/skins/minimal/xui/es/menu_favorites.xml new file mode 100644 index 0000000000..c8a7858ddb --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_favorites.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="Teleportarse" name="Teleport To Landmark"/> + <menu_item_call label="Ver/Editar el hito" name="Landmark Open"/> + <menu_item_call label="Copiar la SLurl" name="Copy slurl"/> + <menu_item_call label="Mostrar en el mapa" name="Show On Map"/> + <menu_item_call label="Copiar" name="Landmark Copy"/> + <menu_item_call label="Pegar" name="Landmark Paste"/> + <menu_item_call label="Borrar" name="Delete"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_gesture_gear.xml b/indra/newview/skins/minimal/xui/es/menu_gesture_gear.xml new file mode 100644 index 0000000000..24706eb2c8 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_gesture_gear.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_gesture_gear"> + <menu_item_call label="Añadir a / Quitar de los favoritos" name="activate"/> + <menu_item_call label="Copiar" name="copy_gesture"/> + <menu_item_call label="Pegar" name="paste"/> + <menu_item_call label="Copiar la UUID" name="copy_uuid"/> + <menu_item_call label="Añadir al vestuario actual" name="save_to_outfit"/> + <menu_item_call label="Editar" name="edit_gesture"/> + <menu_item_call label="Inspeccionar" name="inspect"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_group_plus.xml b/indra/newview/skins/minimal/xui/es/menu_group_plus.xml new file mode 100644 index 0000000000..6b26ba42c4 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_group_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_call label="Entrar al grupo..." name="item_join"/> + <menu_item_call label="Grupo nuevo..." name="item_new"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_hide_navbar.xml b/indra/newview/skins/minimal/xui/es/menu_hide_navbar.xml new file mode 100644 index 0000000000..22a1873234 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_hide_navbar.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="hide_navbar_menu"> + <menu_item_check label="Mostrar la barra de navegación" name="ShowNavbarNavigationPanel"/> + <menu_item_check label="Mostrar la barra de favoritos" name="ShowNavbarFavoritesPanel"/> + <menu_item_check label="Mostrar mini-barra de ubicación" name="ShowMiniLocationPanel"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_im_well_button.xml b/indra/newview/skins/minimal/xui/es/menu_im_well_button.xml new file mode 100644 index 0000000000..c8f6c217cc --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_im_well_button.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="IM Well Button Context Menu"> + <menu_item_call label="Cerrar todo" name="Close All"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_imchiclet_adhoc.xml b/indra/newview/skins/minimal/xui/es/menu_imchiclet_adhoc.xml new file mode 100644 index 0000000000..e11e9bdc58 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_imchiclet_adhoc.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="IMChiclet AdHoc Menu"> + <menu_item_call label="Acabar la sesión" name="End Session"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_imchiclet_group.xml b/indra/newview/skins/minimal/xui/es/menu_imchiclet_group.xml new file mode 100644 index 0000000000..a5e60ea40b --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_imchiclet_group.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="IMChiclet Group Menu"> + <menu_item_call label="Información del grupo" name="Show Profile"/> + <menu_item_call label="Mostrar la sesión" name="Chat"/> + <menu_item_call label="Acabar la sesión" name="End Session"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_imchiclet_p2p.xml b/indra/newview/skins/minimal/xui/es/menu_imchiclet_p2p.xml new file mode 100644 index 0000000000..492801026c --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_imchiclet_p2p.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="IMChiclet P2P Menu"> + <menu_item_call label="Ver el perfil" name="Show Profile"/> + <menu_item_call label="Añadir como amigo" name="Add Friend"/> + <menu_item_call label="Mostrar la sesión" name="Send IM"/> + <menu_item_call label="Acabar la sesión" name="End Session"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_inspect_avatar_gear.xml b/indra/newview/skins/minimal/xui/es/menu_inspect_avatar_gear.xml new file mode 100644 index 0000000000..ebe33cea11 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_inspect_avatar_gear.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> +<toggleable_menu name="Gear Menu"> + <menu_item_call label="Ver el perfil" name="view_profile"/> + <menu_item_call label="Añadir como amigo" name="add_friend"/> + <menu_item_call label="MI" name="im"/> + <menu_item_call label="Teleportarse" name="teleport"/> + <menu_item_call label="Ignorar" name="block"/> + <menu_item_call label="Designorar" name="unblock"/> + <menu_item_call label="Denunciar" name="report"/> + <menu_item_call label="Congelar" name="freeze"/> + <menu_item_call label="Expulsar" name="eject"/> + <menu_item_call label="Expulsar" name="kick"/> + <menu_item_call label="CSR" name="csr"/> + <menu_item_call label="Depurar las texturas" name="debug"/> + <menu_item_call label="Encontrar en el mapa" name="find_on_map"/> + <menu_item_call label="Acercar el zoom" name="zoom_in"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_inspect_object_gear.xml b/indra/newview/skins/minimal/xui/es/menu_inspect_object_gear.xml new file mode 100644 index 0000000000..bcdc25894f --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_inspect_object_gear.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<menu name="Gear Menu"> + <menu_item_call label="Tocar" name="touch"/> + <menu_item_call label="Sentarse" name="sit"/> + <menu_item_call label="Pagar" name="pay"/> + <menu_item_call label="Comprar" name="buy"/> + <menu_item_call label="Tomar" name="take"/> + <menu_item_call label="Coger una copia" name="take_copy"/> + <menu_item_call label="Abrir" name="open"/> + <menu_item_call label="Editar" name="edit"/> + <menu_item_call label="Ponerse" name="wear"/> + <menu_item_call label="Añadir" name="add"/> + <menu_item_call label="Denunciar" name="report"/> + <menu_item_call label="Ignorar" name="block"/> + <menu_item_call label="Acercar el zoom" name="zoom_in"/> + <menu_item_call label="Quitar" name="remove"/> + <menu_item_call label="Más información" name="more_info"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_inspect_self_gear.xml b/indra/newview/skins/minimal/xui/es/menu_inspect_self_gear.xml new file mode 100644 index 0000000000..1a49efb9d0 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_inspect_self_gear.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Self Pie"> + <menu_item_call label="Sentarme" name="Sit Down Here"/> + <menu_item_call label="Levantarme" name="Stand Up"/> + <menu_item_call label="Mis amigos" name="Friends..."/> + <menu_item_call label="Mi perfil" name="Profile..."/> + <menu_item_call label="Depurar texturas" name="Debug..."/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_inv_offer_chiclet.xml b/indra/newview/skins/minimal/xui/es/menu_inv_offer_chiclet.xml new file mode 100644 index 0000000000..20d99afde1 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_inv_offer_chiclet.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="InvOfferChiclet Menu"> + <menu_item_call label="Cerrar" name="Close"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_inventory.xml b/indra/newview/skins/minimal/xui/es/menu_inventory.xml new file mode 100644 index 0000000000..94ee162bbc --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_inventory.xml @@ -0,0 +1,86 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="Compartir" name="Share"/> + <menu_item_call label="Comprar" name="Task Buy"/> + <menu_item_call label="Abrir" name="Task Open"/> + <menu_item_call label="Ejecutar" name="Task Play"/> + <menu_item_call label="Propiedades" name="Task Properties"/> + <menu_item_call label="Renombrar" name="Task Rename"/> + <menu_item_call label="Borrar" name="Task Remove"/> + <menu_item_call label="Vaciar la papelera" name="Empty Trash"/> + <menu_item_call label="Vaciar Objetos Perdidos" name="Empty Lost And Found"/> + <menu_item_call label="Carpeta nueva" name="New Folder"/> + <menu_item_call label="Script nuevo" name="New Script"/> + <menu_item_call label="Nota nueva" name="New Note"/> + <menu_item_call label="Gesto nuevo" name="New Gesture"/> + <menu label="Ropas nuevas" name="New Clothes"> + <menu_item_call label="Camisa nueva" name="New Shirt"/> + <menu_item_call label="Pantalones nuevos" name="New Pants"/> + <menu_item_call label="Zapatos nuevos" name="New Shoes"/> + <menu_item_call label="Calcetines nuevos" name="New Socks"/> + <menu_item_call label="Chaqueta nueva" name="New Jacket"/> + <menu_item_call label="Falda nueva" name="New Skirt"/> + <menu_item_call label="Guantes nuevos" name="New Gloves"/> + <menu_item_call label="Camiseta nueva" name="New Undershirt"/> + <menu_item_call label="Ropa interior nueva" name="New Underpants"/> + <menu_item_call label="Nueva capa Alpha" name="New Alpha Mask"/> + <menu_item_call label="Tatuaje nuevo" name="New Tattoo"/> + </menu> + <menu label="Nuevas partes del cuerpo" name="New Body Parts"> + <menu_item_call label="Forma nueva" name="New Shape"/> + <menu_item_call label="Piel nueva" name="New Skin"/> + <menu_item_call label="Pelo nuevo" name="New Hair"/> + <menu_item_call label="Ojos nuevos" name="New Eyes"/> + </menu> + <menu label="Change Type" name="Change Type"> + <menu_item_call label="Por defecto" name="Default"/> + <menu_item_call label="Guantes" name="Gloves"/> + <menu_item_call label="Chaqueta" name="Jacket"/> + <menu_item_call label="Pantalón" name="Pants"/> + <menu_item_call label="Forma" name="Shape"/> + <menu_item_call label="Zapatos" name="Shoes"/> + <menu_item_call label="Camisa" name="Shirt"/> + <menu_item_call label="Falda" name="Skirt"/> + <menu_item_call label="Ropa interior" name="Underpants"/> + <menu_item_call label="Camiseta" name="Undershirt"/> + </menu> + <menu_item_call label="Teleportar" name="Landmark Open"/> + <menu_item_call label="Abrir" name="Animation Open"/> + <menu_item_call label="Abrir" name="Sound Open"/> + <menu_item_call label="Reemplazar el vestuario" name="Replace Outfit"/> + <menu_item_call label="Añadir al vestuario" name="Add To Outfit"/> + <menu_item_call label="Quitar del vestuario actual" name="Remove From Outfit"/> + <menu_item_call label="Encontrar el original" name="Find Original"/> + <menu_item_call label="Eliminar el ítem" name="Purge Item"/> + <menu_item_call label="Restaurar el ítem" name="Restore Item"/> + <menu_item_call label="Abrir" name="Open"/> + <menu_item_call label="Abrir original" name="Open Original"/> + <menu_item_call label="Propiedades" name="Properties"/> + <menu_item_call label="Renombrar" name="Rename"/> + <menu_item_call label="Copiar la UUID" name="Copy Asset UUID"/> + <menu_item_call label="Copiar" name="Copy"/> + <menu_item_call label="Pegar" name="Paste"/> + <menu_item_call label="Pegar como enlace" name="Paste As Link"/> + <menu_item_call label="Borrar" name="Remove Link"/> + <menu_item_call label="Borrar" name="Delete"/> + <menu_item_call label="Borrar carpeta del sistema" name="Delete System Folder"/> + <menu_item_call label="Empezar multiconferencia" name="Conference Chat Folder"/> + <menu_item_call label="Escuchar" name="Sound Play"/> + <menu_item_call label="Acerca del hito" name="About Landmark"/> + <menu_item_call label="Escuchar en el mundo" name="Animation Play"/> + <menu_item_call label="Ejecutarla para usted" name="Animation Audition"/> + <menu_item_call label="Enviar un mensaje instantáneo" name="Send Instant Message"/> + <menu_item_call label="Ofrecer teleporte..." name="Offer Teleport..."/> + <menu_item_call label="Empezar multiconferencia" name="Conference Chat"/> + <menu_item_call label="Activar" name="Activate"/> + <menu_item_call label="Desactivar" name="Deactivate"/> + <menu_item_call label="Guardar como" name="Save As"/> + <menu_item_call label="Quitarse" name="Detach From Yourself"/> + <menu_item_call label="Ponerme" name="Wearable And Object Wear"/> + <menu label="Anexar a" name="Attach To"/> + <menu label="Anexar como HUD" name="Attach To HUD"/> + <menu_item_call label="Editar" name="Wearable Edit"/> + <menu_item_call label="Añadir" name="Wearable Add"/> + <menu_item_call label="Quitarse" name="Take Off"/> + <menu_item_call label="--sin opciones--" name="--no options--"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_inventory_add.xml b/indra/newview/skins/minimal/xui/es/menu_inventory_add.xml new file mode 100644 index 0000000000..ba106e8335 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_inventory_add.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_inventory_add"> + <menu label="Subir" name="upload"> + <menu_item_call label="Imagen ([COST] L$)..." name="Upload Image"/> + <menu_item_call label="Sonido ([COST] L$)..." name="Upload Sound"/> + <menu_item_call label="Animación ([COST] L$)..." name="Upload Animation"/> + <menu_item_call label="Masivo ([COST] L$ por archivo)..." name="Bulk Upload"/> + <menu_item_call label="Configurar los permisos por defecto de subida" name="perm prefs"/> + </menu> + <menu_item_call label="Carpeta nueva" name="New Folder"/> + <menu_item_call label="Script nuevo" name="New Script"/> + <menu_item_call label="Nota nueva" name="New Note"/> + <menu_item_call label="Gesto nuevo" name="New Gesture"/> + <menu label="Ropas nuevas" name="New Clothes"> + <menu_item_call label="Camisa nueva" name="New Shirt"/> + <menu_item_call label="Pantalón nuevo" name="New Pants"/> + <menu_item_call label="Zapatos nuevos" name="New Shoes"/> + <menu_item_call label="Calcetines nuevos" name="New Socks"/> + <menu_item_call label="Chaqueta nueva" name="New Jacket"/> + <menu_item_call label="Falda nueva" name="New Skirt"/> + <menu_item_call label="Guantes nuevos" name="New Gloves"/> + <menu_item_call label="Camiseta nueva" name="New Undershirt"/> + <menu_item_call label="Ropa interior nueva" name="New Underpants"/> + <menu_item_call label="Nueva Alfa" name="New Alpha"/> + <menu_item_call label="Tatuaje nuevo" name="New Tattoo"/> + </menu> + <menu label="Nuevas partes del cuerpo" name="New Body Parts"> + <menu_item_call label="Forma nueva" name="New Shape"/> + <menu_item_call label="Piel nueva" name="New Skin"/> + <menu_item_call label="Pelo nuevo" name="New Hair"/> + <menu_item_call label="Ojos nuevos" name="New Eyes"/> + </menu> +</menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_inventory_gear_default.xml b/indra/newview/skins/minimal/xui/es/menu_inventory_gear_default.xml new file mode 100644 index 0000000000..8e498fefba --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_inventory_gear_default.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_gear_default"> + <menu_item_call label="Nueva ventana del inventario" name="new_window"/> + <menu_item_check label="Ordenar alfabéticamente" name="sort_by_name"/> + <menu_item_check label="Ordenar por los más recientes" name="sort_by_recent"/> + <menu_item_check label="Las carpetas del sistema, arriba" name="sort_system_folders_to_top"/> + <menu_item_call label="Ver los filtros" name="show_filters"/> + <menu_item_call label="Restablecer los filtros" name="reset_filters"/> + <menu_item_call label="Cerrar todas las carpetas" name="close_folders"/> + <menu_item_call label="Vaciar Objetos Perdidos" name="empty_lostnfound"/> + <menu_item_call label="Guardar la textura como" name="Save Texture As"/> + <menu_item_call label="Compartir" name="Share"/> + <menu_item_call label="Encontrar el original" name="Find Original"/> + <menu_item_call label="Encontrar todos los enlazados" name="Find All Links"/> + <menu_item_call label="Vaciar la Papelera" name="empty_trash"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_land.xml b/indra/newview/skins/minimal/xui/es/menu_land.xml new file mode 100644 index 0000000000..b0f15be1b6 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_land.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Land Pie"> + <menu_item_call label="Acerca del terreno" name="Place Information..."/> + <menu_item_call label="Sentarme aquí" name="Sit Here"/> + <menu_item_call label="Comprar este terreno" name="Land Buy"/> + <menu_item_call label="Comprar un pase" name="Land Buy Pass"/> + <menu_item_call label="Construir" name="Create"/> + <menu_item_call label="Modificar el terreno" name="Edit Terrain"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_landmark.xml b/indra/newview/skins/minimal/xui/es/menu_landmark.xml new file mode 100644 index 0000000000..f69b1539b8 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_landmark.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="landmark_overflow_menu"> + <menu_item_call label="Copiar la SLurl" name="copy"/> + <menu_item_call label="Borrar" name="delete"/> + <menu_item_call label="Crear un Destacado" name="pick"/> + <menu_item_call label="Añadir a la barra de favoritos" name="add_to_favbar"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_login.xml b/indra/newview/skins/minimal/xui/es/menu_login.xml new file mode 100644 index 0000000000..c27d624732 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_login.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu_bar name="Login Menu"> + <menu label="Yo" name="File"> + <menu_item_call label="Preferencias" name="Preferences..."/> + <menu_item_call label="Salir de [APP_NAME]" name="Quit"/> + </menu> + <menu label="Ayuda" name="Help"> + <menu_item_call label="Ayuda de [SECOND_LIFE]" name="Second Life Help"/> + <menu_item_call label="Acerca de [APP_NAME]" name="About Second Life"/> + </menu> + <menu_item_check label="Mostrar el menú 'Debug'" name="Show Debug Menu"/> + <menu label="Depurar" name="Debug"> + <menu_item_call label="Mostrar las configuraciones del depurador" name="Debug Settings"/> + <menu_item_call label="Configuraciones del Visor/Color" name="UI/Color Settings"/> + <menu label="Pruebas de la interfaz" name="UI Tests"/> + <menu_item_call label="Definir el tamaño de la ventana..." name="Set Window Size..."/> + <menu_item_call label="Mostrar los 'TOS'" name="TOS"/> + <menu_item_call label="Mostrar mensaje crítico" name="Critical"/> + <menu_item_call label="Prueba de navegadores de medios" name="Web Browser Test"/> + <menu_item_call label="Prueba de ventanas de contenidos web" name="Web Content Floater Test"/> + <menu_item_check label="Mostrar el selector de Grid" name="Show Grid Picker"/> + <menu_item_call label="Mostrar la consola de notificaciones" name="Show Notifications Console"/> + </menu> +</menu_bar> diff --git a/indra/newview/skins/minimal/xui/es/menu_mini_map.xml b/indra/newview/skins/minimal/xui/es/menu_mini_map.xml new file mode 100644 index 0000000000..07d1b08572 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_mini_map.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="Zoom cerca" name="Zoom Close"/> + <menu_item_call label="Zoom medio" name="Zoom Medium"/> + <menu_item_call label="Zoom lejos" name="Zoom Far"/> + <menu_item_call label="Zoom por defecto" name="Zoom Default"/> + <menu_item_check label="Girar el mapa" name="Rotate Map"/> + <menu_item_check label="Centrar automáticamente" name="Auto Center"/> + <menu_item_call label="Parar la búsqueda" name="Stop Tracking"/> + <menu_item_call label="Mapa del mundo" name="World Map"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_navbar.xml b/indra/newview/skins/minimal/xui/es/menu_navbar.xml new file mode 100644 index 0000000000..63e5468020 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_navbar.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Navbar Menu"> + <menu_item_check label="Mostrar las coordenadas" name="Show Coordinates"/> + <menu_item_check label="Mostrar las propiedades de la parcela" name="Show Parcel Properties"/> + <menu_item_call label="Hito" name="Landmark"/> + <menu_item_call label="Cortar" name="Cut"/> + <menu_item_call label="Copiar" name="Copy"/> + <menu_item_call label="Pegar" name="Paste"/> + <menu_item_call label="Borrar" name="Delete"/> + <menu_item_call label="Seleccionar todo" name="Select All"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_nearby_chat.xml b/indra/newview/skins/minimal/xui/es/menu_nearby_chat.xml new file mode 100644 index 0000000000..94b281b6c7 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_nearby_chat.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="NearBy Chat Menu"> + <menu_item_call label="Mostrar la gente que está cerca..." name="nearby_people"/> + <menu_item_check label="Ver el texto ignorado" name="muted_text"/> + <menu_item_check label="Mostrar los iconos del amigo" name="show_buddy_icons"/> + <menu_item_check label="Mostrar los nombres" name="show_names"/> + <menu_item_check label="Mostrar los iconos y los nombres" name="show_icons_and_names"/> + <menu_item_call label="Tamaño de la fuente" name="font_size"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_notification_well_button.xml b/indra/newview/skins/minimal/xui/es/menu_notification_well_button.xml new file mode 100644 index 0000000000..0562d35be7 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_notification_well_button.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Notification Well Button Context Menu"> + <menu_item_call label="Cerrar todo" name="Close All"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_object.xml b/indra/newview/skins/minimal/xui/es/menu_object.xml new file mode 100644 index 0000000000..06121e0c09 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_object.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Object Pie"> + <menu_item_call label="Tocar" name="Object Touch"> + <menu_item_call.on_enable name="EnableTouch" parameter="Tocar"/> + </menu_item_call> + <menu_item_call label="Editar" name="Edit..."/> + <menu_item_call label="Construir" name="Build"/> + <menu_item_call label="Abrir" name="Open"/> + <menu_item_call label="Sentarme aquí" name="Object Sit"/> + <menu_item_call label="Levantarme" name="Object Stand Up"/> + <menu_item_call label="Perfil del objeto" name="Object Inspect"/> + <menu_item_call label="Acercar el zoom" name="Zoom In"/> + <context_menu label="Ponerme" name="Put On"> + <menu_item_call label="Ponerme" name="Wear"/> + <menu_item_call label="Añadir" name="Add"/> + <context_menu label="Anexar" name="Object Attach"/> + <context_menu label="Anexar el HUD" name="Object Attach HUD"/> + </context_menu> + <context_menu label="Quitar" name="Remove"> + <menu_item_call label="Denunciar una infracción" name="Report Abuse..."/> + <menu_item_call label="Ignorar" name="Object Mute"/> + <menu_item_call label="Devolver" name="Return..."/> + <menu_item_call label="Eliminar" name="Delete"/> + </context_menu> + <menu_item_call label="Tomar" name="Pie Object Take"/> + <menu_item_call label="Coger una copia" name="Take Copy"/> + <menu_item_call label="Pagar" name="Pay..."/> + <menu_item_call label="Comprar" name="Buy..."/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_object_icon.xml b/indra/newview/skins/minimal/xui/es/menu_object_icon.xml new file mode 100644 index 0000000000..7e4578b950 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_object_icon.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Object Icon Menu"> + <menu_item_call label="Perfil del objeto..." name="Object Profile"/> + <menu_item_call label="Ignorar..." name="Block"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_outfit_gear.xml b/indra/newview/skins/minimal/xui/es/menu_outfit_gear.xml new file mode 100644 index 0000000000..3b11bceecf --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_outfit_gear.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Gear Outfit"> + <menu_item_call label="Ponerme - Reemplazar el vestuario actual" name="wear"/> + <menu_item_call label="Ponerme - Añadir al vestuario actual" name="wear_add"/> + <menu_item_call label="Quitarme - Quitar del vestuario actual" name="take_off"/> + <menu label="Ropas nuevas" name="New Clothes"> + <menu_item_call label="Camisa nueva" name="New Shirt"/> + <menu_item_call label="Pantalón nuevo" name="New Pants"/> + <menu_item_call label="Zapatos nuevos" name="New Shoes"/> + <menu_item_call label="Calcetines nuevos" name="New Socks"/> + <menu_item_call label="Chaqueta nueva" name="New Jacket"/> + <menu_item_call label="Falda nueva" name="New Skirt"/> + <menu_item_call label="Guantes nuevos" name="New Gloves"/> + <menu_item_call label="Camiseta nueva" name="New Undershirt"/> + <menu_item_call label="Ropa interior nueva" name="New Underpants"/> + <menu_item_call label="Nueva Alfa" name="New Alpha"/> + <menu_item_call label="Tatuaje nuevo" name="New Tattoo"/> + </menu> + <menu label="Nuevas partes del cuerpo" name="New Body Parts"> + <menu_item_call label="Anatomía nueva" name="New Shape"/> + <menu_item_call label="Piel nueva" name="New Skin"/> + <menu_item_call label="Pelo nuevo" name="New Hair"/> + <menu_item_call label="Ojos nuevos" name="New Eyes"/> + </menu> + <menu_item_call label="Renombrar el vestuario" name="rename"/> + <menu_item_call label="Borrar el vestuario" name="delete_outfit"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_outfit_tab.xml b/indra/newview/skins/minimal/xui/es/menu_outfit_tab.xml new file mode 100644 index 0000000000..4136082a62 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_outfit_tab.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Outfit"> + <menu_item_call label="Ponerme - Reemplazar el vestuario actual" name="wear_replace"/> + <menu_item_call label="Ponerme - Añadir al vestuario actual" name="wear_add"/> + <menu_item_call label="Quitarme - Quitar del vestuario actual" name="take_off"/> + <menu_item_call label="Editar el vestuario" name="edit"/> + <menu_item_call label="Renombrar el vestuario" name="rename"/> + <menu_item_call label="Borrar el vestuario" name="delete"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_participant_list.xml b/indra/newview/skins/minimal/xui/es/menu_participant_list.xml new file mode 100644 index 0000000000..f6eedd1170 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_participant_list.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Participant List Context Menu"> + <menu_item_check label="Ordenar alfabéticamente" name="SortByName"/> + <menu_item_check label="Ordenar según las intervenciones recientes" name="SortByRecentSpeakers"/> + <menu_item_call label="Ver el perfil" name="View Profile"/> + <menu_item_call label="Añadir como amigo" name="Add Friend"/> + <menu_item_call label="MI" name="IM"/> + <menu_item_call label="Llamar" name="Call"/> + <menu_item_call label="Compartir" name="Share"/> + <menu_item_call label="Pagar" name="Pay"/> + <menu_item_check label="Ver los iconos de la gente" name="View Icons"/> + <menu_item_check label="Ignorar la voz" name="Block/Unblock"/> + <menu_item_check label="Ignorar el texto" name="MuteText"/> + <context_menu label="Opciones del moderador" name="Moderator Options"> + <menu_item_check label="Permitir el chat de texto" name="AllowTextChat"/> + <menu_item_call label="Ignorar a este participante" name="ModerateVoiceMuteSelected"/> + <menu_item_call label="Quitar el silencio a este participante" name="ModerateVoiceUnMuteSelected"/> + <menu_item_call label="Silenciar a todos" name="ModerateVoiceMute"/> + <menu_item_call label="Quitar el silencio a todos" name="ModerateVoiceUnmute"/> + </context_menu> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_people_friends_view_sort.xml b/indra/newview/skins/minimal/xui/es/menu_people_friends_view_sort.xml new file mode 100644 index 0000000000..3899ad9e96 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_people_friends_view_sort.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_check label="Ordenar alfabéticamente" name="sort_name"/> + <menu_item_check label="Ordenar por estatus" name="sort_status"/> + <menu_item_check label="Ver los iconos de la gente" name="view_icons"/> + <menu_item_check label="Ver permisos concedidos" name="view_permissions"/> + <menu_item_call label="Ver la lista de Residentes y Objetos ignorados" name="show_blocked_list"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_people_groups.xml b/indra/newview/skins/minimal/xui/es/menu_people_groups.xml new file mode 100644 index 0000000000..51bd2c7208 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_people_groups.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_call label="Ver la información" name="View Info"/> + <menu_item_call label="Chat" name="Chat"/> + <menu_item_call label="Llamar" name="Call"/> + <menu_item_call label="Activar" name="Activate"/> + <menu_item_call label="Dejar" name="Leave"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_people_groups_view_sort.xml b/indra/newview/skins/minimal/xui/es/menu_people_groups_view_sort.xml new file mode 100644 index 0000000000..1bd3efb611 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_people_groups_view_sort.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_check label="Mostrar los iconos de grupo" name="Display Group Icons"/> + <menu_item_call label="Dejar el grupo seleccionado" name="Leave Selected Group"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_people_nearby.xml b/indra/newview/skins/minimal/xui/es/menu_people_nearby.xml new file mode 100644 index 0000000000..dc1486d879 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_people_nearby.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Avatar Context Menu"> + <menu_item_call label="Ver el perfil" name="View Profile"/> + <menu_item_call label="Añadir como amigo" name="Add Friend"/> + <menu_item_call label="Quitarle como amigo" name="Remove Friend"/> + <menu_item_call label="MI" name="IM"/> + <menu_item_call label="Llamar" name="Call"/> + <menu_item_call label="Mapa" name="Map"/> + <menu_item_call label="Compartir" name="Share"/> + <menu_item_call label="Pagar" name="Pay"/> + <menu_item_check label="Ignorar / No ignorar" name="Block/Unblock"/> + <menu_item_call label="Ofrecer teleporte" name="teleport"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_people_nearby_multiselect.xml b/indra/newview/skins/minimal/xui/es/menu_people_nearby_multiselect.xml new file mode 100644 index 0000000000..227c5ebe58 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_people_nearby_multiselect.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Multi-Selected People Context Menu"> + <menu_item_call label="Añadir como amigos" name="Add Friends"/> + <menu_item_call label="Quitar amigos" name="Remove Friend"/> + <menu_item_call label="MI" name="IM"/> + <menu_item_call label="Llamar" name="Call"/> + <menu_item_call label="Compartir" name="Share"/> + <menu_item_call label="Pagar" name="Pay"/> + <menu_item_call label="Ofrecer teleporte" name="teleport"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_people_nearby_view_sort.xml b/indra/newview/skins/minimal/xui/es/menu_people_nearby_view_sort.xml new file mode 100644 index 0000000000..f0fe383c0c --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_people_nearby_view_sort.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_check label="Ordenar según las intervenciones recientes" name="sort_by_recent_speakers"/> + <menu_item_check label="Ordenar alfabéticamente" name="sort_name"/> + <menu_item_check label="Ordenar según distancia" name="sort_distance"/> + <menu_item_check label="Ver los iconos de la gente" name="view_icons"/> + <menu_item_call label="Ver la lista de Residentes y Objetos ignorados" name="show_blocked_list"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_people_recent_view_sort.xml b/indra/newview/skins/minimal/xui/es/menu_people_recent_view_sort.xml new file mode 100644 index 0000000000..e4aaa89110 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_people_recent_view_sort.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_check label="Ordenar por los más recientes" name="sort_most"/> + <menu_item_check label="Ordenar alfabéticamente" name="sort_name"/> + <menu_item_check label="Ver los iconos de la gente" name="view_icons"/> + <menu_item_call label="Ver la lista de Residentes y Objetos ignorados" name="show_blocked_list"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_picks.xml b/indra/newview/skins/minimal/xui/es/menu_picks.xml new file mode 100644 index 0000000000..9da68d7c9b --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_picks.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Picks"> + <menu_item_call label="Información" name="pick_info"/> + <menu_item_call label="Editar" name="pick_edit"/> + <menu_item_call label="Teleportar" name="pick_teleport"/> + <menu_item_call label="Mapa" name="pick_map"/> + <menu_item_call label="Eliminar" name="pick_delete"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_picks_plus.xml b/indra/newview/skins/minimal/xui/es/menu_picks_plus.xml new file mode 100644 index 0000000000..cc59bf1d29 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_picks_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="picks_plus_menu"> + <menu_item_call label="Destacado nuevo" name="create_pick"/> + <menu_item_call label="Clasificado nuevo" name="create_classified"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_place.xml b/indra/newview/skins/minimal/xui/es/menu_place.xml new file mode 100644 index 0000000000..675f0699e9 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_place.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="place_overflow_menu"> + <menu_item_call label="Crear un hito" name="landmark"/> + <menu_item_call label="Crear un destacado" name="pick"/> + <menu_item_call label="Comprar un pase" name="pass"/> + <menu_item_call label="Editar" name="edit"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_place_add_button.xml b/indra/newview/skins/minimal/xui/es/menu_place_add_button.xml new file mode 100644 index 0000000000..4b2f908a06 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_place_add_button.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_folder_gear"> + <menu_item_call label="Añadir una carpeta" name="add_folder"/> + <menu_item_call label="Añadir este hito" name="add_landmark"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_places_gear_folder.xml b/indra/newview/skins/minimal/xui/es/menu_places_gear_folder.xml new file mode 100644 index 0000000000..bf46eb58e3 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_places_gear_folder.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_folder_gear"> + <menu_item_call label="Añadir este hito" name="add_landmark"/> + <menu_item_call label="Añadir una carpeta" name="add_folder"/> + <menu_item_call label="Cortar" name="cut"/> + <menu_item_call label="Copiar" name="copy_folder"/> + <menu_item_call label="Pegar" name="paste"/> + <menu_item_call label="Renombrar" name="rename"/> + <menu_item_call label="Borrar" name="delete"/> + <menu_item_call label="Abrir" name="expand"/> + <menu_item_call label="Cerrar" name="collapse"/> + <menu_item_call label="Abrir todas las carpetas" name="expand_all"/> + <menu_item_call label="Cerrar todas las carpetas" name="collapse_all"/> + <menu_item_check label="Ordenar por fecha" name="sort_by_date"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_places_gear_landmark.xml b/indra/newview/skins/minimal/xui/es/menu_places_gear_landmark.xml new file mode 100644 index 0000000000..eac85de846 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_places_gear_landmark.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_ladmark_gear"> + <menu_item_call label="Teleportar" name="teleport"/> + <menu_item_call label="Más información" name="more_info"/> + <menu_item_call label="Mostrar en el mapa" name="show_on_map"/> + <menu_item_call label="Añadir un hito" name="add_landmark"/> + <menu_item_call label="Añadir una carpeta" name="add_folder"/> + <menu_item_call label="Cortar" name="cut"/> + <menu_item_call label="Copiar el hito" name="copy_landmark"/> + <menu_item_call label="Copiar la SLurl" name="copy_slurl"/> + <menu_item_call label="Pegar" name="paste"/> + <menu_item_call label="Renombrar" name="rename"/> + <menu_item_call label="Eliminar" name="delete"/> + <menu_item_call label="Abrir todas las carpetas" name="expand_all"/> + <menu_item_call label="Cerrar todas las carpetas" name="collapse_all"/> + <menu_item_check label="Ordenar por fecha" name="sort_by_date"/> + <menu_item_call label="Crear un Destacado" name="create_pick"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_profile_overflow.xml b/indra/newview/skins/minimal/xui/es/menu_profile_overflow.xml new file mode 100644 index 0000000000..5ee8c50949 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_profile_overflow.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="profile_overflow_menu"> + <menu_item_call label="Mapa" name="show_on_map"/> + <menu_item_call label="Pagar" name="pay"/> + <menu_item_call label="Compartir" name="share"/> + <menu_item_call label="Ignorar" name="block"/> + <menu_item_call label="Designorar" name="unblock"/> + <menu_item_call label="Expulsar" name="kick"/> + <menu_item_call label="Congelar" name="freeze"/> + <menu_item_call label="Descongelar" name="unfreeze"/> + <menu_item_call label="CSR" name="csr"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_save_outfit.xml b/indra/newview/skins/minimal/xui/es/menu_save_outfit.xml new file mode 100644 index 0000000000..a04ec75b60 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_save_outfit.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="save_outfit_menu"> + <menu_item_call label="Guardar" name="save_outfit"/> + <menu_item_call label="Guardar como" name="save_as_new_outfit"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_script_chiclet.xml b/indra/newview/skins/minimal/xui/es/menu_script_chiclet.xml new file mode 100644 index 0000000000..f517baf566 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_script_chiclet.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="ScriptChiclet Menu"> + <menu_item_call label="Cerrar" name="Close"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_slurl.xml b/indra/newview/skins/minimal/xui/es/menu_slurl.xml new file mode 100644 index 0000000000..ca19acec6e --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_slurl.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="Acerca de la URL" name="about_url"/> + <menu_item_call label="Teleportar a la URL" name="teleport_to_url"/> + <menu_item_call label="Mapa" name="show_on_map"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_teleport_history_gear.xml b/indra/newview/skins/minimal/xui/es/menu_teleport_history_gear.xml new file mode 100644 index 0000000000..b708f3bc20 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_teleport_history_gear.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Teleport History Gear Context Menu"> + <menu_item_call label="Abrir todas las carpetas" name="Expand all folders"/> + <menu_item_call label="Cerrar todas las carpetas" name="Collapse all folders"/> + <menu_item_call label="Limpiar el historial de teleportes" name="Clear Teleport History"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml b/indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml new file mode 100644 index 0000000000..ed33c55aca --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Teleport History Item Context Menu"> + <menu_item_call label="Teleportarse" name="Teleport"/> + <menu_item_call label="Más información" name="More Information"/> + <menu_item_call label="Copiar al portapapeles" name="CopyToClipboard"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_teleport_history_tab.xml b/indra/newview/skins/minimal/xui/es/menu_teleport_history_tab.xml new file mode 100644 index 0000000000..17e90422a5 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_teleport_history_tab.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Teleport History Item Context Menu"> + <menu_item_call label="Abrir" name="TabOpen"/> + <menu_item_call label="Cerrar" name="TabClose"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_text_editor.xml b/indra/newview/skins/minimal/xui/es/menu_text_editor.xml new file mode 100644 index 0000000000..095e461734 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_text_editor.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Text editor context menu"> + <menu_item_call label="Cortar" name="Cut"/> + <menu_item_call label="Copiar" name="Copy"/> + <menu_item_call label="Pegar" name="Paste"/> + <menu_item_call label="Borrar" name="Delete"/> + <menu_item_call label="Seleccionar todo" name="Select All"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_topinfobar.xml b/indra/newview/skins/minimal/xui/es/menu_topinfobar.xml new file mode 100644 index 0000000000..2125fd51b2 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_topinfobar.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_topinfobar"> + <menu_item_check label="Mostrar las coordenadas" name="Show Coordinates"/> + <menu_item_check label="Mostrar las propiedades de la parcela" name="Show Parcel Properties"/> + <menu_item_call label="Hito" name="Landmark"/> + <menu_item_call label="Copiar" name="Copy"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_url_agent.xml b/indra/newview/skins/minimal/xui/es/menu_url_agent.xml new file mode 100644 index 0000000000..a089c8f68e --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_url_agent.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Mostrar el perfil del Residente" name="show_agent"/> + <menu_item_call label="Copiar el nombre al portapapeles" name="url_copy_label"/> + <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_url_group.xml b/indra/newview/skins/minimal/xui/es/menu_url_group.xml new file mode 100644 index 0000000000..79374b9739 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_url_group.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Mostrar la información del grupo" name="show_group"/> + <menu_item_call label="Copiar el grupo al portapapeles" name="url_copy_label"/> + <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_url_http.xml b/indra/newview/skins/minimal/xui/es/menu_url_http.xml new file mode 100644 index 0000000000..585c059ff3 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_url_http.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Abrir la página web" name="url_open"/> + <menu_item_call label="Abrir en el navegador incorporado" name="url_open_internal"/> + <menu_item_call label="Abrir en mi navegador" name="url_open_external"/> + <menu_item_call label="Copiar la URL al portapapeles" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_url_inventory.xml b/indra/newview/skins/minimal/xui/es/menu_url_inventory.xml new file mode 100644 index 0000000000..13a8711c76 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_url_inventory.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Mostrar ítem del inventario" name="show_item"/> + <menu_item_call label="Copiar el nombre al portapapeles" name="url_copy_label"/> + <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_url_map.xml b/indra/newview/skins/minimal/xui/es/menu_url_map.xml new file mode 100644 index 0000000000..f96a0c7170 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_url_map.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Mostrar en el mapa" name="show_on_map"/> + <menu_item_call label="Teleportarse a la localización" name="teleport_to_location"/> + <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_url_objectim.xml b/indra/newview/skins/minimal/xui/es/menu_url_objectim.xml new file mode 100644 index 0000000000..8791a290af --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_url_objectim.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Mostrar la información del objeto" name="show_object"/> + <menu_item_call label="Mostrar en el mapa" name="show_on_map"/> + <menu_item_call label="Teleportarse a la posición del objeto" name="teleport_to_object"/> + <menu_item_call label="Copiar el nombre del objeto al portapapeles" name="url_copy_label"/> + <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_url_parcel.xml b/indra/newview/skins/minimal/xui/es/menu_url_parcel.xml new file mode 100644 index 0000000000..9e789ef8ee --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_url_parcel.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Mostrar la información de la parcela" name="show_parcel"/> + <menu_item_call label="Mostrar en el mapa" name="show_on_map"/> + <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_url_slapp.xml b/indra/newview/skins/minimal/xui/es/menu_url_slapp.xml new file mode 100644 index 0000000000..7147dcd3cf --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_url_slapp.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Ejecutar este comando" name="run_slapp"/> + <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_url_slurl.xml b/indra/newview/skins/minimal/xui/es/menu_url_slurl.xml new file mode 100644 index 0000000000..4ab47c2f61 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_url_slurl.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Mostrar la información del lugar" name="show_place"/> + <menu_item_call label="Mostrar en el mapa" name="show_on_map"/> + <menu_item_call label="Teleportarse a este lugar" name="teleport_to_location"/> + <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_url_teleport.xml b/indra/newview/skins/minimal/xui/es/menu_url_teleport.xml new file mode 100644 index 0000000000..8f86a91be3 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_url_teleport.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Teleportarse a este lugar" name="teleport"/> + <menu_item_call label="Mostrar en el mapa" name="show_on_map"/> + <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_viewer.xml b/indra/newview/skins/minimal/xui/es/menu_viewer.xml new file mode 100644 index 0000000000..776ccfe21b --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_viewer.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu_bar name="Main Menu"> + <menu label="Ayuda" name="Help"> + <menu_item_call label="Ayuda de [SECOND_LIFE]" name="Second Life Help"/> + </menu> + <menu label="Avanzado" name="Advanced"> + <menu label="Atajos de teclado" name="Shortcuts"> + <menu_item_check label="Volar" name="Fly"/> + <menu_item_call label="Cerrar la ventana" name="Close Window"/> + <menu_item_call label="Cerrar todas las ventanas" name="Close All Windows"/> + <menu_item_call label="Volver a la vista por defecto" name="Reset View"/> + </menu> + </menu> +</menu_bar> diff --git a/indra/newview/skins/minimal/xui/es/menu_wearable_list_item.xml b/indra/newview/skins/minimal/xui/es/menu_wearable_list_item.xml new file mode 100644 index 0000000000..4bffa689e7 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_wearable_list_item.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Outfit Wearable Context Menu"> + <menu_item_call label="Reemplazar" name="wear_replace"/> + <menu_item_call label="Ponerme" name="wear_wear"/> + <menu_item_call label="Añadir" name="wear_add"/> + <menu_item_call label="Quitarme / Quitar" name="take_off_or_detach"/> + <menu_item_call label="Quitar" name="detach"/> + <context_menu label="Anexar a" name="wearable_attach_to"/> + <context_menu label="Anexar al HUD" name="wearable_attach_to_hud"/> + <menu_item_call label="Quitarme" name="take_off"/> + <menu_item_call label="Editar" name="edit"/> + <menu_item_call label="Perfil del elemento" name="object_profile"/> + <menu_item_call label="Mostrar original" name="show_original"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_wearing_gear.xml b/indra/newview/skins/minimal/xui/es/menu_wearing_gear.xml new file mode 100644 index 0000000000..9d9ce75e53 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_wearing_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Gear Wearing"> + <menu_item_call label="Editar el vestuario" name="edit"/> + <menu_item_call label="Quitarme" name="takeoff"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_wearing_tab.xml b/indra/newview/skins/minimal/xui/es/menu_wearing_tab.xml new file mode 100644 index 0000000000..64fd7ce4cf --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/menu_wearing_tab.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Wearing"> + <menu_item_call label="Quitarme" name="take_off"/> + <menu_item_call label="Quitar" name="detach"/> + <menu_item_call label="Editar el vestuario" name="edit"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/es/notifications.xml b/indra/newview/skins/minimal/xui/es/notifications.xml new file mode 100644 index 0000000000..b08ebb5f76 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/notifications.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<notifications> + <notification name="UserGiveItem"> + [NAME_SLURL] te ofrece un/a [ITEM_SLURL]. Para utilizar este ítem, cambia al modo Avanzado y búscalo en el inventario. Para cambiar al modo Avanzado, sal de la aplicación, reiníciala y cambia el ajuste de modo en la pantalla de inicio de sesión. + <form name="form"> + <button name="Show" text="Conservar ítem"/> + <button name="Discard" text="Rechazar ítem"/> + <button name="Mute" text="Bloquear usuario"/> + </form> + </notification> + <notification name="ObjectGiveItem"> + Un objeto de nombre <nolink>[OBJECTFROMNAME]</nolink>, propiedad de [NAME_SLURL], te ofrece un/a [ITEM_SLURL]. Para utilizar este ítem, cambia al modo Avanzado y búscalo en el inventario. Para cambiar al modo Avanzado, sal de la aplicación, reiníciala y cambia el ajuste de modo en la pantalla de inicio de sesión. + <form name="form"> + <button name="Keep" text="Conservar ítem"/> + <button name="Discard" text="Rechazar ítem"/> + <button name="Mute" text="Bloquear objeto"/> + </form> + </notification> +</notifications> diff --git a/indra/newview/skins/minimal/xui/es/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/es/panel_bottomtray.xml new file mode 100644 index 0000000000..f782d66ae7 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/panel_bottomtray.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="bottom_tray"> + <string name="DragIndicationImageName" value="Accordion_ArrowOpened_Off"/> + <string name="SpeakBtnToolTip" value="Activa/Desactiva el micrófono"/> + <string name="VoiceControlBtnToolTip" value="Muestra/Oculta el panel del control de voz"/> + <layout_stack name="toolbar_stack"> + <layout_panel name="gesture_panel"> + <gesture_combo_list label="Gestos" name="Gesture" tool_tip="Muestra/Oculta los gestos"/> + </layout_panel> + <layout_panel name="cam_panel"> + <bottomtray_button label="Visión" name="camera_btn" tool_tip="Muestra/Oculta los controles de la cámara"/> + </layout_panel> + <layout_panel name="avatar_and_destinations_panel"> + <bottomtray_button label="Destinos" name="destination_btn" tool_tip="Muestra la ventana de gente"/> + </layout_panel> + <layout_panel name="avatar_and_destinations_panel"> + <bottomtray_button label="Mi avatar" name="avatar_btn"/> + </layout_panel> + <layout_panel name="people_panel"> + <bottomtray_button label="Gente" name="show_people_button" tool_tip="Muestra la ventana de gente"/> + </layout_panel> + <layout_panel name="profile_panel"> + <bottomtray_button label="Perfil" name="show_profile_btn" tool_tip="Muestra la ventana del perfil"/> + </layout_panel> + <layout_panel name="howto_panel"> + <bottomtray_button label="Indicaciones" name="show_help_btn" tool_tip="Abrir los temas sobre indicaciones de Second Life"/> + </layout_panel> + <layout_panel name="im_well_panel"> + <chiclet_im_well name="im_well"> + <button name="Unread IM messages" tool_tip="Conversaciones"/> + </chiclet_im_well> + </layout_panel> + <layout_panel name="notification_well_panel"> + <chiclet_notification name="notification_well"> + <button name="Unread" tool_tip="Notificaciones"/> + </chiclet_notification> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/es/panel_group_control_panel.xml b/indra/newview/skins/minimal/xui/es/panel_group_control_panel.xml new file mode 100644 index 0000000000..e77156b0d4 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/panel_group_control_panel.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <layout_stack name="vertical_stack"> + <layout_panel name="end_call_btn_panel"> + <button label="Colgar" name="end_call_btn"/> + </layout_panel> + <layout_panel name="voice_ctrls_btn_panel"> + <button label="Abrir los controles de la voz" name="voice_ctrls_btn"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/es/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/es/panel_im_control_panel.xml new file mode 100644 index 0000000000..7d4db6a630 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/panel_im_control_panel.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <layout_stack name="button_stack"> + <layout_panel name="view_profile_btn_panel"> + <button label="Perfil" name="view_profile_btn"/> + </layout_panel> + <layout_panel name="add_friend_btn_panel"> + <button label="Añadir como amigo" name="add_friend_btn"/> + </layout_panel> + <layout_panel name="teleport_btn_panel"> + <button label="Teleportarme" name="teleport_btn" tool_tip="Ofrecer teleporte a esta persona"/> + </layout_panel> + <layout_panel name="share_btn_panel"> + <button label="Compartir" name="share_btn"/> + </layout_panel> + <layout_panel name="pay_btn_panel"> + <button label="Pagar" name="pay_btn"/> + </layout_panel> + <layout_panel name="call_btn_panel"> + <button label="Llamar" name="call_btn"/> + </layout_panel> + <layout_panel name="end_call_btn_panel"> + <button label="Colgar" name="end_call_btn"/> + </layout_panel> + <layout_panel name="voice_ctrls_btn_panel"> + <button label="Controles de la voz" name="voice_ctrls_btn"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/es/panel_login.xml b/indra/newview/skins/minimal/xui/es/panel_login.xml new file mode 100644 index 0000000000..689a71e277 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/panel_login.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_login"> + <panel.string name="create_account_url"> + http://join.secondlife.com/index.php?lang=es-ES + </panel.string> + <panel.string name="forgot_password_url"> + http://secondlife.com/account/request.php?lang=es + </panel.string> + <layout_stack name="login_widgets"> + <layout_panel name="login"> + <text name="username_text"> + Nombre de usuario: + </text> + <combo_box name="username_combo" tool_tip="El nombre de usuario que elegiste al registrarte, como bobsmith12 o Steller Sunshine"/> + <text name="password_text"> + Contraseña: + </text> + <check_box label="Recordar la contraseña" name="remember_check"/> + <button label="Iniciar sesión" name="connect_btn"/> + <text name="mode_selection_text"> + Modo: + </text> + <combo_box name="mode_combo" tool_tip="Selecciona el modo. Elige Básico para una exploración rápida y fácil y para chatear. Elige Avanzado para tener acceso a más funciones."> + <combo_box.item label="Básico" name="Basic"/> + <combo_box.item label="Avanzado" name="Advanced"/> + </combo_box> + </layout_panel> + <layout_panel name="links"> + <text name="create_new_account_text"> + Registrarme + </text> + <text name="forgot_password_text"> + ¿Olvidaste el nombre de usuario o la contraseña? + </text> + <text name="login_help"> + ¿Necesitas ayuda para conectarte? + </text> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/es/panel_navigation_bar.xml b/indra/newview/skins/minimal/xui/es/panel_navigation_bar.xml new file mode 100644 index 0000000000..e8e95c3bac --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/panel_navigation_bar.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="navigation_bar"> + <panel name="navigation_panel"> + <pull_button name="back_btn" tool_tip="Volver a lo localización anterior"/> + <pull_button name="forward_btn" tool_tip="Ir una localización adelante"/> + <button name="home_btn" tool_tip="Teleportar a mi Base"/> + <location_input label="Localización" name="location_combo"/> + <search_combo_box label="Buscar" name="search_combo_box" tool_tip="Buscar"> + <combo_editor label="Buscar en [SECOND_LIFE]" name="search_combo_editor"/> + </search_combo_box> + </panel> + <favorites_bar name="favorite" tool_tip="¡Accede rápidamente a tus lugares favoritos de Second Life arrastrando hitos hasta aquí!"> + <label name="favorites_bar_label" tool_tip="¡Accede rápidamente a tus lugares favoritos de Second Life arrastrando hitos hasta aquí!"> + Barra de Favoritos + </label> + <chevron_button name=">>" tool_tip="Ver más de Mis favoritos"/> + </favorites_bar> +</panel> diff --git a/indra/newview/skins/minimal/xui/es/panel_people.xml b/indra/newview/skins/minimal/xui/es/panel_people.xml new file mode 100644 index 0000000000..7d3157ef45 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/panel_people.xml @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- Side tray panel --> +<panel label="Gente" name="people_panel"> + <string name="no_recent_people" value="No hay gente reciente. ¿Estás buscando gente con la que juntarte? Prueba con el botón Destinos que aparece a continuación."/> + <string name="no_filtered_recent_people" value="No hay gente reciente con ese nombre."/> + <string name="no_one_near" value="No hay nadie cerca. ¿Estás buscando gente con la que juntarte? Prueba con el botón Destinos que aparece a continuación."/> + <string name="no_one_filtered_near" value="No hay nadie cerca con ese nombre."/> + <string name="no_friends_online" value="No hay amigos conectados"/> + <string name="no_friends" value="No hay amigos"/> + <string name="no_friends_msg"> + Haz clic con el botón derecho del ratón en un residente para agregarlo como amigo. +¿Estás buscando gente con la que juntarte? Prueba con el botón Destinos que aparece a continuación. + </string> + <string name="no_filtered_friends_msg"> + ¿No encuentras lo que buscas? Prueba con el botón Destinos que aparece a continuación. + </string> + <string name="people_filter_label" value="Filtrar a la gente"/> + <string name="groups_filter_label" value="Filtrar a los grupos"/> + <string name="no_filtered_groups_msg" value="¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/groups/[SEARCH_TERM] Buscar]."/> + <string name="no_groups_msg" value="¿Buscas grupos en que participar? Prueba la [secondlife:///app/search/groups Búsqueda]."/> + <string name="MiniMapToolTipMsg" value="[REGIÓN](Haz doble clic para abrir el mapa y pulsa la tecla Mayús y arrastra para obtener una vista panorámica)"/> + <string name="AltMiniMapToolTipMsg" value="[REGIÓN](Haz doble clic para teleportarte y pulsa la tecla Mayús y arrastra para obtener una vista panorámica)"/> + <filter_editor label="Filtrar" name="filter_input"/> + <tab_container name="tabs"> + <panel label="CERCANA" name="nearby_panel"> + <panel label="bottom_panel" name="bottom_panel"/> + </panel> + <panel label="MIS AMIGOS" name="friends_panel"> + <accordion name="friends_accordion"> + <accordion_tab name="tab_online" title="Conectado"/> + <accordion_tab name="tab_all" title="Todos"/> + </accordion> + <panel label="bottom_panel" name="bottom_panel"> + <layout_stack name="bottom_panel"> + <layout_panel name="trash_btn_panel"> + <dnd_button name="del_btn" tool_tip="Quitar a la persona seleccionada de tu lista de amigos"/> + </layout_panel> + </layout_stack> + </panel> + </panel> + <panel label="RECIENTE" name="recent_panel"> + <panel label="bottom_panel" name="bottom_panel"> + <button name="add_friend_btn" tool_tip="Añadir al Residente seleccionado a la lista de tus amigos"/> + </panel> + </panel> + </tab_container> + <panel name="button_bar"> + <layout_stack name="bottom_bar_ls"> + <layout_panel name="view_profile_btn_lp"> + <button label="Perfil" name="view_profile_btn" tool_tip="Mostrar imágenes, grupos y otra información del Residente"/> + </layout_panel> + <layout_panel name="chat_btn_lp"> + <button label="MI" name="im_btn" tool_tip="Abrir una sesión de mensajes instantáneos"/> + </layout_panel> + <layout_panel name="chat_btn_lp"> + <button label="Teleporte" name="teleport_btn" tool_tip="Ofrecer teleporte"/> + </layout_panel> + </layout_stack> + <layout_stack name="bottom_bar_ls1"> + <layout_panel name="group_info_btn_lp"> + <button label="Perfil del grupo" name="group_info_btn" tool_tip="Ver la información del grupo"/> + </layout_panel> + <layout_panel name="chat_btn_lp"> + <button label="Chat de grupo" name="chat_btn" tool_tip="Abrir el chat"/> + </layout_panel> + <layout_panel name="group_call_btn_lp"> + <button label="Llamar al grupo" name="group_call_btn" tool_tip="Llama a este grupo"/> + </layout_panel> + </layout_stack> + </panel> +</panel> diff --git a/indra/newview/skins/minimal/xui/es/panel_side_tray_tab_caption.xml b/indra/newview/skins/minimal/xui/es/panel_side_tray_tab_caption.xml new file mode 100644 index 0000000000..775e343dc9 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/panel_side_tray_tab_caption.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="sidetray_tab_panel"> + <text name="sidetray_tab_title" value="Panel lateral"/> + <button name="undock" tool_tip="Soltar"/> + <button name="dock" tool_tip="Fijar"/> + <button name="show_help" tool_tip="Ver ayuda"/> +</panel> diff --git a/indra/newview/skins/minimal/xui/es/panel_status_bar.xml b/indra/newview/skins/minimal/xui/es/panel_status_bar.xml new file mode 100644 index 0000000000..ab76d3f994 --- /dev/null +++ b/indra/newview/skins/minimal/xui/es/panel_status_bar.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="status"> + <panel.string name="StatBarDaysOfWeek"> + Domingo:Lunes:Martes:Miércoles:Jueves:Viernes:Sábado + </panel.string> + <panel.string name="StatBarMonthsOfYear"> + Enero:Febrero:Marzo:Abril:Mayo:Junio:Julio:Agosto:Septiembre:Octubre:Noviembre:Diciembre + </panel.string> + <panel.string name="packet_loss_tooltip"> + Pérdida de paquetes + </panel.string> + <panel.string name="bandwidth_tooltip"> + Ancho de banda + </panel.string> + <panel.string name="time"> + [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt] + </panel.string> + <panel.string name="timeTooltip"> + [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt] + </panel.string> + <panel.string name="buycurrencylabel"> + [AMT] L$ + </panel.string> + <panel name="balance_bg"> + <text name="balance" tool_tip="Haz clic para actualizar tu saldo en L$" value="20 L$"/> + <button label="COMPRAR L$" name="buyL" tool_tip="Pulsa para comprar más L$"/> + </panel> + <text name="TimeText" tool_tip="Hora actual (Pacífico)"> + 24:00 AM PST + </text> + <button name="media_toggle_btn" tool_tip="Iniciar/Parar todos los media (música, vídeo, páginas web)"/> + <button name="volume_btn" tool_tip="Control general del volumen"/> +</panel> diff --git a/indra/newview/skins/minimal/xui/fr/floater_camera.xml b/indra/newview/skins/minimal/xui/fr/floater_camera.xml new file mode 100644 index 0000000000..1d62a89ff2 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/floater_camera.xml @@ -0,0 +1,65 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="camera_floater"> + <floater.string name="rotate_tooltip"> + Faire tourner la caméra autour du point central + </floater.string> + <floater.string name="zoom_tooltip"> + Zoomer en direction du point central + </floater.string> + <floater.string name="move_tooltip"> + Déplacer la caméra vers le haut et le bas, la gauche et la droite + </floater.string> + <floater.string name="camera_modes_title"> + Modes + </floater.string> + <floater.string name="pan_mode_title"> + Rotation - Zoom - Panoramique + </floater.string> + <floater.string name="presets_mode_title"> + Préréglages + </floater.string> + <floater.string name="free_mode_title"> + Voir l'objet + </floater.string> + <panel name="controls"> + <panel name="preset_views_list"> + <panel_camera_item name="front_view"> + <panel_camera_item.text name="front_view_text"> + Vue frontale + </panel_camera_item.text> + </panel_camera_item> + <panel_camera_item name="group_view"> + <panel_camera_item.text name="side_view_text"> + Vue latérale + </panel_camera_item.text> + </panel_camera_item> + <panel_camera_item name="rear_view"> + <panel_camera_item.text name="rear_view_text"> + Vue arrière + </panel_camera_item.text> + </panel_camera_item> + </panel> + <panel name="camera_modes_list"> + <panel_camera_item name="object_view"> + <panel_camera_item.text name="object_view_text"> + Vue de l'objet + </panel_camera_item.text> + </panel_camera_item> + <panel_camera_item name="mouselook_view"> + <panel_camera_item.text name="mouselook_view_text"> + Vue subjective + </panel_camera_item.text> + </panel_camera_item> + </panel> + <panel name="zoom" tool_tip="Zoomer en direction du point central"> + <joystick_rotate name="cam_rotate_stick" tool_tip="Faire tourner la caméra autour du point central"/> + <slider_bar name="zoom_slider" tool_tip="Zoomer en direction du point central"/> + <joystick_track name="cam_track_stick" tool_tip="Déplacer la caméra vers le haut et le bas, la gauche et la droite"/> + </panel> + </panel> + <panel name="buttons"> + <button label="" name="presets_btn" tool_tip="Préréglages"/> + <button label="" name="pan_btn" tool_tip="Rotation - Zoom - Panoramique"/> + <button label="" name="avatarview_btn" tool_tip="Modes"/> + </panel> +</floater> diff --git a/indra/newview/skins/minimal/xui/fr/floater_help_browser.xml b/indra/newview/skins/minimal/xui/fr/floater_help_browser.xml new file mode 100644 index 0000000000..09d763b809 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/floater_help_browser.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_help_browser" title="AIDE RAPIDE"> + <floater.string name="loading_text"> + Chargement… + </floater.string> + <layout_stack name="stack1"> + <layout_panel name="external_controls"/> + </layout_stack> +</floater> diff --git a/indra/newview/skins/minimal/xui/fr/floater_media_browser.xml b/indra/newview/skins/minimal/xui/fr/floater_media_browser.xml new file mode 100644 index 0000000000..ba171c6363 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/floater_media_browser.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_about" title="NAVIGATEUR DE MÉDIAS"> + <floater.string name="home_page_url"> + http://www.secondlife.com + </floater.string> + <floater.string name="support_page_url"> + http://support.secondlife.com + </floater.string> + <layout_stack name="stack1"> + <layout_panel name="nav_controls"> + <button label="Préc." name="back"/> + <button label="Suiv." name="forward"/> + <button label="Recharger" name="reload"/> + <button label="OK" name="go"/> + </layout_panel> + <layout_panel name="time_controls"> + <button label="retour" name="rewind"/> + <button label="stop" name="stop"/> + <button label="avance" name="seek"/> + </layout_panel> + <layout_panel name="parcel_owner_controls"> + <button label="Envoyer la page actuelle à la parcelle" name="assign"/> + </layout_panel> + <layout_panel name="external_controls"> + <button label="Ouvrir dans mon navigateur Web" name="open_browser"/> + <check_box label="Toujours ouvrir dans mon navigateur Web" name="open_always"/> + <button label="Fermer" name="close"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/minimal/xui/fr/floater_nearby_chat.xml b/indra/newview/skins/minimal/xui/fr/floater_nearby_chat.xml new file mode 100644 index 0000000000..9b1b21c434 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/floater_nearby_chat.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="nearby_chat" title="CHAT PRÈS DE MOI"> + <check_box label="Traduction du chat (fournie par Google)" name="translate_chat_checkbox"/> +</floater> diff --git a/indra/newview/skins/minimal/xui/fr/floater_web_content.xml b/indra/newview/skins/minimal/xui/fr/floater_web_content.xml new file mode 100644 index 0000000000..71f44b6ec3 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/floater_web_content.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_web_content" title=""> + <layout_stack name="stack1"> + <layout_panel name="nav_controls"> + <button name="back" tool_tip="Précédente"/> + <button name="forward" tool_tip="Suivante"/> + <button name="stop" tool_tip="Arrêter"/> + <button name="reload" tool_tip="Recharger la page"/> + <combo_box name="address" tool_tip="Saisir une URL ici"/> + <icon name="media_secure_lock_flag" tool_tip="Navigation sécurisée"/> + <button name="popexternal" tool_tip="Ouvrir l'URL actuelle dans votre navigateur de bureau"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/minimal/xui/fr/inspect_avatar.xml b/indra/newview/skins/minimal/xui/fr/inspect_avatar.xml new file mode 100644 index 0000000000..553646f8e9 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/inspect_avatar.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="inspect_avatar"> + <string name="Subtitle"> + [AGE] + </string> + <string name="Details"> + [SL_PROFILE] + </string> + <text name="user_subtitle" value="11 mois, 3 jours"/> + <text name="user_details"> + This is my second life description and I really think it is great. But for some reason my description is super extra long because I like to talk a whole lot + </text> + <slider name="volume_slider" tool_tip="Volume de la voix" value="0.5"/> + <button label="Devenir amis" name="add_friend_btn"/> + <button label="IM" name="im_btn"/> + <button label="Profil" name="view_profile_btn"/> + <panel name="moderator_panel"> + <button label="Désactiver le chat vocal" name="disable_voice"/> + <button label="Activer le chat vocal" name="enable_voice"/> + </panel> +</floater> diff --git a/indra/newview/skins/minimal/xui/fr/inspect_object.xml b/indra/newview/skins/minimal/xui/fr/inspect_object.xml new file mode 100644 index 0000000000..b66af7a2bf --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/inspect_object.xml @@ -0,0 +1,48 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="inspect_object"> + <string name="Creator"> + Par [CREATOR] + </string> + <string name="CreatorAndOwner"> + De [CREATOR] +Propriétaire [OWNER] + </string> + <string name="Price"> + [AMOUNT] L$ + </string> + <string name="PriceFree"> + Gratuit ! + </string> + <string name="Touch"> + Toucher + </string> + <string name="Sit"> + M'asseoir + </string> + <text name="object_name" value="Test Object Name That Is actually two lines and Really Long"/> + <text name="object_creator"> + par secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about +owner secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about + </text> + <text name="price_text"> + 30 000 L$ + </text> + <text name="object_description"> + This is a really long description for an object being as how it is at least 80 characters in length and so but maybe more like 120 at this point. Who knows, really? + </text> + <text name="object_media_url"> + http://www.superdupertest.com + </text> + <button label="Acheter" name="buy_btn"/> + <button label="Payer" name="pay_btn"/> + <button label="Prendre une copie" name="take_free_copy_btn"/> + <button label="Toucher" name="touch_btn"/> + <button label="M'asseoir" name="sit_btn"/> + <button label="Ouvert" name="open_btn"/> + <icon name="secure_browsing" tool_tip="Navigation sécurisée"/> + <button label="Plus" name="more_info_btn"/> +</floater> diff --git a/indra/newview/skins/minimal/xui/fr/menu_add_wearable_gear.xml b/indra/newview/skins/minimal/xui/fr/menu_add_wearable_gear.xml new file mode 100644 index 0000000000..7e7993175e --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_add_wearable_gear.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Add Wearable Gear Menu"> + <menu_item_check label="Trier en commençant par le plus récent" name="sort_by_most_recent"/> + <menu_item_check label="Trier par nom" name="sort_by_name"/> + <menu_item_check label="Trier par type" name="sort_by_type"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_attachment_other.xml b/indra/newview/skins/minimal/xui/fr/menu_attachment_other.xml new file mode 100644 index 0000000000..f48513eb2b --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_attachment_other.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- *NOTE: See also menu_avatar_other.xml --> +<context_menu name="Avatar Pie"> + <menu_item_call label="Voir le profil" name="Profile..."/> + <menu_item_call label="Devenir amis" name="Add Friend"/> + <menu_item_call label="IM" name="Send IM..."/> + <menu_item_call label="Appeler" name="Call"/> + <menu_item_call label="Inviter dans le groupe" name="Invite..."/> + <menu_item_call label="Ignorer" name="Avatar Mute"/> + <menu_item_call label="Signaler" name="abuse"/> + <menu_item_call label="Figer" name="Freeze..."/> + <menu_item_call label="Expulser" name="Eject..."/> + <menu_item_call label="Déboguer les textures" name="Debug..."/> + <menu_item_call label="Zoomer en avant" name="Zoom In"/> + <menu_item_call label="Payer" name="Pay..."/> + <menu_item_call label="Profil de l'objet" name="Object Inspect"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_attachment_self.xml b/indra/newview/skins/minimal/xui/fr/menu_attachment_self.xml new file mode 100644 index 0000000000..78198fb5a8 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_attachment_self.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Attachment Pie"> + <menu_item_call label="Toucher" name="Attachment Object Touch"/> + <menu_item_call label="Modifier" name="Edit..."/> + <menu_item_call label="Détacher" name="Detach"/> + <menu_item_call label="M'asseoir" name="Sit Down Here"/> + <menu_item_call label="Me lever" name="Stand Up"/> + <menu_item_call label="Changer de tenue" name="Change Outfit"/> + <menu_item_call label="Modifier ma tenue" name="Edit Outfit"/> + <menu_item_call label="Modifier ma silhouette" name="Edit My Shape"/> + <menu_item_call label="Mes amis" name="Friends..."/> + <menu_item_call label="Mes groupes" name="Groups..."/> + <menu_item_call label="Mon profil" name="Profile..."/> + <menu_item_call label="Déboguer les textures" name="Debug..."/> + <menu_item_call label="Lâcher" name="Drop"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_avatar_icon.xml b/indra/newview/skins/minimal/xui/fr/menu_avatar_icon.xml new file mode 100644 index 0000000000..3bac25c79b --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_avatar_icon.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Avatar Icon Menu"> + <menu_item_call label="Voir le profil" name="Show Profile"/> + <menu_item_call label="Envoyer IM..." name="Send IM"/> + <menu_item_call label="Devenir amis..." name="Add Friend"/> + <menu_item_call label="Supprimer cet ami..." name="Remove Friend"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_avatar_other.xml b/indra/newview/skins/minimal/xui/fr/menu_avatar_other.xml new file mode 100644 index 0000000000..08d1a20361 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_avatar_other.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- *NOTE: See also menu_attachment_other.xml --> +<context_menu name="Avatar Pie"> + <menu_item_call label="Voir le profil" name="Profile..."/> + <menu_item_call label="Devenir amis" name="Add Friend"/> + <menu_item_call label="IM" name="Send IM..."/> + <menu_item_call label="Appeler" name="Call"/> + <menu_item_call label="Inviter dans le groupe" name="Invite..."/> + <menu_item_call label="Ignorer" name="Avatar Mute"/> + <menu_item_call label="Signaler" name="abuse"/> + <menu_item_call label="Figer" name="Freeze..."/> + <menu_item_call label="Expulser" name="Eject..."/> + <menu_item_call label="Déboguer les textures" name="Debug..."/> + <menu_item_call label="Zoomer en avant" name="Zoom In"/> + <menu_item_call label="Payer" name="Pay..."/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_avatar_self.xml b/indra/newview/skins/minimal/xui/fr/menu_avatar_self.xml new file mode 100644 index 0000000000..c7ee2e9f88 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_avatar_self.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Self Pie"> + <menu_item_call label="M'asseoir" name="Sit Down Here"/> + <menu_item_call label="Me lever" name="Stand Up"/> + <context_menu label="Enlever" name="Take Off >"> + <context_menu label="Habits" name="Clothes >"> + <menu_item_call label="Chemise" name="Shirt"/> + <menu_item_call label="Pantalon" name="Pants"/> + <menu_item_call label="Jupe" name="Skirt"/> + <menu_item_call label="Chaussures" name="Shoes"/> + <menu_item_call label="Chaussettes" name="Socks"/> + <menu_item_call label="Veste" name="Jacket"/> + <menu_item_call label="Gants" name="Gloves"/> + <menu_item_call label="Débardeur" name="Self Undershirt"/> + <menu_item_call label="Caleçon" name="Self Underpants"/> + <menu_item_call label="Tatouage" name="Self Tattoo"/> + <menu_item_call label="Alpha" name="Self Alpha"/> + <menu_item_call label="Tous les habits" name="All Clothes"/> + </context_menu> + <context_menu label="HUD" name="Object Detach HUD"/> + <context_menu label="Détacher" name="Object Detach"/> + <menu_item_call label="Tout détacher" name="Detach All"/> + </context_menu> + <menu_item_call label="Changer de tenue" name="Chenge Outfit"/> + <menu_item_call label="Modifier ma tenue" name="Edit Outfit"/> + <menu_item_call label="Modifier ma silhouette" name="Edit My Shape"/> + <menu_item_call label="Mes amis" name="Friends..."/> + <menu_item_call label="Mes groupes" name="Groups..."/> + <menu_item_call label="Mon profil" name="Profile..."/> + <menu_item_call label="Déboguer les textures" name="Debug..."/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_bottomtray.xml b/indra/newview/skins/minimal/xui/fr/menu_bottomtray.xml new file mode 100644 index 0000000000..bfdc89c5bb --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_bottomtray.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="hide_camera_move_controls_menu"> + <menu_item_check label="Bouton Geste" name="ShowGestureButton"/> + <menu_item_check label="Bouton Bouger" name="ShowMoveButton"/> + <menu_item_check label="Bouton Affichage" name="ShowCameraButton"/> + <menu_item_check label="Bouton Photo" name="ShowSnapshotButton"/> + <menu_item_check label="Bouton Panneau latéral" name="ShowSidebarButton"/> + <menu_item_check label="Bouton Construire" name="ShowBuildButton"/> + <menu_item_check label="Bouton Rechercher" name="ShowSearchButton"/> + <menu_item_check label="Bouton Carte" name="ShowWorldMapButton"/> + <menu_item_check label="Bouton Mini-carte" name="ShowMiniMapButton"/> + <menu_item_call label="Couper" name="NearbyChatBar_Cut"/> + <menu_item_call label="Copier" name="NearbyChatBar_Copy"/> + <menu_item_call label="Coller" name="NearbyChatBar_Paste"/> + <menu_item_call label="Supprimer" name="NearbyChatBar_Delete"/> + <menu_item_call label="Tout sélectionner" name="NearbyChatBar_Select_All"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_cof_attachment.xml b/indra/newview/skins/minimal/xui/fr/menu_cof_attachment.xml new file mode 100644 index 0000000000..a4ead48b6b --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_cof_attachment.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Attachment"> + <menu_item_call label="Détacher" name="detach"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_cof_body_part.xml b/indra/newview/skins/minimal/xui/fr/menu_cof_body_part.xml new file mode 100644 index 0000000000..4b6907fcc6 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_cof_body_part.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Body"> + <menu_item_call label="Remplacer" name="replace"/> + <menu_item_call label="Modifier" name="edit"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_cof_clothing.xml b/indra/newview/skins/minimal/xui/fr/menu_cof_clothing.xml new file mode 100644 index 0000000000..03cc569704 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_cof_clothing.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Clothing"> + <menu_item_call label="Enlever" name="take_off"/> + <menu_item_call label="Modifier" name="edit"/> + <menu_item_call label="Remplacer" name="replace"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_cof_gear.xml b/indra/newview/skins/minimal/xui/fr/menu_cof_gear.xml new file mode 100644 index 0000000000..8276d57025 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_cof_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Gear COF"> + <menu label="Nouveaux habits" name="COF.Gear.New_Clothes"/> + <menu label="Nouvelles parties du corps" name="COF.Geear.New_Body_Parts"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_edit.xml b/indra/newview/skins/minimal/xui/fr/menu_edit.xml new file mode 100644 index 0000000000..56669f31e1 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_edit.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu label="Modifier" name="Edit"> + <menu_item_call label="Annuler" name="Undo"/> + <menu_item_call label="Refaire" name="Redo"/> + <menu_item_call label="Couper" name="Cut"/> + <menu_item_call label="Copier" name="Copy"/> + <menu_item_call label="Coller" name="Paste"/> + <menu_item_call label="Supprimer" name="Delete"/> + <menu_item_call label="Dupliquer" name="Duplicate"/> + <menu_item_call label="Tout sélectionner" name="Select All"/> + <menu_item_call label="Désélectionner" name="Deselect"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_favorites.xml b/indra/newview/skins/minimal/xui/fr/menu_favorites.xml new file mode 100644 index 0000000000..5f1545fde7 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_favorites.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="Téléporter" name="Teleport To Landmark"/> + <menu_item_call label="Voir/Modifier le repère" name="Landmark Open"/> + <menu_item_call label="Copier la SLurl" name="Copy slurl"/> + <menu_item_call label="Voir sur la carte" name="Show On Map"/> + <menu_item_call label="Copier" name="Landmark Copy"/> + <menu_item_call label="Coller" name="Landmark Paste"/> + <menu_item_call label="Supprimer" name="Delete"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_gesture_gear.xml b/indra/newview/skins/minimal/xui/fr/menu_gesture_gear.xml new file mode 100644 index 0000000000..062dd0f005 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_gesture_gear.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_gesture_gear"> + <menu_item_call label="Ajouter/Supprimer des favoris" name="activate"/> + <menu_item_call label="Copier" name="copy_gesture"/> + <menu_item_call label="Coller" name="paste"/> + <menu_item_call label="Copier l'UUID" name="copy_uuid"/> + <menu_item_call label="Enregistrer dans la tenue actuelle" name="save_to_outfit"/> + <menu_item_call label="Modifier" name="edit_gesture"/> + <menu_item_call label="Inspecter" name="inspect"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_group_plus.xml b/indra/newview/skins/minimal/xui/fr/menu_group_plus.xml new file mode 100644 index 0000000000..0db5afedc7 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_group_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_call label="Rejoindre des groupes..." name="item_join"/> + <menu_item_call label="Nouveau groupe..." name="item_new"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_hide_navbar.xml b/indra/newview/skins/minimal/xui/fr/menu_hide_navbar.xml new file mode 100644 index 0000000000..20af901ddc --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_hide_navbar.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="hide_navbar_menu"> + <menu_item_check label="Afficher la barre de navigation" name="ShowNavbarNavigationPanel"/> + <menu_item_check label="Afficher la barre des favoris" name="ShowNavbarFavoritesPanel"/> + <menu_item_check label="Afficher la mini-barre d'emplacement" name="ShowMiniLocationPanel"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_im_well_button.xml b/indra/newview/skins/minimal/xui/fr/menu_im_well_button.xml new file mode 100644 index 0000000000..8ef1529e6b --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_im_well_button.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="IM Well Button Context Menu"> + <menu_item_call label="Tout fermer" name="Close All"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_imchiclet_adhoc.xml b/indra/newview/skins/minimal/xui/fr/menu_imchiclet_adhoc.xml new file mode 100644 index 0000000000..4d9a103058 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_imchiclet_adhoc.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="IMChiclet AdHoc Menu"> + <menu_item_call label="Mettre fin à la session" name="End Session"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_imchiclet_group.xml b/indra/newview/skins/minimal/xui/fr/menu_imchiclet_group.xml new file mode 100644 index 0000000000..59f97d8b48 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_imchiclet_group.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="IMChiclet Group Menu"> + <menu_item_call label="Profil du groupe" name="Show Profile"/> + <menu_item_call label="Afficher la session" name="Chat"/> + <menu_item_call label="Mettre fin à la session" name="End Session"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_imchiclet_p2p.xml b/indra/newview/skins/minimal/xui/fr/menu_imchiclet_p2p.xml new file mode 100644 index 0000000000..ecc8cee413 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_imchiclet_p2p.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="IMChiclet P2P Menu"> + <menu_item_call label="Voir le profil" name="Show Profile"/> + <menu_item_call label="Devenir amis" name="Add Friend"/> + <menu_item_call label="Afficher la session" name="Send IM"/> + <menu_item_call label="Mettre fin à la session" name="End Session"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_inspect_avatar_gear.xml b/indra/newview/skins/minimal/xui/fr/menu_inspect_avatar_gear.xml new file mode 100644 index 0000000000..231a175ee5 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_inspect_avatar_gear.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> +<toggleable_menu name="Gear Menu"> + <menu_item_call label="Voir le profil" name="view_profile"/> + <menu_item_call label="Devenir amis" name="add_friend"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="Téléporter" name="teleport"/> + <menu_item_call label="Ignorer" name="block"/> + <menu_item_call label="Ne plus ignorer" name="unblock"/> + <menu_item_call label="Signaler" name="report"/> + <menu_item_call label="Figer" name="freeze"/> + <menu_item_call label="Expulser" name="eject"/> + <menu_item_call label="Éjecter" name="kick"/> + <menu_item_call label="Représentant de l'Assistance client" name="csr"/> + <menu_item_call label="Déboguer les textures" name="debug"/> + <menu_item_call label="Situer sur la carte" name="find_on_map"/> + <menu_item_call label="Zoomer en avant" name="zoom_in"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_inspect_object_gear.xml b/indra/newview/skins/minimal/xui/fr/menu_inspect_object_gear.xml new file mode 100644 index 0000000000..074bb54cdc --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_inspect_object_gear.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<menu name="Gear Menu"> + <menu_item_call label="Toucher" name="touch"/> + <menu_item_call label="M'asseoir" name="sit"/> + <menu_item_call label="Payer" name="pay"/> + <menu_item_call label="Acheter" name="buy"/> + <menu_item_call label="Prendre" name="take"/> + <menu_item_call label="Prendre une copie" name="take_copy"/> + <menu_item_call label="Ouvrir" name="open"/> + <menu_item_call label="Modifier" name="edit"/> + <menu_item_call label="Porter" name="wear"/> + <menu_item_call label="Ajouter" name="add"/> + <menu_item_call label="Signaler" name="report"/> + <menu_item_call label="Ignorer" name="block"/> + <menu_item_call label="Zoomer en avant" name="zoom_in"/> + <menu_item_call label="Supprimer" name="remove"/> + <menu_item_call label="En savoir plus" name="more_info"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_inspect_self_gear.xml b/indra/newview/skins/minimal/xui/fr/menu_inspect_self_gear.xml new file mode 100644 index 0000000000..fd48aa4f7d --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_inspect_self_gear.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Self Pie"> + <menu_item_call label="M'asseoir" name="Sit Down Here"/> + <menu_item_call label="Me lever" name="Stand Up"/> + <menu_item_call label="Mes amis" name="Friends..."/> + <menu_item_call label="Mon profil" name="Profile..."/> + <menu_item_call label="Déboguer les textures" name="Debug..."/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_inv_offer_chiclet.xml b/indra/newview/skins/minimal/xui/fr/menu_inv_offer_chiclet.xml new file mode 100644 index 0000000000..a9b2883cca --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_inv_offer_chiclet.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="InvOfferChiclet Menu"> + <menu_item_call label="Fermer" name="Close"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_inventory.xml b/indra/newview/skins/minimal/xui/fr/menu_inventory.xml new file mode 100644 index 0000000000..a2279cf0ac --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_inventory.xml @@ -0,0 +1,86 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="Partager" name="Share"/> + <menu_item_call label="Acheter" name="Task Buy"/> + <menu_item_call label="Ouvrir" name="Task Open"/> + <menu_item_call label="Jouer" name="Task Play"/> + <menu_item_call label="Propriétés" name="Task Properties"/> + <menu_item_call label="Renommer" name="Task Rename"/> + <menu_item_call label="Supprimer" name="Task Remove"/> + <menu_item_call label="Vider la corbeille" name="Empty Trash"/> + <menu_item_call label="Vider les objets trouvés" name="Empty Lost And Found"/> + <menu_item_call label="Nouveau dossier" name="New Folder"/> + <menu_item_call label="Nouveau script" name="New Script"/> + <menu_item_call label="Nouvelle note" name="New Note"/> + <menu_item_call label="Nouveau geste" name="New Gesture"/> + <menu label="Nouveaux habits" name="New Clothes"> + <menu_item_call label="Nouvelle chemise" name="New Shirt"/> + <menu_item_call label="Nouveau pantalon" name="New Pants"/> + <menu_item_call label="Nouvelles chaussures" name="New Shoes"/> + <menu_item_call label="Nouvelles chaussettes" name="New Socks"/> + <menu_item_call label="Nouvelle veste" name="New Jacket"/> + <menu_item_call label="Nouvelle jupe" name="New Skirt"/> + <menu_item_call label="Nouveaux gants" name="New Gloves"/> + <menu_item_call label="Nouveau débardeur" name="New Undershirt"/> + <menu_item_call label="Nouveau caleçon" name="New Underpants"/> + <menu_item_call label="Nouveau masque alpha" name="New Alpha Mask"/> + <menu_item_call label="Nouveau tatouage" name="New Tattoo"/> + </menu> + <menu label="Nouvelles parties du corps" name="New Body Parts"> + <menu_item_call label="Nouvelle silhouette" name="New Shape"/> + <menu_item_call label="Nouvelle peau" name="New Skin"/> + <menu_item_call label="Nouveaux cheveux" name="New Hair"/> + <menu_item_call label="Nouveaux yeux" name="New Eyes"/> + </menu> + <menu label="Changer de type" name="Change Type"> + <menu_item_call label="Défaut" name="Default"/> + <menu_item_call label="Gants" name="Gloves"/> + <menu_item_call label="Veste" name="Jacket"/> + <menu_item_call label="Pantalon" name="Pants"/> + <menu_item_call label="Silhouette" name="Shape"/> + <menu_item_call label="Chaussures" name="Shoes"/> + <menu_item_call label="Chemise" name="Shirt"/> + <menu_item_call label="Jupe" name="Skirt"/> + <menu_item_call label="Caleçon" name="Underpants"/> + <menu_item_call label="Débardeur" name="Undershirt"/> + </menu> + <menu_item_call label="Téléporter" name="Landmark Open"/> + <menu_item_call label="Ouvrir" name="Animation Open"/> + <menu_item_call label="Ouvrir" name="Sound Open"/> + <menu_item_call label="Remplacer la tenue actuelle" name="Replace Outfit"/> + <menu_item_call label="Ajouter à la tenue actuelle" name="Add To Outfit"/> + <menu_item_call label="Enlever de la tenue actuelle" name="Remove From Outfit"/> + <menu_item_call label="Trouver l'original" name="Find Original"/> + <menu_item_call label="Purger l'objet" name="Purge Item"/> + <menu_item_call label="Restaurer l'objet" name="Restore Item"/> + <menu_item_call label="Ouvrir" name="Open"/> + <menu_item_call label="Ouvrir l'original" name="Open Original"/> + <menu_item_call label="Propriétés" name="Properties"/> + <menu_item_call label="Renommer" name="Rename"/> + <menu_item_call label="Copier l'UUID (identifiant universel unique)" name="Copy Asset UUID"/> + <menu_item_call label="Copier" name="Copy"/> + <menu_item_call label="Coller" name="Paste"/> + <menu_item_call label="Coller comme lien" name="Paste As Link"/> + <menu_item_call label="Supprimer" name="Remove Link"/> + <menu_item_call label="Supprimer" name="Delete"/> + <menu_item_call label="Supprimer le dossier système" name="Delete System Folder"/> + <menu_item_call label="Démarrer le chat conférence" name="Conference Chat Folder"/> + <menu_item_call label="Jouer" name="Sound Play"/> + <menu_item_call label="À propos du repère" name="About Landmark"/> + <menu_item_call label="Jouer dans Second Life" name="Animation Play"/> + <menu_item_call label="Jouer localement" name="Animation Audition"/> + <menu_item_call label="Envoyer un message instantané" name="Send Instant Message"/> + <menu_item_call label="Offrir de téléporter..." name="Offer Teleport..."/> + <menu_item_call label="Démarrer le chat conférence" name="Conference Chat"/> + <menu_item_call label="Activer" name="Activate"/> + <menu_item_call label="Désactiver" name="Deactivate"/> + <menu_item_call label="Enregistrer sous" name="Save As"/> + <menu_item_call label="Détacher de vous" name="Detach From Yourself"/> + <menu_item_call label="Porter" name="Wearable And Object Wear"/> + <menu label="Attacher à" name="Attach To"/> + <menu label="Attacher au HUD " name="Attach To HUD"/> + <menu_item_call label="Modifier" name="Wearable Edit"/> + <menu_item_call label="Ajouter" name="Wearable Add"/> + <menu_item_call label="Enlever" name="Take Off"/> + <menu_item_call label="--aucune option--" name="--no options--"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_inventory_add.xml b/indra/newview/skins/minimal/xui/fr/menu_inventory_add.xml new file mode 100644 index 0000000000..fe096b4a7e --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_inventory_add.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_inventory_add"> + <menu label="Importer" name="upload"> + <menu_item_call label="Image ([COST] L$)..." name="Upload Image"/> + <menu_item_call label="Son ([COST] L$)..." name="Upload Sound"/> + <menu_item_call label="Animation ([COST] L$)..." name="Upload Animation"/> + <menu_item_call label="Lot ([COST] L$ par fichier)..." name="Bulk Upload"/> + <menu_item_call label="Définir les droits de chargement par défaut" name="perm prefs"/> + </menu> + <menu_item_call label="Nouveau dossier" name="New Folder"/> + <menu_item_call label="Nouveau script" name="New Script"/> + <menu_item_call label="Nouvelle note" name="New Note"/> + <menu_item_call label="Nouveau geste" name="New Gesture"/> + <menu label="Nouveaux habits" name="New Clothes"> + <menu_item_call label="Nouvelle chemise" name="New Shirt"/> + <menu_item_call label="Nouveau pantalon" name="New Pants"/> + <menu_item_call label="Nouvelles chaussures" name="New Shoes"/> + <menu_item_call label="Nouvelles chaussettes" name="New Socks"/> + <menu_item_call label="Nouvelle veste" name="New Jacket"/> + <menu_item_call label="Nouvelle jupe" name="New Skirt"/> + <menu_item_call label="Nouveaux gants" name="New Gloves"/> + <menu_item_call label="Nouveau débardeur" name="New Undershirt"/> + <menu_item_call label="Nouveau caleçon" name="New Underpants"/> + <menu_item_call label="Nouvel alpha" name="New Alpha"/> + <menu_item_call label="Nouveau tatouage" name="New Tattoo"/> + </menu> + <menu label="Nouvelles parties du corps" name="New Body Parts"> + <menu_item_call label="Nouvelle silhouette" name="New Shape"/> + <menu_item_call label="Nouvelle peau" name="New Skin"/> + <menu_item_call label="Nouveaux cheveux" name="New Hair"/> + <menu_item_call label="Nouveaux yeux" name="New Eyes"/> + </menu> +</menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_inventory_gear_default.xml b/indra/newview/skins/minimal/xui/fr/menu_inventory_gear_default.xml new file mode 100644 index 0000000000..f28918ae14 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_inventory_gear_default.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_gear_default"> + <menu_item_call label="Nouvelle fenêtre d'inventaire" name="new_window"/> + <menu_item_check label="Trier par nom" name="sort_by_name"/> + <menu_item_check label="Trier en commençant par le plus récent" name="sort_by_recent"/> + <menu_item_check label="Dossiers système en premier" name="sort_system_folders_to_top"/> + <menu_item_call label="Afficher les filtres" name="show_filters"/> + <menu_item_call label="Réinitialiser les filtres" name="reset_filters"/> + <menu_item_call label="Fermer tous les dossiers" name="close_folders"/> + <menu_item_call label="Vider les objets trouvés" name="empty_lostnfound"/> + <menu_item_call label="Enregistrer la texture sous" name="Save Texture As"/> + <menu_item_call label="Partager" name="Share"/> + <menu_item_call label="Trouver l'original" name="Find Original"/> + <menu_item_call label="Trouver tous les liens" name="Find All Links"/> + <menu_item_call label="Vider la corbeille" name="empty_trash"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_land.xml b/indra/newview/skins/minimal/xui/fr/menu_land.xml new file mode 100644 index 0000000000..b84daee3ae --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_land.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Land Pie"> + <menu_item_call label="À propos du terrain" name="Place Information..."/> + <menu_item_call label="M'asseoir ici" name="Sit Here"/> + <menu_item_call label="Acheter ce terrain" name="Land Buy"/> + <menu_item_call label="Acheter un pass" name="Land Buy Pass"/> + <menu_item_call label="Construire" name="Create"/> + <menu_item_call label="Modifier le terrain" name="Edit Terrain"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_landmark.xml b/indra/newview/skins/minimal/xui/fr/menu_landmark.xml new file mode 100644 index 0000000000..73eaa4af7e --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_landmark.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="landmark_overflow_menu"> + <menu_item_call label="Copier la SLurl" name="copy"/> + <menu_item_call label="Supprimer" name="delete"/> + <menu_item_call label="Créer un favori" name="pick"/> + <menu_item_call label="Ajouter à la barre des favoris" name="add_to_favbar"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_login.xml b/indra/newview/skins/minimal/xui/fr/menu_login.xml new file mode 100644 index 0000000000..400c77e51a --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_login.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu_bar name="Login Menu"> + <menu label="Moi" name="File"> + <menu_item_call label="Préférences" name="Preferences..."/> + <menu_item_call label="Quitter [APP_NAME]" name="Quit"/> + </menu> + <menu label="Aide" name="Help"> + <menu_item_call label="Aide de [SECOND_LIFE]" name="Second Life Help"/> + <menu_item_call label="À propos de [APP_NAME]" name="About Second Life"/> + </menu> + <menu_item_check label="Afficher le menu de débogage" name="Show Debug Menu"/> + <menu label="Débogage" name="Debug"> + <menu_item_call label="Afficher les paramètres de débogage" name="Debug Settings"/> + <menu_item_call label="Paramètres de couleurs/interface" name="UI/Color Settings"/> + <menu_item_call label="Outil d'aperçu XUI" name="UI Preview Tool"/> + <menu label="Tests de l'interface" name="UI Tests"/> + <menu_item_call label="Définir la taille de la fenêtre..." name="Set Window Size..."/> + <menu_item_call label="Afficher les conditions d'utilisation" name="TOS"/> + <menu_item_call label="Afficher le message critique" name="Critical"/> + <menu_item_call label="Test du navigateur de médias" name="Web Browser Test"/> + <menu_item_call label="Test de la fenêtre flottante du contenu Web" name="Web Content Floater Test"/> + <menu_item_check label="Afficher le sélecteur de grille" name="Show Grid Picker"/> + <menu_item_call label="Afficher la console des notifications" name="Show Notifications Console"/> + </menu> +</menu_bar> diff --git a/indra/newview/skins/minimal/xui/fr/menu_mini_map.xml b/indra/newview/skins/minimal/xui/fr/menu_mini_map.xml new file mode 100644 index 0000000000..b9d0a70383 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_mini_map.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="Zoom rapproché" name="Zoom Close"/> + <menu_item_call label="Zoom moyen" name="Zoom Medium"/> + <menu_item_call label="Zoom éloigné" name="Zoom Far"/> + <menu_item_call label="Zoom par défaut" name="Zoom Default"/> + <menu_item_check label="Faire pivoter la carte" name="Rotate Map"/> + <menu_item_check label="Centrage auto" name="Auto Center"/> + <menu_item_call label="Arrêter de suivre" name="Stop Tracking"/> + <menu_item_call label="Carte du monde" name="World Map"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_navbar.xml b/indra/newview/skins/minimal/xui/fr/menu_navbar.xml new file mode 100644 index 0000000000..08d810b653 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_navbar.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Navbar Menu"> + <menu_item_check label="Voir les coordonnées" name="Show Coordinates"/> + <menu_item_check label="Afficher les propriétés de la parcelle" name="Show Parcel Properties"/> + <menu_item_call label="Repère" name="Landmark"/> + <menu_item_call label="Couper" name="Cut"/> + <menu_item_call label="Copier" name="Copy"/> + <menu_item_call label="Coller" name="Paste"/> + <menu_item_call label="Supprimer" name="Delete"/> + <menu_item_call label="Tout sélectionner" name="Select All"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_nearby_chat.xml b/indra/newview/skins/minimal/xui/fr/menu_nearby_chat.xml new file mode 100644 index 0000000000..99e22aeff7 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_nearby_chat.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="NearBy Chat Menu"> + <menu_item_call label="Afficher les personnes près de vous..." name="nearby_people"/> + <menu_item_check label="Afficher le texte ignoré" name="muted_text"/> + <menu_item_check label="Afficher les icônes des Buddy" name="show_buddy_icons"/> + <menu_item_check label="Afficher les noms" name="show_names"/> + <menu_item_check label="Afficher les icônes et les noms" name="show_icons_and_names"/> + <menu_item_call label="Taille de la police" name="font_size"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_notification_well_button.xml b/indra/newview/skins/minimal/xui/fr/menu_notification_well_button.xml new file mode 100644 index 0000000000..323bfdbf16 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_notification_well_button.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Notification Well Button Context Menu"> + <menu_item_call label="Tout fermer" name="Close All"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_object.xml b/indra/newview/skins/minimal/xui/fr/menu_object.xml new file mode 100644 index 0000000000..a50a9df4b1 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_object.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Object Pie"> + <menu_item_call label="Toucher" name="Object Touch"> + <menu_item_call.on_enable name="EnableTouch" parameter="Toucher"/> + </menu_item_call> + <menu_item_call label="Modifier" name="Edit..."/> + <menu_item_call label="Construire" name="Build"/> + <menu_item_call label="Ouvrir" name="Open"/> + <menu_item_call label="M'asseoir ici" name="Object Sit"/> + <menu_item_call label="Me lever" name="Object Stand Up"/> + <menu_item_call label="Profil de l'objet" name="Object Inspect"/> + <menu_item_call label="Zoomer en avant" name="Zoom In"/> + <context_menu label="Porter" name="Put On"> + <menu_item_call label="Porter" name="Wear"/> + <menu_item_call label="Ajouter" name="Add"/> + <context_menu label="Attacher" name="Object Attach"/> + <context_menu label="Attacher HUD" name="Object Attach HUD"/> + </context_menu> + <context_menu label="Supprimer" name="Remove"> + <menu_item_call label="Signaler une infraction" name="Report Abuse..."/> + <menu_item_call label="Ignorer" name="Object Mute"/> + <menu_item_call label="Retour" name="Return..."/> + <menu_item_call label="Supprimer" name="Delete"/> + </context_menu> + <menu_item_call label="Prendre" name="Pie Object Take"/> + <menu_item_call label="Prendre une copie" name="Take Copy"/> + <menu_item_call label="Payer" name="Pay..."/> + <menu_item_call label="Acheter" name="Buy..."/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_object_icon.xml b/indra/newview/skins/minimal/xui/fr/menu_object_icon.xml new file mode 100644 index 0000000000..69f8e88a0d --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_object_icon.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Object Icon Menu"> + <menu_item_call label="Profil de l'objet..." name="Object Profile"/> + <menu_item_call label="Ignorer..." name="Block"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_outfit_gear.xml b/indra/newview/skins/minimal/xui/fr/menu_outfit_gear.xml new file mode 100644 index 0000000000..5db7f176b5 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_outfit_gear.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Gear Outfit"> + <menu_item_call label="Porter - Remplacer la tenue actuelle" name="wear"/> + <menu_item_call label="Porter - Ajouter à la tenue actuelle" name="wear_add"/> + <menu_item_call label="Enlever - Supprimer de la tenue actuelle" name="take_off"/> + <menu label="Nouveaux habits" name="New Clothes"> + <menu_item_call label="Nouvelle chemise" name="New Shirt"/> + <menu_item_call label="Nouveau pantalon" name="New Pants"/> + <menu_item_call label="Nouvelles chaussures" name="New Shoes"/> + <menu_item_call label="Nouvelles chaussettes" name="New Socks"/> + <menu_item_call label="Nouvelle veste" name="New Jacket"/> + <menu_item_call label="Nouvelle jupe" name="New Skirt"/> + <menu_item_call label="Nouveaux gants" name="New Gloves"/> + <menu_item_call label="Nouveau débardeur" name="New Undershirt"/> + <menu_item_call label="Nouveau caleçon" name="New Underpants"/> + <menu_item_call label="Nouvel alpha" name="New Alpha"/> + <menu_item_call label="Nouveau tatouage" name="New Tattoo"/> + </menu> + <menu label="Nouvelles parties du corps" name="New Body Parts"> + <menu_item_call label="Nouvelle silhouette" name="New Shape"/> + <menu_item_call label="Nouvelle peau" name="New Skin"/> + <menu_item_call label="Nouveaux cheveux" name="New Hair"/> + <menu_item_call label="Nouveaux yeux" name="New Eyes"/> + </menu> + <menu_item_call label="Renommer la tenue" name="rename"/> + <menu_item_call label="Supprimer la tenue" name="delete_outfit"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_outfit_tab.xml b/indra/newview/skins/minimal/xui/fr/menu_outfit_tab.xml new file mode 100644 index 0000000000..2a7f618e07 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_outfit_tab.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Outfit"> + <menu_item_call label="Porter - Remplacer la tenue actuelle" name="wear_replace"/> + <menu_item_call label="Porter - Ajouter à la tenue actuelle" name="wear_add"/> + <menu_item_call label="Enlever - Supprimer de la tenue actuelle" name="take_off"/> + <menu_item_call label="Modifier la tenue" name="edit"/> + <menu_item_call label="Renommer la tenue" name="rename"/> + <menu_item_call label="Supprimer la tenue" name="delete"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_participant_list.xml b/indra/newview/skins/minimal/xui/fr/menu_participant_list.xml new file mode 100644 index 0000000000..f91a30f6bb --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_participant_list.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Participant List Context Menu"> + <menu_item_check label="Trier par nom" name="SortByName"/> + <menu_item_check label="Trier par intervenants récents" name="SortByRecentSpeakers"/> + <menu_item_call label="Voir le profil" name="View Profile"/> + <menu_item_call label="Devenir amis" name="Add Friend"/> + <menu_item_call label="IM" name="IM"/> + <menu_item_call label="Appeler" name="Call"/> + <menu_item_call label="Partager" name="Share"/> + <menu_item_call label="Payer" name="Pay"/> + <menu_item_check label="Afficher les icônes des résidents" name="View Icons"/> + <menu_item_check label="Bloquer le chat vocal" name="Block/Unblock"/> + <menu_item_check label="Ignorer le texte" name="MuteText"/> + <context_menu label="Options du modérateur" name="Moderator Options"> + <menu_item_check label="Autoriser les chats écrits" name="AllowTextChat"/> + <menu_item_call label="Ignorer ce participant" name="ModerateVoiceMuteSelected"/> + <menu_item_call label="Ne plus ignorer ce participant" name="ModerateVoiceUnMuteSelected"/> + <menu_item_call label="Ignorer les autres" name="ModerateVoiceMute"/> + <menu_item_call label="Ne plus ignorer les autres" name="ModerateVoiceUnmute"/> + </context_menu> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_people_friends_view_sort.xml b/indra/newview/skins/minimal/xui/fr/menu_people_friends_view_sort.xml new file mode 100644 index 0000000000..a6170a6c16 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_people_friends_view_sort.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_check label="Trier par nom" name="sort_name"/> + <menu_item_check label="Trier par statut" name="sort_status"/> + <menu_item_check label="Afficher les icônes des résidents" name="view_icons"/> + <menu_item_check label="Afficher les droits octroyés" name="view_permissions"/> + <menu_item_call label="Afficher les résidents et les objets ignorés" name="show_blocked_list"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_people_groups.xml b/indra/newview/skins/minimal/xui/fr/menu_people_groups.xml new file mode 100644 index 0000000000..eb51b4cf7e --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_people_groups.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_call label="Afficher les infos" name="View Info"/> + <menu_item_call label="Chat" name="Chat"/> + <menu_item_call label="Appeler" name="Call"/> + <menu_item_call label="Activer" name="Activate"/> + <menu_item_call label="Quitter" name="Leave"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_people_groups_view_sort.xml b/indra/newview/skins/minimal/xui/fr/menu_people_groups_view_sort.xml new file mode 100644 index 0000000000..34f949cf2c --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_people_groups_view_sort.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_check label="Afficher les icônes des groupes" name="Display Group Icons"/> + <menu_item_call label="Quitter le groupe sélectionné" name="Leave Selected Group"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_people_nearby.xml b/indra/newview/skins/minimal/xui/fr/menu_people_nearby.xml new file mode 100644 index 0000000000..f153ed15ae --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_people_nearby.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Avatar Context Menu"> + <menu_item_call label="Voir le profil" name="View Profile"/> + <menu_item_call label="Devenir amis" name="Add Friend"/> + <menu_item_call label="Supprimer cet ami" name="Remove Friend"/> + <menu_item_call label="IM" name="IM"/> + <menu_item_call label="Appeler" name="Call"/> + <menu_item_call label="Carte" name="Map"/> + <menu_item_call label="Partager" name="Share"/> + <menu_item_call label="Payer" name="Pay"/> + <menu_item_check label="Ignorer/Ne plus ignorer" name="Block/Unblock"/> + <menu_item_call label="Téléporter" name="teleport"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_people_nearby_multiselect.xml b/indra/newview/skins/minimal/xui/fr/menu_people_nearby_multiselect.xml new file mode 100644 index 0000000000..8400ec0a14 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_people_nearby_multiselect.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Multi-Selected People Context Menu"> + <menu_item_call label="Devenir amis" name="Add Friends"/> + <menu_item_call label="Supprimer des amis" name="Remove Friend"/> + <menu_item_call label="IM" name="IM"/> + <menu_item_call label="Appeler" name="Call"/> + <menu_item_call label="Partager" name="Share"/> + <menu_item_call label="Payer" name="Pay"/> + <menu_item_call label="Proposer une téléportation" name="teleport"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_people_nearby_view_sort.xml b/indra/newview/skins/minimal/xui/fr/menu_people_nearby_view_sort.xml new file mode 100644 index 0000000000..45f97e062e --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_people_nearby_view_sort.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_check label="Trier par intervenants récents" name="sort_by_recent_speakers"/> + <menu_item_check label="Trier par nom" name="sort_name"/> + <menu_item_check label="Trier par distance" name="sort_distance"/> + <menu_item_check label="Afficher les icônes des résidents" name="view_icons"/> + <menu_item_call label="Afficher les résidents et les objets interdits" name="show_blocked_list"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_people_recent_view_sort.xml b/indra/newview/skins/minimal/xui/fr/menu_people_recent_view_sort.xml new file mode 100644 index 0000000000..93b90ae61c --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_people_recent_view_sort.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_check label="Trier en commençant par le plus récent" name="sort_most"/> + <menu_item_check label="Trier par nom" name="sort_name"/> + <menu_item_check label="Afficher les icônes des résidents" name="view_icons"/> + <menu_item_call label="Afficher les résidents et les objets ignorés" name="show_blocked_list"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_picks.xml b/indra/newview/skins/minimal/xui/fr/menu_picks.xml new file mode 100644 index 0000000000..7d7174d43c --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_picks.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Picks"> + <menu_item_call label="Infos" name="pick_info"/> + <menu_item_call label="Modifier" name="pick_edit"/> + <menu_item_call label="Téléporter" name="pick_teleport"/> + <menu_item_call label="Carte" name="pick_map"/> + <menu_item_call label="Supprimer" name="pick_delete"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_picks_plus.xml b/indra/newview/skins/minimal/xui/fr/menu_picks_plus.xml new file mode 100644 index 0000000000..b6cde6d6e2 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_picks_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="picks_plus_menu"> + <menu_item_call label="Nouveau favori" name="create_pick"/> + <menu_item_call label="Nouvelle petite annonce" name="create_classified"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_place.xml b/indra/newview/skins/minimal/xui/fr/menu_place.xml new file mode 100644 index 0000000000..6b0f4db752 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_place.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="place_overflow_menu"> + <menu_item_call label="Enregistrer comme repère" name="landmark"/> + <menu_item_call label="Créer un favori" name="pick"/> + <menu_item_call label="Acheter un pass" name="pass"/> + <menu_item_call label="Modifier" name="edit"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_place_add_button.xml b/indra/newview/skins/minimal/xui/fr/menu_place_add_button.xml new file mode 100644 index 0000000000..92f9e7719d --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_place_add_button.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_folder_gear"> + <menu_item_call label="Ajouter un dossier" name="add_folder"/> + <menu_item_call label="Ajouter un repère" name="add_landmark"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_places_gear_folder.xml b/indra/newview/skins/minimal/xui/fr/menu_places_gear_folder.xml new file mode 100644 index 0000000000..3570bdec7f --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_places_gear_folder.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_folder_gear"> + <menu_item_call label="Ajouter un repère" name="add_landmark"/> + <menu_item_call label="Ajouter un dossier" name="add_folder"/> + <menu_item_call label="Couper" name="cut"/> + <menu_item_call label="Copier" name="copy_folder"/> + <menu_item_call label="Coller" name="paste"/> + <menu_item_call label="Renommer" name="rename"/> + <menu_item_call label="Supprimer" name="delete"/> + <menu_item_call label="Agrandir" name="expand"/> + <menu_item_call label="Réduire" name="collapse"/> + <menu_item_call label="Développer tous les dossiers" name="expand_all"/> + <menu_item_call label="Réduire tous les dossiers" name="collapse_all"/> + <menu_item_check label="Trier par date" name="sort_by_date"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_places_gear_landmark.xml b/indra/newview/skins/minimal/xui/fr/menu_places_gear_landmark.xml new file mode 100644 index 0000000000..5491c1b3fc --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_places_gear_landmark.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_ladmark_gear"> + <menu_item_call label="Téléporter" name="teleport"/> + <menu_item_call label="Plus d'informations" name="more_info"/> + <menu_item_call label="Voir sur la carte" name="show_on_map"/> + <menu_item_call label="Ajouter un repère" name="add_landmark"/> + <menu_item_call label="Ajouter un dossier" name="add_folder"/> + <menu_item_call label="Couper" name="cut"/> + <menu_item_call label="Copier le repère" name="copy_landmark"/> + <menu_item_call label="Copier la SLurl" name="copy_slurl"/> + <menu_item_call label="Coller" name="paste"/> + <menu_item_call label="Renommer" name="rename"/> + <menu_item_call label="Supprimer" name="delete"/> + <menu_item_call label="Développer tous les dossiers" name="expand_all"/> + <menu_item_call label="Réduire tous les dossiers" name="collapse_all"/> + <menu_item_check label="Trier par date" name="sort_by_date"/> + <menu_item_call label="Créer un favori" name="create_pick"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_profile_overflow.xml b/indra/newview/skins/minimal/xui/fr/menu_profile_overflow.xml new file mode 100644 index 0000000000..ddf898b791 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_profile_overflow.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="profile_overflow_menu"> + <menu_item_call label="Carte" name="show_on_map"/> + <menu_item_call label="Payer" name="pay"/> + <menu_item_call label="Partager" name="share"/> + <menu_item_call label="Ignorer" name="block"/> + <menu_item_call label="Ne plus ignorer" name="unblock"/> + <menu_item_call label="Éjecter" name="kick"/> + <menu_item_call label="Figer" name="freeze"/> + <menu_item_call label="Libérer" name="unfreeze"/> + <menu_item_call label="Représentant du service consommateur" name="csr"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_save_outfit.xml b/indra/newview/skins/minimal/xui/fr/menu_save_outfit.xml new file mode 100644 index 0000000000..f78db411b3 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_save_outfit.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="save_outfit_menu"> + <menu_item_call label="Enregistrer" name="save_outfit"/> + <menu_item_call label="Enregistrer sous" name="save_as_new_outfit"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_script_chiclet.xml b/indra/newview/skins/minimal/xui/fr/menu_script_chiclet.xml new file mode 100644 index 0000000000..46efa30bd6 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_script_chiclet.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="ScriptChiclet Menu"> + <menu_item_call label="Fermer" name="Close"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_slurl.xml b/indra/newview/skins/minimal/xui/fr/menu_slurl.xml new file mode 100644 index 0000000000..ddfa5c0849 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_slurl.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="À propos de l'URL" name="about_url"/> + <menu_item_call label="Téléporter vers l'URL" name="teleport_to_url"/> + <menu_item_call label="Carte" name="show_on_map"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_teleport_history_gear.xml b/indra/newview/skins/minimal/xui/fr/menu_teleport_history_gear.xml new file mode 100644 index 0000000000..3dea662cc2 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_teleport_history_gear.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Teleport History Gear Context Menu"> + <menu_item_call label="Développer tous les dossiers" name="Expand all folders"/> + <menu_item_call label="Réduire tous les dossiers" name="Collapse all folders"/> + <menu_item_call label="Effacer l'historique des téléportations" name="Clear Teleport History"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_teleport_history_item.xml b/indra/newview/skins/minimal/xui/fr/menu_teleport_history_item.xml new file mode 100644 index 0000000000..fb4582dbce --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_teleport_history_item.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Teleport History Item Context Menu"> + <menu_item_call label="Téléporter" name="Teleport"/> + <menu_item_call label="Plus d'informations" name="More Information"/> + <menu_item_call label="Copier dans le presse-papiers" name="CopyToClipboard"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_teleport_history_tab.xml b/indra/newview/skins/minimal/xui/fr/menu_teleport_history_tab.xml new file mode 100644 index 0000000000..369680985d --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_teleport_history_tab.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Teleport History Item Context Menu"> + <menu_item_call label="Ouvrir" name="TabOpen"/> + <menu_item_call label="Fermer" name="TabClose"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_text_editor.xml b/indra/newview/skins/minimal/xui/fr/menu_text_editor.xml new file mode 100644 index 0000000000..b6f429aec9 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_text_editor.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Text editor context menu"> + <menu_item_call label="Couper" name="Cut"/> + <menu_item_call label="Copier" name="Copy"/> + <menu_item_call label="Coller" name="Paste"/> + <menu_item_call label="Supprimer" name="Delete"/> + <menu_item_call label="Tout sélectionner" name="Select All"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_topinfobar.xml b/indra/newview/skins/minimal/xui/fr/menu_topinfobar.xml new file mode 100644 index 0000000000..dc68f40fe7 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_topinfobar.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_topinfobar"> + <menu_item_check label="Afficher les coordonnées" name="Show Coordinates"/> + <menu_item_check label="Afficher les propriétés de la parcelle" name="Show Parcel Properties"/> + <menu_item_call label="Repère" name="Landmark"/> + <menu_item_call label="Copier" name="Copy"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_url_agent.xml b/indra/newview/skins/minimal/xui/fr/menu_url_agent.xml new file mode 100644 index 0000000000..5ed627fbc3 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_url_agent.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Voir le profil du résident" name="show_agent"/> + <menu_item_call label="Copier le nom dans le presse-papiers" name="url_copy_label"/> + <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_url_group.xml b/indra/newview/skins/minimal/xui/fr/menu_url_group.xml new file mode 100644 index 0000000000..de90c3ff7e --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_url_group.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Voir le profil du groupe" name="show_group"/> + <menu_item_call label="Copier le groupe dans le presse-papiers" name="url_copy_label"/> + <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_url_http.xml b/indra/newview/skins/minimal/xui/fr/menu_url_http.xml new file mode 100644 index 0000000000..5e96352999 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_url_http.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Ouvrir la page Web" name="url_open"/> + <menu_item_call label="Ouvrir dans un navigateur interne" name="url_open_internal"/> + <menu_item_call label="Ouvrir dans un navigateur externe" name="url_open_external"/> + <menu_item_call label="Copier l'URL dans le presse-papiers" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_url_inventory.xml b/indra/newview/skins/minimal/xui/fr/menu_url_inventory.xml new file mode 100644 index 0000000000..8ab88b4be7 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_url_inventory.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Afficher l'article d'inventaire" name="show_item"/> + <menu_item_call label="Copier le nom dans le presse-papiers" name="url_copy_label"/> + <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_url_map.xml b/indra/newview/skins/minimal/xui/fr/menu_url_map.xml new file mode 100644 index 0000000000..67e6986f5d --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_url_map.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Voir sur la carte" name="show_on_map"/> + <menu_item_call label="Me téléporter à cet endroit" name="teleport_to_location"/> + <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_url_objectim.xml b/indra/newview/skins/minimal/xui/fr/menu_url_objectim.xml new file mode 100644 index 0000000000..f581c3ef9d --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_url_objectim.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Afficher les informations sur l'objet" name="show_object"/> + <menu_item_call label="Voir sur la carte" name="show_on_map"/> + <menu_item_call label="Me téléporter à l'emplacement de l'objet" name="teleport_to_object"/> + <menu_item_call label="Copier le nom de l'objet dans le presse-papiers" name="url_copy_label"/> + <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_url_parcel.xml b/indra/newview/skins/minimal/xui/fr/menu_url_parcel.xml new file mode 100644 index 0000000000..07b0eeca49 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_url_parcel.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Afficher les informations sur la parcelle" name="show_parcel"/> + <menu_item_call label="Voir sur la carte" name="show_on_map"/> + <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_url_slapp.xml b/indra/newview/skins/minimal/xui/fr/menu_url_slapp.xml new file mode 100644 index 0000000000..f4b7e212ca --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_url_slapp.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Exécuter cette commande" name="run_slapp"/> + <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_url_slurl.xml b/indra/newview/skins/minimal/xui/fr/menu_url_slurl.xml new file mode 100644 index 0000000000..e44943cf15 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_url_slurl.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Afficher les informations sur ce lieu" name="show_place"/> + <menu_item_call label="Voir sur la carte" name="show_on_map"/> + <menu_item_call label="Me téléporter à cet endroit" name="teleport_to_location"/> + <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_url_teleport.xml b/indra/newview/skins/minimal/xui/fr/menu_url_teleport.xml new file mode 100644 index 0000000000..a5075a2740 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_url_teleport.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Me téléporter à cet endroit." name="teleport"/> + <menu_item_call label="Voir sur la carte" name="show_on_map"/> + <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_viewer.xml b/indra/newview/skins/minimal/xui/fr/menu_viewer.xml new file mode 100644 index 0000000000..bd1c077f52 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_viewer.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu_bar name="Main Menu"> + <menu label="Aide" name="Help"> + <menu_item_call label="Aide de [SECOND_LIFE]" name="Second Life Help"/> + </menu> + <menu label="Avancé" name="Advanced"> + <menu label="Raccourcis" name="Shortcuts"> + <menu_item_check label="Voler" name="Fly"/> + <menu_item_call label="Fermer la fenêtre" name="Close Window"/> + <menu_item_call label="Fermer toutes les fenêtres" name="Close All Windows"/> + <menu_item_call label="Réinitialiser la vue" name="Reset View"/> + </menu> + </menu> +</menu_bar> diff --git a/indra/newview/skins/minimal/xui/fr/menu_wearable_list_item.xml b/indra/newview/skins/minimal/xui/fr/menu_wearable_list_item.xml new file mode 100644 index 0000000000..187cb4bcd2 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_wearable_list_item.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Outfit Wearable Context Menu"> + <menu_item_call label="Remplacer" name="wear_replace"/> + <menu_item_call label="Porter" name="wear_wear"/> + <menu_item_call label="Ajouter" name="wear_add"/> + <menu_item_call label="Enlever / Détacher" name="take_off_or_detach"/> + <menu_item_call label="Détacher" name="detach"/> + <context_menu label="Attacher à" name="wearable_attach_to"/> + <context_menu label="Attacher au HUD" name="wearable_attach_to_hud"/> + <menu_item_call label="Enlever" name="take_off"/> + <menu_item_call label="Modifier" name="edit"/> + <menu_item_call label="Profil de l'article" name="object_profile"/> + <menu_item_call label="Afficher l'original" name="show_original"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_wearing_gear.xml b/indra/newview/skins/minimal/xui/fr/menu_wearing_gear.xml new file mode 100644 index 0000000000..0ca9fe1879 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_wearing_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Gear Wearing"> + <menu_item_call label="Modifier la tenue" name="edit"/> + <menu_item_call label="Enlever" name="takeoff"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/fr/menu_wearing_tab.xml b/indra/newview/skins/minimal/xui/fr/menu_wearing_tab.xml new file mode 100644 index 0000000000..4d88445506 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/menu_wearing_tab.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Wearing"> + <menu_item_call label="Enlever" name="take_off"/> + <menu_item_call label="Détacher" name="detach"/> + <menu_item_call label="Modifier la tenue" name="edit"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/fr/notifications.xml b/indra/newview/skins/minimal/xui/fr/notifications.xml new file mode 100644 index 0000000000..41dd42c39f --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/notifications.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<notifications> + <notification name="UserGiveItem"> + [NAME_SLURL] vous offre [ITEM_SLURL]. Pour utiliser cet article, vous devez passer en mode Avancé. L'article se trouve dans votre inventaire. Pour changer de mode, quittez l'application, redémarrez-la, puis sélectionnez un autre mode sur l'écran de connexion. + <form name="form"> + <button name="Show" text="Garder l'article"/> + <button name="Discard" text="Refuser l'article"/> + <button name="Mute" text="Ignorer l'utilisateur"/> + </form> + </notification> + <notification name="ObjectGiveItem"> + Un objet nommé <nolink>[OBJECTFROMNAME]</nolink> appartenant à [NAME_SLURL] vous offre [ITEM_SLURL]. Pour utiliser cet article, vous devez passer en mode Avancé. L'article se trouve dans votre inventaire. Pour changer de mode, quittez l'application, redémarrez-la, puis sélectionnez un autre mode sur l'écran de connexion. + <form name="form"> + <button name="Keep" text="Garder l'article"/> + <button name="Discard" text="Refuser l'article"/> + <button name="Mute" text="Ignorer l'objet"/> + </form> + </notification> +</notifications> diff --git a/indra/newview/skins/minimal/xui/fr/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/fr/panel_bottomtray.xml new file mode 100644 index 0000000000..ef62901e99 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/panel_bottomtray.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="bottom_tray"> + <string name="DragIndicationImageName" value="Accordion_ArrowOpened_Off"/> + <string name="SpeakBtnToolTip" value="Active/Désactive le micro"/> + <string name="VoiceControlBtnToolTip" value="Affiche/Masque le panneau de contrôle de la voix"/> + <layout_stack name="toolbar_stack"> + <layout_panel name="gesture_panel"> + <gesture_combo_list label="Geste" name="Gesture" tool_tip="Affiche/Masque les gestes"/> + </layout_panel> + <layout_panel name="cam_panel"> + <bottomtray_button label="Affichage" name="camera_btn" tool_tip="Affiche/Masque le contrôle de la caméra"/> + </layout_panel> + <layout_panel name="avatar_and_destinations_panel"> + <bottomtray_button label="Destinations" name="destination_btn" tool_tip="Afficher la fenêtre des personnes."/> + </layout_panel> + <layout_panel name="avatar_and_destinations_panel"> + <bottomtray_button label="Mon avatar" name="avatar_btn"/> + </layout_panel> + <layout_panel name="people_panel"> + <bottomtray_button label="Personnes" name="show_people_button" tool_tip="Afficher la fenêtre des personnes."/> + </layout_panel> + <layout_panel name="profile_panel"> + <bottomtray_button label="Profil" name="show_profile_btn" tool_tip="Afficher la fenêtre de profil."/> + </layout_panel> + <layout_panel name="howto_panel"> + <bottomtray_button label="Aide rapide" name="show_help_btn" tool_tip="Ouvrir les rubriques d'aide rapide Second Life."/> + </layout_panel> + <layout_panel name="im_well_panel"> + <chiclet_im_well name="im_well"> + <button name="Unread IM messages" tool_tip="Conversations"/> + </chiclet_im_well> + </layout_panel> + <layout_panel name="notification_well_panel"> + <chiclet_notification name="notification_well"> + <button name="Unread" tool_tip="Notifications"/> + </chiclet_notification> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/fr/panel_group_control_panel.xml b/indra/newview/skins/minimal/xui/fr/panel_group_control_panel.xml new file mode 100644 index 0000000000..676fa1d222 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/panel_group_control_panel.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <layout_stack name="vertical_stack"> + <layout_panel name="end_call_btn_panel"> + <button label="Quitter l'appel" name="end_call_btn"/> + </layout_panel> + <layout_panel name="voice_ctrls_btn_panel"> + <button label="Ouvrir contrôles vocaux" name="voice_ctrls_btn"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/fr/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/fr/panel_im_control_panel.xml new file mode 100644 index 0000000000..1f2169e22c --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/panel_im_control_panel.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <text name="avatar_name" value="Inconnu"/> + <layout_stack name="button_stack"> + <layout_panel name="view_profile_btn_panel"> + <button label="Profil" name="view_profile_btn"/> + </layout_panel> + <layout_panel name="add_friend_btn_panel"> + <button label="Devenir amis" name="add_friend_btn"/> + </layout_panel> + <layout_panel name="teleport_btn_panel"> + <button label="Téléporter" name="teleport_btn" tool_tip="Proposer de téléporter cette personne"/> + </layout_panel> + <layout_panel name="share_btn_panel"> + <button label="Partager" name="share_btn"/> + </layout_panel> + <layout_panel name="pay_btn_panel"> + <button label="Payer" name="pay_btn"/> + </layout_panel> + <layout_panel name="call_btn_panel"> + <button label="Appeler" name="call_btn"/> + </layout_panel> + <layout_panel name="end_call_btn_panel"> + <button label="Quitter l'appel" name="end_call_btn"/> + </layout_panel> + <layout_panel name="voice_ctrls_btn_panel"> + <button label="Contrôles vocaux" name="voice_ctrls_btn"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/fr/panel_login.xml b/indra/newview/skins/minimal/xui/fr/panel_login.xml new file mode 100644 index 0000000000..0869778a54 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/panel_login.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_login"> + <panel.string name="create_account_url"> + http://fr.secondlife.com/registration/ + </panel.string> + <panel.string name="forgot_password_url"> + http://secondlife.com/account/request.php?lang=fr + </panel.string> + <layout_stack name="login_widgets"> + <layout_panel name="login"> + <text name="username_text"> + Nom d'utilisateur : + </text> + <combo_box name="username_combo" tool_tip="Nom d'utilisateur que vous avez choisi lors de votre inscription (par exemple, bobsmith12 ou Steller Sunshine)."/> + <text name="password_text"> + Mot de passe : + </text> + <check_box label="Enregistrer" name="remember_check"/> + <button label="Connexion" name="connect_btn"/> + <text name="mode_selection_text"> + Mode : + </text> + <combo_box name="mode_combo" tool_tip="Sélectionnez un mode. Pour une exploration facile et rapide avec chat, choisissez Basique. Pour accéder à plus de fonctionnalités, choisissez Avancé."> + <combo_box.item label="Basique" name="Basic"/> + <combo_box.item label="Avancé" name="Advanced"/> + </combo_box> + </layout_panel> + <layout_panel name="links"> + <text name="create_new_account_text"> + S'inscrire + </text> + <text name="forgot_password_text"> + Nom d'utilisateur ou mot de passe oublié ? + </text> + <text name="login_help"> + Besoin d'aide ? + </text> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/fr/panel_navigation_bar.xml b/indra/newview/skins/minimal/xui/fr/panel_navigation_bar.xml new file mode 100644 index 0000000000..45caf2323d --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/panel_navigation_bar.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="navigation_bar"> + <panel name="navigation_panel"> + <pull_button name="back_btn" tool_tip="Revenir à l'emplacement précédent"/> + <pull_button name="forward_btn" tool_tip="Avancer d'un emplacement"/> + <button name="home_btn" tool_tip="Me téléporter jusqu'à mon domicile"/> + <location_input label="Emplacement" name="location_combo"/> + <search_combo_box label="Rechercher" name="search_combo_box" tool_tip="Rechercher"> + <combo_editor label="Rechercher dans [SECOND_LIFE]" name="search_combo_editor"/> + </search_combo_box> + </panel> + <favorites_bar name="favorite" tool_tip="Faites glisser des repères ici pour un accès rapide à vos lieux favoris dans Second Life."> + <label name="favorites_bar_label" tool_tip="Faites glisser des repères ici pour un accès rapide à vos lieux favoris dans Second Life."> + Favoris + </label> + <chevron_button name=">>" tool_tip="Afficher d'avantage de Favoris"/> + </favorites_bar> +</panel> diff --git a/indra/newview/skins/minimal/xui/fr/panel_people.xml b/indra/newview/skins/minimal/xui/fr/panel_people.xml new file mode 100644 index 0000000000..88409a2a86 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/panel_people.xml @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- Side tray panel --> +<panel label="Résidents" name="people_panel"> + <string name="no_recent_people" value="Personne de récent. Vous recherchez des résidents avec qui passer du temps ? Essayez avec le bouton Destinations ci-dessous."/> + <string name="no_filtered_recent_people" value="Personne de récent portant ce nom."/> + <string name="no_one_near" value="Personne près de vous. Vous recherchez des résidents avec qui passer du temps ? Essayez avec le bouton Destinations ci-dessous."/> + <string name="no_one_filtered_near" value="Personne près de vous portant ce nom."/> + <string name="no_friends_online" value="Pas d'amis connectés"/> + <string name="no_friends" value="Pas d'amis"/> + <string name="no_friends_msg"> + Pour ajouter un résident à votre liste d'amis, cliquez-droit dessus. +Vous recherchez des résidents avec qui passer du temps ? Essayez avec le bouton Destinations ci-dessous. + </string> + <string name="no_filtered_friends_msg"> + Vous n'avez pas trouvé ce que vous cherchiez ? Essayez avec le bouton Destinations ci-dessous. + </string> + <string name="people_filter_label" value="Filtrer les personnes"/> + <string name="groups_filter_label" value="Filtrer les groupes"/> + <string name="no_filtered_groups_msg" value="Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/groups/[SEARCH_TERM] Rechercher]."/> + <string name="no_groups_msg" value="Vous souhaitez trouver des groupes à rejoindre ? Utilisez [secondlife:///app/search/groups Rechercher]."/> + <string name="MiniMapToolTipMsg" value="[REGION](Carte : double-clic ; Panoramique : Maj + faire glisser)"/> + <string name="AltMiniMapToolTipMsg" value="[REGION](Téléportation : double-clic ; Panoramique : Maj + faire glisser)"/> + <filter_editor label="Filtre" name="filter_input"/> + <tab_container name="tabs"> + <panel label="PRÈS DE VOUS" name="nearby_panel"> + <panel label="bottom_panel" name="bottom_panel"/> + </panel> + <panel label="MES AMIS" name="friends_panel"> + <accordion name="friends_accordion"> + <accordion_tab name="tab_online" title="En ligne"/> + <accordion_tab name="tab_all" title="Tout"/> + </accordion> + <panel label="bottom_panel" name="bottom_panel"> + <layout_stack name="bottom_panel"> + <layout_panel name="trash_btn_panel"> + <dnd_button name="del_btn" tool_tip="Supprimer le résident sélectionné de votre liste d'amis."/> + </layout_panel> + </layout_stack> + </panel> + </panel> + <panel label="RÉCENT" name="recent_panel"> + <panel label="bottom_panel" name="bottom_panel"> + <button name="add_friend_btn" tool_tip="Ajouter le résident sélectionné à votre liste d'amis"/> + </panel> + </panel> + </tab_container> + <panel name="button_bar"> + <layout_stack name="bottom_bar_ls"> + <layout_panel name="view_profile_btn_lp"> + <button label="Profil" name="view_profile_btn" tool_tip="Afficher la photo, les groupes et autres infos des résidents"/> + </layout_panel> + <layout_panel name="chat_btn_lp"> + <button label="IM" name="im_btn" tool_tip="Ouvrir une session IM"/> + </layout_panel> + <layout_panel name="chat_btn_lp"> + <button label="Téléporter" name="teleport_btn" tool_tip="Proposer une téléportation"/> + </layout_panel> + </layout_stack> + <layout_stack name="bottom_bar_ls1"> + <layout_panel name="group_info_btn_lp"> + <button label="Profil du groupe" name="group_info_btn" tool_tip="Afficher les informations sur le groupe"/> + </layout_panel> + <layout_panel name="chat_btn_lp"> + <button label="Chat de groupe" name="chat_btn" tool_tip="Ouvrir une session de chat"/> + </layout_panel> + <layout_panel name="group_call_btn_lp"> + <button label="Appel de groupe" name="group_call_btn" tool_tip="Appeler ce groupe"/> + </layout_panel> + </layout_stack> + </panel> +</panel> diff --git a/indra/newview/skins/minimal/xui/fr/panel_side_tray_tab_caption.xml b/indra/newview/skins/minimal/xui/fr/panel_side_tray_tab_caption.xml new file mode 100644 index 0000000000..45efbdc980 --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/panel_side_tray_tab_caption.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="sidetray_tab_panel"> + <text name="sidetray_tab_title" value="Panneau latéral"/> + <button name="undock" tool_tip="Détacher"/> + <button name="dock" tool_tip="Attacher"/> + <button name="show_help" tool_tip="Afficher l'aide"/> +</panel> diff --git a/indra/newview/skins/minimal/xui/fr/panel_status_bar.xml b/indra/newview/skins/minimal/xui/fr/panel_status_bar.xml new file mode 100644 index 0000000000..69aec99e1d --- /dev/null +++ b/indra/newview/skins/minimal/xui/fr/panel_status_bar.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="status"> + <panel.string name="StatBarDaysOfWeek"> + Sunday:Monday:Tuesday:Wednesday:Thursday:Friday:Saturday + </panel.string> + <panel.string name="StatBarMonthsOfYear"> + January:February:March:April:May:June:July:August:September:October:November:December + </panel.string> + <panel.string name="packet_loss_tooltip"> + Perte de paquets + </panel.string> + <panel.string name="bandwidth_tooltip"> + Bande passante + </panel.string> + <panel.string name="time"> + [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt] + </panel.string> + <panel.string name="timeTooltip"> + [weekday, datetime, slt] [sday, datetime, slt] [month, datetime, slt] [year, datetime, slt] + </panel.string> + <panel.string name="buycurrencylabel"> + [AMT] L$ + </panel.string> + <panel name="balance_bg"> + <text name="balance" tool_tip="Cliquer sur ce bouton pour actualiser votre solde en L$." value="20 L$"/> + <button label="ACHETER L$" name="buyL" tool_tip="Cliquer pour acheter plus de L$"/> + </panel> + <text name="TimeText" tool_tip="Heure actuelle (Pacifique)"> + 00h00 PST + </text> + <button name="media_toggle_btn" tool_tip="Arrêter tous les médias (musique, vidéo, pages web)"/> + <button name="volume_btn" tool_tip="Contrôle du volume global"/> +</panel> diff --git a/indra/newview/skins/minimal/xui/pt/floater_camera.xml b/indra/newview/skins/minimal/xui/pt/floater_camera.xml new file mode 100644 index 0000000000..4f3729c623 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/floater_camera.xml @@ -0,0 +1,65 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="camera_floater" title=""> + <floater.string name="rotate_tooltip"> + Girar a Câmera ao redor do Foco + </floater.string> + <floater.string name="zoom_tooltip"> + Aproximar a Câmera in direção ao Foco + </floater.string> + <floater.string name="move_tooltip"> + Mover a Câmera para Cima e para Baixo, para a Esquerda e para a Direita + </floater.string> + <floater.string name="camera_modes_title"> + Modos de câmera + </floater.string> + <floater.string name="pan_mode_title"> + Pan zoom orbital + </floater.string> + <floater.string name="presets_mode_title"> + Ângulos predefinidos + </floater.string> + <floater.string name="free_mode_title"> + Visualizar objeto + </floater.string> + <panel name="controls"> + <panel name="preset_views_list"> + <panel_camera_item name="front_view"> + <panel_camera_item.text name="front_view_text"> + Vista frontal + </panel_camera_item.text> + </panel_camera_item> + <panel_camera_item name="group_view"> + <panel_camera_item.text name="side_view_text"> + Vista lateral + </panel_camera_item.text> + </panel_camera_item> + <panel_camera_item name="rear_view"> + <panel_camera_item.text name="rear_view_text"> + Vista de trás + </panel_camera_item.text> + </panel_camera_item> + </panel> + <panel name="camera_modes_list"> + <panel_camera_item name="object_view"> + <panel_camera_item.text name="object_view_text"> + Vista de objetos + </panel_camera_item.text> + </panel_camera_item> + <panel_camera_item name="mouselook_view"> + <panel_camera_item.text name="mouselook_view_text"> + Vista do mouse + </panel_camera_item.text> + </panel_camera_item> + </panel> + <panel name="zoom" tool_tip="Aproximar a Câmera in direção ao Foco"> + <joystick_rotate name="cam_rotate_stick" tool_tip="Girar câmera ao redor do foco"/> + <slider_bar name="zoom_slider" tool_tip="Zoom de câmera para focalizar"/> + <joystick_track name="cam_track_stick" tool_tip="Move a câmera para cima e para baixo, direita e esquerda"/> + </panel> + </panel> + <panel name="buttons"> + <button label="" name="presets_btn" tool_tip="Ângulos predefinidos"/> + <button label="" name="pan_btn" tool_tip="Pan zoom orbital"/> + <button label="" name="avatarview_btn" tool_tip="Modos de câmera"/> + </panel> +</floater> diff --git a/indra/newview/skins/minimal/xui/pt/floater_help_browser.xml b/indra/newview/skins/minimal/xui/pt/floater_help_browser.xml new file mode 100644 index 0000000000..11428ff651 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/floater_help_browser.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_help_browser" title="COMO"> + <floater.string name="loading_text"> + Carregando... + </floater.string> + <layout_stack name="stack1"> + <layout_panel name="external_controls"/> + </layout_stack> +</floater> diff --git a/indra/newview/skins/minimal/xui/pt/floater_media_browser.xml b/indra/newview/skins/minimal/xui/pt/floater_media_browser.xml new file mode 100644 index 0000000000..da7428007e --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/floater_media_browser.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_about" title="NAVEGADOR DE MÍDIA"> + <floater.string name="home_page_url"> + http://www.secondlife.com + </floater.string> + <floater.string name="support_page_url"> + http://support.secondlife.com + </floater.string> + <layout_stack name="stack1"> + <layout_panel name="nav_controls"> + <button label="Atrás" name="back"/> + <button label="Frente" name="forward"/> + <button label="Recarregar" name="reload"/> + <button label="OK" name="go"/> + </layout_panel> + <layout_panel name="time_controls"> + <button label="p/ trás" name="rewind"/> + <button label="parar" name="stop"/> + <button label="p/ frente" name="seek"/> + </layout_panel> + <layout_panel name="parcel_owner_controls"> + <button label="Enviar esta página para lote" name="assign"/> + </layout_panel> + <layout_panel name="external_controls"> + <button label="Abrir no meu navegador" name="open_browser"/> + <check_box label="Abrir sempre no meu navegador" name="open_always"/> + <button label="Fechar" name="close"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/minimal/xui/pt/floater_nearby_chat.xml b/indra/newview/skins/minimal/xui/pt/floater_nearby_chat.xml new file mode 100644 index 0000000000..60edfa505f --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/floater_nearby_chat.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="nearby_chat" title="Bate-papo local"> + <check_box label="Traduzir bate-papo (via Google)" name="translate_chat_checkbox"/> +</floater> diff --git a/indra/newview/skins/minimal/xui/pt/floater_web_content.xml b/indra/newview/skins/minimal/xui/pt/floater_web_content.xml new file mode 100644 index 0000000000..5101579c6f --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/floater_web_content.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_web_content" title=""> + <layout_stack name="stack1"> + <layout_panel name="nav_controls"> + <button name="back" tool_tip="Navegar para trás"/> + <button name="forward" tool_tip="Navegar para frente"/> + <button name="stop" tool_tip="Parar a navegação"/> + <button name="reload" tool_tip="Recarregar página"/> + <combo_box name="address" tool_tip="Digite a URL aqui"/> + <icon name="media_secure_lock_flag" tool_tip="Navegação segura"/> + <button name="popexternal" tool_tip="Abrir a URL atual no navegador do seu computador"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/minimal/xui/pt/inspect_avatar.xml b/indra/newview/skins/minimal/xui/pt/inspect_avatar.xml new file mode 100644 index 0000000000..a199c58c15 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/inspect_avatar.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="inspect_avatar"> + <string name="Subtitle"> + [IDADE] + </string> + <string name="Details"> + [PERFIL_SL] + </string> + <text name="user_details"> + This is my second life description and I really think it is great. But for some reason my description is super extra long because I like to talk a whole lot + </text> + <slider name="volume_slider" tool_tip="Volume de Voz" value="0.5"/> + <button label="Adicionar amigo" name="add_friend_btn"/> + <button label="MI" name="im_btn"/> + <button label="Perfil" name="view_profile_btn"/> + <panel name="moderator_panel"> + <button label="Disabilitar Voz" name="disable_voice"/> + <button label="Habilitar Voz" name="enable_voice"/> + </panel> +</floater> diff --git a/indra/newview/skins/minimal/xui/pt/inspect_object.xml b/indra/newview/skins/minimal/xui/pt/inspect_object.xml new file mode 100644 index 0000000000..b72de7038d --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/inspect_object.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="inspect_object"> + <string name="Creator"> + Autor: [CREATOR] + </string> + <string name="CreatorAndOwner"> + Autor [CREATOR] +Proprietário [OWNER] + </string> + <string name="Price"> + L$[AMOUNT] + </string> + <string name="PriceFree"> + Grátis! + </string> + <string name="Touch"> + Tocar + </string> + <string name="Sit"> + Sentar + </string> + <text name="object_name" value="Test Object Name That Is actually two lines and Really Long"/> + <text name="price_text"> + L$30.000 + </text> + <text name="object_description"> + This is a really long description for an object being as how it is at least 80 characters in length and so but maybe more like 120 at this point. Who knows, really? + </text> + <button label="Comprar" name="buy_btn"/> + <button label="Pagar" name="pay_btn"/> + <button label="Pegar uma cópia" name="take_free_copy_btn"/> + <button label="Tocar" name="touch_btn"/> + <button label="Sentar" name="sit_btn"/> + <button label="Abrir" name="open_btn"/> + <icon name="secure_browsing" tool_tip="Navegação segura"/> + <button label="Mais" name="more_info_btn"/> +</floater> diff --git a/indra/newview/skins/minimal/xui/pt/menu_add_wearable_gear.xml b/indra/newview/skins/minimal/xui/pt/menu_add_wearable_gear.xml new file mode 100644 index 0000000000..4b81276ab3 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_add_wearable_gear.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Add Wearable Gear Menu"> + <menu_item_check label="Ordenar por mais recente" name="sort_by_most_recent"/> + <menu_item_check label="Ordenar por nome" name="sort_by_name"/> + <menu_item_check label="Ordenar por tipo" name="sort_by_type"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_attachment_other.xml b/indra/newview/skins/minimal/xui/pt/menu_attachment_other.xml new file mode 100644 index 0000000000..cfd69158bc --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_attachment_other.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- *NOTE: See also menu_avatar_other.xml --> +<context_menu name="Avatar Pie"> + <menu_item_call label="Ver perfil" name="Profile..."/> + <menu_item_call label="Adicionar amigo..." name="Add Friend"/> + <menu_item_call label="MI" name="Send IM..."/> + <menu_item_call label="Ligar" name="Call"/> + <menu_item_call label="Convidar para entrar no grupo" name="Invite..."/> + <menu_item_call label="Bloquear" name="Avatar Mute"/> + <menu_item_call label="Denunciar" name="abuse"/> + <menu_item_call label="Congelar" name="Freeze..."/> + <menu_item_call label="Ejetar" name="Eject..."/> + <menu_item_call label="Depurar texturas" name="Debug..."/> + <menu_item_call label="Mais zoom" name="Zoom In"/> + <menu_item_call label="Pagar" name="Pay..."/> + <menu_item_call label="Perfil do objeto" name="Object Inspect"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_attachment_self.xml b/indra/newview/skins/minimal/xui/pt/menu_attachment_self.xml new file mode 100644 index 0000000000..09060cf3ae --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_attachment_self.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Attachment Pie"> + <menu_item_call label="Tocar" name="Attachment Object Touch"/> + <menu_item_call label="Editar" name="Edit..."/> + <menu_item_call label="Tirar" name="Detach"/> + <menu_item_call label="Sentar" name="Sit Down Here"/> + <menu_item_call label="Ficar de pé" name="Stand Up"/> + <menu_item_call label="Trocar de look" name="Change Outfit"/> + <menu_item_call label="Editar meu look" name="Edit Outfit"/> + <menu_item_call label="Editar meu corpo" name="Edit My Shape"/> + <menu_item_call label="Meus amigos" name="Friends..."/> + <menu_item_call label="Meus grupos" name="Groups..."/> + <menu_item_call label="Meu perfil" name="Profile..."/> + <menu_item_call label="Depurar texturas" name="Debug..."/> + <menu_item_call label="Largar" name="Drop"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_avatar_icon.xml b/indra/newview/skins/minimal/xui/pt/menu_avatar_icon.xml new file mode 100644 index 0000000000..beba969b7e --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_avatar_icon.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Avatar Icon Menu"> + <menu_item_call label="Ver perfil" name="Show Profile"/> + <menu_item_call label="Enviar MI..." name="Send IM"/> + <menu_item_call label="Adicionar amigo..." name="Add Friend"/> + <menu_item_call label="Remover amigo..." name="Remove Friend"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_avatar_other.xml b/indra/newview/skins/minimal/xui/pt/menu_avatar_other.xml new file mode 100644 index 0000000000..a4a26144c7 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_avatar_other.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- *NOTE: See also menu_attachment_other.xml --> +<context_menu name="Avatar Pie"> + <menu_item_call label="Ver perfil" name="Profile..."/> + <menu_item_call label="Adicionar amigo..." name="Add Friend"/> + <menu_item_call label="MI" name="Send IM..."/> + <menu_item_call label="Ligar" name="Call"/> + <menu_item_call label="Convidar para entrar no grupo" name="Invite..."/> + <menu_item_call label="Bloquear" name="Avatar Mute"/> + <menu_item_call label="Denunciar" name="abuse"/> + <menu_item_call label="Congelar" name="Freeze..."/> + <menu_item_call label="Ejetar" name="Eject..."/> + <menu_item_call label="Depurar texturas" name="Debug..."/> + <menu_item_call label="Mais zoom" name="Zoom In"/> + <menu_item_call label="Pagar" name="Pay..."/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_avatar_self.xml b/indra/newview/skins/minimal/xui/pt/menu_avatar_self.xml new file mode 100644 index 0000000000..6e203d5a25 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_avatar_self.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Self Pie"> + <menu_item_call label="Sentar" name="Sit Down Here"/> + <menu_item_call label="Ficar de pé" name="Stand Up"/> + <context_menu label="Tirar" name="Take Off >"> + <context_menu label="Roupa" name="Clothes >"> + <menu_item_call label="Camisa" name="Shirt"/> + <menu_item_call label="Calças" name="Pants"/> + <menu_item_call label="Saia" name="Skirt"/> + <menu_item_call label="Sapatos" name="Shoes"/> + <menu_item_call label="Meias" name="Socks"/> + <menu_item_call label="Jaqueta" name="Jacket"/> + <menu_item_call label="Luvas" name="Gloves"/> + <menu_item_call label="Camiseta" name="Self Undershirt"/> + <menu_item_call label="Roupa de baixo" name="Self Underpants"/> + <menu_item_call label="Tatuagem" name="Self Tattoo"/> + <menu_item_call label="Alpha" name="Self Alpha"/> + <menu_item_call label="Todas as roupas" name="All Clothes"/> + </context_menu> + <context_menu label="HUD" name="Object Detach HUD"/> + <context_menu label="Tirar" name="Object Detach"/> + <menu_item_call label="Tirar tudo" name="Detach All"/> + </context_menu> + <menu_item_call label="Trocar de look" name="Chenge Outfit"/> + <menu_item_call label="Editar meu look" name="Edit Outfit"/> + <menu_item_call label="Editar meu corpo" name="Edit My Shape"/> + <menu_item_call label="Meus amigos" name="Friends..."/> + <menu_item_call label="Meus grupos" name="Groups..."/> + <menu_item_call label="Meu perfil" name="Profile..."/> + <menu_item_call label="Depurar texturas" name="Debug..."/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_bottomtray.xml b/indra/newview/skins/minimal/xui/pt/menu_bottomtray.xml new file mode 100644 index 0000000000..479d02512f --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_bottomtray.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="hide_camera_move_controls_menu"> + <menu_item_check label="Botão de gestos" name="ShowGestureButton"/> + <menu_item_check label="Botão de movimento" name="ShowMoveButton"/> + <menu_item_check label="Botão de ver" name="ShowCameraButton"/> + <menu_item_check label="Botão de fotos" name="ShowSnapshotButton"/> + <menu_item_check label="Botão da Barra lateral" name="ShowSidebarButton"/> + <menu_item_check label="Botão Construir" name="ShowBuildButton"/> + <menu_item_check label="Botão Buscar" name="ShowSearchButton"/> + <menu_item_check label="Botão Mapa" name="ShowWorldMapButton"/> + <menu_item_check label="Botão do Mini Mapa" name="ShowMiniMapButton"/> + <menu_item_call label="Cortar" name="NearbyChatBar_Cut"/> + <menu_item_call label="Copiar" name="NearbyChatBar_Copy"/> + <menu_item_call label="Colar" name="NearbyChatBar_Paste"/> + <menu_item_call label="Excluir" name="NearbyChatBar_Delete"/> + <menu_item_call label="Selecionar tudo" name="NearbyChatBar_Select_All"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_cof_attachment.xml b/indra/newview/skins/minimal/xui/pt/menu_cof_attachment.xml new file mode 100644 index 0000000000..527e3af3c9 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_cof_attachment.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Attachment"> + <menu_item_call label="Separar" name="detach"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_cof_body_part.xml b/indra/newview/skins/minimal/xui/pt/menu_cof_body_part.xml new file mode 100644 index 0000000000..704fd226eb --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_cof_body_part.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Body"> + <menu_item_call label="Trocar" name="replace"/> + <menu_item_call label="Editar" name="edit"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_cof_clothing.xml b/indra/newview/skins/minimal/xui/pt/menu_cof_clothing.xml new file mode 100644 index 0000000000..051323ae6a --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_cof_clothing.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Clothing"> + <menu_item_call label="Tirar" name="take_off"/> + <menu_item_call label="Editar" name="edit"/> + <menu_item_call label="Trocar" name="replace"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_cof_gear.xml b/indra/newview/skins/minimal/xui/pt/menu_cof_gear.xml new file mode 100644 index 0000000000..8716992a5e --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_cof_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Gear COF"> + <menu label="Roupas novas" name="COF.Gear.New_Clothes"/> + <menu label="Nova parte do corpo" name="COF.Geear.New_Body_Parts"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_edit.xml b/indra/newview/skins/minimal/xui/pt/menu_edit.xml new file mode 100644 index 0000000000..ff431c9a21 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_edit.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu label="Editar" name="Edit"> + <menu_item_call label="Desfazer" name="Undo"/> + <menu_item_call label="Repetir" name="Redo"/> + <menu_item_call label="Cortar" name="Cut"/> + <menu_item_call label="Copiar" name="Copy"/> + <menu_item_call label="Colar" name="Paste"/> + <menu_item_call label="Excluir" name="Delete"/> + <menu_item_call label="Replicar" name="Duplicate"/> + <menu_item_call label="Selecionar tudo" name="Select All"/> + <menu_item_call label="Desfazer seleção" name="Deselect"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_favorites.xml b/indra/newview/skins/minimal/xui/pt/menu_favorites.xml new file mode 100644 index 0000000000..062820fbca --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_favorites.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="Teletransportar" name="Teleport To Landmark"/> + <menu_item_call label="Ver/Editar marco" name="Landmark Open"/> + <menu_item_call label="Copiar SLurl" name="Copy slurl"/> + <menu_item_call label="Mostrar no mapa" name="Show On Map"/> + <menu_item_call label="Copiar" name="Landmark Copy"/> + <menu_item_call label="Colar" name="Landmark Paste"/> + <menu_item_call label="Excluir" name="Delete"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_gesture_gear.xml b/indra/newview/skins/minimal/xui/pt/menu_gesture_gear.xml new file mode 100644 index 0000000000..70d8ae7a8e --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_gesture_gear.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_gesture_gear"> + <menu_item_call label="Adicionar/remover de favoritos" name="activate"/> + <menu_item_call label="Copiar" name="copy_gesture"/> + <menu_item_call label="Colar" name="paste"/> + <menu_item_call label="Copiar UUID" name="copy_uuid"/> + <menu_item_call label="Salvar para look atual" name="save_to_outfit"/> + <menu_item_call label="Editar" name="edit_gesture"/> + <menu_item_call label="Verificar" name="inspect"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_group_plus.xml b/indra/newview/skins/minimal/xui/pt/menu_group_plus.xml new file mode 100644 index 0000000000..1083845d68 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_group_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_call label="Entrar no grupo..." name="item_join"/> + <menu_item_call label="Novo grupo..." name="item_new"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_hide_navbar.xml b/indra/newview/skins/minimal/xui/pt/menu_hide_navbar.xml new file mode 100644 index 0000000000..c2b063193e --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_hide_navbar.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="hide_navbar_menu"> + <menu_item_check label="Mostrar barra de navegação" name="ShowNavbarNavigationPanel"/> + <menu_item_check label="Mostrar barra de favoritos" name="ShowNavbarFavoritesPanel"/> + <menu_item_check label="Mostrar minibarra de localização" name="ShowMiniLocationPanel"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_im_well_button.xml b/indra/newview/skins/minimal/xui/pt/menu_im_well_button.xml new file mode 100644 index 0000000000..2d37cefd6f --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_im_well_button.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="IM Well Button Context Menu"> + <menu_item_call label="Fechar tudo" name="Close All"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_imchiclet_adhoc.xml b/indra/newview/skins/minimal/xui/pt/menu_imchiclet_adhoc.xml new file mode 100644 index 0000000000..ead949ba13 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_imchiclet_adhoc.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="IMChiclet AdHoc Menu"> + <menu_item_call label="Encerrar esta sessão" name="End Session"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_imchiclet_group.xml b/indra/newview/skins/minimal/xui/pt/menu_imchiclet_group.xml new file mode 100644 index 0000000000..dd177d1b8d --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_imchiclet_group.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="IMChiclet Group Menu"> + <menu_item_call label="Sobre o grupo" name="Show Profile"/> + <menu_item_call label="Mostrar sessão" name="Chat"/> + <menu_item_call label="Encerrar esta sessão" name="End Session"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_imchiclet_p2p.xml b/indra/newview/skins/minimal/xui/pt/menu_imchiclet_p2p.xml new file mode 100644 index 0000000000..d821b3ded0 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_imchiclet_p2p.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="IMChiclet P2P Menu"> + <menu_item_call label="Ver perfil" name="Show Profile"/> + <menu_item_call label="Adicionar amigo..." name="Add Friend"/> + <menu_item_call label="Mostrar sessão" name="Send IM"/> + <menu_item_call label="Encerrar esta sessão" name="End Session"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_inspect_avatar_gear.xml b/indra/newview/skins/minimal/xui/pt/menu_inspect_avatar_gear.xml new file mode 100644 index 0000000000..f7fe5640ef --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_inspect_avatar_gear.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> +<toggleable_menu name="Gear Menu"> + <menu_item_call label="Ver perfil" name="view_profile"/> + <menu_item_call label="Adicionar amigo..." name="add_friend"/> + <menu_item_call label="MI" name="im"/> + <menu_item_call label="Teletransportar" name="teleport"/> + <menu_item_call label="Bloquear" name="block"/> + <menu_item_call label="Desbloquear" name="unblock"/> + <menu_item_call label="Denunciar" name="report"/> + <menu_item_call label="Congelar" name="freeze"/> + <menu_item_call label="Ejetar" name="eject"/> + <menu_item_call label="Chutar" name="kick"/> + <menu_item_call label="CSR" name="csr"/> + <menu_item_call label="Depurar texturas" name="debug"/> + <menu_item_call label="Localizar no mapa" name="find_on_map"/> + <menu_item_call label="Mais zoom" name="zoom_in"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_inspect_object_gear.xml b/indra/newview/skins/minimal/xui/pt/menu_inspect_object_gear.xml new file mode 100644 index 0000000000..184db26538 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_inspect_object_gear.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<menu name="Gear Menu"> + <menu_item_call label="Tocar" name="touch"/> + <menu_item_call label="Sentar" name="sit"/> + <menu_item_call label="Pagar" name="pay"/> + <menu_item_call label="Comprar" name="buy"/> + <menu_item_call label="Pegar" name="take"/> + <menu_item_call label="Pegar uma cópia" name="take_copy"/> + <menu_item_call label="Abrir" name="open"/> + <menu_item_call label="Editar" name="edit"/> + <menu_item_call label="Vestir" name="wear"/> + <menu_item_call label="Adicionar" name="add"/> + <menu_item_call label="Denunciar" name="report"/> + <menu_item_call label="Bloquear" name="block"/> + <menu_item_call label="Mais zoom" name="zoom_in"/> + <menu_item_call label="Tirar" name="remove"/> + <menu_item_call label="Mais informações" name="more_info"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_inspect_self_gear.xml b/indra/newview/skins/minimal/xui/pt/menu_inspect_self_gear.xml new file mode 100644 index 0000000000..c1f27e765d --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_inspect_self_gear.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Self Pie"> + <menu_item_call label="Sentar" name="Sit Down Here"/> + <menu_item_call label="Ficar de pé" name="Stand Up"/> + <menu_item_call label="Meus amigos" name="Friends..."/> + <menu_item_call label="Meu perfil" name="Profile..."/> + <menu_item_call label="Depurar texturas" name="Debug..."/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_inv_offer_chiclet.xml b/indra/newview/skins/minimal/xui/pt/menu_inv_offer_chiclet.xml new file mode 100644 index 0000000000..c404719c95 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_inv_offer_chiclet.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="InvOfferChiclet Menu"> + <menu_item_call label="Fechar" name="Close"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_inventory.xml b/indra/newview/skins/minimal/xui/pt/menu_inventory.xml new file mode 100644 index 0000000000..1b1efd3270 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_inventory.xml @@ -0,0 +1,86 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="Compartilhar" name="Share"/> + <menu_item_call label="Comprar" name="Task Buy"/> + <menu_item_call label="Abrir" name="Task Open"/> + <menu_item_call label="Executar" name="Task Play"/> + <menu_item_call label="Propriedades" name="Task Properties"/> + <menu_item_call label="Renomear" name="Task Rename"/> + <menu_item_call label="Apagar" name="Task Remove"/> + <menu_item_call label="Limpar lixeira" name="Empty Trash"/> + <menu_item_call label="Limpar Achados & perdidos" name="Empty Lost And Found"/> + <menu_item_call label="Nova pasta" name="New Folder"/> + <menu_item_call label="Novo script" name="New Script"/> + <menu_item_call label="Nova anotação" name="New Note"/> + <menu_item_call label="Novo gesto" name="New Gesture"/> + <menu label="Novas roupas" name="New Clothes"> + <menu_item_call label="Nova camisa" name="New Shirt"/> + <menu_item_call label="Nova calça" name="New Pants"/> + <menu_item_call label="Novos sapatos" name="New Shoes"/> + <menu_item_call label="Novas meias" name="New Socks"/> + <menu_item_call label="Nova jaqueta" name="New Jacket"/> + <menu_item_call label="Nova saia" name="New Skirt"/> + <menu_item_call label="Novas luvas" name="New Gloves"/> + <menu_item_call label="Nova anágua" name="New Undershirt"/> + <menu_item_call label="Nova roupa de baixo" name="New Underpants"/> + <menu_item_call label="Nova máscara alfa" name="New Alpha Mask"/> + <menu_item_call label="Nova tatuagem" name="New Tattoo"/> + </menu> + <menu label="Nova parte do corpo" name="New Body Parts"> + <menu_item_call label="Nova forma" name="New Shape"/> + <menu_item_call label="Nova pele" name="New Skin"/> + <menu_item_call label="Novo cabelo" name="New Hair"/> + <menu_item_call label="Novos olhos" name="New Eyes"/> + </menu> + <menu label="Alterar fonte" name="Change Type"> + <menu_item_call label="Padrão" name="Default"/> + <menu_item_call label="Luvas" name="Gloves"/> + <menu_item_call label="Jaqueta" name="Jacket"/> + <menu_item_call label="Calças" name="Pants"/> + <menu_item_call label="Silhueta" name="Shape"/> + <menu_item_call label="Sapatos" name="Shoes"/> + <menu_item_call label="Camisa" name="Shirt"/> + <menu_item_call label="Saia" name="Skirt"/> + <menu_item_call label="Roupa de baixo" name="Underpants"/> + <menu_item_call label="Camiseta" name="Undershirt"/> + </menu> + <menu_item_call label="Teletransporte" name="Landmark Open"/> + <menu_item_call label="Abrir" name="Animation Open"/> + <menu_item_call label="Abrir" name="Sound Open"/> + <menu_item_call label="Substituir look" name="Replace Outfit"/> + <menu_item_call label="Adicionar a look" name="Add To Outfit"/> + <menu_item_call label="Tirar do look atual" name="Remove From Outfit"/> + <menu_item_call label="Encontrar original" name="Find Original"/> + <menu_item_call label="Remover item" name="Purge Item"/> + <menu_item_call label="Restaurar item" name="Restore Item"/> + <menu_item_call label="Abrir" name="Open"/> + <menu_item_call label="Abrir original" name="Open Original"/> + <menu_item_call label="Propriedades" name="Properties"/> + <menu_item_call label="Renomear" name="Rename"/> + <menu_item_call label="Copiar item UUID" name="Copy Asset UUID"/> + <menu_item_call label="Copiar" name="Copy"/> + <menu_item_call label="Colar" name="Paste"/> + <menu_item_call label="Colar como link" name="Paste As Link"/> + <menu_item_call label="Excluir" name="Remove Link"/> + <menu_item_call label="Apagar" name="Delete"/> + <menu_item_call label="Excluir pasta do sistema" name="Delete System Folder"/> + <menu_item_call label="Pasta conversa em conferência" name="Conference Chat Folder"/> + <menu_item_call label="Executar som" name="Sound Play"/> + <menu_item_call label="Sobre o marco" name="About Landmark"/> + <menu_item_call label="Executar animação" name="Animation Play"/> + <menu_item_call label="Executar áudio" name="Animation Audition"/> + <menu_item_call label="Mandar MI" name="Send Instant Message"/> + <menu_item_call label="Oferecer teletransporte..." name="Offer Teleport..."/> + <menu_item_call label="Bate-papo em conferência" name="Conference Chat"/> + <menu_item_call label="Ativar" name="Activate"/> + <menu_item_call label="Desativar" name="Deactivate"/> + <menu_item_call label="Salvar como" name="Save As"/> + <menu_item_call label="Tirar de si mesmo" name="Detach From Yourself"/> + <menu_item_call label="Vestir" name="Wearable And Object Wear"/> + <menu label="Anexar a" name="Attach To"/> + <menu label="Anexar ao HUD" name="Attach To HUD"/> + <menu_item_call label="Editar" name="Wearable Edit"/> + <menu_item_call label="Adicionar" name="Wearable Add"/> + <menu_item_call label="Tirar" name="Take Off"/> + <menu_item_call label="--Sem opções--" name="--no options--"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_inventory_add.xml b/indra/newview/skins/minimal/xui/pt/menu_inventory_add.xml new file mode 100644 index 0000000000..2723f39287 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_inventory_add.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_inventory_add"> + <menu label="Upload" name="upload"> + <menu_item_call label="Imagem (L$[COST])..." name="Upload Image"/> + <menu_item_call label="Som (L$[COST])..." name="Upload Sound"/> + <menu_item_call label="Animação (L$[COST])..." name="Upload Animation"/> + <menu_item_call label="Volume (L$[COST] per file)..." name="Bulk Upload"/> + <menu_item_call label="Autorizações de upload padrão" name="perm prefs"/> + </menu> + <menu_item_call label="Nova pasta" name="New Folder"/> + <menu_item_call label="Novo script" name="New Script"/> + <menu_item_call label="Nova anotação" name="New Note"/> + <menu_item_call label="Novo gesto" name="New Gesture"/> + <menu label="Novas roupas" name="New Clothes"> + <menu_item_call label="Nova camisa" name="New Shirt"/> + <menu_item_call label="Novas calças" name="New Pants"/> + <menu_item_call label="Novos sapatos" name="New Shoes"/> + <menu_item_call label="Novas meias" name="New Socks"/> + <menu_item_call label="Nova blusa" name="New Jacket"/> + <menu_item_call label="Nova saia" name="New Skirt"/> + <menu_item_call label="Novas luvas" name="New Gloves"/> + <menu_item_call label="Nova camiseta" name="New Undershirt"/> + <menu_item_call label="Novas roupa de baixo" name="New Underpants"/> + <menu_item_call label="Novo alpha" name="New Alpha"/> + <menu_item_call label="Nova tatuagem" name="New Tattoo"/> + </menu> + <menu label="Nova parte do corpo" name="New Body Parts"> + <menu_item_call label="Nova forma" name="New Shape"/> + <menu_item_call label="Nova pele" name="New Skin"/> + <menu_item_call label="Novo cabelo" name="New Hair"/> + <menu_item_call label="Novos olhos" name="New Eyes"/> + </menu> +</menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_inventory_gear_default.xml b/indra/newview/skins/minimal/xui/pt/menu_inventory_gear_default.xml new file mode 100644 index 0000000000..3400578d9a --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_inventory_gear_default.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_gear_default"> + <menu_item_call label="Nova janela de inventário" name="new_window"/> + <menu_item_check label="Ordenar por nome" name="sort_by_name"/> + <menu_item_check label="Ordenar por mais recente" name="sort_by_recent"/> + <menu_item_check label="Pastas do sistema no topo" name="sort_system_folders_to_top"/> + <menu_item_call label="Mostrar filtros" name="show_filters"/> + <menu_item_call label="Restabelecer filtros" name="reset_filters"/> + <menu_item_call label="Fechar todas as pastas" name="close_folders"/> + <menu_item_call label="Esvaziar achados e perdidos" name="empty_lostnfound"/> + <menu_item_call label="Salvar textura como" name="Save Texture As"/> + <menu_item_call label="Compartilhar" name="Share"/> + <menu_item_call label="Encontrar original" name="Find Original"/> + <menu_item_call label="Encontrar todos os links" name="Find All Links"/> + <menu_item_call label="Esvaziar lixeira" name="empty_trash"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_land.xml b/indra/newview/skins/minimal/xui/pt/menu_land.xml new file mode 100644 index 0000000000..9182ce321a --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_land.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Land Pie"> + <menu_item_call label="Sobre terrenos" name="Place Information..."/> + <menu_item_call label="Sentar aqui" name="Sit Here"/> + <menu_item_call label="Comprar este terreno" name="Land Buy"/> + <menu_item_call label="Comprar passe" name="Land Buy Pass"/> + <menu_item_call label="Construir" name="Create"/> + <menu_item_call label="Editar a topografia" name="Edit Terrain"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_landmark.xml b/indra/newview/skins/minimal/xui/pt/menu_landmark.xml new file mode 100644 index 0000000000..6accfebee7 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_landmark.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="landmark_overflow_menu"> + <menu_item_call label="Copiar SLurl" name="copy"/> + <menu_item_call label="Excluir" name="delete"/> + <menu_item_call label="Criar destaque" name="pick"/> + <menu_item_call label="Adicionar à barra de favoritos" name="add_to_favbar"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_login.xml b/indra/newview/skins/minimal/xui/pt/menu_login.xml new file mode 100644 index 0000000000..3dff3d7c8a --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_login.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu_bar name="Login Menu"> + <menu label="Eu" name="File"> + <menu_item_call label="Preferências" name="Preferences..."/> + <menu_item_call label="Sair do [APP_NAME]" name="Quit"/> + </menu> + <menu label="Ajuda" name="Help"> + <menu_item_call label="Ajuda do [SECOND_LIFE]" name="Second Life Help"/> + <menu_item_call label="Sobre [APP_NAME]" name="About Second Life"/> + </menu> + <menu_item_check label="Exibir menu de depuração" name="Show Debug Menu"/> + <menu label="Depurar" name="Debug"> + <menu_item_call label="Mostrar configurações" name="Debug Settings"/> + <menu_item_call label="Configurações da interface e cor" name="UI/Color Settings"/> + <menu label="Testes de UI" name="UI Tests"/> + <menu_item_call label="Definir tamanho da janela:" name="Set Window Size..."/> + <menu_item_call label="Mostrar TOS" name="TOS"/> + <menu_item_call label="Mostrar mensagem crítica" name="Critical"/> + <menu_item_call label="Teste de mídia do navegador" name="Web Browser Test"/> + <menu_item_call label="Teste de conteúdo web" name="Web Content Floater Test"/> + <menu_item_check label="Exibir seletor da grade" name="Show Grid Picker"/> + <menu_item_call label="Exibir painel de notificações" name="Show Notifications Console"/> + </menu> +</menu_bar> diff --git a/indra/newview/skins/minimal/xui/pt/menu_mini_map.xml b/indra/newview/skins/minimal/xui/pt/menu_mini_map.xml new file mode 100644 index 0000000000..6a3fe55de5 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_mini_map.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="Zoom Perto" name="Zoom Close"/> + <menu_item_call label="Zoom Médio" name="Zoom Medium"/> + <menu_item_call label="Zoom Longe" name="Zoom Far"/> + <menu_item_call label="Zoom padrão" name="Zoom Default"/> + <menu_item_check label="Girar mapa" name="Rotate Map"/> + <menu_item_check label="Auto Center" name="Auto Center"/> + <menu_item_call label="Parar Acompanhamento" name="Stop Tracking"/> + <menu_item_call label="Mapa-múndi" name="World Map"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_navbar.xml b/indra/newview/skins/minimal/xui/pt/menu_navbar.xml new file mode 100644 index 0000000000..57c1471de3 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_navbar.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Navbar Menu"> + <menu_item_check label="Mostrar coordenadas" name="Show Coordinates"/> + <menu_item_check label="Mostrar as propriedades do terreno" name="Show Parcel Properties"/> + <menu_item_call label="Marco" name="Landmark"/> + <menu_item_call label="Cortar" name="Cut"/> + <menu_item_call label="Copiar" name="Copy"/> + <menu_item_call label="Colar" name="Paste"/> + <menu_item_call label="Excluir" name="Delete"/> + <menu_item_call label="Selecionar tudo" name="Select All"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_nearby_chat.xml b/indra/newview/skins/minimal/xui/pt/menu_nearby_chat.xml new file mode 100644 index 0000000000..f1ea83c837 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_nearby_chat.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="NearBy Chat Menu"> + <menu_item_call label="Mostrar quem está aqui..." name="nearby_people"/> + <menu_item_check label="Mostrar texto bloqueado" name="muted_text"/> + <menu_item_check label="Mostrar ícones de amigos" name="show_buddy_icons"/> + <menu_item_check label="Mostrar nomes" name="show_names"/> + <menu_item_check label="Mostrar ícones e nomes" name="show_icons_and_names"/> + <menu_item_call label="Tamanho da fonte" name="font_size"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_notification_well_button.xml b/indra/newview/skins/minimal/xui/pt/menu_notification_well_button.xml new file mode 100644 index 0000000000..43ad4134ec --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_notification_well_button.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Notification Well Button Context Menu"> + <menu_item_call label="Fechar tudo" name="Close All"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_object.xml b/indra/newview/skins/minimal/xui/pt/menu_object.xml new file mode 100644 index 0000000000..bf94859699 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_object.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Object Pie"> + <menu_item_call label="Tocar" name="Object Touch"> + <menu_item_call.on_enable name="EnableTouch" parameter="Tocar"/> + </menu_item_call> + <menu_item_call label="Editar" name="Edit..."/> + <menu_item_call label="Construir" name="Build"/> + <menu_item_call label="Abrir" name="Open"/> + <menu_item_call label="Sentar aqui" name="Object Sit"/> + <menu_item_call label="Ficar de pé" name="Object Stand Up"/> + <menu_item_call label="Perfil do objeto" name="Object Inspect"/> + <menu_item_call label="Mais zoom" name="Zoom In"/> + <context_menu label="Colocar no(a)" name="Put On"> + <menu_item_call label="Vestir" name="Wear"/> + <menu_item_call label="Adicionar" name="Add"/> + <context_menu label="Anexar" name="Object Attach"/> + <context_menu label="Anexar o HUD" name="Object Attach HUD"/> + </context_menu> + <context_menu label="Tirar" name="Remove"> + <menu_item_call label="Denunciar abuso" name="Report Abuse..."/> + <menu_item_call label="Bloquear" name="Object Mute"/> + <menu_item_call label="Devolver" name="Return..."/> + <menu_item_call label="Excluir" name="Delete"/> + </context_menu> + <menu_item_call label="Pegar" name="Pie Object Take"/> + <menu_item_call label="Pegar uma cópia" name="Take Copy"/> + <menu_item_call label="Pagar" name="Pay..."/> + <menu_item_call label="Comprar" name="Buy..."/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_object_icon.xml b/indra/newview/skins/minimal/xui/pt/menu_object_icon.xml new file mode 100644 index 0000000000..7af760a6ee --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_object_icon.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Object Icon Menu"> + <menu_item_call label="Perfil do objeto..." name="Object Profile"/> + <menu_item_call label="Bloquear..." name="Block"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_outfit_gear.xml b/indra/newview/skins/minimal/xui/pt/menu_outfit_gear.xml new file mode 100644 index 0000000000..11b3e653c6 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_outfit_gear.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Gear Outfit"> + <menu_item_call label="Vestir - Substituir look atual" name="wear"/> + <menu_item_call label="Vestir - Adicionar ao look atual" name="wear_add"/> + <menu_item_call label="Tirar - Tirar do look atual" name="take_off"/> + <menu label="Roupas novas" name="New Clothes"> + <menu_item_call label="Nova camisa" name="New Shirt"/> + <menu_item_call label="Novas calças" name="New Pants"/> + <menu_item_call label="Novos sapatos" name="New Shoes"/> + <menu_item_call label="Novas meias" name="New Socks"/> + <menu_item_call label="Nova blusa" name="New Jacket"/> + <menu_item_call label="Nova saia" name="New Skirt"/> + <menu_item_call label="Novas luvas" name="New Gloves"/> + <menu_item_call label="Nova camiseta" name="New Undershirt"/> + <menu_item_call label="Novas roupa de baixo" name="New Underpants"/> + <menu_item_call label="Novo alpha" name="New Alpha"/> + <menu_item_call label="Nova tatuagem" name="New Tattoo"/> + </menu> + <menu label="Nova parte do corpo" name="New Body Parts"> + <menu_item_call label="Nova silhueta" name="New Shape"/> + <menu_item_call label="Nova pele" name="New Skin"/> + <menu_item_call label="Novo cabelo" name="New Hair"/> + <menu_item_call label="Novos olhos" name="New Eyes"/> + </menu> + <menu_item_call label="Renomear look" name="rename"/> + <menu_item_call label="Excluir visual" name="delete_outfit"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_outfit_tab.xml b/indra/newview/skins/minimal/xui/pt/menu_outfit_tab.xml new file mode 100644 index 0000000000..8db5e405b3 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_outfit_tab.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Outfit"> + <menu_item_call label="Vestir - Substituir look atual" name="wear_replace"/> + <menu_item_call label="Vestir - Sem tirar look atual" name="wear_add"/> + <menu_item_call label="Tirar - Tirar do look atual" name="take_off"/> + <menu_item_call label="Editar look" name="edit"/> + <menu_item_call label="Renomear look" name="rename"/> + <menu_item_call label="Excluir visual" name="delete"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_participant_list.xml b/indra/newview/skins/minimal/xui/pt/menu_participant_list.xml new file mode 100644 index 0000000000..01f1d4ef80 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_participant_list.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Participant List Context Menu"> + <menu_item_check label="Ordenar por nome" name="SortByName"/> + <menu_item_check label="Ordenar por conversas mais recentes" name="SortByRecentSpeakers"/> + <menu_item_call label="Ver perfil" name="View Profile"/> + <menu_item_call label="Adicionar amigo..." name="Add Friend"/> + <menu_item_call label="MI" name="IM"/> + <menu_item_call label="Ligar" name="Call"/> + <menu_item_call label="Compartilhar" name="Share"/> + <menu_item_call label="Pagar" name="Pay"/> + <menu_item_check label="Ver ícones de pessoas" name="View Icons"/> + <menu_item_check label="Bloquear voz" name="Block/Unblock"/> + <menu_item_check label="Bloquear texto" name="MuteText"/> + <context_menu label="Opções do moderador >" name="Moderator Options"> + <menu_item_check label="Pode bater papo por escrito" name="AllowTextChat"/> + <menu_item_call label="Silenciar este participante" name="ModerateVoiceMuteSelected"/> + <menu_item_call label="Desfazer silenciar deste participante" name="ModerateVoiceUnMuteSelected"/> + <menu_item_call label="Silenciar todos" name="ModerateVoiceMute"/> + <menu_item_call label="Desfazer silenciar para todos" name="ModerateVoiceUnmute"/> + </context_menu> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_people_friends_view_sort.xml b/indra/newview/skins/minimal/xui/pt/menu_people_friends_view_sort.xml new file mode 100644 index 0000000000..e7c325010f --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_people_friends_view_sort.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_check label="Ordenar por nome" name="sort_name"/> + <menu_item_check label="Ordenar por status" name="sort_status"/> + <menu_item_check label="Ver ícones de pessoas" name="view_icons"/> + <menu_item_check label="Autorizações de visualização dadas" name="view_permissions"/> + <menu_item_call label="Ver residentes e objetos bloqueados" name="show_blocked_list"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_people_groups.xml b/indra/newview/skins/minimal/xui/pt/menu_people_groups.xml new file mode 100644 index 0000000000..9a924ad7b9 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_people_groups.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_call label="Ver dados" name="View Info"/> + <menu_item_call label="Bate-papo" name="Chat"/> + <menu_item_call label="Ligar" name="Call"/> + <menu_item_call label="Ativar" name="Activate"/> + <menu_item_call label="Sair" name="Leave"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_people_groups_view_sort.xml b/indra/newview/skins/minimal/xui/pt/menu_people_groups_view_sort.xml new file mode 100644 index 0000000000..86a9d2263f --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_people_groups_view_sort.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_check label="Mostrar ícones de grupos" name="Display Group Icons"/> + <menu_item_call label="Sair do grupo selecionado" name="Leave Selected Group"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_people_nearby.xml b/indra/newview/skins/minimal/xui/pt/menu_people_nearby.xml new file mode 100644 index 0000000000..b446a2fe81 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_people_nearby.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Avatar Context Menu"> + <menu_item_call label="Ver perfil" name="View Profile"/> + <menu_item_call label="Adicionar amigo" name="Add Friend"/> + <menu_item_call label="Remover amigo" name="Remove Friend"/> + <menu_item_call label="IM" name="IM"/> + <menu_item_call label="Ligar" name="Call"/> + <menu_item_call label="Mapa" name="Map"/> + <menu_item_call label="Compartilhar" name="Share"/> + <menu_item_call label="Pagar" name="Pay"/> + <menu_item_check label="Bloquear/desbloquear" name="Block/Unblock"/> + <menu_item_call label="Teletransportar?" name="teleport"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_people_nearby_multiselect.xml b/indra/newview/skins/minimal/xui/pt/menu_people_nearby_multiselect.xml new file mode 100644 index 0000000000..79edb96b1c --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_people_nearby_multiselect.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Multi-Selected People Context Menu"> + <menu_item_call label="Adicionar amigo..." name="Add Friends"/> + <menu_item_call label="Remover amigo..." name="Remove Friend"/> + <menu_item_call label="MI" name="IM"/> + <menu_item_call label="Ligar" name="Call"/> + <menu_item_call label="Compartilhar" name="Share"/> + <menu_item_call label="Pagar" name="Pay"/> + <menu_item_call label="Teletransportar?" name="teleport"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_people_nearby_view_sort.xml b/indra/newview/skins/minimal/xui/pt/menu_people_nearby_view_sort.xml new file mode 100644 index 0000000000..228ce46a31 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_people_nearby_view_sort.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_check label="Ordenar por conversas mais recentes" name="sort_by_recent_speakers"/> + <menu_item_check label="Ordenar por nome" name="sort_name"/> + <menu_item_check label="Ordenar por distância" name="sort_distance"/> + <menu_item_check label="Ver ícones de pessoas" name="view_icons"/> + <menu_item_call label="Ver residentes e objetos bloqueados" name="show_blocked_list"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_people_recent_view_sort.xml b/indra/newview/skins/minimal/xui/pt/menu_people_recent_view_sort.xml new file mode 100644 index 0000000000..f3b89e01cd --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_people_recent_view_sort.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_check label="Ordenar por mais recente" name="sort_most"/> + <menu_item_check label="Ordenar por nome" name="sort_name"/> + <menu_item_check label="Ver ícones de pessoas" name="view_icons"/> + <menu_item_call label="Ver residentes e objetos bloqueados" name="show_blocked_list"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_picks.xml b/indra/newview/skins/minimal/xui/pt/menu_picks.xml new file mode 100644 index 0000000000..8b9e10fc02 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_picks.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Picks"> + <menu_item_call label="Info" name="pick_info"/> + <menu_item_call label="Editar" name="pick_edit"/> + <menu_item_call label="Teletransportar" name="pick_teleport"/> + <menu_item_call label="Mapa" name="pick_map"/> + <menu_item_call label="Excluir" name="pick_delete"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_picks_plus.xml b/indra/newview/skins/minimal/xui/pt/menu_picks_plus.xml new file mode 100644 index 0000000000..95a7c05262 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_picks_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="picks_plus_menu"> + <menu_item_call label="Adicionar" name="create_pick"/> + <menu_item_call label="Novo anúncio" name="create_classified"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_place.xml b/indra/newview/skins/minimal/xui/pt/menu_place.xml new file mode 100644 index 0000000000..282ea20a7a --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_place.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="place_overflow_menu"> + <menu_item_call label="Criar marco" name="landmark"/> + <menu_item_call label="Criar destaque" name="pick"/> + <menu_item_call label="Comprar passe" name="pass"/> + <menu_item_call label="Editar" name="edit"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_place_add_button.xml b/indra/newview/skins/minimal/xui/pt/menu_place_add_button.xml new file mode 100644 index 0000000000..d099d04f8d --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_place_add_button.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_folder_gear"> + <menu_item_call label="Adicionar pasta" name="add_folder"/> + <menu_item_call label="Adicionar marco" name="add_landmark"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_places_gear_folder.xml b/indra/newview/skins/minimal/xui/pt/menu_places_gear_folder.xml new file mode 100644 index 0000000000..2059a9ed2d --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_places_gear_folder.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_folder_gear"> + <menu_item_call label="Adicionar marco" name="add_landmark"/> + <menu_item_call label="Adicionar pasta" name="add_folder"/> + <menu_item_call label="Cortar" name="cut"/> + <menu_item_call label="Copiar" name="copy_folder"/> + <menu_item_call label="Colar" name="paste"/> + <menu_item_call label="Renomear" name="rename"/> + <menu_item_call label="Excluir" name="delete"/> + <menu_item_call label="Expanda" name="expand"/> + <menu_item_call label="Recolher" name="collapse"/> + <menu_item_call label="Expandir todas as pastas" name="expand_all"/> + <menu_item_call label="Recolher todas as pastas" name="collapse_all"/> + <menu_item_check label="Ordenar por data" name="sort_by_date"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_places_gear_landmark.xml b/indra/newview/skins/minimal/xui/pt/menu_places_gear_landmark.xml new file mode 100644 index 0000000000..52a9d13735 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_places_gear_landmark.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_ladmark_gear"> + <menu_item_call label="Teletransportar" name="teleport"/> + <menu_item_call label="Mais informações" name="more_info"/> + <menu_item_call label="Mostrar no mapa" name="show_on_map"/> + <menu_item_call label="Adicionar marco" name="add_landmark"/> + <menu_item_call label="Adicionar pasta" name="add_folder"/> + <menu_item_call label="Cortar" name="cut"/> + <menu_item_call label="Copiar marco" name="copy_landmark"/> + <menu_item_call label="Copiar SLurl" name="copy_slurl"/> + <menu_item_call label="Colar" name="paste"/> + <menu_item_call label="Renomear" name="rename"/> + <menu_item_call label="Excluir" name="delete"/> + <menu_item_call label="Expandir todas as pastas" name="expand_all"/> + <menu_item_call label="Recolher todas as pastas" name="collapse_all"/> + <menu_item_check label="Ordenar por data" name="sort_by_date"/> + <menu_item_call label="Criar destaque" name="create_pick"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_profile_overflow.xml b/indra/newview/skins/minimal/xui/pt/menu_profile_overflow.xml new file mode 100644 index 0000000000..d41ecbd755 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_profile_overflow.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="profile_overflow_menu"> + <menu_item_call label="Mapa" name="show_on_map"/> + <menu_item_call label="Pagar" name="pay"/> + <menu_item_call label="Compartilhar" name="share"/> + <menu_item_call label="Bloquear" name="block"/> + <menu_item_call label="Desbloquear" name="unblock"/> + <menu_item_call label="Chutar" name="kick"/> + <menu_item_call label="Congelar" name="freeze"/> + <menu_item_call label="Descongelar" name="unfreeze"/> + <menu_item_call label="CSR" name="csr"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_save_outfit.xml b/indra/newview/skins/minimal/xui/pt/menu_save_outfit.xml new file mode 100644 index 0000000000..61c6b9202f --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_save_outfit.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="save_outfit_menu"> + <menu_item_call label="Salvar" name="save_outfit"/> + <menu_item_call label="Salvar como" name="save_as_new_outfit"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_script_chiclet.xml b/indra/newview/skins/minimal/xui/pt/menu_script_chiclet.xml new file mode 100644 index 0000000000..ccf3878e14 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_script_chiclet.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="ScriptChiclet Menu"> + <menu_item_call label="Fechar" name="Close"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_slurl.xml b/indra/newview/skins/minimal/xui/pt/menu_slurl.xml new file mode 100644 index 0000000000..6d4c84fc3c --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_slurl.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="Sobre a URL" name="about_url"/> + <menu_item_call label="Teletransporte para a URL" name="teleport_to_url"/> + <menu_item_call label="Mapa" name="show_on_map"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_teleport_history_gear.xml b/indra/newview/skins/minimal/xui/pt/menu_teleport_history_gear.xml new file mode 100644 index 0000000000..f034509be8 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_teleport_history_gear.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Teleport History Gear Context Menu"> + <menu_item_call label="Expandir todas as pastas" name="Expand all folders"/> + <menu_item_call label="Recolher todas as pastas" name="Collapse all folders"/> + <menu_item_call label="Limpar histórico de teletransporte" name="Clear Teleport History"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_teleport_history_item.xml b/indra/newview/skins/minimal/xui/pt/menu_teleport_history_item.xml new file mode 100644 index 0000000000..ec1e7a0950 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_teleport_history_item.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Teleport History Item Context Menu"> + <menu_item_call label="Teletransportar" name="Teleport"/> + <menu_item_call label="Mais informações" name="More Information"/> + <menu_item_call label="Copiar" name="CopyToClipboard"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_teleport_history_tab.xml b/indra/newview/skins/minimal/xui/pt/menu_teleport_history_tab.xml new file mode 100644 index 0000000000..6a633cf74c --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_teleport_history_tab.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Teleport History Item Context Menu"> + <menu_item_call label="Abrir" name="TabOpen"/> + <menu_item_call label="Fechar" name="TabClose"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_text_editor.xml b/indra/newview/skins/minimal/xui/pt/menu_text_editor.xml new file mode 100644 index 0000000000..31c284c6ed --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_text_editor.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Text editor context menu"> + <menu_item_call label="Cortar" name="Cut"/> + <menu_item_call label="Copiar" name="Copy"/> + <menu_item_call label="Colar" name="Paste"/> + <menu_item_call label="Excluir" name="Delete"/> + <menu_item_call label="Selecionar tudo" name="Select All"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_topinfobar.xml b/indra/newview/skins/minimal/xui/pt/menu_topinfobar.xml new file mode 100644 index 0000000000..d9347950b1 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_topinfobar.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_topinfobar"> + <menu_item_check label="Mostrar coordenadas" name="Show Coordinates"/> + <menu_item_check label="Mostrar as propriedades do terreno" name="Show Parcel Properties"/> + <menu_item_call label="Marco" name="Landmark"/> + <menu_item_call label="Copiar" name="Copy"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_url_agent.xml b/indra/newview/skins/minimal/xui/pt/menu_url_agent.xml new file mode 100644 index 0000000000..ba5e055124 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_url_agent.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Mostrar perfil de residente" name="show_agent"/> + <menu_item_call label="Copiar nome para área de transferência" name="url_copy_label"/> + <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_url_group.xml b/indra/newview/skins/minimal/xui/pt/menu_url_group.xml new file mode 100644 index 0000000000..5b67a69c9a --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_url_group.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Mostrar informações do grupo" name="show_group"/> + <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy_label"/> + <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_url_http.xml b/indra/newview/skins/minimal/xui/pt/menu_url_http.xml new file mode 100644 index 0000000000..e53a2572b8 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_url_http.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Abrir página da web" name="url_open"/> + <menu_item_call label="Abrir no navegador do SL" name="url_open_internal"/> + <menu_item_call label="Abrir no navegador externo" name="url_open_external"/> + <menu_item_call label="Copiar URL para área de transferência" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_url_inventory.xml b/indra/newview/skins/minimal/xui/pt/menu_url_inventory.xml new file mode 100644 index 0000000000..45c14355d0 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_url_inventory.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Mostrar item de inventário" name="show_item"/> + <menu_item_call label="Copiar nome para área de transferência" name="url_copy_label"/> + <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_url_map.xml b/indra/newview/skins/minimal/xui/pt/menu_url_map.xml new file mode 100644 index 0000000000..ba114cccaa --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_url_map.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Mostrar no mapa" name="show_on_map"/> + <menu_item_call label="Teletransportar para este lugar" name="teleport_to_location"/> + <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_url_objectim.xml b/indra/newview/skins/minimal/xui/pt/menu_url_objectim.xml new file mode 100644 index 0000000000..c197444181 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_url_objectim.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Mostrar informações sobre o objeto" name="show_object"/> + <menu_item_call label="Mostrar no mapa" name="show_on_map"/> + <menu_item_call label="Teletransportar para lugar do objeto" name="teleport_to_object"/> + <menu_item_call label="Copiar nome do objeto para área de transferência" name="url_copy_label"/> + <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_url_parcel.xml b/indra/newview/skins/minimal/xui/pt/menu_url_parcel.xml new file mode 100644 index 0000000000..6cc668bfd3 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_url_parcel.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Mostrar informações sobre este lote" name="show_parcel"/> + <menu_item_call label="Mostrar no mapa" name="show_on_map"/> + <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_url_slapp.xml b/indra/newview/skins/minimal/xui/pt/menu_url_slapp.xml new file mode 100644 index 0000000000..d0784149ac --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_url_slapp.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Executar este comando" name="run_slapp"/> + <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_url_slurl.xml b/indra/newview/skins/minimal/xui/pt/menu_url_slurl.xml new file mode 100644 index 0000000000..7216ccf0b3 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_url_slurl.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Mostrar informações sobre este lugar" name="show_place"/> + <menu_item_call label="Mostrar no mapa" name="show_on_map"/> + <menu_item_call label="Teletransportar para este lugar" name="teleport_to_location"/> + <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_url_teleport.xml b/indra/newview/skins/minimal/xui/pt/menu_url_teleport.xml new file mode 100644 index 0000000000..f007425646 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_url_teleport.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Teletransportar para este lugar" name="teleport"/> + <menu_item_call label="Mostrar no mapa" name="show_on_map"/> + <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_viewer.xml b/indra/newview/skins/minimal/xui/pt/menu_viewer.xml new file mode 100644 index 0000000000..2bd1e88279 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_viewer.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu_bar name="Main Menu"> + <menu label="Ajuda" name="Help"> + <menu_item_call label="[SECOND_LIFE] Ajuda" name="Second Life Help"/> + </menu> + <menu label="Avançado" name="Advanced"> + <menu label="Atalhos" name="Shortcuts"> + <menu_item_check label="Voar" name="Fly"/> + <menu_item_call label="Fechar janela" name="Close Window"/> + <menu_item_call label="Fechar todas as janelas" name="Close All Windows"/> + <menu_item_call label="Visão padrão" name="Reset View"/> + </menu> + </menu> +</menu_bar> diff --git a/indra/newview/skins/minimal/xui/pt/menu_wearable_list_item.xml b/indra/newview/skins/minimal/xui/pt/menu_wearable_list_item.xml new file mode 100644 index 0000000000..2487f6779f --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_wearable_list_item.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Outfit Wearable Context Menu"> + <menu_item_call label="Trocar" name="wear_replace"/> + <menu_item_call label="Vestir" name="wear_wear"/> + <menu_item_call label="Adicionar" name="wear_add"/> + <menu_item_call label="Tirar / Separar" name="take_off_or_detach"/> + <menu_item_call label="Separar" name="detach"/> + <context_menu label="Colocar em" name="wearable_attach_to"/> + <context_menu label="Anexar ao HUD" name="wearable_attach_to_hud"/> + <menu_item_call label="Tirar" name="take_off"/> + <menu_item_call label="Editar" name="edit"/> + <menu_item_call label="Perfil do item" name="object_profile"/> + <menu_item_call label="Mostrar original" name="show_original"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_wearing_gear.xml b/indra/newview/skins/minimal/xui/pt/menu_wearing_gear.xml new file mode 100644 index 0000000000..7b6ce4d87e --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_wearing_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Gear Wearing"> + <menu_item_call label="Editar look" name="edit"/> + <menu_item_call label="Tirar" name="takeoff"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pt/menu_wearing_tab.xml b/indra/newview/skins/minimal/xui/pt/menu_wearing_tab.xml new file mode 100644 index 0000000000..4e6e52ebc7 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/menu_wearing_tab.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Wearing"> + <menu_item_call label="Tirar" name="take_off"/> + <menu_item_call label="Tirar" name="detach"/> + <menu_item_call label="Editar look" name="edit"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pt/notifications.xml b/indra/newview/skins/minimal/xui/pt/notifications.xml new file mode 100644 index 0000000000..30ba6f68bf --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/notifications.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<notifications> + <notification name="UserGiveItem"> + [NAME_SLURL] quer lhe dar [ITEM_SLURL]. Esta ação requer o modo Avançado. Passe para o modo avançado e você verá o item em seu inventário. Para passar para o modo avançado, feche e reinicialize esse aplicativo e mude o modo (indicado na tela de login). + <form name="form"> + <button name="Show" text="Guardar item"/> + <button name="Discard" text="Recusar item"/> + <button name="Mute" text="Bloquear usuário"/> + </form> + </notification> + <notification name="ObjectGiveItem"> + Um objeto chamado <nolink>[OBJECTFROMNAME]</nolink>, de [NAME_SLURL], está lhe oferecendo [ITEM_SLURL]. Esta ação requer o modo Avançado. Passe para o modo Avançado e você verá o item em seu Inventário. Para passar para o modo Avançado, feche e reinicialize esse aplicativo e mude o modo (indicado na tela de login). + <form name="form"> + <button name="Keep" text="Guardar item"/> + <button name="Discard" text="Recusar item"/> + <button name="Mute" text="Bloquear objeto"/> + </form> + </notification> +</notifications> diff --git a/indra/newview/skins/minimal/xui/pt/panel_adhoc_control_panel.xml b/indra/newview/skins/minimal/xui/pt/panel_adhoc_control_panel.xml new file mode 100644 index 0000000000..bd50d4953d --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/panel_adhoc_control_panel.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <layout_stack name="vertical_stack"> + <layout_panel name="call_btn_panel"> + <button label="Ligar" name="call_btn"/> + </layout_panel> + <layout_panel name="end_call_btn_panel"> + <button label="Desligar" name="end_call_btn"/> + </layout_panel> + <layout_panel name="voice_ctrls_btn_panel"> + <button label="Controles de voz" name="voice_ctrls_btn"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/pt/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/pt/panel_bottomtray.xml new file mode 100644 index 0000000000..f67823dbd8 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/panel_bottomtray.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="bottom_tray"> + <string name="DragIndicationImageName" value="Accordion_ArrowOpened_Off"/> + <string name="SpeakBtnToolTip" value="Liga e desliga o microfone"/> + <string name="VoiceControlBtnToolTip" value="Mostra/oculta os controles de voz"/> + <layout_stack name="toolbar_stack"> + <layout_panel name="gesture_panel"> + <gesture_combo_list label="Gesto" name="Gesture" tool_tip="Mostra/oculta os gestos"/> + </layout_panel> + <layout_panel name="cam_panel"> + <bottomtray_button label="Exibir" name="camera_btn" tool_tip="Mostra/oculta os controles da câmera"/> + </layout_panel> + <layout_panel name="avatar_and_destinations_panel"> + <bottomtray_button label="Destinos" name="destination_btn" tool_tip="Exibe janela de pessoas"/> + </layout_panel> + <layout_panel name="avatar_and_destinations_panel"> + <bottomtray_button label="Meu avatar" name="avatar_btn"/> + </layout_panel> + <layout_panel name="people_panel"> + <bottomtray_button label="Pessoas" name="show_people_button" tool_tip="Exibe as pessoas"/> + </layout_panel> + <layout_panel name="profile_panel"> + <bottomtray_button label="Perfil" name="show_profile_btn" tool_tip="Exibe o perfil"/> + </layout_panel> + <layout_panel name="howto_panel"> + <bottomtray_button label="Como..." name="show_help_btn" tool_tip="Abrir "Como..." do Second Life"/> + </layout_panel> + <layout_panel name="im_well_panel"> + <chiclet_im_well name="im_well"> + <button name="Unread IM messages" tool_tip="Conversas"/> + </chiclet_im_well> + </layout_panel> + <layout_panel name="notification_well_panel"> + <chiclet_notification name="notification_well"> + <button name="Unread" tool_tip="Notificações"/> + </chiclet_notification> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/pt/panel_group_control_panel.xml b/indra/newview/skins/minimal/xui/pt/panel_group_control_panel.xml new file mode 100644 index 0000000000..177cee28a6 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/panel_group_control_panel.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <layout_stack name="vertical_stack"> + <layout_panel name="end_call_btn_panel"> + <button label="Desligar" name="end_call_btn"/> + </layout_panel> + <layout_panel name="voice_ctrls_btn_panel"> + <button label="Abrir controles de voz" name="voice_ctrls_btn"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/pt/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/pt/panel_im_control_panel.xml new file mode 100644 index 0000000000..91b7d1b7cd --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/panel_im_control_panel.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <layout_stack name="button_stack"> + <layout_panel name="view_profile_btn_panel"> + <button label="Perfil" name="view_profile_btn"/> + </layout_panel> + <layout_panel name="add_friend_btn_panel"> + <button label="Adicionar amigo" name="add_friend_btn"/> + </layout_panel> + <layout_panel name="teleport_btn_panel"> + <button label="Teletransportar" name="teleport_btn" tool_tip="Oferecer teletransporte"/> + </layout_panel> + <layout_panel name="share_btn_panel"> + <button label="Compartilhar" name="share_btn"/> + </layout_panel> + <layout_panel name="pay_btn_panel"> + <button label="Pagar" name="pay_btn"/> + </layout_panel> + <layout_panel name="call_btn_panel"> + <button label="Ligar" name="call_btn"/> + </layout_panel> + <layout_panel name="end_call_btn_panel"> + <button label="Encerrar ligação" name="end_call_btn"/> + </layout_panel> + <layout_panel name="voice_ctrls_btn_panel"> + <button label="Controles de voz" name="voice_ctrls_btn"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/pt/panel_login.xml b/indra/newview/skins/minimal/xui/pt/panel_login.xml new file mode 100644 index 0000000000..de9717874f --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/panel_login.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_login"> + <panel.string name="create_account_url"> + http://join.secondlife.com/ + </panel.string> + <panel.string name="forgot_password_url"> + http://secondlife.com/account/request.php?lang=pt + </panel.string> + <layout_stack name="login_widgets"> + <layout_panel name="login"> + <text name="username_text"> + Nome de usuário: + </text> + <combo_box name="username_combo" tool_tip="O nome de usuário que você escolheu ao fazer seu cadastro, como zecazc12 or Magia Solar"/> + <text name="password_text"> + Senha: + </text> + <check_box label="Lembrar senha" name="remember_check"/> + <button label="conectar" name="connect_btn"/> + <text name="mode_selection_text"> + Modo: + </text> + <combo_box name="mode_combo" tool_tip="Selecione o modo. O modo Básico é mais rápido e ideal para explorar e conversar. Use o modo Avançado para acessar mais recursos."> + <combo_box.item label="Básico" name="Basic"/> + <combo_box.item label="Avançado" name="Advanced"/> + </combo_box> + </layout_panel> + <layout_panel name="links"> + <text name="create_new_account_text"> + Cadastre-se + </text> + <text name="forgot_password_text"> + Esqueceu seu nome ou senha? + </text> + <text name="login_help"> + Precisa de ajuda ao conectar? + </text> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/pt/panel_navigation_bar.xml b/indra/newview/skins/minimal/xui/pt/panel_navigation_bar.xml new file mode 100644 index 0000000000..01930bf3b3 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/panel_navigation_bar.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="navigation_bar"> + <panel name="navigation_panel"> + <pull_button name="back_btn" tool_tip="Voltar para região anterior"/> + <pull_button name="forward_btn" tool_tip="Avançar uma região"/> + <button name="home_btn" tool_tip="Teletransportar para meu início"/> + <location_input label="Onde" name="location_combo"/> + <search_combo_box label="Busca" name="search_combo_box" tool_tip="Busca"> + <combo_editor label="Buscar no [SECOND_LIFE]" name="search_combo_editor"/> + </search_combo_box> + </panel> + <favorites_bar name="favorite" tool_tip="Arraste marcos para cá para acessar seus lugares preferidos do Second Life!"> + <label name="favorites_bar_label" tool_tip="Arraste marcos para cá para acessar seus lugares preferidos do Second Life!"> + Barra Destaques + </label> + <chevron_button name=">>" tool_tip="Mostrar mais favoritos"/> + </favorites_bar> +</panel> diff --git a/indra/newview/skins/minimal/xui/pt/panel_people.xml b/indra/newview/skins/minimal/xui/pt/panel_people.xml new file mode 100644 index 0000000000..935ade2177 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/panel_people.xml @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- Side tray panel --> +<panel label="Pessoas" name="people_panel"> + <string name="no_recent_people" value="Ninguém, recentemente. Em busca de alguém para conversar? Confira o botão Destinos abaixo."/> + <string name="no_filtered_recent_people" value="Não há ninguém com esse nome ultimamente."/> + <string name="no_one_near" value="Ninguém por perto Em busca de alguém para conversar? Confira o botão Destinos abaixo."/> + <string name="no_one_filtered_near" value="Não há ninguém com esse nome por perto."/> + <string name="no_friends_online" value="Nenhum amigo online"/> + <string name="no_friends" value="Nenhum amigo"/> + <string name="no_friends_msg"> + Clique em um residente com o botão direito to mouse para adicioná-lo como amigo. +Em busca de alguém para conversar? Confira o botão Destinos abaixo. + </string> + <string name="no_filtered_friends_msg"> + Não encontrou o que procura? Confira o botão Destinos abaixo. + </string> + <string name="people_filter_label" value="Filtro de pessoas"/> + <string name="groups_filter_label" value="Filtro de grupos"/> + <string name="no_filtered_groups_msg" value="Não encontrou o que procura? Tente buscar no [secondlife:///app/search/groups/[SEARCH_TERM] Search]."/> + <string name="no_groups_msg" value="À procura de grupos interessantes? Tente fazer uma [secondlife:///app/search/groups Busca]."/> + <string name="MiniMapToolTipMsg" value="[REGION](Clique duplo para abrir o Mapa, botão Shift e arrastar para ver mais)"/> + <string name="AltMiniMapToolTipMsg" value="[REGION](Clique duplo para se teletransportar, botão Shift e arrastar para ver mais)"/> + <filter_editor label="Filtro" name="filter_input"/> + <tab_container name="tabs"> + <panel label="PROXIMIDADE" name="nearby_panel"> + <panel label="bottom_panel" name="bottom_panel"/> + </panel> + <panel label="MEUS AMIGOS" name="friends_panel"> + <accordion name="friends_accordion"> + <accordion_tab name="tab_online" title="Online"/> + <accordion_tab name="tab_all" title="Todos"/> + </accordion> + <panel label="bottom_panel" name="bottom_panel"> + <layout_stack name="bottom_panel"> + <layout_panel name="trash_btn_panel"> + <dnd_button name="del_btn" tool_tip="Remover a pessoa selecionada da sua lista de amigos"/> + </layout_panel> + </layout_stack> + </panel> + </panel> + <panel label="RECENTE" name="recent_panel"> + <panel label="bottom_panel" name="bottom_panel"> + <button name="add_friend_btn" tool_tip="Adicionar o residente selecionado para sua lista de amigos"/> + </panel> + </panel> + </tab_container> + <panel name="button_bar"> + <layout_stack name="bottom_bar_ls"> + <layout_panel name="view_profile_btn_lp"> + <button label="Perfil" name="view_profile_btn" tool_tip="Exibir fotografia, grupos e outras informações dos residentes"/> + </layout_panel> + <layout_panel name="chat_btn_lp"> + <button label="MI" name="im_btn" tool_tip="Abrir sessão de mensagem instantânea"/> + </layout_panel> + <layout_panel name="chat_btn_lp"> + <button label="Teletransportar" name="teleport_btn" tool_tip="Oferecer teletransporte"/> + </layout_panel> + </layout_stack> + <layout_stack name="bottom_bar_ls1"> + <layout_panel name="group_info_btn_lp"> + <button label="Perfil do grupo" name="group_info_btn" tool_tip="Exibir dados do grupo"/> + </layout_panel> + <layout_panel name="chat_btn_lp"> + <button label="Bate-papo de grupo" name="chat_btn" tool_tip="Nova sessão de bate-papo"/> + </layout_panel> + <layout_panel name="group_call_btn_lp"> + <button label="Ligar para o grupo" name="group_call_btn" tool_tip="Ligar para este grupo"/> + </layout_panel> + </layout_stack> + </panel> +</panel> diff --git a/indra/newview/skins/minimal/xui/pt/panel_side_tray_tab_caption.xml b/indra/newview/skins/minimal/xui/pt/panel_side_tray_tab_caption.xml new file mode 100644 index 0000000000..09444a5535 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/panel_side_tray_tab_caption.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="sidetray_tab_panel"> + <text name="sidetray_tab_title" value="Bandeja lateral"/> + <button name="undock" tool_tip="Soltar janela"/> + <button name="dock" tool_tip="Ancorar janela"/> + <button name="show_help" tool_tip="Mostrar ajuda"/> +</panel> diff --git a/indra/newview/skins/minimal/xui/pt/panel_status_bar.xml b/indra/newview/skins/minimal/xui/pt/panel_status_bar.xml new file mode 100644 index 0000000000..f7890ae57d --- /dev/null +++ b/indra/newview/skins/minimal/xui/pt/panel_status_bar.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="status"> + <panel.string name="StatBarDaysOfWeek"> + Domingo:Segunda-feira:Terça-feira:Quarta-feira:Quinta-feira:Sexta-feira:Sábado + </panel.string> + <panel.string name="StatBarMonthsOfYear"> + Janeiro:Fevereiro:Março:Abril:Maio:Junho:Julho:Agosto:Setembro:Outubro:Novembro:Dezembro + </panel.string> + <panel.string name="packet_loss_tooltip"> + Perda de pacote + </panel.string> + <panel.string name="bandwidth_tooltip"> + Banda + </panel.string> + <panel.string name="time"> + [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt] + </panel.string> + <panel.string name="timeTooltip"> + [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt] + </panel.string> + <panel.string name="buycurrencylabel"> + L$ [AMT] + </panel.string> + <panel name="balance_bg"> + <text name="balance" tool_tip="Atualizar saldo de L$" value="L$20"/> + <button label="Comprar L$" name="buyL" tool_tip="Comprar mais L$"/> + </panel> + <text name="TimeText" tool_tip="Hora atual (Pacífico)"> + 24:00 AM PST + </text> + <button name="media_toggle_btn" tool_tip="Tocar/Pausar todas mídias (música, vídeo, páginas web)"/> + <button name="volume_btn" tool_tip="Volume geral"/> +</panel> -- cgit v1.2.3 From c14d9b6e5f3fb52d1c8e743c5d28d212551458a1 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Thu, 28 Apr 2011 16:56:05 -0700 Subject: fixed build --- indra/llxuixml/llinitparam.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/indra/llxuixml/llinitparam.h b/indra/llxuixml/llinitparam.h index 35c3106198..70dad4c8bf 100644 --- a/indra/llxuixml/llinitparam.h +++ b/indra/llxuixml/llinitparam.h @@ -478,7 +478,7 @@ namespace LLInitParam bool mergeBlockParam(bool param_provided, BlockDescriptor& block_data, const BaseBlock& other, bool overwrite) { - mergeBlock(block_data, other, overwrite); + return mergeBlock(block_data, other, overwrite); } // take all provided params from other and apply to self bool mergeBlock(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite); @@ -1333,8 +1333,9 @@ namespace LLInitParam { if (param_provided) { - mergeBlock(block_data, other, overwrite); + return mergeBlock(block_data, other, overwrite); } + return false; } // merge with other block @@ -1889,8 +1890,9 @@ namespace LLInitParam { if (param_provided) { - mergeBlock(block_data, other, overwrite); + return mergeBlock(block_data, other, overwrite); } + return false; } bool mergeBlock(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite) -- cgit v1.2.3 From f22eacd5de91ff248b3c19b4c657df143a663ff9 Mon Sep 17 00:00:00 2001 From: Eli Linden <eli@lindenlab.com> Date: Thu, 28 Apr 2011 17:19:26 -0700 Subject: WIP INTL-41 set23 DE/FR/ES/PT translation; CT-640 set22 PL translation --- .../skins/default/xui/de/floater_beacons.xml | 1 + .../skins/default/xui/de/menu_avatar_self.xml | 1 + .../skins/default/xui/de/menu_bottomtray.xml | 2 +- .../skins/default/xui/de/menu_inventory.xml | 1 + .../skins/default/xui/de/menu_inventory_add.xml | 1 + .../skins/default/xui/de/menu_outfit_gear.xml | 5 +- indra/newview/skins/default/xui/de/menu_viewer.xml | 1 + .../newview/skins/default/xui/de/notifications.xml | 15 +- .../skins/default/xui/de/panel_edit_wearable.xml | 6 + .../default/xui/de/panel_preferences_chat.xml | 4 +- .../default/xui/de/panel_preferences_graphics1.xml | 4 + .../default/xui/de/panel_preferences_sound.xml | 4 +- indra/newview/skins/default/xui/de/strings.xml | 123 +++++++ .../skins/default/xui/es/floater_beacons.xml | 1 + .../skins/default/xui/es/menu_avatar_self.xml | 1 + .../skins/default/xui/es/menu_bottomtray.xml | 2 +- .../skins/default/xui/es/menu_inventory.xml | 1 + .../skins/default/xui/es/menu_inventory_add.xml | 1 + .../skins/default/xui/es/menu_outfit_gear.xml | 5 +- indra/newview/skins/default/xui/es/menu_viewer.xml | 5 + .../newview/skins/default/xui/es/notifications.xml | 15 +- .../skins/default/xui/es/panel_edit_wearable.xml | 6 + .../default/xui/es/panel_preferences_chat.xml | 4 +- .../default/xui/es/panel_preferences_colors.xml | 8 +- .../default/xui/es/panel_preferences_graphics1.xml | 4 + .../default/xui/es/panel_preferences_sound.xml | 4 +- indra/newview/skins/default/xui/es/strings.xml | 123 +++++++ .../skins/default/xui/fr/floater_beacons.xml | 1 + .../skins/default/xui/fr/menu_avatar_self.xml | 1 + .../skins/default/xui/fr/menu_bottomtray.xml | 2 +- .../skins/default/xui/fr/menu_inventory.xml | 1 + .../skins/default/xui/fr/menu_inventory_add.xml | 1 + .../skins/default/xui/fr/menu_outfit_gear.xml | 5 +- indra/newview/skins/default/xui/fr/menu_viewer.xml | 1 + .../newview/skins/default/xui/fr/notifications.xml | 17 +- .../skins/default/xui/fr/panel_edit_wearable.xml | 6 + .../default/xui/fr/panel_preferences_chat.xml | 4 +- .../default/xui/fr/panel_preferences_colors.xml | 4 +- .../default/xui/fr/panel_preferences_graphics1.xml | 6 +- .../default/xui/fr/panel_preferences_sound.xml | 4 +- indra/newview/skins/default/xui/fr/strings.xml | 123 +++++++ .../skins/default/xui/pl/floater_about_land.xml | 4 +- indra/newview/skins/default/xui/pl/floater_map.xml | 3 + .../newview/skins/default/xui/pl/floater_tools.xml | 4 +- .../skins/default/xui/pl/menu_attachment_self.xml | 2 +- .../skins/default/xui/pl/menu_avatar_self.xml | 2 +- .../skins/default/xui/pl/menu_bottomtray.xml | 2 +- .../default/xui/pl/menu_inspect_avatar_gear.xml | 6 +- .../default/xui/pl/menu_inspect_self_gear.xml | 39 ++- .../default/xui/pl/menu_inventory_gear_default.xml | 1 + indra/newview/skins/default/xui/pl/menu_object.xml | 4 +- .../default/xui/pl/menu_places_gear_folder.xml | 5 +- .../default/xui/pl/menu_places_gear_landmark.xml | 5 +- indra/newview/skins/default/xui/pl/menu_viewer.xml | 8 +- .../newview/skins/default/xui/pl/notifications.xml | 50 ++- indra/newview/skins/default/xui/pl/panel_login.xml | 7 + .../skins/default/xui/pl/panel_nearby_media.xml | 2 +- .../newview/skins/default/xui/pl/panel_people.xml | 2 + .../default/xui/pl/panel_preferences_sound.xml | 6 +- .../newview/skins/default/xui/pl/panel_profile.xml | 8 +- .../skins/default/xui/pl/panel_script_ed.xml | 3 + indra/newview/skins/default/xui/pl/strings.xml | 363 ++++++++++++++++++++- .../skins/default/xui/pt/floater_beacons.xml | 1 + .../skins/default/xui/pt/menu_avatar_self.xml | 1 + .../skins/default/xui/pt/menu_bottomtray.xml | 2 +- .../skins/default/xui/pt/menu_inventory.xml | 1 + .../skins/default/xui/pt/menu_inventory_add.xml | 1 + .../skins/default/xui/pt/menu_outfit_gear.xml | 5 +- indra/newview/skins/default/xui/pt/menu_viewer.xml | 5 + .../newview/skins/default/xui/pt/notifications.xml | 15 +- .../skins/default/xui/pt/panel_edit_wearable.xml | 6 + .../default/xui/pt/panel_preferences_chat.xml | 4 +- .../default/xui/pt/panel_preferences_colors.xml | 2 +- .../default/xui/pt/panel_preferences_graphics1.xml | 6 +- .../default/xui/pt/panel_preferences_sound.xml | 4 +- indra/newview/skins/default/xui/pt/strings.xml | 123 +++++++ 76 files changed, 1133 insertions(+), 93 deletions(-) diff --git a/indra/newview/skins/default/xui/de/floater_beacons.xml b/indra/newview/skins/default/xui/de/floater_beacons.xml index 6e83e0419b..1a052bd814 100644 --- a/indra/newview/skins/default/xui/de/floater_beacons.xml +++ b/indra/newview/skins/default/xui/de/floater_beacons.xml @@ -17,5 +17,6 @@ <check_box label="Nur berühren" name="touch_only"/> <check_box label="Soundquellen" name="sounds"/> <check_box label="Partikelquellen" name="particles"/> + <check_box label="Medienquellen" name="moapbeacon"/> </panel> </floater> diff --git a/indra/newview/skins/default/xui/de/menu_avatar_self.xml b/indra/newview/skins/default/xui/de/menu_avatar_self.xml index 40557b7ad8..c49f4b198b 100644 --- a/indra/newview/skins/default/xui/de/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/de/menu_avatar_self.xml @@ -14,6 +14,7 @@ <menu_item_call label="Unterhemd" name="Self Undershirt"/> <menu_item_call label="Unterhose" name="Self Underpants"/> <menu_item_call label="Tätowierung" name="Self Tattoo"/> + <menu_item_call label="Physik" name="Self Physics"/> <menu_item_call label="Alpha" name="Self Alpha"/> <menu_item_call label="Alle Kleider" name="All Clothes"/> </context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_bottomtray.xml b/indra/newview/skins/default/xui/de/menu_bottomtray.xml index 660cd2eaf3..da36be59d0 100644 --- a/indra/newview/skins/default/xui/de/menu_bottomtray.xml +++ b/indra/newview/skins/default/xui/de/menu_bottomtray.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="hide_camera_move_controls_menu"> - <menu_item_check label="Voice aktiviert" name="EnableVoiceChat"/> + <menu_item_check label="Schaltfläche „Sprechen“" name="EnableVoiceChat"/> <menu_item_check label="Schaltfläche Gesten" name="ShowGestureButton"/> <menu_item_check label="Schaltfläche Bewegungssteuerung" name="ShowMoveButton"/> <menu_item_check label="Schaltfläche Ansicht" name="ShowCameraButton"/> diff --git a/indra/newview/skins/default/xui/de/menu_inventory.xml b/indra/newview/skins/default/xui/de/menu_inventory.xml index 43722e0dcf..9fcd41e62a 100644 --- a/indra/newview/skins/default/xui/de/menu_inventory.xml +++ b/indra/newview/skins/default/xui/de/menu_inventory.xml @@ -25,6 +25,7 @@ <menu_item_call label="Neue Unterhose" name="New Underpants"/> <menu_item_call label="Neue Alpha-Maske" name="New Alpha Mask"/> <menu_item_call label="Neue Tätowierung" name="New Tattoo"/> + <menu_item_call label="Neue Physik" name="New Physics"/> </menu> <menu label="Neue Körperteile" name="New Body Parts"> <menu_item_call label="Neue Form/Gestalt" name="New Shape"/> diff --git a/indra/newview/skins/default/xui/de/menu_inventory_add.xml b/indra/newview/skins/default/xui/de/menu_inventory_add.xml index dccee6712d..165e9a9264 100644 --- a/indra/newview/skins/default/xui/de/menu_inventory_add.xml +++ b/indra/newview/skins/default/xui/de/menu_inventory_add.xml @@ -23,6 +23,7 @@ <menu_item_call label="Neue Unterhose" name="New Underpants"/> <menu_item_call label="Neues Alpha" name="New Alpha"/> <menu_item_call label="Neue Tätowierung" name="New Tattoo"/> + <menu_item_call label="Neue Physik" name="New Physics"/> </menu> <menu label="Neue Körperteile" name="New Body Parts"> <menu_item_call label="Neue Form/Gestalt" name="New Shape"/> diff --git a/indra/newview/skins/default/xui/de/menu_outfit_gear.xml b/indra/newview/skins/default/xui/de/menu_outfit_gear.xml index 897154ec56..d56c93533c 100644 --- a/indra/newview/skins/default/xui/de/menu_outfit_gear.xml +++ b/indra/newview/skins/default/xui/de/menu_outfit_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Gear Outfit"> +<toggleable_menu name="Gear Outfit"> <menu_item_call label="Anziehen - Aktuelles Outfit ersetzen" name="wear"/> <menu_item_call label="Anziehen - Aktuelles Outfit hinzufügen" name="wear_add"/> <menu_item_call label="Ausziehen - Aus aktuellem Outfit entfernen" name="take_off"/> @@ -14,6 +14,7 @@ <menu_item_call label="Neues Unterhemd" name="New Undershirt"/> <menu_item_call label="Neue Unterhose" name="New Underpants"/> <menu_item_call label="Neues Alpha" name="New Alpha"/> + <menu_item_call label="Neue Physik" name="New Physics"/> <menu_item_call label="Neue Tätowierung" name="New Tattoo"/> </menu> <menu label="Neue Körperteile" name="New Body Parts"> @@ -24,4 +25,4 @@ </menu> <menu_item_call label="Outfit neu benennen" name="rename"/> <menu_item_call label="Outfit löschen" name="delete_outfit"/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml index 17bcb013cc..9d5a69105d 100644 --- a/indra/newview/skins/default/xui/de/menu_viewer.xml +++ b/indra/newview/skins/default/xui/de/menu_viewer.xml @@ -413,6 +413,7 @@ <menu_item_call label="Rock" name="Skirt"/> <menu_item_call label="Alpha" name="Alpha"/> <menu_item_call label="Tätowierung" name="Tattoo"/> + <menu_item_call label="Physik" name="Physics"/> <menu_item_call label="Alle Kleider" name="All Clothes"/> </menu> <menu label="Hilfe" name="Help"> diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml index 3c63c093d2..c172f7ea2d 100644 --- a/indra/newview/skins/default/xui/de/notifications.xml +++ b/indra/newview/skins/default/xui/de/notifications.xml @@ -2853,6 +2853,13 @@ Alle stummschalten? <notification label="Stehen" name="HintSit"> Um aufzustehen, klicken Sie auf die Schaltfläche „Stehen“. </notification> + <notification label="Sprechen" name="HintSpeak"> + Auf Schaltfläche „Sprechen“ klicken, um das Mikrofon ein- und auszuschalten. + +Auf den Pfeil nach oben klicken, um die Sprachsteuerung zu sehen. + +Durch Ausblenden der Schaltfläche „Sprechen“ wird die Sprechfunktion deaktiviert. + </notification> <notification label="Welt erkunden" name="HintDestinationGuide"> Im Reiseführer finden Sie Tausende von interessanten Orten. Wählen Sie einfach einen Ort aus und klicken Sie auf „Teleportieren“. </notification> @@ -2862,12 +2869,14 @@ Alle stummschalten? <notification label="Bewegen" name="HintMove"> Um zu gehen oder zu rennen, öffnen Sie das Bedienfeld „Bewegen“ und klicken Sie auf die Pfeile. Sie können auch die Pfeiltasten auf Ihrer Tastatur verwenden. </notification> + <notification label="" name="HintMoveClick"> + 1. Zum Gehen klicken: Auf beliebige Stelle am Boden klicken, um zu dieser Stelle zu gehen. + +2. Zum Drehen der Anzeige klicken und ziehen: Auf beliebige Stelle in der Welt klicken und ziehen, um Ihre Ansicht zu ändern. + </notification> <notification label="Anzeigename" name="HintDisplayName"> Hier können Sie Ihren anpassbaren Anzeigenamen festlegen. Der Anzeigename unterscheidet sich von Ihrem eindeutigen Benutzernamen, der nicht geändert werden kann. In den Einstellungen können Sie festlegen, welcher Name von anderen Einwohnern angezeigt wird. </notification> - <notification label="Bewegen" name="HintMoveArrows"> - Verwenden Sie zum Gehen die Pfeiltasten auf Ihrer Tastatur. Drücken Sie die Nach-oben-Taste zweimal, um zu rennen. - </notification> <notification label="Ansicht" name="HintView"> Um die Kameraansicht zu ändern, verwenden Sie die Schwenk- und Kreissteuerungen. Um die Ansicht zurückzusetzen, drücken Sie die Esc-Taste oder laufen Sie einfach. </notification> diff --git a/indra/newview/skins/default/xui/de/panel_edit_wearable.xml b/indra/newview/skins/default/xui/de/panel_edit_wearable.xml index 271db4c15c..94a79a0bbd 100644 --- a/indra/newview/skins/default/xui/de/panel_edit_wearable.xml +++ b/indra/newview/skins/default/xui/de/panel_edit_wearable.xml @@ -45,6 +45,9 @@ <string name="edit_tattoo_title"> Tätowierung bearbeiten </string> + <string name="edit_physics_title"> + Physik bearbeiten + </string> <string name="shape_desc_text"> Form: </string> @@ -90,6 +93,9 @@ <string name="tattoo_desc_text"> Tätowierung: </string> + <string name="physics_desc_text"> + Physik: + </string> <labeled_back_button label="Speichern" name="back_btn" tool_tip="Zurück zu Outfit bearbeiten"/> <text name="edit_wearable_title" value="Form bearbeiten"/> <panel label="Hemd" name="wearable_type_panel"> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml index 8c8cdd31fe..ca8af27f58 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml @@ -30,7 +30,9 @@ <spinner label="Lebenszeit von Toasts für Chat in der Nähe:" name="nearby_toasts_lifetime"/> <spinner label="Ein-/Ausblenddauer von Toasts für Chat in der Nähe:" name="nearby_toasts_fadingtime"/> <check_box name="translate_chat_checkbox"/> - <text name="translate_chb_label" >Bei Chat Maschinenübersetzung verwenden (Service von Google)</text> + <text name="translate_chb_label"> + Beim Chatten Maschinenübersetzung verwenden (von Google bereitgestellt) + </text> <text name="translate_language_text"> Chat übersetzen in: </text> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml index 63161c954e..78cb03a50a 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml @@ -39,6 +39,10 @@ <combo_box.item label="Alle Avatare und Objekte" name="3"/> <combo_box.item label="Alles" name="4"/> </combo_box> + <slider label="Avatar-Physik:" name="AvatarPhysicsDetail"/> + <text name="AvatarPhysicsDetailText"> + Niedrig + </text> <slider label="Sichtweite:" name="DrawDistance"/> <text name="DrawDistanceMeterText2"> m diff --git a/indra/newview/skins/default/xui/de/panel_preferences_sound.xml b/indra/newview/skins/default/xui/de/panel_preferences_sound.xml index 07631b6a91..c118e4e4dd 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_sound.xml @@ -5,7 +5,9 @@ </panel.string> <slider label="Master-Lautstärke" name="System Volume"/> <check_box initial_value="true" name="mute_when_minimized"/> - <text name="mute_chb_label">Stummschalten, wenn minimiert</text> + <text name="mute_chb_label"> + Stummschalten, wenn minimiert + </text> <slider label="Schaltflächen" name="UI Volume"/> <slider label="Umgebung" name="Wind Volume"/> <slider label="Soundeffekte" name="SFX Volume"/> diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml index 0c621db6b0..f32eb21dd3 100644 --- a/indra/newview/skins/default/xui/de/strings.xml +++ b/indra/newview/skins/default/xui/de/strings.xml @@ -876,6 +876,9 @@ <string name="tattoo"> Tätowierung </string> + <string name="physics"> + Physik + </string> <string name="invalid"> ungültig </string> @@ -915,6 +918,9 @@ <string name="tattoo_not_worn"> Tätowierung nicht getragen </string> + <string name="physics_not_worn"> + Physik nicht getragen + </string> <string name="invalid_not_worn"> ungültig </string> @@ -963,6 +969,9 @@ <string name="create_new_tattoo"> Neue Tätowierung erstellen </string> + <string name="create_new_physics"> + Neue Physik erstellen + </string> <string name="create_new_invalid"> ungültig </string> @@ -2247,6 +2256,114 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_ <string name="Bulbous Nose"> Knollennase </string> + <string name="Breast Physics Mass"> + Brust – Masse + </string> + <string name="Breast Physics Smoothing"> + Brust – Glättung + </string> + <string name="Breast Physics Gravity"> + Brust – Schwerkraft + </string> + <string name="Breast Physics Drag"> + Brust – Luftwiderstand + </string> + <string name="Breast Physics InOut Max Effect"> + Max. Effekt + </string> + <string name="Breast Physics InOut Spring"> + Federn + </string> + <string name="Breast Physics InOut Gain"> + Verstärkung + </string> + <string name="Breast Physics InOut Damping"> + Dämpfung + </string> + <string name="Breast Physics UpDown Max Effect"> + Max. Effekt + </string> + <string name="Breast Physics UpDown Spring"> + Federn + </string> + <string name="Breast Physics UpDown Gain"> + Verstärkung + </string> + <string name="Breast Physics UpDown Damping"> + Dämpfung + </string> + <string name="Breast Physics LeftRight Max Effect"> + Max. Effekt + </string> + <string name="Breast Physics LeftRight Spring"> + Federn + </string> + <string name="Breast Physics LeftRight Gain"> + Verstärkung + </string> + <string name="Breast Physics LeftRight Damping"> + Dämpfung + </string> + <string name="Belly Physics Mass"> + Bauch – Masse + </string> + <string name="Belly Physics Smoothing"> + Bauch – Glättung + </string> + <string name="Belly Physics Gravity"> + Bauch – Schwerkraft + </string> + <string name="Belly Physics Drag"> + Bauch – Luftwiderstand + </string> + <string name="Belly Physics UpDown Max Effect"> + Max. Effekt + </string> + <string name="Belly Physics UpDown Spring"> + Federn + </string> + <string name="Belly Physics UpDown Gain"> + Verstärkung + </string> + <string name="Belly Physics UpDown Damping"> + Dämpfung + </string> + <string name="Butt Physics Mass"> + Po – Masse + </string> + <string name="Butt Physics Smoothing"> + Po – Glättung + </string> + <string name="Butt Physics Gravity"> + Po – Schwerkraft + </string> + <string name="Butt Physics Drag"> + Po – Luftwiderstand + </string> + <string name="Butt Physics UpDown Max Effect"> + Max. Effekt + </string> + <string name="Butt Physics UpDown Spring"> + Federn + </string> + <string name="Butt Physics UpDown Gain"> + Verstärkung + </string> + <string name="Butt Physics UpDown Damping"> + Dämpfung + </string> + <string name="Butt Physics LeftRight Max Effect"> + Max. Effekt + </string> + <string name="Butt Physics LeftRight Spring"> + Federn + </string> + <string name="Butt Physics LeftRight Gain"> + Verstärkung + </string> + <string name="Butt Physics LeftRight Damping"> + Dämpfung + </string> <string name="Bushy Eyebrows"> Buschige Augenbrauen </string> @@ -2256,6 +2373,9 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_ <string name="Butt Size"> Hintern, Größe </string> + <string name="Butt Gravity"> + Po – Schwerkraft + </string> <string name="bustle skirt"> Tournürenrock </string> @@ -3764,6 +3884,9 @@ Missbrauchsbericht <string name="New Tattoo"> Neue Tätowierung </string> + <string name="New Physics"> + Neue Physik + </string> <string name="Invalid Wearable"> Ungültiges Objekt </string> diff --git a/indra/newview/skins/default/xui/es/floater_beacons.xml b/indra/newview/skins/default/xui/es/floater_beacons.xml index b86967755c..49f990c84d 100644 --- a/indra/newview/skins/default/xui/es/floater_beacons.xml +++ b/indra/newview/skins/default/xui/es/floater_beacons.xml @@ -17,5 +17,6 @@ <check_box label="Sólo tocar" name="touch_only"/> <check_box label="Origen de sonidos" name="sounds"/> <check_box label="Origen de partículas" name="particles"/> + <check_box label="Fuentes de media" name="moapbeacon"/> </panel> </floater> diff --git a/indra/newview/skins/default/xui/es/menu_avatar_self.xml b/indra/newview/skins/default/xui/es/menu_avatar_self.xml index a2d86d78c1..268d6f70ab 100644 --- a/indra/newview/skins/default/xui/es/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/es/menu_avatar_self.xml @@ -14,6 +14,7 @@ <menu_item_call label="Camiseta" name="Self Undershirt"/> <menu_item_call label="Ropa interior" name="Self Underpants"/> <menu_item_call label="Tatuaje" name="Self Tattoo"/> + <menu_item_call label="Física" name="Self Physics"/> <menu_item_call label="Alfa" name="Self Alpha"/> <menu_item_call label="Toda la ropa" name="All Clothes"/> </context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_bottomtray.xml b/indra/newview/skins/default/xui/es/menu_bottomtray.xml index a16da5ae9e..40058a1749 100644 --- a/indra/newview/skins/default/xui/es/menu_bottomtray.xml +++ b/indra/newview/skins/default/xui/es/menu_bottomtray.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="hide_camera_move_controls_menu"> - <menu_item_check label="Voz activada" name="EnableVoiceChat"/> + <menu_item_check label="Botón Hablar" name="EnableVoiceChat"/> <menu_item_check label="Botón Gestos" name="ShowGestureButton"/> <menu_item_check label="Botón Moverse" name="ShowMoveButton"/> <menu_item_check label="Botón Vista" name="ShowCameraButton"/> diff --git a/indra/newview/skins/default/xui/es/menu_inventory.xml b/indra/newview/skins/default/xui/es/menu_inventory.xml index 94ee162bbc..e873d31580 100644 --- a/indra/newview/skins/default/xui/es/menu_inventory.xml +++ b/indra/newview/skins/default/xui/es/menu_inventory.xml @@ -25,6 +25,7 @@ <menu_item_call label="Ropa interior nueva" name="New Underpants"/> <menu_item_call label="Nueva capa Alpha" name="New Alpha Mask"/> <menu_item_call label="Tatuaje nuevo" name="New Tattoo"/> + <menu_item_call label="Nueva física" name="New Physics"/> </menu> <menu label="Nuevas partes del cuerpo" name="New Body Parts"> <menu_item_call label="Forma nueva" name="New Shape"/> diff --git a/indra/newview/skins/default/xui/es/menu_inventory_add.xml b/indra/newview/skins/default/xui/es/menu_inventory_add.xml index ba106e8335..615a1a09b7 100644 --- a/indra/newview/skins/default/xui/es/menu_inventory_add.xml +++ b/indra/newview/skins/default/xui/es/menu_inventory_add.xml @@ -23,6 +23,7 @@ <menu_item_call label="Ropa interior nueva" name="New Underpants"/> <menu_item_call label="Nueva Alfa" name="New Alpha"/> <menu_item_call label="Tatuaje nuevo" name="New Tattoo"/> + <menu_item_call label="Nueva física" name="New Physics"/> </menu> <menu label="Nuevas partes del cuerpo" name="New Body Parts"> <menu_item_call label="Forma nueva" name="New Shape"/> diff --git a/indra/newview/skins/default/xui/es/menu_outfit_gear.xml b/indra/newview/skins/default/xui/es/menu_outfit_gear.xml index 3b11bceecf..558ff6afd3 100644 --- a/indra/newview/skins/default/xui/es/menu_outfit_gear.xml +++ b/indra/newview/skins/default/xui/es/menu_outfit_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Gear Outfit"> +<toggleable_menu name="Gear Outfit"> <menu_item_call label="Ponerme - Reemplazar el vestuario actual" name="wear"/> <menu_item_call label="Ponerme - Añadir al vestuario actual" name="wear_add"/> <menu_item_call label="Quitarme - Quitar del vestuario actual" name="take_off"/> @@ -14,6 +14,7 @@ <menu_item_call label="Camiseta nueva" name="New Undershirt"/> <menu_item_call label="Ropa interior nueva" name="New Underpants"/> <menu_item_call label="Nueva Alfa" name="New Alpha"/> + <menu_item_call label="Nueva física" name="New Physics"/> <menu_item_call label="Tatuaje nuevo" name="New Tattoo"/> </menu> <menu label="Nuevas partes del cuerpo" name="New Body Parts"> @@ -24,4 +25,4 @@ </menu> <menu_item_call label="Renombrar el vestuario" name="rename"/> <menu_item_call label="Borrar el vestuario" name="delete_outfit"/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_viewer.xml b/indra/newview/skins/default/xui/es/menu_viewer.xml index c48203f95c..138bbd9412 100644 --- a/indra/newview/skins/default/xui/es/menu_viewer.xml +++ b/indra/newview/skins/default/xui/es/menu_viewer.xml @@ -336,4 +336,9 @@ </menu> <menu_item_call label="God Tools" name="God Tools"/> </menu> + <menu label="Admin" name="Deprecated"> + <menu label="Take Off Clothing" name="Take Off Clothing"> + <menu_item_call label="Física" name="Physics"/> + </menu> + </menu> </menu_bar> diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml index 1379f710c3..91a03023a1 100644 --- a/indra/newview/skins/default/xui/es/notifications.xml +++ b/indra/newview/skins/default/xui/es/notifications.xml @@ -2841,6 +2841,13 @@ Si lo haces, todos los residentes que se unan posteriormente a la llamada tambi <notification label="Levantarme" name="HintSit"> Para levantarte y salir de la posición de sentado, haz clic en el botón Levantarme. </notification> + <notification label="Hablar" name="HintSpeak"> + Pulsa en el botón: Hablar para conectar y desconectar el micrófono. + +Pulsa en el cursor arriba para ver el panel de control de voz. + +Al ocultar el botón Hablar se desactiva la función de voz. + </notification> <notification label="Explora el mundo" name="HintDestinationGuide"> La Guía de destinos contiene miles de nuevos lugares por descubrir. Selecciona una ubicación y elige Teleportarme para iniciar la exploración. </notification> @@ -2850,12 +2857,14 @@ Si lo haces, todos los residentes que se unan posteriormente a la llamada tambi <notification label="Mover" name="HintMove"> Si deseas caminar o correr, abre el panel Mover y utiliza las flechas de dirección para navegar. También puedes utilizar las flechas de dirección del teclado. </notification> + <notification label="" name="HintMoveClick"> + 1. Pulsa para caminar: Pulsa en cualquier punto del terreno para ir a él. + +2. Pulsa y arrastra para girar la vista: Pulsa y arrastra el cursor a cualquier parte del mundo para girar la vista. + </notification> <notification label="Nombre mostrado" name="HintDisplayName"> Configura y personaliza aquí tu nombre mostrado. Esto se añadirá a tu nombre de usuario personal, que no puedes modificar. Puedes cambiar la manera en que ves los nombres de otras personas en tus preferencias. </notification> - <notification label="Mover" name="HintMoveArrows"> - Para caminar, utiliza las flechas de dirección del teclado. Para correr, pulsa dos veces la flecha hacia arriba. - </notification> <notification label="Visión" name="HintView"> Para cambiar la vista de la cámara, utiliza los controles Orbital y Panorámica. Para restablecer tu vista, pulsa Esc o camina. </notification> diff --git a/indra/newview/skins/default/xui/es/panel_edit_wearable.xml b/indra/newview/skins/default/xui/es/panel_edit_wearable.xml index 15c683f375..799512968d 100644 --- a/indra/newview/skins/default/xui/es/panel_edit_wearable.xml +++ b/indra/newview/skins/default/xui/es/panel_edit_wearable.xml @@ -45,6 +45,9 @@ <string name="edit_tattoo_title"> Modificando los tatuajes </string> + <string name="edit_physics_title"> + Modificar la física + </string> <string name="shape_desc_text"> Anatomía: </string> @@ -90,6 +93,9 @@ <string name="tattoo_desc_text"> Tatuaje: </string> + <string name="physics_desc_text"> + Física: + </string> <labeled_back_button label="Guardar" name="back_btn" tool_tip="Regresar a Editar el vestuario"/> <text name="edit_wearable_title" value="Modificando la anatomía"/> <panel label="Camisa" name="wearable_type_panel"> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml index aba85f9ff1..f7bc1f6aad 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml @@ -30,7 +30,9 @@ <spinner label="Duración de los interlocutores favoritos:" name="nearby_toasts_lifetime"/> <spinner label="Tiempo de los otros interlocutores:" name="nearby_toasts_fadingtime"/> <check_box name="translate_chat_checkbox"/> - <text name="translate_chb_label" >Usar la traducción automática (con Google) en el chat</text> + <text name="translate_chb_label"> + Utiliza la herramienta de traducción automática mientras utilizas el chat (mediante Google) + </text> <text name="translate_language_text"> Traducir el chat al: </text> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_colors.xml b/indra/newview/skins/default/xui/es/panel_preferences_colors.xml index edd417d564..a7fb2d9af8 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_colors.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_colors.xml @@ -26,13 +26,13 @@ Propietario </text> <text name="text_box9"> - URL + URLs </text> <text name="bubble_chat"> - Color de fondo de la etiqueta del nombre (afectará también a los bocadillos del chat): + Color de fondo de las etiquetas de nombre (también se aplica a los bocadillos del chat): </text> - <color_swatch name="background" tool_tip="Seleccionar el color de la etiqueta del nombre"/> - <slider label="Opacidad:" name="bubble_chat_opacity" tool_tip="Seleccionar opacidad de la etiqueta del nombre"/> + <color_swatch name="background" tool_tip="Elige el color de las etiquetas de nombre"/> + <slider label="Opacidad:" name="bubble_chat_opacity" tool_tip="Elige la opacidad de las etiquetas de nombre"/> <text name="floater_opacity"> Opacidad de la ventana: </text> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml index c569db3376..1ae5d63ace 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml @@ -39,6 +39,10 @@ <combo_box.item label="Todos los avatares y objetos" name="3"/> <combo_box.item label="Todo" name="4"/> </combo_box> + <slider label="Física del avatar:" name="AvatarPhysicsDetail"/> + <text name="AvatarPhysicsDetailText"> + Bajo + </text> <slider label="Distancia de dibujo:" name="DrawDistance"/> <text name="DrawDistanceMeterText2"> m diff --git a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml index 2bc82307a8..8ce8e23138 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml @@ -5,7 +5,9 @@ </panel.string> <slider label="Volumen general" name="System Volume"/> <check_box initial_value="true" name="mute_when_minimized"/> - <text name="mute_chb_label">Silenciar cuando minimice</text> + <text name="mute_chb_label"> + Silenciar cuando minimice + </text> <slider label="Botones" name="UI Volume"/> <slider label="Ambiental" name="Wind Volume"/> <slider label="Efectos de sonido" name="SFX Volume"/> diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index cd1fb767c8..75126e74c5 100644 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -855,6 +855,9 @@ <string name="tattoo"> Tatuaje </string> + <string name="physics"> + Física + </string> <string name="invalid"> inválido/a </string> @@ -894,6 +897,9 @@ <string name="tattoo_not_worn"> Tatuaje no puesto </string> + <string name="physics_not_worn"> + Física no puesta + </string> <string name="invalid_not_worn"> no válido/a </string> @@ -942,6 +948,9 @@ <string name="create_new_tattoo"> Crear un tatuaje nuevo </string> + <string name="create_new_physics"> + Crear nueva física + </string> <string name="create_new_invalid"> no válido/a </string> @@ -2178,6 +2187,114 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE]. <string name="Bulbous Nose"> Nariz de porra </string> + <string name="Breast Physics Mass"> + Masa del busto + </string> + <string name="Breast Physics Smoothing"> + Suavizado del busto + </string> + <string name="Breast Physics Gravity"> + Gravedad del busto + </string> + <string name="Breast Physics Drag"> + Aerodinámica del busto + </string> + <string name="Breast Physics InOut Max Effect"> + Efecto máx. + </string> + <string name="Breast Physics InOut Spring"> + Elasticidad + </string> + <string name="Breast Physics InOut Gain"> + Ganancia + </string> + <string name="Breast Physics InOut Damping"> + Amortiguación + </string> + <string name="Breast Physics UpDown Max Effect"> + Efecto máx. + </string> + <string name="Breast Physics UpDown Spring"> + Elasticidad + </string> + <string name="Breast Physics UpDown Gain"> + Ganancia + </string> + <string name="Breast Physics UpDown Damping"> + Amortiguación + </string> + <string name="Breast Physics LeftRight Max Effect"> + Efecto máx. + </string> + <string name="Breast Physics LeftRight Spring"> + Elasticidad + </string> + <string name="Breast Physics LeftRight Gain"> + Ganancia + </string> + <string name="Breast Physics LeftRight Damping"> + Amortiguación + </string> + <string name="Belly Physics Mass"> + Masa de la barriga + </string> + <string name="Belly Physics Smoothing"> + Suavizado de la barriga + </string> + <string name="Belly Physics Gravity"> + Gravedad de la barriga + </string> + <string name="Belly Physics Drag"> + Aerodinámica de la barriga + </string> + <string name="Belly Physics UpDown Max Effect"> + Efecto máx. + </string> + <string name="Belly Physics UpDown Spring"> + Elasticidad + </string> + <string name="Belly Physics UpDown Gain"> + Ganancia + </string> + <string name="Belly Physics UpDown Damping"> + Amortiguación + </string> + <string name="Butt Physics Mass"> + Masa del culo + </string> + <string name="Butt Physics Smoothing"> + Suavizado del culo + </string> + <string name="Butt Physics Gravity"> + Gravedad del culo + </string> + <string name="Butt Physics Drag"> + Aerodinámica del culo + </string> + <string name="Butt Physics UpDown Max Effect"> + Efecto máx. + </string> + <string name="Butt Physics UpDown Spring"> + Elasticidad + </string> + <string name="Butt Physics UpDown Gain"> + Ganancia + </string> + <string name="Butt Physics UpDown Damping"> + Amortiguación + </string> + <string name="Butt Physics LeftRight Max Effect"> + Efecto máx. + </string> + <string name="Butt Physics LeftRight Spring"> + Elasticidad + </string> + <string name="Butt Physics LeftRight Gain"> + Ganancia + </string> + <string name="Butt Physics LeftRight Damping"> + Amortiguación + </string> <string name="Bushy Eyebrows"> Cejijuntas </string> @@ -2187,6 +2304,9 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE]. <string name="Butt Size"> Culo: tamaño </string> + <string name="Butt Gravity"> + Gravedad del culo + </string> <string name="bustle skirt"> Polisón </string> @@ -3662,6 +3782,9 @@ Denuncia de infracción <string name="New Tattoo"> Tatuaje nuevo </string> + <string name="New Physics"> + Nueva física + </string> <string name="Invalid Wearable"> No se puede poner </string> diff --git a/indra/newview/skins/default/xui/fr/floater_beacons.xml b/indra/newview/skins/default/xui/fr/floater_beacons.xml index d61115a2db..ebd4dab683 100644 --- a/indra/newview/skins/default/xui/fr/floater_beacons.xml +++ b/indra/newview/skins/default/xui/fr/floater_beacons.xml @@ -17,5 +17,6 @@ <check_box label="Toucher uniquement" name="touch_only"/> <check_box label="Sources sonores" name="sounds"/> <check_box label="Sources des particules" name="particles"/> + <check_box label="Sources des médias" name="moapbeacon"/> </panel> </floater> diff --git a/indra/newview/skins/default/xui/fr/menu_avatar_self.xml b/indra/newview/skins/default/xui/fr/menu_avatar_self.xml index 21528cd43b..6310a2177a 100644 --- a/indra/newview/skins/default/xui/fr/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/fr/menu_avatar_self.xml @@ -14,6 +14,7 @@ <menu_item_call label="Débardeur" name="Self Undershirt"/> <menu_item_call label="Caleçon" name="Self Underpants"/> <menu_item_call label="Tatouage" name="Self Tattoo"/> + <menu_item_call label="Propriétés physiques" name="Self Physics"/> <menu_item_call label="Alpha" name="Self Alpha"/> <menu_item_call label="Tous les habits" name="All Clothes"/> </context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_bottomtray.xml b/indra/newview/skins/default/xui/fr/menu_bottomtray.xml index ddaea517fc..d0d245b286 100644 --- a/indra/newview/skins/default/xui/fr/menu_bottomtray.xml +++ b/indra/newview/skins/default/xui/fr/menu_bottomtray.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="hide_camera_move_controls_menu"> - <menu_item_check label="Voix activée" name="EnableVoiceChat"/> + <menu_item_check label="Bouton Parler" name="EnableVoiceChat"/> <menu_item_check label="Bouton Geste" name="ShowGestureButton"/> <menu_item_check label="Bouton Bouger" name="ShowMoveButton"/> <menu_item_check label="Bouton Affichage" name="ShowCameraButton"/> diff --git a/indra/newview/skins/default/xui/fr/menu_inventory.xml b/indra/newview/skins/default/xui/fr/menu_inventory.xml index a2279cf0ac..fa0e264d14 100644 --- a/indra/newview/skins/default/xui/fr/menu_inventory.xml +++ b/indra/newview/skins/default/xui/fr/menu_inventory.xml @@ -25,6 +25,7 @@ <menu_item_call label="Nouveau caleçon" name="New Underpants"/> <menu_item_call label="Nouveau masque alpha" name="New Alpha Mask"/> <menu_item_call label="Nouveau tatouage" name="New Tattoo"/> + <menu_item_call label="Nouvelles propriétés physiques" name="New Physics"/> </menu> <menu label="Nouvelles parties du corps" name="New Body Parts"> <menu_item_call label="Nouvelle silhouette" name="New Shape"/> diff --git a/indra/newview/skins/default/xui/fr/menu_inventory_add.xml b/indra/newview/skins/default/xui/fr/menu_inventory_add.xml index fe096b4a7e..5d2b554dc3 100644 --- a/indra/newview/skins/default/xui/fr/menu_inventory_add.xml +++ b/indra/newview/skins/default/xui/fr/menu_inventory_add.xml @@ -23,6 +23,7 @@ <menu_item_call label="Nouveau caleçon" name="New Underpants"/> <menu_item_call label="Nouvel alpha" name="New Alpha"/> <menu_item_call label="Nouveau tatouage" name="New Tattoo"/> + <menu_item_call label="Nouvelles propriétés physiques" name="New Physics"/> </menu> <menu label="Nouvelles parties du corps" name="New Body Parts"> <menu_item_call label="Nouvelle silhouette" name="New Shape"/> diff --git a/indra/newview/skins/default/xui/fr/menu_outfit_gear.xml b/indra/newview/skins/default/xui/fr/menu_outfit_gear.xml index 5db7f176b5..b5181f4f82 100644 --- a/indra/newview/skins/default/xui/fr/menu_outfit_gear.xml +++ b/indra/newview/skins/default/xui/fr/menu_outfit_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Gear Outfit"> +<toggleable_menu name="Gear Outfit"> <menu_item_call label="Porter - Remplacer la tenue actuelle" name="wear"/> <menu_item_call label="Porter - Ajouter à la tenue actuelle" name="wear_add"/> <menu_item_call label="Enlever - Supprimer de la tenue actuelle" name="take_off"/> @@ -14,6 +14,7 @@ <menu_item_call label="Nouveau débardeur" name="New Undershirt"/> <menu_item_call label="Nouveau caleçon" name="New Underpants"/> <menu_item_call label="Nouvel alpha" name="New Alpha"/> + <menu_item_call label="Nouvelles propriétés physiques" name="New Physics"/> <menu_item_call label="Nouveau tatouage" name="New Tattoo"/> </menu> <menu label="Nouvelles parties du corps" name="New Body Parts"> @@ -24,4 +25,4 @@ </menu> <menu_item_call label="Renommer la tenue" name="rename"/> <menu_item_call label="Supprimer la tenue" name="delete_outfit"/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml index ee1ab8c601..1dd6da9d6f 100644 --- a/indra/newview/skins/default/xui/fr/menu_viewer.xml +++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml @@ -412,6 +412,7 @@ <menu_item_call label="Jupe" name="Skirt"/> <menu_item_call label="Alpha" name="Alpha"/> <menu_item_call label="Tatouage" name="Tattoo"/> + <menu_item_call label="Propriétés physiques" name="Physics"/> <menu_item_call label="Tous les habits" name="All Clothes"/> </menu> <menu label="Aide" name="Help"> diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml index e984ea66ed..78890caabb 100644 --- a/indra/newview/skins/default/xui/fr/notifications.xml +++ b/indra/newview/skins/default/xui/fr/notifications.xml @@ -2838,6 +2838,13 @@ Ignorer les autres ? <notification label="Se lever" name="HintSit"> Pour passer d'une position assise à une position debout, cliquez sur le bouton Me lever. </notification> + <notification label="Parler" name="HintSpeak"> + Cliquez sur le bouton Parler pour activer/désactiver le micro. + +Cliquez sur la flèche vers le haut pour afficher le panneau de contrôle de la voix. + +Si vous masquez le bouton Parler, la fonction Voix sera désactivée. + </notification> <notification label="Explorer le monde" name="HintDestinationGuide"> Le Guide des destinations comprend des milliers d'endroits nouveaux à découvrir. Sélectionnez-en un, puis cliquez sur Téléporter pour commencer à l'explorer. </notification> @@ -2847,12 +2854,16 @@ Ignorer les autres ? <notification label="Bouger" name="HintMove"> Pour marcher ou courir, cliquez sur le bouton Bouger, puis naviguez à l'aide des flèches directionnelles. Vous pouvez également utiliser les touches fléchées de votre clavier. </notification> + <notification label="" name="HintMoveClick"> + 1. Cliquer pour marcher +Cliquez n'importe où sur le sol pour vous diriger vers ce point en marchant. + +2. Cliquer et faire glisser pour faire pivoter la vue +Cliquez sur un point dans le monde et faites glisser votre souris pour faire tourner la caméra. + </notification> <notification label="Nom d'affichage" name="HintDisplayName"> Définissez ici votre nom d'affichage personnalisable. Cette fonctionnalité vous est fournie en plus de votre nom d'utilisateur unique qui, lui, ne peut être changé. Vous pouvez modifier l'apparence des noms des autres résidents dans vos préférences. </notification> - <notification label="Bouger" name="HintMoveArrows"> - Pour marcher, utilisez les touches fléchées de votre clavier. Pour courir, appuyez deux fois sur la flèche vers le haut. - </notification> <notification label="Affichage" name="HintView"> Pour changer d'angle de vision, utilisez les contrôles Faire tourner et Faire un panoramique. Pour réinitialiser la vue, appuyez sur Échap ou marchez. </notification> diff --git a/indra/newview/skins/default/xui/fr/panel_edit_wearable.xml b/indra/newview/skins/default/xui/fr/panel_edit_wearable.xml index d7a3d3bd85..def158cf68 100644 --- a/indra/newview/skins/default/xui/fr/panel_edit_wearable.xml +++ b/indra/newview/skins/default/xui/fr/panel_edit_wearable.xml @@ -45,6 +45,9 @@ <string name="edit_tattoo_title"> Modification du tatouage </string> + <string name="edit_physics_title"> + Modification des propriétés physiques + </string> <string name="shape_desc_text"> Silhouette : </string> @@ -90,6 +93,9 @@ <string name="tattoo_desc_text"> Tatouage : </string> + <string name="physics_desc_text"> + Propriétés physiques : + </string> <labeled_back_button label="Enregistrer" name="back_btn" tool_tip="Revenir à Modifier la tenue"/> <text name="edit_wearable_title" value="Modification de la silhouette"/> <panel label="Chemise" name="wearable_type_panel"> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml index d5cecfc698..e9e6e6350f 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml @@ -30,7 +30,9 @@ <spinner label="Durée de vie du popup Chat près de moi :" name="nearby_toasts_lifetime"/> <spinner label="Disparition progressive du popup Chat près de moi :" name="nearby_toasts_fadingtime"/> <check_box name="translate_chat_checkbox"/> - <text name="translate_chb_label" >Utiliser la traduction automatique lors des chats (fournie par Google)</text> + <text name="translate_chb_label"> + Utiliser la traduction automatique lors des chats (fournie par Google) + </text> <text name="translate_language_text"> Traduire le chat en : </text> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_colors.xml b/indra/newview/skins/default/xui/fr/panel_preferences_colors.xml index 4e7d75e1b9..abdffd232a 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_colors.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_colors.xml @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Couleurs" name="colors_panel"> <text name="effects_color_textbox"> - Mes effets (faisceau de sélection lumineux) : + Mes effets (faisceau de sélection) : </text> <color_swatch name="effect_color_swatch" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs."/> <text name="font_colors"> - Couleurs de la police du chat : + Couleurs pour le chat : </text> <text name="text_box1"> Moi diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml index c90edd443e..025a72a1d2 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml @@ -39,6 +39,10 @@ <combo_box.item label="Tous les objets et avatars" name="3"/> <combo_box.item label="Tout" name="4"/> </combo_box> + <slider label="Propriétés physiques de l'avatar :" name="AvatarPhysicsDetail"/> + <text name="AvatarPhysicsDetailText"> + Faible + </text> <slider label="Limite d'affichage :" name="DrawDistance"/> <text name="DrawDistanceMeterText2"> m @@ -77,7 +81,7 @@ Faible </text> <text name="AvatarRenderingText"> - Rendu de l'avatar : + Rendu de l'avatar : </text> <check_box initial_value="true" label="Avatars éloignés en 2D" name="AvatarImpostors"/> <check_box initial_value="true" label="Accélération du rendu" name="AvatarVertexProgram"/> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml b/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml index ac7f72d367..a404aae483 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml @@ -5,7 +5,9 @@ </panel.string> <slider label="Volume principal" name="System Volume"/> <check_box initial_value="true" name="mute_when_minimized"/> - <text name="mute_chb_label">Couper quand minimisé</text> + <text name="mute_chb_label"> + Couper lorsque minimisé + </text> <slider label="Boutons" name="UI Volume"/> <slider label="Ambiant" name="Wind Volume"/> <slider label="Effets sonores" name="SFX Volume"/> diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml index a7c71dc0f0..a3369e6730 100644 --- a/indra/newview/skins/default/xui/fr/strings.xml +++ b/indra/newview/skins/default/xui/fr/strings.xml @@ -876,6 +876,9 @@ <string name="tattoo"> Tatouage </string> + <string name="physics"> + Propriétés physiques + </string> <string name="invalid"> non valide </string> @@ -915,6 +918,9 @@ <string name="tattoo_not_worn"> Tatouage non porté </string> + <string name="physics_not_worn"> + Propriétés physiques non portées + </string> <string name="invalid_not_worn"> non valide </string> @@ -963,6 +969,9 @@ <string name="create_new_tattoo"> Créer un nouveau tatouage </string> + <string name="create_new_physics"> + Créer de nouvelles propriétés physiques + </string> <string name="create_new_invalid"> non valide </string> @@ -2247,6 +2256,114 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. <string name="Bulbous Nose"> Nez en bulbe </string> + <string name="Breast Physics Mass"> + Masse des seins + </string> + <string name="Breast Physics Smoothing"> + Lissage des seins + </string> + <string name="Breast Physics Gravity"> + Gravité des seins + </string> + <string name="Breast Physics Drag"> + Résistance de l'air sur les seins + </string> + <string name="Breast Physics InOut Max Effect"> + Effet max. + </string> + <string name="Breast Physics InOut Spring"> + Vibration + </string> + <string name="Breast Physics InOut Gain"> + Amplification + </string> + <string name="Breast Physics InOut Damping"> + Amortissement + </string> + <string name="Breast Physics UpDown Max Effect"> + Effet max. + </string> + <string name="Breast Physics UpDown Spring"> + Vibration + </string> + <string name="Breast Physics UpDown Gain"> + Amplification + </string> + <string name="Breast Physics UpDown Damping"> + Amortissement + </string> + <string name="Breast Physics LeftRight Max Effect"> + Effet max. + </string> + <string name="Breast Physics LeftRight Spring"> + Vibration + </string> + <string name="Breast Physics LeftRight Gain"> + Amplification + </string> + <string name="Breast Physics LeftRight Damping"> + Amortissement + </string> + <string name="Belly Physics Mass"> + Masse du ventre + </string> + <string name="Belly Physics Smoothing"> + Lissage du ventre + </string> + <string name="Belly Physics Gravity"> + Gravité du ventre + </string> + <string name="Belly Physics Drag"> + Résistance de l'air sur le ventre + </string> + <string name="Belly Physics UpDown Max Effect"> + Effet max. + </string> + <string name="Belly Physics UpDown Spring"> + Vibration + </string> + <string name="Belly Physics UpDown Gain"> + Amplification + </string> + <string name="Belly Physics UpDown Damping"> + Amortissement + </string> + <string name="Butt Physics Mass"> + Masse des fesses + </string> + <string name="Butt Physics Smoothing"> + Lissage des fesses + </string> + <string name="Butt Physics Gravity"> + Gravité des fesses + </string> + <string name="Butt Physics Drag"> + Résistance de l'air sur les fesses + </string> + <string name="Butt Physics UpDown Max Effect"> + Effet max. + </string> + <string name="Butt Physics UpDown Spring"> + Vibration + </string> + <string name="Butt Physics UpDown Gain"> + Amplification + </string> + <string name="Butt Physics UpDown Damping"> + Amortissement + </string> + <string name="Butt Physics LeftRight Max Effect"> + Effet max. + </string> + <string name="Butt Physics LeftRight Spring"> + Vibration + </string> + <string name="Butt Physics LeftRight Gain"> + Amplification + </string> + <string name="Butt Physics LeftRight Damping"> + Amortissement + </string> <string name="Bushy Eyebrows"> Sourcils touffus </string> @@ -2256,6 +2373,9 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. <string name="Butt Size"> Taille des fesses </string> + <string name="Butt Gravity"> + Gravité des fesses + </string> <string name="bustle skirt"> Jupe gonflante </string> @@ -3764,6 +3884,9 @@ de l'infraction signalée <string name="New Tattoo"> Nouveau tatouage </string> + <string name="New Physics"> + Nouvelles propriétés physiques + </string> <string name="Invalid Wearable"> Objet à porter non valide </string> diff --git a/indra/newview/skins/default/xui/pl/floater_about_land.xml b/indra/newview/skins/default/xui/pl/floater_about_land.xml index b935615fcb..badff11a59 100644 --- a/indra/newview/skins/default/xui/pl/floater_about_land.xml +++ b/indra/newview/skins/default/xui/pl/floater_about_land.xml @@ -349,6 +349,7 @@ Jedynie większe posiadłości mogą być umieszczone w bazie wyszukiwarki. <combo_box.item label="Park i natura" name="item9"/> <combo_box.item label="Mieszkalna" name="item10"/> <combo_box.item label="Zakupy" name="item11"/> + <combo_box.item label="Opłata za wynajęcie" name="item13"/> <combo_box.item label="Inna" name="item12"/> </combo_box> <combo_box name="land category"> @@ -363,6 +364,7 @@ Jedynie większe posiadłości mogą być umieszczone w bazie wyszukiwarki. <combo_box.item label="Parki i natura" name="item9"/> <combo_box.item label="Mieszkalna" name="item10"/> <combo_box.item label="Zakupy" name="item11"/> + <combo_box.item label="Opłata za wynajęcie" name="item13"/> <combo_box.item label="Inna" name="item12"/> </combo_box> <check_box label="Treść 'Mature'" name="MatureCheck" tool_tip=""/> @@ -430,7 +432,7 @@ Mediów: (Zdefiniowane przez Majątek) </panel.string> <panel.string name="allow_public_access"> - Udostępnij publicznie ([MATURITY]) + Udostępniaj publicznie ([MATURITY]) (Pamiętaj: w przypadku braku zaznaczenia tej opcji widoczne będą linie bana.) </panel.string> <panel.string name="estate_override"> Jedna lub więcej z tych opcji ustawiona jest z poziomu Posiadłości diff --git a/indra/newview/skins/default/xui/pl/floater_map.xml b/indra/newview/skins/default/xui/pl/floater_map.xml index fd151e91ad..e01c4c8a82 100644 --- a/indra/newview/skins/default/xui/pl/floater_map.xml +++ b/indra/newview/skins/default/xui/pl/floater_map.xml @@ -3,6 +3,9 @@ <floater.string name="ToolTipMsg"> [REGION](Podwójne kliknięcie otwiera Mapę, Shift i przeciągnięcie kursorem zmienia skalę) </floater.string> + <floater.string name="AltToolTipMsg"> + [REGION](Podwójne kliknięcie aktywuje teleportację, wciśnij Shift i przeciągnij aby przesunąć) + </floater.string> <floater.string name="mini_map_caption"> MINIMAPA </floater.string> diff --git a/indra/newview/skins/default/xui/pl/floater_tools.xml b/indra/newview/skins/default/xui/pl/floater_tools.xml index 337998efc9..9e6fed8387 100644 --- a/indra/newview/skins/default/xui/pl/floater_tools.xml +++ b/indra/newview/skins/default/xui/pl/floater_tools.xml @@ -64,6 +64,8 @@ <radio_item label="Wybierz teksturę" name="radio select face"/> </radio_group> <check_box label="Edytuj połączone części" name="checkbox edit linked parts"/> + <button label="Linkuj" name="link_btn"/> + <button label="Rozlinkuj" name="unlink_btn"/> <text name="RenderingCost" tool_tip="Pokazuje koszt renderowania tego obiektu"> þ: [COUNT] </text> @@ -301,7 +303,7 @@ <combo_box.item label="Kwadrat" name="Square"/> <combo_box.item label="Trójkąt" name="Triangle"/> </combo_box> - <text name="text twist" left_delta="-5" width="160"> + <text left_delta="-5" name="text twist" width="160"> Skręcenie (początek/koniec) </text> <spinner label="P" name="Twist Begin"/> diff --git a/indra/newview/skins/default/xui/pl/menu_attachment_self.xml b/indra/newview/skins/default/xui/pl/menu_attachment_self.xml index c19b0a1c2e..163b3a231e 100644 --- a/indra/newview/skins/default/xui/pl/menu_attachment_self.xml +++ b/indra/newview/skins/default/xui/pl/menu_attachment_self.xml @@ -5,7 +5,7 @@ <menu_item_call label="Odłącz" name="Detach"/> <menu_item_call label="Usiądź tutaj" name="Sit Down Here"/> <menu_item_call label="Wstań" name="Stand Up"/> - <menu_item_call label="Zmień strój" name="Change Outfit"/> + <menu_item_call label="Mój wygląd" name="Change Outfit"/> <menu_item_call label="Edytuj mój strój" name="Edit Outfit"/> <menu_item_call label="Edytuj mój kształt" name="Edit My Shape"/> <menu_item_call label="Moi znajomi" name="Friends..."/> diff --git a/indra/newview/skins/default/xui/pl/menu_avatar_self.xml b/indra/newview/skins/default/xui/pl/menu_avatar_self.xml index ea151788c6..d481475803 100644 --- a/indra/newview/skins/default/xui/pl/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/pl/menu_avatar_self.xml @@ -21,7 +21,7 @@ <context_menu label="Odłącz" name="Object Detach"/> <menu_item_call label="Odłącz wszystko" name="Detach All"/> </context_menu> - <menu_item_call label="Zmień strój" name="Chenge Outfit"/> + <menu_item_call label="Mój wygląd" name="Chenge Outfit"/> <menu_item_call label="Edytuj mój strój" name="Edit Outfit"/> <menu_item_call label="Edytuj mój kształt" name="Edit My Shape"/> <menu_item_call label="Moi znajomi" name="Friends..."/> diff --git a/indra/newview/skins/default/xui/pl/menu_bottomtray.xml b/indra/newview/skins/default/xui/pl/menu_bottomtray.xml index a4a6ea484d..8da40dcedf 100644 --- a/indra/newview/skins/default/xui/pl/menu_bottomtray.xml +++ b/indra/newview/skins/default/xui/pl/menu_bottomtray.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="hide_camera_move_controls_menu"> + <menu_item_check label="Rozmowy głosowe aktywne" name="EnableVoiceChat"/> <menu_item_check label="Przycisk gesturki" name="ShowGestureButton"/> <menu_item_check label="Przycisk ruchu" name="ShowMoveButton"/> <menu_item_check label="Przycisk widoku" name="ShowCameraButton"/> <menu_item_check label="Przycisk zdjęć" name="ShowSnapshotButton"/> - <menu_item_check label="Schowek" name="ShowSidebarButton"/> <menu_item_check label="Buduj" name="ShowBuildButton"/> <menu_item_check label="Szukaj" name="ShowSearchButton"/> <menu_item_check label="Mapa" name="ShowWorldMapButton"/> diff --git a/indra/newview/skins/default/xui/pl/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/pl/menu_inspect_avatar_gear.xml index 5c27d53d90..59560f236c 100644 --- a/indra/newview/skins/default/xui/pl/menu_inspect_avatar_gear.xml +++ b/indra/newview/skins/default/xui/pl/menu_inspect_avatar_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> -<menu name="Gear Menu"> +<toggleable_menu name="Gear Menu"> <menu_item_call label="Zobacz profil" name="view_profile"/> <menu_item_call label="Dodaj znajomość" name="add_friend"/> <menu_item_call label="IM" name="im"/> @@ -11,9 +11,11 @@ <menu_item_call label="Raport" name="report"/> <menu_item_call label="Unieruchom" name="freeze"/> <menu_item_call label="Wyrzuć" name="eject"/> + <menu_item_call label="Kopnij" name="kick"/> + <menu_item_call label="CSR" name="csr"/> <menu_item_call label="Debugowanie tekstur" name="debug"/> <menu_item_call label="Znajdź na mapie" name="find_on_map"/> <menu_item_call label="Przybliż" name="zoom_in"/> <menu_item_call label="Zapłać" name="pay"/> <menu_item_call label="Udostępnij" name="share"/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pl/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/pl/menu_inspect_self_gear.xml index 90d71371e8..c4ef9761d9 100644 --- a/indra/newview/skins/default/xui/pl/menu_inspect_self_gear.xml +++ b/indra/newview/skins/default/xui/pl/menu_inspect_self_gear.xml @@ -1,10 +1,31 @@ -<?xml version="1.0" encoding="utf-8"?> -<menu name="Gear Menu"> - <menu_item_call label="Usiądź tutaj" name="sit_down_here"/> - <menu_item_call label="Wstań" name="stand_up"/> - <menu_item_call label="Zmień strój" name="change_outfit"/> - <menu_item_call label="Mój profil" name="my_profile"/> - <menu_item_call label="Moi znajomi" name="my_friends"/> - <menu_item_call label="Moje grupy" name="my_groups"/> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Gear Menu"> + <menu_item_call label="Usiądź tutaj" name="Sit Down Here"/> + <menu_item_call label="Wstań" name="Stand Up"/> + <context_menu label="Zdejmij" name="Take Off >"> + <context_menu label="Ubranie" name="Clothes >"> + <menu_item_call label="Bluzka" name="Shirt"/> + <menu_item_call label="Spodnie" name="Pants"/> + <menu_item_call label="Spódnica" name="Skirt"/> + <menu_item_call label="Buty" name="Shoes"/> + <menu_item_call label="Skarpetki" name="Socks"/> + <menu_item_call label="Kurtka" name="Jacket"/> + <menu_item_call label="Rękawiczki" name="Gloves"/> + <menu_item_call label="Podkoszulek" name="Self Undershirt"/> + <menu_item_call label="Bielizna" name="Self Underpants"/> + <menu_item_call label="Tatuaż" name="Self Tattoo"/> + <menu_item_call label="Alpha" name="Self Alpha"/> + <menu_item_call label="Ubranie" name="All Clothes"/> + </context_menu> + <context_menu label="HUD" name="Object Detach HUD"/> + <context_menu label="Odłącz" name="Object Detach"/> + <menu_item_call label="Odłącz wszystko" name="Detach All"/> + </context_menu> + <menu_item_call label="Zmień strój" name="Chenge Outfit"/> + <menu_item_call label="Edytuj mój strój" name="Edit Outfit"/> + <menu_item_call label="Edytuj mój kształt" name="Edit My Shape"/> + <menu_item_call label="Znajomi" name="Friends..."/> + <menu_item_call label="Moje grupy" name="Groups..."/> + <menu_item_call label="Mój profil" name="Profile..."/> <menu_item_call label="Debugowanie tekstur" name="Debug..."/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pl/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/pl/menu_inventory_gear_default.xml index 491b4deeaa..591c3a81d5 100644 --- a/indra/newview/skins/default/xui/pl/menu_inventory_gear_default.xml +++ b/indra/newview/skins/default/xui/pl/menu_inventory_gear_default.xml @@ -3,6 +3,7 @@ <menu_item_call label="Nowe okno Szafy" name="new_window"/> <menu_item_check label="Porządkuj według nazwy" name="sort_by_name"/> <menu_item_check label="Porządkuj według daty" name="sort_by_recent"/> + <menu_item_check label="Sortuj foldery zawsze według nazwy" name="sort_folders_by_name"/> <menu_item_check label="Posortuj foldery systemowe od góry" name="sort_system_folders_to_top"/> <menu_item_call label="Pokaż filtry" name="show_filters"/> <menu_item_call label="Zresetuj filtry" name="reset_filters"/> diff --git a/indra/newview/skins/default/xui/pl/menu_object.xml b/indra/newview/skins/default/xui/pl/menu_object.xml index 2173401dd2..3da6c5c890 100644 --- a/indra/newview/skins/default/xui/pl/menu_object.xml +++ b/indra/newview/skins/default/xui/pl/menu_object.xml @@ -16,14 +16,14 @@ <context_menu label="Dołącz" name="Object Attach"/> <context_menu label="Dołącz HUD" name="Object Attach HUD"/> </context_menu> - <context_menu label="Usuń" name="Remove"> + <context_menu label="Zarządzaj" name="Remove"> <menu_item_call label="Raport" name="Report Abuse..."/> <menu_item_call label="Zablokuj" name="Object Mute"/> <menu_item_call label="Zwróć" name="Return..."/> - <menu_item_call label="Usuń" name="Delete"/> </context_menu> <menu_item_call label="Weź" name="Pie Object Take"/> <menu_item_call label="Weź kopię" name="Take Copy"/> <menu_item_call label="Zapłać" name="Pay..."/> <menu_item_call label="Kup" name="Buy..."/> + <menu_item_call label="Skasuj" name="Delete"/> </context_menu> diff --git a/indra/newview/skins/default/xui/pl/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/pl/menu_places_gear_folder.xml index 65417cef22..d1f283b7aa 100644 --- a/indra/newview/skins/default/xui/pl/menu_places_gear_folder.xml +++ b/indra/newview/skins/default/xui/pl/menu_places_gear_folder.xml @@ -1,7 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="menu_folder_gear"> +<toggleable_menu name="menu_folder_gear"> <menu_item_call label="Dodaj do landmarków" name="add_landmark"/> <menu_item_call label="Dodaj folder" name="add_folder"/> + <menu_item_call label="Przywróć obiekt" name="restore_item"/> <menu_item_call label="Wytnij" name="cut"/> <menu_item_call label="Kopiuj" name="copy_folder"/> <menu_item_call label="Wklej" name="paste"/> @@ -12,4 +13,4 @@ <menu_item_call label="Rozwiń wszystkie foldery" name="expand_all"/> <menu_item_call label="Schowaj wszystkie foldery" name="collapse_all"/> <menu_item_check label="Sortuj według daty" name="sort_by_date"/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pl/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/pl/menu_places_gear_landmark.xml index 36787dd0aa..0139d3a987 100644 --- a/indra/newview/skins/default/xui/pl/menu_places_gear_landmark.xml +++ b/indra/newview/skins/default/xui/pl/menu_places_gear_landmark.xml @@ -1,10 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="menu_ladmark_gear"> +<toggleable_menu name="menu_ladmark_gear"> <menu_item_call label="Teleportuj" name="teleport"/> <menu_item_call label="Więcej informacji" name="more_info"/> <menu_item_call label="Pokaż na mapie" name="show_on_map"/> <menu_item_call label="Dodaj do landmarków" name="add_landmark"/> <menu_item_call label="Dodaj folder" name="add_folder"/> + <menu_item_call label="Przywróć obiekt" name="restore_item"/> <menu_item_call label="Wytnij" name="cut"/> <menu_item_call label="Kopiuj landmark" name="copy_landmark"/> <menu_item_call label="Kopiuj SLurl" name="copy_slurl"/> @@ -15,4 +16,4 @@ <menu_item_call label="Schowaj wszystkie foldery" name="collapse_all"/> <menu_item_check label="Sortuj według daty" name="sort_by_date"/> <menu_item_call label="Stwórz Ulubione" name="create_pick"/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pl/menu_viewer.xml b/indra/newview/skins/default/xui/pl/menu_viewer.xml index e6a9d360c4..9c01e53a01 100644 --- a/indra/newview/skins/default/xui/pl/menu_viewer.xml +++ b/indra/newview/skins/default/xui/pl/menu_viewer.xml @@ -5,7 +5,7 @@ <menu_item_call label="Dashboard" name="Manage My Account"/> <menu_item_call label="Kup L$" name="Buy and Sell L$"/> <menu_item_call label="Mój Profil" name="Profile"/> - <menu_item_call label="Zmień strój" name="ChangeOutfit"/> + <menu_item_call label="Mój wygląd" name="ChangeOutfit"/> <menu_item_check label="Moja Szafa" name="Inventory"/> <menu_item_check label="Moja Szafa" name="ShowSidetrayInventory"/> <menu_item_check label="Moje gesturki" name="Gestures"/> @@ -33,6 +33,7 @@ <menu label="Świat" name="World"> <menu_item_check label="Mini-Mapa" name="Mini-Map"/> <menu_item_check label="Mapa Świata" name="World Map"/> + <menu_item_check label="Szukaj" name="Search"/> <menu_item_call label="Zrób zdjęcie" name="Take Snapshot"/> <menu_item_call label="Zapamiętaj to miejsce (LM)" name="Create Landmark Here"/> <menu label="Miejsce" name="Land"> @@ -222,7 +223,9 @@ <menu label="Pokaż informacje" name="Display Info"> <menu_item_check label="Pokaż czas" name="Show Time"/> <menu_item_check label="Pokaż informacje o renderowaniu" name="Show Render Info"/> + <menu_item_check label="Pokaż informację o teksturze" name="Show Texture Info"/> <menu_item_check label="Pokaż kolor pod kursorem" name="Show Color Under Cursor"/> + <menu_item_check label="Pokaż pamięć" name="Show Memory"/> <menu_item_check label="Pokaż aktualizacje obiektów" name="Show Updates"/> </menu> <menu label="Reset błędu" name="Force Errors"> @@ -240,6 +243,9 @@ <menu_item_check label="Losowa ilość klatek" name="Randomize Framerate"/> <menu_item_check label="Test klatki obrazu" name="Frame Test"/> </menu> + <menu label="Render Metadata" name="Render Metadata"> + <menu_item_check label="Aktualizuj typ" name="Update Type"/> + </menu> <menu label="Renderowanie" name="Rendering"> <menu_item_check label="Osie" name="Axes"/> <menu_item_check label="Tryb obrazu szkieletowego" name="Wireframe"/> diff --git a/indra/newview/skins/default/xui/pl/notifications.xml b/indra/newview/skins/default/xui/pl/notifications.xml index 25fa5da3ab..e36df9bca7 100644 --- a/indra/newview/skins/default/xui/pl/notifications.xml +++ b/indra/newview/skins/default/xui/pl/notifications.xml @@ -72,9 +72,9 @@ Szczegóły błędu: Błąd o nazwie '[_NAME]' nie został odnaleziony <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="LoginFailedNoNetwork"> - Brak połączenia z [SECOND_LIFE_GRID]. -'[DIAGNOSTIC]' -Sprawdź stan swojego połączenia sieciowego. + Nie można połączyć z [SECOND_LIFE_GRID]. + '[DIAGNOSTIC]' +Upewnij się, że Twoje połączenie z internetem działa. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="MessageTemplateNotFound"> @@ -331,13 +331,6 @@ Potrzebujesz konta aby się zalogować do [SECOND_LIFE]. Czy chcesz utworzyć je <notification name="InvalidCredentialFormat"> Należy wprowadzić nazwę użytkownika lub imię oraz nazwisko Twojego awatara w pole nazwy użytkownika a następnie ponownie się zalogować. </notification> - <notification name="AddClassified"> - Ogłoszenia reklamowe ukazują się w zakładce Reklama w wyszukiwarce (Szukaj) oraz na [http://secondlife.com/community/classifieds secondlife.com] przez tydzień. -Napisz treść swojej reklamy, kliknij Zamieść by dodać katalogu ogłoszeń. -Po zamieszczeniu reklamy zostaniesz poproszony o sprecyzowanie opłaty za Reklamę. -Im wyższa opłata tym wyżej Twoja reklama wyświetla się w katalogu i wyszukiwarce po wpisaniu słów kluczowych. - <usetemplate ignoretext="Jak stworzyć nową reklamę?" name="okcancelignore" notext="Anuluj" yestext="OK"/> - </notification> <notification name="DeleteClassified"> Usunąć reklamę '[NAME]'? Pamiętaj! Nie ma rekompensaty za poniesione koszta. @@ -2723,7 +2716,7 @@ Przycisk zostanie wyświetlony w przypadku dostatecznej ilości przestrzeni. Zaznacz Rezydentów, z którymi chcesz się podzielić. </notification> <notification name="ShareItemsConfirmation"> - Jesteś pewien/pewna, że chcesz udostępnić następujące obiekty: + Czy na pewno chcesz udostępnić następujące obiekty: <nolink>[ITEMS]</nolink> @@ -2817,9 +2810,6 @@ Wyciszyć wszystkich? <notification label="Odkrywaj Świat" name="HintDestinationGuide"> Destination Guide zawiera tysiące nowych miejsc do odkrycia. Wybierz lokalizację i teleportuj się aby rozpocząć zwiedzanie. </notification> - <notification label="Zmień wygląd swojego awatara" name="HintAvatarPicker"> - Czy chcesz inaczej wyglądać? Kliknij poniższy przycisk aby zobaczyć więcej przykładów awatarów. - </notification> <notification label="Schowek" name="HintSidePanel"> Schowek umożliwia szybki dostęp do Twojej Szafy, ubrań, profili i innych w panelu bocznym. </notification> @@ -2857,6 +2847,38 @@ Wyciszyć wszystkich? <button name="cancel" text="Anuluj"/> </form> </notification> + <notification label="" name="ModeChange"> + Zmiana trybu wymaga restartu. + <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/> + </notification> + <notification label="" name="NoClassifieds"> + Tworzenie i edycja reklam jest możliwa tylko w trybie zaawansowanym. Czy chcesz wylogować się i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania. + <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/> + </notification> + <notification label="" name="NoGroupInfo"> + Tworzenie i edycja grup jest możliwa tylko w trybie zaawansowanym. Czy chcesz wylogować się i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania. + <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/> + </notification> + <notification label="" name="NoPicks"> + Tworzenie i edycja Ulubionych jest możliwa jedynie w trybie zaawansowanym. Czy chcesz się wylogować i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania. + <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/> + </notification> + <notification label="" name="NoWorldMap"> + Oglądanie mapy świata jest możliwe tylko w trybie zaawansowanym. Czy chcesz się wylogować i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania. + <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/> + </notification> + <notification label="" name="NoVoiceCall"> + Rozmowy głosowe są możliwe tylko w trybie zaawansowanym. Czy chcesz wylogować się i zmienić tryb? + <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/> + </notification> + <notification label="" name="NoAvatarShare"> + Udostępnienie jest możliwe tylko w trybie zaawansowanym. Czy chcesz wylogować się i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania. + <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/> + </notification> + <notification label="" name="NoAvatarPay"> + Płacenie innym Rezydentom jest możliwe tylko w trybie zaawansowanym. Czy chcesz się wylogować i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania. + <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/> + </notification> <global name="UnsupportedCPU"> - Prędkość Twojego CPU nie spełnia minimalnych wymagań. </global> diff --git a/indra/newview/skins/default/xui/pl/panel_login.xml b/indra/newview/skins/default/xui/pl/panel_login.xml index 81da94a659..dc8e7399af 100644 --- a/indra/newview/skins/default/xui/pl/panel_login.xml +++ b/indra/newview/skins/default/xui/pl/panel_login.xml @@ -14,6 +14,13 @@ </text> <check_box label="Zapamiętaj hasło" name="remember_check"/> <button label="Połącz" name="connect_btn"/> + <text name="mode_selection_text"> + Tryb życia: + </text> + <combo_box name="mode_combo" tool_tip="Wybierz tryb życia. Wybierz tryb turystyczny dla łatwego zwiedzania i czatowania. Wybierz tryb zaawansowany aby mieć dostęp do większej ilości opcji."> + <combo_box.item label="Turystyczny" name="Basic"/> + <combo_box.item label="Zaawansowany" name="Advanced"/> + </combo_box> <text name="start_location_text"> Rozpocznij w: </text> diff --git a/indra/newview/skins/default/xui/pl/panel_nearby_media.xml b/indra/newview/skins/default/xui/pl/panel_nearby_media.xml index c9f951f7c6..d77c6d7852 100644 --- a/indra/newview/skins/default/xui/pl/panel_nearby_media.xml +++ b/indra/newview/skins/default/xui/pl/panel_nearby_media.xml @@ -19,7 +19,7 @@ <button label="Zatrzymaj" name="all_nearby_media_disable_btn" tool_tip="Wyłącz wszystkie media w pobliżu"/> <button label="Włącz" name="all_nearby_media_enable_btn" tool_tip="Włącz wszystkie media w pobliżu"/> <button name="open_prefs_btn" tool_tip="Uruchom preferencje medialne"/> - <button label="Więcej >>" label_selected="Mniej <<" name="more_btn" tool_tip="Zaawansowane"/> + <button label="Więcej >>" label_selected="<< Mniej" name="more_btn" tool_tip="Zaawansowane"/> <button label="Więcej >>" label_selected="Mniej <<" name="less_btn" tool_tip="Zaawansowane"/> </panel> <panel name="nearby_media_panel"> diff --git a/indra/newview/skins/default/xui/pl/panel_people.xml b/indra/newview/skins/default/xui/pl/panel_people.xml index 1bd5b4a912..da9f84cb2e 100644 --- a/indra/newview/skins/default/xui/pl/panel_people.xml +++ b/indra/newview/skins/default/xui/pl/panel_people.xml @@ -18,6 +18,8 @@ Chcesz spotkać ludzi? Spróbuj [secondlife:///app/worldmap Mapa Świata]. <string name="groups_filter_label" value="Filtruj grupy"/> <string name="no_filtered_groups_msg" value="Nie znaleziono tego czego szukasz? Spróbuj [secondlife:///app/search/groups/[SEARCH_TERM] Szukaj]."/> <string name="no_groups_msg" value="Chcesz dołączyć do grup? Spróbuj [secondlife:///app/search/groups Szukaj]."/> + <string name="MiniMapToolTipMsg" value="[REGION](Podwójne kliknięcie otwiera mapę, wciśnij Shift i przeciągnij aby przesunąć)"/> + <string name="AltMiniMapToolTipMsg" value="[REGION](Podwójne kliknięcie aktywuje teleport, wciśnij Shift i przeciągnij aby przesunąć)"/> <filter_editor label="Filtr" name="filter_input"/> <tab_container name="tabs"> <panel label="W POBLIŻU" name="nearby_panel"> diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml b/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml index 692f24715b..46f5ebb8e2 100644 --- a/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml @@ -5,12 +5,14 @@ </panel.string> <slider label="Główny" name="System Volume"/> <check_box initial_value="true" name="mute_when_minimized"/> - <text name="mute_chb_label">Wycisz podczas minimalizacji</text> + <text name="mute_chb_label"> + Wycisz podczas minimalizacji + </text> <slider label="Interfejs" name="UI Volume"/> <slider label="Otoczenie" name="Wind Volume"/> <slider label="Efekty dźwiękowe" name="SFX Volume"/> <slider label="Muzyka strumieniowa" name="Music Volume"/> - <check_box label="Odtwarzaj media audio" name="enable_music"/> + <check_box label="Aktywny" name="enable_music"/> <slider label="Media" name="Media Volume"/> <check_box label="Odtwarzaj media" name="enable_media"/> <slider label="Komunikacja głosowa" name="Voice Volume"/> diff --git a/indra/newview/skins/default/xui/pl/panel_profile.xml b/indra/newview/skins/default/xui/pl/panel_profile.xml index 4152c00386..77dd951bc4 100644 --- a/indra/newview/skins/default/xui/pl/panel_profile.xml +++ b/indra/newview/skins/default/xui/pl/panel_profile.xml @@ -5,6 +5,12 @@ <string name="RegisterDateFormat"> [REG_DATE] ([AGE]) </string> + <string name="name_text_args"> + [NAME] + </string> + <string name="display_name_text_args"> + [DISPLAY_NAME] + </string> <layout_stack name="layout"> <layout_panel name="profile_stack"> <scroll_container name="profile_scroll"> @@ -19,7 +25,7 @@ <text name="title_acc_status_text" value="Konto:"/> <text name="title_partner_text" value="Partner:"/> <panel name="partner_data_panel"> - <name_box initial_value="(przetwarzanie)" name="partner_text"/> + <text initial_value="(przetwarzanie)" name="partner_text"/> </panel> <text name="title_groups_text" value="Grupy:"/> </panel> diff --git a/indra/newview/skins/default/xui/pl/panel_script_ed.xml b/indra/newview/skins/default/xui/pl/panel_script_ed.xml index e18900af68..b05223aa0f 100644 --- a/indra/newview/skins/default/xui/pl/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/pl/panel_script_ed.xml @@ -15,6 +15,9 @@ <panel.string name="Title"> Skrypt: [NAME] </panel.string> + <panel.string name="external_editor_not_set"> + Wybierz edytor poprzez ustawienie zmiennej środowiska LL_SCRIPT_EDITOR lub ustawienie ExternalEditor. + </panel.string> <menu_bar name="script_menu"> <menu label="Plik" name="File"> <menu_item_call label="Zapisz" name="Save"/> diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml index e6019bf66d..05a567262c 100644 --- a/indra/newview/skins/default/xui/pl/strings.xml +++ b/indra/newview/skins/default/xui/pl/strings.xml @@ -1037,7 +1037,7 @@ </string> <string name="WornOnAttachmentPoint" value=" (założony na [ATTACHMENT_POINT])"/> <string name="ActiveGesture" value="[GESLABEL] (aktywne)"/> - <string name="Chat" value=" Czat :"/> + <string name="Chat Message" value="Czat:"/> <string name="Sound" value=" Dźwięk :"/> <string name="Wait" value=" --- Zaczekaj :"/> <string name="AnimFlagStop" value=" Zatrzymaj animację :"/> @@ -1819,12 +1819,6 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh <string name="accel-win-shift"> Shift+ </string> - <string name="Esc"> - Esc - </string> - <string name="Home"> - Miejsce Startu - </string> <string name="FileSaved"> Zapisane pliki </string> @@ -1847,13 +1841,13 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh Do przodu </string> <string name="Direction_Left"> - W lewo + Lewo </string> <string name="Direction_Right"> - W prawo + Prawo </string> <string name="Direction_Back"> - Wróć + Wstecz </string> <string name="Direction_North"> Północ @@ -1942,6 +1936,9 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh <string name="Other"> Inna </string> + <string name="Rental"> + Wynajem + </string> <string name="Any"> Jakiekolwiek </string> @@ -3861,7 +3858,7 @@ Raport o Nadużyciu <string name="Notices"> Ogłoszenia </string> - <string name="Chat"> + <string name="Chat" value=" Czat :"> Czat </string> <string name="DeleteItems"> @@ -3873,4 +3870,348 @@ Raport o Nadużyciu <string name="EmptyOutfitText"> W tym stroju nie ma elementów </string> + <string name="ExternalEditorNotSet"> + Wybierz edytor używając ustawień ExternalEditor. + </string> + <string name="ExternalEditorNotFound"> + Nie odnaleziono zewnętrzego edytora wskazanego przez Ciebie. +Spróbuj załączyć ścieżkę do edytora w cytowaniu. +(np. "/ścieżka do mojego/edytora" "%s") + </string> + <string name="ExternalEditorCommandParseError"> + Błąd w składni komendy zewnętrznego edytora. + </string> + <string name="ExternalEditorFailedToRun"> + Uruchomienie zewnętrznego edytora nie powiodło się. + </string> + <string name="Esc"> + Esc + </string> + <string name="Space"> + Space + </string> + <string name="Enter"> + Enter + </string> + <string name="Tab"> + Tab + </string> + <string name="Ins"> + Ins + </string> + <string name="Del"> + Del + </string> + <string name="Backsp"> + Backsp + </string> + <string name="Shift"> + Shift + </string> + <string name="Ctrl"> + Ctrl + </string> + <string name="Alt"> + Alt + </string> + <string name="CapsLock"> + CapsLock + </string> + <string name="Home"> + Miejsce Startu + </string> + <string name="End"> + End + </string> + <string name="PgUp"> + PgUp + </string> + <string name="PgDn"> + PgDn + </string> + <string name="F1"> + F1 + </string> + <string name="F2"> + F2 + </string> + <string name="F3"> + F3 + </string> + <string name="F4"> + F4 + </string> + <string name="F5"> + F5 + </string> + <string name="F6"> + F6 + </string> + <string name="F7"> + F7 + </string> + <string name="F8"> + F8 + </string> + <string name="F9"> + F9 + </string> + <string name="F10"> + F10 + </string> + <string name="F11"> + F11 + </string> + <string name="F12"> + F12 + </string> + <string name="Add"> + Dodaj + </string> + <string name="Subtract"> + Odejmij + </string> + <string name="Multiply"> + Mnożenie + </string> + <string name="Divide"> + Podziel + </string> + <string name="PAD_DIVIDE"> + PAD_DIVIDE + </string> + <string name="PAD_LEFT"> + PAD_LEFT + </string> + <string name="PAD_RIGHT"> + PAD_RIGHT + </string> + <string name="PAD_DOWN"> + PAD_DOWN + </string> + <string name="PAD_UP"> + PAD_UP + </string> + <string name="PAD_HOME"> + PAD_HOME + </string> + <string name="PAD_END"> + PAD_END + </string> + <string name="PAD_PGUP"> + PAD_PGUP + </string> + <string name="PAD_PGDN"> + PAD_PGDN + </string> + <string name="PAD_CENTER"> + PAD_CENTER + </string> + <string name="PAD_INS"> + PAD_INS + </string> + <string name="PAD_DEL"> + PAD_DEL + </string> + <string name="PAD_Enter"> + PAD_Enter + </string> + <string name="PAD_BUTTON0"> + PAD_BUTTON0 + </string> + <string name="PAD_BUTTON1"> + PAD_BUTTON1 + </string> + <string name="PAD_BUTTON2"> + PAD_BUTTON2 + </string> + <string name="PAD_BUTTON3"> + PAD_BUTTON3 + </string> + <string name="PAD_BUTTON4"> + PAD_BUTTON4 + </string> + <string name="PAD_BUTTON5"> + PAD_BUTTON5 + </string> + <string name="PAD_BUTTON6"> + PAD_BUTTON6 + </string> + <string name="PAD_BUTTON7"> + PAD_BUTTON7 + </string> + <string name="PAD_BUTTON8"> + PAD_BUTTON8 + </string> + <string name="PAD_BUTTON9"> + PAD_BUTTON9 + </string> + <string name="PAD_BUTTON10"> + PAD_BUTTON10 + </string> + <string name="PAD_BUTTON11"> + PAD_BUTTON11 + </string> + <string name="PAD_BUTTON12"> + PAD_BUTTON12 + </string> + <string name="PAD_BUTTON13"> + PAD_BUTTON13 + </string> + <string name="PAD_BUTTON14"> + PAD_BUTTON14 + </string> + <string name="PAD_BUTTON15"> + PAD_BUTTON15 + </string> + <string name="-"> + - + </string> + <string name="="> + = + </string> + <string name="`"> + ` + </string> + <string name=";"> + ; + </string> + <string name="["> + [ + </string> + <string name="]"> + ] + </string> + <string name="\"> + \ + </string> + <string name="0"> + 0 + </string> + <string name="1"> + 1 + </string> + <string name="2"> + 2 + </string> + <string name="3"> + 3 + </string> + <string name="4"> + 4 + </string> + <string name="5"> + 5 + </string> + <string name="6"> + 6 + </string> + <string name="7"> + 7 + </string> + <string name="8"> + 8 + </string> + <string name="9"> + 9 + </string> + <string name="A"> + A + </string> + <string name="B"> + B + </string> + <string name="C"> + C + </string> + <string name="D"> + D + </string> + <string name="E"> + E + </string> + <string name="F"> + F + </string> + <string name="G"> + G + </string> + <string name="H"> + H + </string> + <string name="I"> + I + </string> + <string name="J"> + J + </string> + <string name="K"> + K + </string> + <string name="L"> + L + </string> + <string name="M"> + M + </string> + <string name="N"> + N + </string> + <string name="O"> + O + </string> + <string name="P"> + P + </string> + <string name="Q"> + Q + </string> + <string name="R"> + R + </string> + <string name="S"> + S + </string> + <string name="T"> + T + </string> + <string name="U"> + U + </string> + <string name="V"> + V + </string> + <string name="W"> + W + </string> + <string name="X"> + X + </string> + <string name="Y"> + Y + </string> + <string name="Z"> + Z + </string> + <string name="BeaconParticle"> + Podgląd lokalizatorów cząsteczek (niebieski) + </string> + <string name="BeaconPhysical"> + Podgląd lokalizatorów fizycznych obiektów (zielony) + </string> + <string name="BeaconScripted"> + Podgląd lokalizatorów obiektów skryptowanych (czerwony) + </string> + <string name="BeaconScriptedTouch"> + Podgląd lokalizatorów obiektów skryptowanych z opcją dotyku (czerwony) + </string> + <string name="BeaconSound"> + Podgląd lokalizatorów dźwięków (żółty) + </string> + <string name="BeaconMedia"> + Podgląd lokalizatorów mediów (biały) + </string> + <string name="ParticleHiding"> + Ukryj cząsteczki + </string> </strings> diff --git a/indra/newview/skins/default/xui/pt/floater_beacons.xml b/indra/newview/skins/default/xui/pt/floater_beacons.xml index b16ff6003e..f8ae3cd2d8 100644 --- a/indra/newview/skins/default/xui/pt/floater_beacons.xml +++ b/indra/newview/skins/default/xui/pt/floater_beacons.xml @@ -17,5 +17,6 @@ <check_box label="Só tocar" name="touch_only"/> <check_box label="Fontes de som" name="sounds"/> <check_box label="Fontes de partículas" name="particles"/> + <check_box label="Fontes de mídia" name="moapbeacon"/> </panel> </floater> diff --git a/indra/newview/skins/default/xui/pt/menu_avatar_self.xml b/indra/newview/skins/default/xui/pt/menu_avatar_self.xml index e2fd61745f..e84dcb093d 100644 --- a/indra/newview/skins/default/xui/pt/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/pt/menu_avatar_self.xml @@ -14,6 +14,7 @@ <menu_item_call label="Camiseta" name="Self Undershirt"/> <menu_item_call label="Roupa de baixo" name="Self Underpants"/> <menu_item_call label="Tatuagem" name="Self Tattoo"/> + <menu_item_call label="Físico" name="Self Physics"/> <menu_item_call label="Alpha" name="Self Alpha"/> <menu_item_call label="Todas as roupas" name="All Clothes"/> </context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_bottomtray.xml b/indra/newview/skins/default/xui/pt/menu_bottomtray.xml index bd628c94d3..7585160954 100644 --- a/indra/newview/skins/default/xui/pt/menu_bottomtray.xml +++ b/indra/newview/skins/default/xui/pt/menu_bottomtray.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="hide_camera_move_controls_menu"> - <menu_item_check label="Voz ativada" name="EnableVoiceChat"/> + <menu_item_check label="Botão Falar" name="EnableVoiceChat"/> <menu_item_check label="Botão de gestos" name="ShowGestureButton"/> <menu_item_check label="Botão de movimento" name="ShowMoveButton"/> <menu_item_check label="Botão de ver" name="ShowCameraButton"/> diff --git a/indra/newview/skins/default/xui/pt/menu_inventory.xml b/indra/newview/skins/default/xui/pt/menu_inventory.xml index 1b1efd3270..7aa3b836a4 100644 --- a/indra/newview/skins/default/xui/pt/menu_inventory.xml +++ b/indra/newview/skins/default/xui/pt/menu_inventory.xml @@ -25,6 +25,7 @@ <menu_item_call label="Nova roupa de baixo" name="New Underpants"/> <menu_item_call label="Nova máscara alfa" name="New Alpha Mask"/> <menu_item_call label="Nova tatuagem" name="New Tattoo"/> + <menu_item_call label="Novo físico" name="New Physics"/> </menu> <menu label="Nova parte do corpo" name="New Body Parts"> <menu_item_call label="Nova forma" name="New Shape"/> diff --git a/indra/newview/skins/default/xui/pt/menu_inventory_add.xml b/indra/newview/skins/default/xui/pt/menu_inventory_add.xml index 2723f39287..9f345b5b6e 100644 --- a/indra/newview/skins/default/xui/pt/menu_inventory_add.xml +++ b/indra/newview/skins/default/xui/pt/menu_inventory_add.xml @@ -23,6 +23,7 @@ <menu_item_call label="Novas roupa de baixo" name="New Underpants"/> <menu_item_call label="Novo alpha" name="New Alpha"/> <menu_item_call label="Nova tatuagem" name="New Tattoo"/> + <menu_item_call label="Novo físico" name="New Physics"/> </menu> <menu label="Nova parte do corpo" name="New Body Parts"> <menu_item_call label="Nova forma" name="New Shape"/> diff --git a/indra/newview/skins/default/xui/pt/menu_outfit_gear.xml b/indra/newview/skins/default/xui/pt/menu_outfit_gear.xml index 11b3e653c6..894f1d741c 100644 --- a/indra/newview/skins/default/xui/pt/menu_outfit_gear.xml +++ b/indra/newview/skins/default/xui/pt/menu_outfit_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Gear Outfit"> +<toggleable_menu name="Gear Outfit"> <menu_item_call label="Vestir - Substituir look atual" name="wear"/> <menu_item_call label="Vestir - Adicionar ao look atual" name="wear_add"/> <menu_item_call label="Tirar - Tirar do look atual" name="take_off"/> @@ -14,6 +14,7 @@ <menu_item_call label="Nova camiseta" name="New Undershirt"/> <menu_item_call label="Novas roupa de baixo" name="New Underpants"/> <menu_item_call label="Novo alpha" name="New Alpha"/> + <menu_item_call label="Novo físico" name="New Physics"/> <menu_item_call label="Nova tatuagem" name="New Tattoo"/> </menu> <menu label="Nova parte do corpo" name="New Body Parts"> @@ -24,4 +25,4 @@ </menu> <menu_item_call label="Renomear look" name="rename"/> <menu_item_call label="Excluir visual" name="delete_outfit"/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_viewer.xml b/indra/newview/skins/default/xui/pt/menu_viewer.xml index 538b20e01f..0a2a2994f6 100644 --- a/indra/newview/skins/default/xui/pt/menu_viewer.xml +++ b/indra/newview/skins/default/xui/pt/menu_viewer.xml @@ -336,4 +336,9 @@ </menu> <menu_item_call label="God Tools" name="God Tools"/> </menu> + <menu label="Admin" name="Deprecated"> + <menu label="Take Off Clothing" name="Take Off Clothing"> + <menu_item_call label="Físico" name="Physics"/> + </menu> + </menu> </menu_bar> diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml index 31e29fb6c1..4adfe8e37f 100644 --- a/indra/newview/skins/default/xui/pt/notifications.xml +++ b/indra/newview/skins/default/xui/pt/notifications.xml @@ -2822,6 +2822,13 @@ Silenciar todos? <notification label="Levantar-se" name="HintSit"> Para se levantar quando estiver sentado, clique em Levantar-se </notification> + <notification label="Falar" name="HintSpeak"> + Clique no botão Falar para ligar ou desligar o microfone. + +Clique na seta para cima para ver o painel de controles de voz. + +Se o botão Falar for ocultado, o recurso de voz será desabilitado. + </notification> <notification label="Explore o mundo" name="HintDestinationGuide"> O Guia de Destinos traz milhares de lugares novos para você explorar e conhecer. Selecione um lugar, clique em Teletransportar e comece suas descobertas. </notification> @@ -2831,12 +2838,14 @@ Silenciar todos? <notification label="Movimentar" name="HintMove"> Para andar ou correr, clique no botão Movimentar e use as setas para controlar a direção. Ou use as setas do teclado. </notification> + <notification label="" name="HintMoveClick"> + 1. Clique para andar Clique em qualquer lugar no solo para andar até o local. + +2. Clique e arraste para girar a exibição Clique e arraste em qualquer lugar no mundo para girar a exibição + </notification> <notification label="Nome de tela" name="HintDisplayName"> Defina seu nome de tela personalizável. O nome de tele é separado do seu nome de usuário, que não pode ser modificado. Você pode mudar a visualização dos nomes de outras pessoas nas suas preferências. </notification> - <notification label="Movimentar" name="HintMoveArrows"> - Para andar, use as setas do teclado. Para correr, pressione a seta para cima duas vezes. - </notification> <notification label="Exibir" name="HintView"> Para mudar o ângulo de visualização, use os controles Órbita e Pan. Volte à visualização normal pressionando a tecla Escape ou começando a andar. </notification> diff --git a/indra/newview/skins/default/xui/pt/panel_edit_wearable.xml b/indra/newview/skins/default/xui/pt/panel_edit_wearable.xml index 679bb524b4..2e3e3d6305 100644 --- a/indra/newview/skins/default/xui/pt/panel_edit_wearable.xml +++ b/indra/newview/skins/default/xui/pt/panel_edit_wearable.xml @@ -45,6 +45,9 @@ <string name="edit_tattoo_title"> Editando tatuagem </string> + <string name="edit_physics_title"> + Editando o físico + </string> <string name="shape_desc_text"> Forma: </string> @@ -90,6 +93,9 @@ <string name="tattoo_desc_text"> Tatuagem: </string> + <string name="physics_desc_text"> + Físico: + </string> <labeled_back_button label="Salvar" name="back_btn" tool_tip="Voltar à edição de look"/> <text name="edit_wearable_title" value="Editando forma"/> <panel label="Camisa" name="wearable_type_panel"> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml index 412bdbb13e..e5aa42aae0 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml @@ -30,7 +30,9 @@ <spinner label="Transição de avisos de bate-papos por perto:" name="nearby_toasts_lifetime"/> <spinner label="Transição de avisos de bate-papos por perto:" name="nearby_toasts_fadingtime"/> <check_box name="translate_chat_checkbox"/> - <text name="translate_chb_label" >Traduzir bate-papo automaticamente (via Google)</text> + <text name="translate_chb_label"> + Traduzir bate-papo automaticamente (via Google) + </text> <text name="translate_language_text"> Traduzir bate-papo para: </text> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_colors.xml b/indra/newview/skins/default/xui/pt/panel_preferences_colors.xml index 5f2f341e3f..46d9517a98 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_colors.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_colors.xml @@ -14,7 +14,7 @@ Outros </text> <text name="text_box3"> - Objetos + Objects </text> <text name="text_box4"> Sistema diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml index c2efbf0300..4b03c79a9e 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml @@ -40,6 +40,10 @@ rápido <combo_box.item label="Avatares e objetos" name="3"/> <combo_box.item label="Tudo" name="4"/> </combo_box> + <slider label="Físico do avatar:" name="AvatarPhysicsDetail"/> + <text name="AvatarPhysicsDetailText"> + Baixo + </text> <slider label="Distancia de desenho:" name="DrawDistance"/> <text name="DrawDistanceMeterText2"> m @@ -78,7 +82,7 @@ rápido Baixo </text> <text name="AvatarRenderingText"> - Renderização de Avatar: + Renderização do avatar: </text> <check_box initial_value="true" label="Atributos do Avatar" name="AvatarImpostors"/> <check_box initial_value="true" label="Melhoria de Hardware" name="AvatarVertexProgram"/> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml b/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml index 6053deb5b1..4164147e5c 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml @@ -5,7 +5,9 @@ </panel.string> <slider label="Volume principal" name="System Volume"/> <check_box initial_value="true" name="mute_when_minimized"/> - <text name="mute_chb_label">Silenciar ao minimizar</text> + <text name="mute_chb_label"> + Silenciar ao minimizar + </text> <slider label="Botões" name="UI Volume"/> <slider label="Ambiente" name="Wind Volume"/> <slider label="Efeitos sonoros" name="SFX Volume"/> diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml index 47813604ff..6466f42c75 100644 --- a/indra/newview/skins/default/xui/pt/strings.xml +++ b/indra/newview/skins/default/xui/pt/strings.xml @@ -855,6 +855,9 @@ <string name="tattoo"> Tatuagem </string> + <string name="physics"> + Físico + </string> <string name="invalid"> Inválido </string> @@ -894,6 +897,9 @@ <string name="tattoo_not_worn"> Tatuagem não usada </string> + <string name="physics_not_worn"> + Físico não usado + </string> <string name="invalid_not_worn"> inválido </string> @@ -942,6 +948,9 @@ <string name="create_new_tattoo"> Criar nova tatuagem </string> + <string name="create_new_physics"> + Criar novo físico + </string> <string name="create_new_invalid"> inválido </string> @@ -2177,6 +2186,114 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="Bulbous Nose"> Nariz em bulbo </string> + <string name="Breast Physics Mass"> + Seios - massa + </string> + <string name="Breast Physics Smoothing"> + Seios - suavização + </string> + <string name="Breast Physics Gravity"> + Seios - gravidade + </string> + <string name="Breast Physics Drag"> + Seios - resistência do ar + </string> + <string name="Breast Physics InOut Max Effect"> + Efeito máximo + </string> + <string name="Breast Physics InOut Spring"> + Vibração + </string> + <string name="Breast Physics InOut Gain"> + Ganho + </string> + <string name="Breast Physics InOut Damping"> + Duração + </string> + <string name="Breast Physics UpDown Max Effect"> + Efeito máximo + </string> + <string name="Breast Physics UpDown Spring"> + Vibração + </string> + <string name="Breast Physics UpDown Gain"> + Ganho + </string> + <string name="Breast Physics UpDown Damping"> + Duração + </string> + <string name="Breast Physics LeftRight Max Effect"> + Efeito máximo + </string> + <string name="Breast Physics LeftRight Spring"> + Vibração + </string> + <string name="Breast Physics LeftRight Gain"> + Ganho + </string> + <string name="Breast Physics LeftRight Damping"> + Duração + </string> + <string name="Belly Physics Mass"> + Barriga - massa + </string> + <string name="Belly Physics Smoothing"> + Barriga - suavização + </string> + <string name="Belly Physics Gravity"> + Barriga - gravidade + </string> + <string name="Belly Physics Drag"> + Barriga - resistência do ar + </string> + <string name="Belly Physics UpDown Max Effect"> + Efeito máximo + </string> + <string name="Belly Physics UpDown Spring"> + Vibração + </string> + <string name="Belly Physics UpDown Gain"> + Ganho + </string> + <string name="Belly Physics UpDown Damping"> + Duração + </string> + <string name="Butt Physics Mass"> + Nádegas - massa + </string> + <string name="Butt Physics Smoothing"> + Nádegas - suavização + </string> + <string name="Butt Physics Gravity"> + Nádegas - gravidade + </string> + <string name="Butt Physics Drag"> + Nádegas - resistência do ar + </string> + <string name="Butt Physics UpDown Max Effect"> + Efeito máximo + </string> + <string name="Butt Physics UpDown Spring"> + Vibração + </string> + <string name="Butt Physics UpDown Gain"> + Ganho + </string> + <string name="Butt Physics UpDown Damping"> + Duração + </string> + <string name="Butt Physics LeftRight Max Effect"> + Efeito máximo + </string> + <string name="Butt Physics LeftRight Spring"> + Vibração + </string> + <string name="Butt Physics LeftRight Gain"> + Ganho + </string> + <string name="Butt Physics LeftRight Damping"> + Duração + </string> <string name="Bushy Eyebrows"> Sobrancelhas grossas </string> @@ -2186,6 +2303,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="Butt Size"> Tamanho do traseiro </string> + <string name="Butt Gravity"> + Nádegas - gravidade + </string> <string name="bustle skirt"> Saia armada </string> @@ -3661,6 +3781,9 @@ Denunciar abuso <string name="New Tattoo"> Nova tatuagem </string> + <string name="New Physics"> + Novo físico + </string> <string name="Invalid Wearable"> Item inválido </string> -- cgit v1.2.3 From 1645ae1f7d5be934f4850b3b395976db29cb938d Mon Sep 17 00:00:00 2001 From: Eli Linden <eli@lindenlab.com> Date: Thu, 28 Apr 2011 17:20:11 -0700 Subject: WIP INTL-41 set23 DE/FR/ES/PT translation, new files --- indra/newview/skins/default/xui/de/menu_media_ctrl.xml | 6 ++++++ indra/newview/skins/default/xui/de/panel_edit_physics.xml | 14 ++++++++++++++ .../skins/default/xui/de/panel_scrolling_param_base.xml | 4 ++++ indra/newview/skins/default/xui/es/menu_media_ctrl.xml | 6 ++++++ indra/newview/skins/default/xui/es/panel_edit_physics.xml | 14 ++++++++++++++ .../skins/default/xui/es/panel_scrolling_param_base.xml | 4 ++++ indra/newview/skins/default/xui/fr/menu_media_ctrl.xml | 6 ++++++ indra/newview/skins/default/xui/fr/panel_edit_physics.xml | 14 ++++++++++++++ .../skins/default/xui/fr/panel_scrolling_param_base.xml | 4 ++++ indra/newview/skins/default/xui/pt/menu_media_ctrl.xml | 6 ++++++ indra/newview/skins/default/xui/pt/panel_edit_physics.xml | 14 ++++++++++++++ .../skins/default/xui/pt/panel_scrolling_param_base.xml | 4 ++++ 12 files changed, 96 insertions(+) create mode 100644 indra/newview/skins/default/xui/de/menu_media_ctrl.xml create mode 100644 indra/newview/skins/default/xui/de/panel_edit_physics.xml create mode 100644 indra/newview/skins/default/xui/de/panel_scrolling_param_base.xml create mode 100644 indra/newview/skins/default/xui/es/menu_media_ctrl.xml create mode 100644 indra/newview/skins/default/xui/es/panel_edit_physics.xml create mode 100644 indra/newview/skins/default/xui/es/panel_scrolling_param_base.xml create mode 100644 indra/newview/skins/default/xui/fr/menu_media_ctrl.xml create mode 100644 indra/newview/skins/default/xui/fr/panel_edit_physics.xml create mode 100644 indra/newview/skins/default/xui/fr/panel_scrolling_param_base.xml create mode 100644 indra/newview/skins/default/xui/pt/menu_media_ctrl.xml create mode 100644 indra/newview/skins/default/xui/pt/panel_edit_physics.xml create mode 100644 indra/newview/skins/default/xui/pt/panel_scrolling_param_base.xml diff --git a/indra/newview/skins/default/xui/de/menu_media_ctrl.xml b/indra/newview/skins/default/xui/de/menu_media_ctrl.xml new file mode 100644 index 0000000000..781796670a --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_media_ctrl.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="media ctrl context menu"> + <menu_item_call label="Ausschneiden" name="Cut"/> + <menu_item_call label="Kopieren" name="Copy"/> + <menu_item_call label="Einfügen" name="Paste"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/de/panel_edit_physics.xml b/indra/newview/skins/default/xui/de/panel_edit_physics.xml new file mode 100644 index 0000000000..bd9c84577a --- /dev/null +++ b/indra/newview/skins/default/xui/de/panel_edit_physics.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_physics_panel"> + <panel label="" name="accordion_panel"> + <accordion name="physics_accordion"> + <accordion_tab name="physics_breasts_updown_tab" title="Brust – Hüpfen"/> + <accordion_tab name="physics_breasts_inout_tab" title="Brust – Dekolleté"/> + <accordion_tab name="physics_breasts_leftright_tab" title="Brust – Schwingen"/> + <accordion_tab name="physics_belly_tab" title="Bauch – Hüpfen"/> + <accordion_tab name="physics_butt_tab" title="Po – Hüpfen"/> + <accordion_tab name="physics_butt_leftright_tab" title="Po – Wiegen"/> + <accordion_tab name="physics_advanced_tab" title="Erweiterte Parameter"/> + </accordion> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/de/panel_scrolling_param_base.xml new file mode 100644 index 0000000000..990193574e --- /dev/null +++ b/indra/newview/skins/default/xui/de/panel_scrolling_param_base.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="LLScrollingPanelParamBase"> + <slider label="[BESCHR]" name="param slider"/> +</panel> diff --git a/indra/newview/skins/default/xui/es/menu_media_ctrl.xml b/indra/newview/skins/default/xui/es/menu_media_ctrl.xml new file mode 100644 index 0000000000..8ea9286d8e --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_media_ctrl.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="media ctrl context menu"> + <menu_item_call label="Cortar" name="Cut"/> + <menu_item_call label="Copiar" name="Copy"/> + <menu_item_call label="Pegar" name="Paste"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/es/panel_edit_physics.xml b/indra/newview/skins/default/xui/es/panel_edit_physics.xml new file mode 100644 index 0000000000..dfb5ab330a --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_edit_physics.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_physics_panel"> + <panel label="" name="accordion_panel"> + <accordion name="physics_accordion"> + <accordion_tab name="physics_breasts_updown_tab" title="Rebote de los senos"/> + <accordion_tab name="physics_breasts_inout_tab" title="Canalillo de los senos"/> + <accordion_tab name="physics_breasts_leftright_tab" title="Bamboleo de los senos"/> + <accordion_tab name="physics_belly_tab" title="Rebote de la barriga"/> + <accordion_tab name="physics_butt_tab" title="Rebote del culo"/> + <accordion_tab name="physics_butt_leftright_tab" title="Bamboleo del culo"/> + <accordion_tab name="physics_advanced_tab" title="Parámetros avanzados"/> + </accordion> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/es/panel_scrolling_param_base.xml new file mode 100644 index 0000000000..fa659040ea --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_scrolling_param_base.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="LLScrollingPanelParamBase"> + <slider label="[DESC]" name="param slider"/> +</panel> diff --git a/indra/newview/skins/default/xui/fr/menu_media_ctrl.xml b/indra/newview/skins/default/xui/fr/menu_media_ctrl.xml new file mode 100644 index 0000000000..787a5b3af2 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_media_ctrl.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="media ctrl context menu"> + <menu_item_call label="Couper" name="Cut"/> + <menu_item_call label="Copier" name="Copy"/> + <menu_item_call label="Coller" name="Paste"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/fr/panel_edit_physics.xml b/indra/newview/skins/default/xui/fr/panel_edit_physics.xml new file mode 100644 index 0000000000..d79f7df90a --- /dev/null +++ b/indra/newview/skins/default/xui/fr/panel_edit_physics.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_physics_panel"> + <panel label="" name="accordion_panel"> + <accordion name="physics_accordion"> + <accordion_tab name="physics_breasts_updown_tab" title="Rebond des seins"/> + <accordion_tab name="physics_breasts_inout_tab" title="Décolleté"/> + <accordion_tab name="physics_breasts_leftright_tab" title="Balancement des seins"/> + <accordion_tab name="physics_belly_tab" title="Rebond du ventre"/> + <accordion_tab name="physics_butt_tab" title="Rebond des fesses"/> + <accordion_tab name="physics_butt_leftright_tab" title="Balancement des fesses"/> + <accordion_tab name="physics_advanced_tab" title="Paramètres avancés"/> + </accordion> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/fr/panel_scrolling_param_base.xml new file mode 100644 index 0000000000..fa659040ea --- /dev/null +++ b/indra/newview/skins/default/xui/fr/panel_scrolling_param_base.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="LLScrollingPanelParamBase"> + <slider label="[DESC]" name="param slider"/> +</panel> diff --git a/indra/newview/skins/default/xui/pt/menu_media_ctrl.xml b/indra/newview/skins/default/xui/pt/menu_media_ctrl.xml new file mode 100644 index 0000000000..44117c8865 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_media_ctrl.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="media ctrl context menu"> + <menu_item_call label="Cortar" name="Cut"/> + <menu_item_call label="Cortar" name="Copy"/> + <menu_item_call label="Colar" name="Paste"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/pt/panel_edit_physics.xml b/indra/newview/skins/default/xui/pt/panel_edit_physics.xml new file mode 100644 index 0000000000..967aab8bc3 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_edit_physics.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_physics_panel"> + <panel label="" name="accordion_panel"> + <accordion name="physics_accordion"> + <accordion_tab name="physics_breasts_updown_tab" title="Seios - movimento vertical"/> + <accordion_tab name="physics_breasts_inout_tab" title="Seios - decote"/> + <accordion_tab name="physics_breasts_leftright_tab" title="Seios - movimento lateral"/> + <accordion_tab name="physics_belly_tab" title="Barriga - movimento vertical"/> + <accordion_tab name="physics_butt_tab" title="Nádegas - movimento vertical"/> + <accordion_tab name="physics_butt_leftright_tab" title="Nádegas - movimento lateral"/> + <accordion_tab name="physics_advanced_tab" title="Parâmetros avançados"/> + </accordion> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/pt/panel_scrolling_param_base.xml new file mode 100644 index 0000000000..0a5a2e2572 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_scrolling_param_base.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="LLScrollingPanelParamBase"> + <slider label="[DESC]:" name="param slider"/> +</panel> -- cgit v1.2.3 From 9baeb70ddda7b28b1ebeec8793710a51296565e0 Mon Sep 17 00:00:00 2001 From: Eli Linden <eli@lindenlab.com> Date: Thu, 28 Apr 2011 18:01:54 -0700 Subject: WIP CT-636 CT-637 PL translation for Light Viewer set1 and set2, adding new files --- .../skins/minimal/xui/pl/floater_camera.xml | 65 + .../skins/minimal/xui/pl/floater_help_browser.xml | 9 + .../skins/minimal/xui/pl/floater_media_browser.xml | 30 + .../skins/minimal/xui/pl/floater_nearby_chat.xml | 4 + .../skins/minimal/xui/pl/floater_web_content.xml | 14 + .../skins/minimal/xui/pl/inspect_avatar.xml | 24 + .../skins/minimal/xui/pl/inspect_object.xml | 41 + .../minimal/xui/pl/menu_add_wearable_gear.xml | 6 + .../skins/minimal/xui/pl/menu_attachment_other.xml | 17 + .../skins/minimal/xui/pl/menu_attachment_self.xml | 16 + .../skins/minimal/xui/pl/menu_avatar_icon.xml | 7 + .../skins/minimal/xui/pl/menu_avatar_other.xml | 16 + .../skins/minimal/xui/pl/menu_avatar_self.xml | 31 + .../skins/minimal/xui/pl/menu_bottomtray.xml | 17 + .../skins/minimal/xui/pl/menu_cof_attachment.xml | 4 + .../skins/minimal/xui/pl/menu_cof_body_part.xml | 5 + .../skins/minimal/xui/pl/menu_cof_clothing.xml | 6 + .../newview/skins/minimal/xui/pl/menu_cof_gear.xml | 5 + indra/newview/skins/minimal/xui/pl/menu_edit.xml | 12 + .../skins/minimal/xui/pl/menu_favorites.xml | 10 + .../skins/minimal/xui/pl/menu_gesture_gear.xml | 10 + .../skins/minimal/xui/pl/menu_group_plus.xml | 5 + .../skins/minimal/xui/pl/menu_hide_navbar.xml | 6 + .../skins/minimal/xui/pl/menu_im_well_button.xml | 4 + .../skins/minimal/xui/pl/menu_imchiclet_adhoc.xml | 4 + .../skins/minimal/xui/pl/menu_imchiclet_group.xml | 6 + .../skins/minimal/xui/pl/menu_imchiclet_p2p.xml | 7 + .../minimal/xui/pl/menu_inspect_avatar_gear.xml | 21 + .../minimal/xui/pl/menu_inspect_object_gear.xml | 18 + .../minimal/xui/pl/menu_inspect_self_gear.xml | 31 + .../minimal/xui/pl/menu_inv_offer_chiclet.xml | 4 + .../skins/minimal/xui/pl/menu_inventory.xml | 84 + .../skins/minimal/xui/pl/menu_inventory_add.xml | 33 + .../minimal/xui/pl/menu_inventory_gear_default.xml | 17 + indra/newview/skins/minimal/xui/pl/menu_land.xml | 9 + .../newview/skins/minimal/xui/pl/menu_landmark.xml | 7 + indra/newview/skins/minimal/xui/pl/menu_login.xml | 24 + .../newview/skins/minimal/xui/pl/menu_mini_map.xml | 11 + indra/newview/skins/minimal/xui/pl/menu_navbar.xml | 11 + .../skins/minimal/xui/pl/menu_nearby_chat.xml | 9 + .../xui/pl/menu_notification_well_button.xml | 4 + indra/newview/skins/minimal/xui/pl/menu_object.xml | 29 + .../skins/minimal/xui/pl/menu_object_icon.xml | 5 + .../skins/minimal/xui/pl/menu_outfit_gear.xml | 27 + .../skins/minimal/xui/pl/menu_outfit_tab.xml | 9 + .../skins/minimal/xui/pl/menu_participant_list.xml | 21 + .../xui/pl/menu_people_friends_view_sort.xml | 8 + .../skins/minimal/xui/pl/menu_people_groups.xml | 8 + .../xui/pl/menu_people_groups_view_sort.xml | 5 + .../skins/minimal/xui/pl/menu_people_nearby.xml | 13 + .../xui/pl/menu_people_nearby_multiselect.xml | 10 + .../xui/pl/menu_people_nearby_view_sort.xml | 8 + .../xui/pl/menu_people_recent_view_sort.xml | 7 + indra/newview/skins/minimal/xui/pl/menu_picks.xml | 8 + .../skins/minimal/xui/pl/menu_picks_plus.xml | 5 + indra/newview/skins/minimal/xui/pl/menu_place.xml | 7 + .../skins/minimal/xui/pl/menu_place_add_button.xml | 5 + .../minimal/xui/pl/menu_places_gear_folder.xml | 16 + .../minimal/xui/pl/menu_places_gear_landmark.xml | 19 + .../skins/minimal/xui/pl/menu_profile_overflow.xml | 12 + .../skins/minimal/xui/pl/menu_save_outfit.xml | 5 + .../skins/minimal/xui/pl/menu_script_chiclet.xml | 4 + indra/newview/skins/minimal/xui/pl/menu_slurl.xml | 6 + .../minimal/xui/pl/menu_teleport_history_gear.xml | 6 + .../minimal/xui/pl/menu_teleport_history_item.xml | 6 + .../minimal/xui/pl/menu_teleport_history_tab.xml | 5 + .../skins/minimal/xui/pl/menu_text_editor.xml | 8 + .../skins/minimal/xui/pl/menu_topinfobar.xml | 7 + .../skins/minimal/xui/pl/menu_url_agent.xml | 6 + .../skins/minimal/xui/pl/menu_url_group.xml | 6 + .../newview/skins/minimal/xui/pl/menu_url_http.xml | 7 + .../skins/minimal/xui/pl/menu_url_inventory.xml | 6 + .../newview/skins/minimal/xui/pl/menu_url_map.xml | 6 + .../skins/minimal/xui/pl/menu_url_objectim.xml | 8 + .../skins/minimal/xui/pl/menu_url_parcel.xml | 6 + .../skins/minimal/xui/pl/menu_url_slapp.xml | 5 + .../skins/minimal/xui/pl/menu_url_slurl.xml | 7 + .../skins/minimal/xui/pl/menu_url_teleport.xml | 6 + indra/newview/skins/minimal/xui/pl/menu_viewer.xml | 14 + .../minimal/xui/pl/menu_wearable_list_item.xml | 14 + .../skins/minimal/xui/pl/menu_wearing_gear.xml | 5 + .../skins/minimal/xui/pl/menu_wearing_tab.xml | 6 + .../newview/skins/minimal/xui/pl/notifications.xml | 2907 ++++++++++++++++++++ .../minimal/xui/pl/panel_adhoc_control_panel.xml | 14 + .../skins/minimal/xui/pl/panel_bottomtray.xml | 39 + .../minimal/xui/pl/panel_group_control_panel.xml | 17 + .../minimal/xui/pl/panel_im_control_panel.xml | 29 + indra/newview/skins/minimal/xui/pl/panel_login.xml | 45 + .../skins/minimal/xui/pl/panel_navigation_bar.xml | 18 + .../newview/skins/minimal/xui/pl/panel_people.xml | 94 + .../minimal/xui/pl/panel_side_tray_tab_caption.xml | 7 + .../skins/minimal/xui/pl/panel_status_bar.xml | 33 + 92 files changed, 4238 insertions(+) create mode 100644 indra/newview/skins/minimal/xui/pl/floater_camera.xml create mode 100644 indra/newview/skins/minimal/xui/pl/floater_help_browser.xml create mode 100644 indra/newview/skins/minimal/xui/pl/floater_media_browser.xml create mode 100644 indra/newview/skins/minimal/xui/pl/floater_nearby_chat.xml create mode 100644 indra/newview/skins/minimal/xui/pl/floater_web_content.xml create mode 100644 indra/newview/skins/minimal/xui/pl/inspect_avatar.xml create mode 100644 indra/newview/skins/minimal/xui/pl/inspect_object.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_add_wearable_gear.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_attachment_other.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_attachment_self.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_avatar_icon.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_avatar_other.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_avatar_self.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_bottomtray.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_cof_attachment.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_cof_body_part.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_cof_clothing.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_cof_gear.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_edit.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_favorites.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_gesture_gear.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_group_plus.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_hide_navbar.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_im_well_button.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_imchiclet_adhoc.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_imchiclet_group.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_imchiclet_p2p.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_inspect_avatar_gear.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_inspect_object_gear.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_inspect_self_gear.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_inv_offer_chiclet.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_inventory.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_inventory_add.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_inventory_gear_default.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_land.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_landmark.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_login.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_mini_map.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_navbar.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_nearby_chat.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_notification_well_button.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_object.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_object_icon.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_outfit_gear.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_outfit_tab.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_participant_list.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_people_friends_view_sort.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_people_groups.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_people_groups_view_sort.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_people_nearby.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_people_nearby_multiselect.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_people_nearby_view_sort.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_people_recent_view_sort.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_picks.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_picks_plus.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_place.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_place_add_button.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_places_gear_folder.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_places_gear_landmark.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_profile_overflow.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_save_outfit.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_script_chiclet.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_slurl.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_teleport_history_gear.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_teleport_history_item.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_teleport_history_tab.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_text_editor.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_topinfobar.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_url_agent.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_url_group.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_url_http.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_url_inventory.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_url_map.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_url_objectim.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_url_parcel.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_url_slapp.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_url_slurl.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_url_teleport.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_viewer.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_wearable_list_item.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_wearing_gear.xml create mode 100644 indra/newview/skins/minimal/xui/pl/menu_wearing_tab.xml create mode 100644 indra/newview/skins/minimal/xui/pl/notifications.xml create mode 100644 indra/newview/skins/minimal/xui/pl/panel_adhoc_control_panel.xml create mode 100644 indra/newview/skins/minimal/xui/pl/panel_bottomtray.xml create mode 100644 indra/newview/skins/minimal/xui/pl/panel_group_control_panel.xml create mode 100644 indra/newview/skins/minimal/xui/pl/panel_im_control_panel.xml create mode 100644 indra/newview/skins/minimal/xui/pl/panel_login.xml create mode 100644 indra/newview/skins/minimal/xui/pl/panel_navigation_bar.xml create mode 100644 indra/newview/skins/minimal/xui/pl/panel_people.xml create mode 100644 indra/newview/skins/minimal/xui/pl/panel_side_tray_tab_caption.xml create mode 100644 indra/newview/skins/minimal/xui/pl/panel_status_bar.xml diff --git a/indra/newview/skins/minimal/xui/pl/floater_camera.xml b/indra/newview/skins/minimal/xui/pl/floater_camera.xml new file mode 100644 index 0000000000..5b9dd47616 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/floater_camera.xml @@ -0,0 +1,65 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="camera_floater" title=""> + <floater.string name="rotate_tooltip"> + Obracaj kamerę wokół obiektu + </floater.string> + <floater.string name="zoom_tooltip"> + Najedź kamerą w kierunku obiektu + </floater.string> + <floater.string name="move_tooltip"> + Poruszaj kamerą w dół/górę oraz w prawo/lewo + </floater.string> + <floater.string name="camera_modes_title"> + Ustawienia + </floater.string> + <floater.string name="pan_mode_title"> + W prawo lub w lewo + </floater.string> + <floater.string name="presets_mode_title"> + Ustaw widok + </floater.string> + <floater.string name="free_mode_title"> + Zobacz obiekt + </floater.string> + <panel name="controls"> + <panel name="preset_views_list"> + <panel_camera_item name="front_view"> + <panel_camera_item.text name="front_view_text"> + Widok z przodu + </panel_camera_item.text> + </panel_camera_item> + <panel_camera_item name="group_view"> + <panel_camera_item.text name="side_view_text"> + Podgląd grupy + </panel_camera_item.text> + </panel_camera_item> + <panel_camera_item name="rear_view"> + <panel_camera_item.text name="rear_view_text"> + Widok z tyłu + </panel_camera_item.text> + </panel_camera_item> + </panel> + <panel name="camera_modes_list"> + <panel_camera_item name="object_view"> + <panel_camera_item.text name="object_view_text"> + Widok obiektu + </panel_camera_item.text> + </panel_camera_item> + <panel_camera_item name="mouselook_view"> + <panel_camera_item.text name="mouselook_view_text"> + Widok panoramiczny + </panel_camera_item.text> + </panel_camera_item> + </panel> + <panel name="zoom" tool_tip="Najedź kamerą w kierunku obiektu"> + <joystick_rotate name="cam_rotate_stick" tool_tip="Obracaj kamerę wokoł osi"/> + <slider_bar name="zoom_slider" tool_tip="Przybliż kamerę do ogniskowej"/> + <joystick_track name="cam_track_stick" tool_tip="Poruszaj kamerą w górę, w dół, w lewo i w prawo"/> + </panel> + </panel> + <panel name="buttons"> + <button label="" name="presets_btn" tool_tip="Ustaw widok"/> + <button label="" name="pan_btn" tool_tip="Kamera horyzontalna"/> + <button label="" name="avatarview_btn" tool_tip="Ustawienia"/> + </panel> +</floater> diff --git a/indra/newview/skins/minimal/xui/pl/floater_help_browser.xml b/indra/newview/skins/minimal/xui/pl/floater_help_browser.xml new file mode 100644 index 0000000000..66fde04f88 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/floater_help_browser.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_help_browser" title="POMOC"> + <floater.string name="loading_text"> + Ładowanie... + </floater.string> + <layout_stack name="stack1"> + <layout_panel name="external_controls"/> + </layout_stack> +</floater> diff --git a/indra/newview/skins/minimal/xui/pl/floater_media_browser.xml b/indra/newview/skins/minimal/xui/pl/floater_media_browser.xml new file mode 100644 index 0000000000..02b7c6bc2b --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/floater_media_browser.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_about" title="PRZEGLĄDARKA MEDIÓW"> + <floater.string name="home_page_url"> + http://www.secondlife.com + </floater.string> + <floater.string name="support_page_url"> + http://support.secondlife.com + </floater.string> + <layout_stack name="stack1"> + <layout_panel name="nav_controls"> + <button label="Wstecz" name="back"/> + <button label="Dalej" name="forward"/> + <button label="Odśwież" name="reload"/> + <button label="Idź" name="go"/> + </layout_panel> + <layout_panel name="time_controls"> + <button label="przewiń" name="rewind"/> + <button label="zatrzymaj" name="stop"/> + <button label="dalej" name="seek"/> + </layout_panel> + <layout_panel name="parcel_owner_controls"> + <button label="Wyślij bieżącą stronę do parceli" name="assign"/> + </layout_panel> + <layout_panel name="external_controls"> + <button label="Otwórz w przeglądarce zewnętrznej" name="open_browser"/> + <check_box label="Zawsze otwieraj w przeglądarce zewnętrznej" name="open_always"/> + <button label="Zamknij" name="close"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/minimal/xui/pl/floater_nearby_chat.xml b/indra/newview/skins/minimal/xui/pl/floater_nearby_chat.xml new file mode 100644 index 0000000000..7dc3e1f22e --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/floater_nearby_chat.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="nearby_chat" title="CZAT LOKALNY"> + <check_box label="Tłumaczenie czatu (wspierane przez Google)" name="translate_chat_checkbox"/> +</floater> diff --git a/indra/newview/skins/minimal/xui/pl/floater_web_content.xml b/indra/newview/skins/minimal/xui/pl/floater_web_content.xml new file mode 100644 index 0000000000..e3096f1e54 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/floater_web_content.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_web_content" title=""> + <layout_stack name="stack1"> + <layout_panel name="nav_controls"> + <button name="back" tool_tip="Wstecz"/> + <button name="forward" tool_tip="Dalej"/> + <button name="stop" tool_tip="Zatrzymaj"/> + <button name="reload" tool_tip="Odśwież stronę"/> + <combo_box name="address" tool_tip="Wpisz URL tutaj"/> + <icon name="media_secure_lock_flag" tool_tip="Zabezpieczona przeglądarka"/> + <button name="popexternal" tool_tip="Otwórz bieżący URL w zewnętrznej przeglądarce"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/minimal/xui/pl/inspect_avatar.xml b/indra/newview/skins/minimal/xui/pl/inspect_avatar.xml new file mode 100644 index 0000000000..5e982c0185 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/inspect_avatar.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="inspect_avatar"> + <string name="Subtitle"> + [AGE] + </string> + <string name="Details"> + [SL_PROFILE] + </string> + <text name="user_details"> + To jest mój opis w Second Life. + </text> + <slider name="volume_slider" tool_tip="Poziom głośności" value="0.5"/> + <button label="Dodaj znajomość" name="add_friend_btn"/> + <button label="IM" name="im_btn"/> + <button label="Profil" name="view_profile_btn"/> + <panel name="moderator_panel"> + <button label="Wyłącz komunikację głosową" name="disable_voice"/> + <button label="Włącz komunikację głosową" name="enable_voice"/> + </panel> +</floater> diff --git a/indra/newview/skins/minimal/xui/pl/inspect_object.xml b/indra/newview/skins/minimal/xui/pl/inspect_object.xml new file mode 100644 index 0000000000..23d8ce7700 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/inspect_object.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="inspect_object"> + <string name="Creator"> + Przez [CREATOR] + </string> + <string name="CreatorAndOwner"> + Twórca [CREATOR] +Właściciel [OWNER] + </string> + <string name="Price"> + L$[AMOUNT] + </string> + <string name="PriceFree"> + Darmowe! + </string> + <string name="Touch"> + Dotknij + </string> + <string name="Sit"> + Usiądź tutaj + </string> + <text name="object_name" value="Test Object Name That Is actually two lines and Really Long"/> + <text name="price_text"> + L$30,000 + </text> + <text name="object_description"> + This is a really long description for an object being as how it is at least 80 characters in length and so but maybe more like 120 at this point. Who knows, really? + </text> + <button label="Kup" name="buy_btn"/> + <button label="Zapłać" name="pay_btn"/> + <button label="Weź kopię" name="take_free_copy_btn"/> + <button label="Dotknij" name="touch_btn"/> + <button label="Usiądź tutaj" name="sit_btn"/> + <button label="Otwórz" name="open_btn"/> + <icon name="secure_browsing" tool_tip="Zabezpiecz przeglądanie"/> + <button label="Więcej" name="more_info_btn"/> +</floater> diff --git a/indra/newview/skins/minimal/xui/pl/menu_add_wearable_gear.xml b/indra/newview/skins/minimal/xui/pl/menu_add_wearable_gear.xml new file mode 100644 index 0000000000..7c572b4fc9 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_add_wearable_gear.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Add Wearable Gear Menu"> + <menu_item_check label="Porządkuj według daty" name="sort_by_most_recent"/> + <menu_item_check label="Porządkuj według nazwy" name="sort_by_name"/> + <menu_item_check label="Porządkuj według typu" name="sort_by_type"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_attachment_other.xml b/indra/newview/skins/minimal/xui/pl/menu_attachment_other.xml new file mode 100644 index 0000000000..aacdad97e3 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_attachment_other.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- *NOTE: See also menu_avatar_other.xml --> +<context_menu name="Avatar Pie"> + <menu_item_call label="Zobacz profil" name="Profile..."/> + <menu_item_call label="Dodaj znajomość" name="Add Friend"/> + <menu_item_call label="IM" name="Send IM..."/> + <menu_item_call label="Zadzwoń" name="Call"/> + <menu_item_call label="Zaproś do grupy" name="Invite..."/> + <menu_item_call label="Zablokuj" name="Avatar Mute"/> + <menu_item_call label="Raport" name="abuse"/> + <menu_item_call label="Unieruchom" name="Freeze..."/> + <menu_item_call label="Wyrzuć" name="Eject..."/> + <menu_item_call label="Debugowanie tekstur" name="Debug..."/> + <menu_item_call label="Przybliż" name="Zoom In"/> + <menu_item_call label="Zapłać" name="Pay..."/> + <menu_item_call label="Sprawdź" name="Object Inspect"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_attachment_self.xml b/indra/newview/skins/minimal/xui/pl/menu_attachment_self.xml new file mode 100644 index 0000000000..163b3a231e --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_attachment_self.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Attachment Pie"> + <menu_item_call label="Dotknij" name="Attachment Object Touch"/> + <menu_item_call label="Edytuj" name="Edit..."/> + <menu_item_call label="Odłącz" name="Detach"/> + <menu_item_call label="Usiądź tutaj" name="Sit Down Here"/> + <menu_item_call label="Wstań" name="Stand Up"/> + <menu_item_call label="Mój wygląd" name="Change Outfit"/> + <menu_item_call label="Edytuj mój strój" name="Edit Outfit"/> + <menu_item_call label="Edytuj mój kształt" name="Edit My Shape"/> + <menu_item_call label="Moi znajomi" name="Friends..."/> + <menu_item_call label="Moje grupy" name="Groups..."/> + <menu_item_call label="Mój profil" name="Profile..."/> + <menu_item_call label="Debugowanie tekstur" name="Debug..."/> + <menu_item_call label="Opuść" name="Drop"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_avatar_icon.xml b/indra/newview/skins/minimal/xui/pl/menu_avatar_icon.xml new file mode 100644 index 0000000000..e8d2b14231 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_avatar_icon.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Avatar Icon Menu"> + <menu_item_call label="Profil" name="Show Profile"/> + <menu_item_call label="Czat/IM..." name="Send IM"/> + <menu_item_call label="Dodaj znajomość..." name="Add Friend"/> + <menu_item_call label="Usuń..." name="Remove Friend"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_avatar_other.xml b/indra/newview/skins/minimal/xui/pl/menu_avatar_other.xml new file mode 100644 index 0000000000..dcf7921bad --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_avatar_other.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- *NOTE: See also menu_attachment_other.xml --> +<context_menu name="Avatar Pie"> + <menu_item_call label="Zobacz profil" name="Profile..."/> + <menu_item_call label="Dodaj znajomość" name="Add Friend"/> + <menu_item_call label="IM" name="Send IM..."/> + <menu_item_call label="Zadzwoń" name="Call"/> + <menu_item_call label="Zaproś do grupy" name="Invite..."/> + <menu_item_call label="Zablokuj" name="Avatar Mute"/> + <menu_item_call label="Raport" name="abuse"/> + <menu_item_call label="Unieruchom" name="Freeze..."/> + <menu_item_call label="Wyrzuć" name="Eject..."/> + <menu_item_call label="Debugowanie tekstur" name="Debug..."/> + <menu_item_call label="Przybliż" name="Zoom In"/> + <menu_item_call label="Zapłać" name="Pay..."/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_avatar_self.xml b/indra/newview/skins/minimal/xui/pl/menu_avatar_self.xml new file mode 100644 index 0000000000..d481475803 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_avatar_self.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Self Pie"> + <menu_item_call label="Usiądź tu" name="Sit Down Here"/> + <menu_item_call label="Wstań" name="Stand Up"/> + <context_menu label="Zdejmij" name="Take Off >"> + <context_menu label="Ubrania" name="Clothes >"> + <menu_item_call label="Koszulę" name="Shirt"/> + <menu_item_call label="Spodnie" name="Pants"/> + <menu_item_call label="Spódnicę" name="Skirt"/> + <menu_item_call label="Buty" name="Shoes"/> + <menu_item_call label="Skarpetki" name="Socks"/> + <menu_item_call label="Kurtkę" name="Jacket"/> + <menu_item_call label="Rękawiczki" name="Gloves"/> + <menu_item_call label="Podkoszulek" name="Self Undershirt"/> + <menu_item_call label="Bieliznę" name="Self Underpants"/> + <menu_item_call label="Tatuaż" name="Self Tattoo"/> + <menu_item_call label="Ubranie alpha" name="Self Alpha"/> + <menu_item_call label="Wszystko" name="All Clothes"/> + </context_menu> + <context_menu label="HUD" name="Object Detach HUD"/> + <context_menu label="Odłącz" name="Object Detach"/> + <menu_item_call label="Odłącz wszystko" name="Detach All"/> + </context_menu> + <menu_item_call label="Mój wygląd" name="Chenge Outfit"/> + <menu_item_call label="Edytuj mój strój" name="Edit Outfit"/> + <menu_item_call label="Edytuj mój kształt" name="Edit My Shape"/> + <menu_item_call label="Moi znajomi" name="Friends..."/> + <menu_item_call label="Moje grupy" name="Groups..."/> + <menu_item_call label="Mój profil" name="Profile..."/> + <menu_item_call label="Debugowanie tekstur" name="Debug..."/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_bottomtray.xml b/indra/newview/skins/minimal/xui/pl/menu_bottomtray.xml new file mode 100644 index 0000000000..8da40dcedf --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_bottomtray.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="hide_camera_move_controls_menu"> + <menu_item_check label="Rozmowy głosowe aktywne" name="EnableVoiceChat"/> + <menu_item_check label="Przycisk gesturki" name="ShowGestureButton"/> + <menu_item_check label="Przycisk ruchu" name="ShowMoveButton"/> + <menu_item_check label="Przycisk widoku" name="ShowCameraButton"/> + <menu_item_check label="Przycisk zdjęć" name="ShowSnapshotButton"/> + <menu_item_check label="Buduj" name="ShowBuildButton"/> + <menu_item_check label="Szukaj" name="ShowSearchButton"/> + <menu_item_check label="Mapa" name="ShowWorldMapButton"/> + <menu_item_check label="Mini-Mapa" name="ShowMiniMapButton"/> + <menu_item_call label="Wytnij" name="NearbyChatBar_Cut"/> + <menu_item_call label="Kopiuj" name="NearbyChatBar_Copy"/> + <menu_item_call label="Wklej" name="NearbyChatBar_Paste"/> + <menu_item_call label="Usuń" name="NearbyChatBar_Delete"/> + <menu_item_call label="Zaznacz wszystko" name="NearbyChatBar_Select_All"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_cof_attachment.xml b/indra/newview/skins/minimal/xui/pl/menu_cof_attachment.xml new file mode 100644 index 0000000000..4e5407601b --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_cof_attachment.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Attachment"> + <menu_item_call label="Odłącz" name="detach"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_cof_body_part.xml b/indra/newview/skins/minimal/xui/pl/menu_cof_body_part.xml new file mode 100644 index 0000000000..ee60d3feb6 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_cof_body_part.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Body"> + <menu_item_call label="Zastąp" name="replace"/> + <menu_item_call label="Edytuj" name="edit"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_cof_clothing.xml b/indra/newview/skins/minimal/xui/pl/menu_cof_clothing.xml new file mode 100644 index 0000000000..ad43900137 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_cof_clothing.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Clothing"> + <menu_item_call label="Zdejmij" name="take_off"/> + <menu_item_call label="Edytuj" name="edit"/> + <menu_item_call label="Zastąp" name="replace"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_cof_gear.xml b/indra/newview/skins/minimal/xui/pl/menu_cof_gear.xml new file mode 100644 index 0000000000..9fba39be1a --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_cof_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Gear COF"> + <menu label="Nowe ubranie" name="COF.Gear.New_Clothes"/> + <menu label="Nowe części ciała" name="COF.Geear.New_Body_Parts"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_edit.xml b/indra/newview/skins/minimal/xui/pl/menu_edit.xml new file mode 100644 index 0000000000..578e270fed --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_edit.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu label="Edycja" name="Edit"> + <menu_item_call label="Cofnij" name="Undo"/> + <menu_item_call label="Powtórz" name="Redo"/> + <menu_item_call label="Wytnij" name="Cut"/> + <menu_item_call label="Kopiuj" name="Copy"/> + <menu_item_call label="Wklej" name="Paste"/> + <menu_item_call label="Usuń" name="Delete"/> + <menu_item_call label="Powiel" name="Duplicate"/> + <menu_item_call label="Zaznacz wszystko" name="Select All"/> + <menu_item_call label="Odznacz" name="Deselect"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_favorites.xml b/indra/newview/skins/minimal/xui/pl/menu_favorites.xml new file mode 100644 index 0000000000..7310ff5c27 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_favorites.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="Teleportuj" name="Teleport To Landmark"/> + <menu_item_call label="Zobacz/Edytuj Ulubione miejsce" name="Landmark Open"/> + <menu_item_call label="Kopiuj SLurl" name="Copy slurl"/> + <menu_item_call label="Pokaż na mapie" name="Show On Map"/> + <menu_item_call label="Kopiuj" name="Landmark Copy"/> + <menu_item_call label="Wklej" name="Landmark Paste"/> + <menu_item_call label="Usuń" name="Delete"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_gesture_gear.xml b/indra/newview/skins/minimal/xui/pl/menu_gesture_gear.xml new file mode 100644 index 0000000000..a72dec22fc --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_gesture_gear.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_gesture_gear"> + <menu_item_call label="Dodaj/Usuń z Ulubionych" name="activate"/> + <menu_item_call label="Kopiuj" name="copy_gesture"/> + <menu_item_call label="Wklej" name="paste"/> + <menu_item_call label="Kopiuj UUID" name="copy_uuid"/> + <menu_item_call label="Zapisz do obecnego zestawu ubrania" name="save_to_outfit"/> + <menu_item_call label="Edytuj" name="edit_gesture"/> + <menu_item_call label="Sprawdź" name="inspect"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_group_plus.xml b/indra/newview/skins/minimal/xui/pl/menu_group_plus.xml new file mode 100644 index 0000000000..83be4d38c5 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_group_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_call label="Dołącz do grupy..." name="item_join"/> + <menu_item_call label="Nowa grupa..." name="item_new"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_hide_navbar.xml b/indra/newview/skins/minimal/xui/pl/menu_hide_navbar.xml new file mode 100644 index 0000000000..19d9510cd3 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_hide_navbar.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="hide_navbar_menu"> + <menu_item_check label="Pokaż pasek Nawigacji" name="ShowNavbarNavigationPanel"/> + <menu_item_check label="Pokaż pasek Ulubionych" name="ShowNavbarFavoritesPanel"/> + <menu_item_check label="Pokaż pasek mini-lokalizacji" name="ShowMiniLocationPanel"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_im_well_button.xml b/indra/newview/skins/minimal/xui/pl/menu_im_well_button.xml new file mode 100644 index 0000000000..207bc2211b --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_im_well_button.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="IM Well Button Context Menu"> + <menu_item_call label="Zamknij wszystkie" name="Close All"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_imchiclet_adhoc.xml b/indra/newview/skins/minimal/xui/pl/menu_imchiclet_adhoc.xml new file mode 100644 index 0000000000..4ead44878a --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_imchiclet_adhoc.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="IMChiclet AdHoc Menu"> + <menu_item_call label="Zakończ rozmowę" name="End Session"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_imchiclet_group.xml b/indra/newview/skins/minimal/xui/pl/menu_imchiclet_group.xml new file mode 100644 index 0000000000..2b9a362123 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_imchiclet_group.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="IMChiclet Group Menu"> + <menu_item_call label="O grupie" name="Show Profile"/> + <menu_item_call label="Pokaż sesję" name="Chat"/> + <menu_item_call label="Zakończ rozmowę" name="End Session"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_imchiclet_p2p.xml b/indra/newview/skins/minimal/xui/pl/menu_imchiclet_p2p.xml new file mode 100644 index 0000000000..8924d6db3e --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_imchiclet_p2p.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="IMChiclet P2P Menu"> + <menu_item_call label="Zobacz profil" name="Show Profile"/> + <menu_item_call label="Dodaj znajomość" name="Add Friend"/> + <menu_item_call label="Pokaż sesję" name="Send IM"/> + <menu_item_call label="Zakończ rozmowę" name="End Session"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_inspect_avatar_gear.xml b/indra/newview/skins/minimal/xui/pl/menu_inspect_avatar_gear.xml new file mode 100644 index 0000000000..59560f236c --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_inspect_avatar_gear.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<toggleable_menu name="Gear Menu"> + <menu_item_call label="Zobacz profil" name="view_profile"/> + <menu_item_call label="Dodaj znajomość" name="add_friend"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="Zadzwoń" name="call"/> + <menu_item_call label="Teleportuj" name="teleport"/> + <menu_item_call label="Zaproś do grupy" name="invite_to_group"/> + <menu_item_call label="Zablokuj" name="block"/> + <menu_item_call label="Odblokuj" name="unblock"/> + <menu_item_call label="Raport" name="report"/> + <menu_item_call label="Unieruchom" name="freeze"/> + <menu_item_call label="Wyrzuć" name="eject"/> + <menu_item_call label="Kopnij" name="kick"/> + <menu_item_call label="CSR" name="csr"/> + <menu_item_call label="Debugowanie tekstur" name="debug"/> + <menu_item_call label="Znajdź na mapie" name="find_on_map"/> + <menu_item_call label="Przybliż" name="zoom_in"/> + <menu_item_call label="Zapłać" name="pay"/> + <menu_item_call label="Udostępnij" name="share"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_inspect_object_gear.xml b/indra/newview/skins/minimal/xui/pl/menu_inspect_object_gear.xml new file mode 100644 index 0000000000..c12bd490ff --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_inspect_object_gear.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<menu name="Gear Menu"> + <menu_item_call label="Dotknij" name="touch"/> + <menu_item_call label="Usiądź" name="sit"/> + <menu_item_call label="Zapłać" name="pay"/> + <menu_item_call label="Kup" name="buy"/> + <menu_item_call label="Weź" name="take"/> + <menu_item_call label="Weź kopię" name="take_copy"/> + <menu_item_call label="Otwórz" name="open"/> + <menu_item_call label="Edytuj" name="edit"/> + <menu_item_call label="Ubierz" name="wear"/> + <menu_item_call label="Dodaj" name="add"/> + <menu_item_call label="Raport" name="report"/> + <menu_item_call label="Zablokuj" name="block"/> + <menu_item_call label="Przybliż" name="zoom_in"/> + <menu_item_call label="Usuń" name="remove"/> + <menu_item_call label="Więcej informacji" name="more_info"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_inspect_self_gear.xml b/indra/newview/skins/minimal/xui/pl/menu_inspect_self_gear.xml new file mode 100644 index 0000000000..c4ef9761d9 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_inspect_self_gear.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Gear Menu"> + <menu_item_call label="Usiądź tutaj" name="Sit Down Here"/> + <menu_item_call label="Wstań" name="Stand Up"/> + <context_menu label="Zdejmij" name="Take Off >"> + <context_menu label="Ubranie" name="Clothes >"> + <menu_item_call label="Bluzka" name="Shirt"/> + <menu_item_call label="Spodnie" name="Pants"/> + <menu_item_call label="Spódnica" name="Skirt"/> + <menu_item_call label="Buty" name="Shoes"/> + <menu_item_call label="Skarpetki" name="Socks"/> + <menu_item_call label="Kurtka" name="Jacket"/> + <menu_item_call label="Rękawiczki" name="Gloves"/> + <menu_item_call label="Podkoszulek" name="Self Undershirt"/> + <menu_item_call label="Bielizna" name="Self Underpants"/> + <menu_item_call label="Tatuaż" name="Self Tattoo"/> + <menu_item_call label="Alpha" name="Self Alpha"/> + <menu_item_call label="Ubranie" name="All Clothes"/> + </context_menu> + <context_menu label="HUD" name="Object Detach HUD"/> + <context_menu label="Odłącz" name="Object Detach"/> + <menu_item_call label="Odłącz wszystko" name="Detach All"/> + </context_menu> + <menu_item_call label="Zmień strój" name="Chenge Outfit"/> + <menu_item_call label="Edytuj mój strój" name="Edit Outfit"/> + <menu_item_call label="Edytuj mój kształt" name="Edit My Shape"/> + <menu_item_call label="Znajomi" name="Friends..."/> + <menu_item_call label="Moje grupy" name="Groups..."/> + <menu_item_call label="Mój profil" name="Profile..."/> + <menu_item_call label="Debugowanie tekstur" name="Debug..."/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_inv_offer_chiclet.xml b/indra/newview/skins/minimal/xui/pl/menu_inv_offer_chiclet.xml new file mode 100644 index 0000000000..5ef0f2f7a4 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_inv_offer_chiclet.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="InvOfferChiclet Menu"> + <menu_item_call label="Zamknij" name="Close"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_inventory.xml b/indra/newview/skins/minimal/xui/pl/menu_inventory.xml new file mode 100644 index 0000000000..e47ffa0e18 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_inventory.xml @@ -0,0 +1,84 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="Udostępnij" name="Share"/> + <menu_item_call label="Kupuj" name="Task Buy"/> + <menu_item_call label="Otwórz" name="Task Open"/> + <menu_item_call label="Odtwarzaj" name="Task Play"/> + <menu_item_call label="Właściwości" name="Task Properties"/> + <menu_item_call label="Zmień nazwę" name="Task Rename"/> + <menu_item_call label="Usuń" name="Task Remove"/> + <menu_item_call label="Opróżnij Kosz" name="Empty Trash"/> + <menu_item_call label="Opróżnij Folder Zgubione i odnalezione" name="Empty Lost And Found"/> + <menu_item_call label="Nowy folder" name="New Folder"/> + <menu_item_call label="Nowy skrypt" name="New Script"/> + <menu_item_call label="Nowa nota" name="New Note"/> + <menu_item_call label="Nowa gesturka" name="New Gesture"/> + <menu label="Nowe Ubranie" name="New Clothes"> + <menu_item_call label="Nowa koszula" name="New Shirt"/> + <menu_item_call label="Nowe spodnie" name="New Pants"/> + <menu_item_call label="Nowe buty" name="New Shoes"/> + <menu_item_call label="Nowe skarpety" name="New Socks"/> + <menu_item_call label="Nowa kurtka" name="New Jacket"/> + <menu_item_call label="Nowa spódnica" name="New Skirt"/> + <menu_item_call label="Nowe rękawiczki" name="New Gloves"/> + <menu_item_call label="Nowy podkoszulek" name="New Undershirt"/> + <menu_item_call label="Nowa bielizna" name="New Underpants"/> + <menu_item_call label="Nowa maska alpha" name="New Alpha Mask"/> + <menu_item_call label="Nowy tatuaż" name="New Tattoo"/> + </menu> + <menu label="Nowa Część Ciała" name="New Body Parts"> + <menu_item_call label="Nowy kształt" name="New Shape"/> + <menu_item_call label="Nowa skórka" name="New Skin"/> + <menu_item_call label="Nowe włosy" name="New Hair"/> + <menu_item_call label="Nowe oczy" name="New Eyes"/> + </menu> + <menu label="Zmień Czcionkę" name="Change Type"> + <menu_item_call label="Domyślna" name="Default"/> + <menu_item_call label="Rękawiczki" name="Gloves"/> + <menu_item_call label="Kurtka" name="Jacket"/> + <menu_item_call label="Spodnie" name="Pants"/> + <menu_item_call label="Kształt" name="Shape"/> + <menu_item_call label="Buty" name="Shoes"/> + <menu_item_call label="Koszula" name="Shirt"/> + <menu_item_call label="Spódnica" name="Skirt"/> + <menu_item_call label="Bielizna" name="Underpants"/> + <menu_item_call label="Podkoszulek" name="Undershirt"/> + </menu> + <menu_item_call label="Teleportuj" name="Landmark Open"/> + <menu_item_call label="Otwórz" name="Animation Open"/> + <menu_item_call label="Otwórz" name="Sound Open"/> + <menu_item_call label="Zmień strój" name="Replace Outfit"/> + <menu_item_call label="Dodaj do stroju" name="Add To Outfit"/> + <menu_item_call label="Usuń obiekt" name="Purge Item"/> + <menu_item_call label="Przywróć obiekt" name="Restore Item"/> + <menu_item_call label="Otwórz" name="Open"/> + <menu_item_call label="Otwórz oryginalne" name="Open Original"/> + <menu_item_call label="Właściwości" name="Properties"/> + <menu_item_call label="Zmień nazwę" name="Rename"/> + <menu_item_call label="Kopiuj dane UUID" name="Copy Asset UUID"/> + <menu_item_call label="Kopiuj" name="Copy"/> + <menu_item_call label="Wklej" name="Paste"/> + <menu_item_call label="Wklej jako link" name="Paste As Link"/> + <menu_item_call label="Usuń" name="Remove Link"/> + <menu_item_call label="Usuń" name="Delete"/> + <menu_item_call label="Skasuj folder systemu" name="Delete System Folder"/> + <menu_item_call label="Rozpocznij konferencję czatową" name="Conference Chat Folder"/> + <menu_item_call label="Odtwarzaj" name="Sound Play"/> + <menu_item_call label="O Miejscu" name="About Landmark"/> + <menu_item_call label="Używaj in-world" name="Animation Play"/> + <menu_item_call label="Odtwarzaj lokalnie" name="Animation Audition"/> + <menu_item_call label="Wyślij IM" name="Send Instant Message"/> + <menu_item_call label="Teleportuj..." name="Offer Teleport..."/> + <menu_item_call label="Rozpocznij konferencję czatową" name="Conference Chat"/> + <menu_item_call label="Aktywuj" name="Activate"/> + <menu_item_call label="Deaktywuj" name="Deactivate"/> + <menu_item_call label="Zapisz jako" name="Save As"/> + <menu_item_call label="Odłącz od siebie" name="Detach From Yourself"/> + <menu_item_call label="Załóż" name="Wearable And Object Wear"/> + <menu label="Dołącz do" name="Attach To"/> + <menu label="Dołącz do załączników HUD" name="Attach To HUD"/> + <menu_item_call label="Edytuj" name="Wearable Edit"/> + <menu_item_call label="Dodaj" name="Wearable Add"/> + <menu_item_call label="Zdejmij" name="Take Off"/> + <menu_item_call label="--brak opcji--" name="--no options--"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_inventory_add.xml b/indra/newview/skins/minimal/xui/pl/menu_inventory_add.xml new file mode 100644 index 0000000000..4a56586aaf --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_inventory_add.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_inventory_add"> + <menu label="Załaduj" name="upload"> + <menu_item_call label="obraz (L$[COST])..." name="Upload Image"/> + <menu_item_call label="dźwięk (L$[COST])..." name="Upload Sound"/> + <menu_item_call label="animację (L$[COST])..." name="Upload Animation"/> + <menu_item_call label="zbiór plików (L$[COST] za jeden plik)..." name="Bulk Upload"/> + <menu_item_call label="Ustaw domyślne pozwolenia ładowania" name="perm prefs"/> + </menu> + <menu_item_call label="Nowy folder" name="New Folder"/> + <menu_item_call label="Nowy skrypt" name="New Script"/> + <menu_item_call label="Nowa nota" name="New Note"/> + <menu_item_call label="Nowa gesturka" name="New Gesture"/> + <menu label="Nowe Ubranie" name="New Clothes"> + <menu_item_call label="Nowa koszula" name="New Shirt"/> + <menu_item_call label="Nowe spodnie" name="New Pants"/> + <menu_item_call label="Nowe buty" name="New Shoes"/> + <menu_item_call label="Nowe skarpetki" name="New Socks"/> + <menu_item_call label="Nowa kurtka" name="New Jacket"/> + <menu_item_call label="Nowa spódnica" name="New Skirt"/> + <menu_item_call label="Nowe rękawiczki" name="New Gloves"/> + <menu_item_call label="Nowy podkoszulek" name="New Undershirt"/> + <menu_item_call label="Nowa bielizna" name="New Underpants"/> + <menu_item_call label="Nowa maska alpha" name="New Alpha"/> + <menu_item_call label="Nowy tatuaż" name="New Tattoo"/> + </menu> + <menu label="Nowa Część Ciała" name="New Body Parts"> + <menu_item_call label="Nowy kształt" name="New Shape"/> + <menu_item_call label="Nowa skórka" name="New Skin"/> + <menu_item_call label="Nowe włosy" name="New Hair"/> + <menu_item_call label="Nowe oczy" name="New Eyes"/> + </menu> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_inventory_gear_default.xml b/indra/newview/skins/minimal/xui/pl/menu_inventory_gear_default.xml new file mode 100644 index 0000000000..591c3a81d5 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_inventory_gear_default.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_gear_default"> + <menu_item_call label="Nowe okno Szafy" name="new_window"/> + <menu_item_check label="Porządkuj według nazwy" name="sort_by_name"/> + <menu_item_check label="Porządkuj według daty" name="sort_by_recent"/> + <menu_item_check label="Sortuj foldery zawsze według nazwy" name="sort_folders_by_name"/> + <menu_item_check label="Posortuj foldery systemowe od góry" name="sort_system_folders_to_top"/> + <menu_item_call label="Pokaż filtry" name="show_filters"/> + <menu_item_call label="Zresetuj filtry" name="reset_filters"/> + <menu_item_call label="Zamknij wszystkie foldery" name="close_folders"/> + <menu_item_call label="Opróżnij Zagubione i odnalezione" name="empty_lostnfound"/> + <menu_item_call label="Zapisz teksturę jako" name="Save Texture As"/> + <menu_item_call label="Udostępnij" name="Share"/> + <menu_item_call label="Znajdź oryginał" name="Find Original"/> + <menu_item_call label="Znajdź wszystkie linki" name="Find All Links"/> + <menu_item_call label="Opróżnij Kosz" name="empty_trash"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_land.xml b/indra/newview/skins/minimal/xui/pl/menu_land.xml new file mode 100644 index 0000000000..cbfecaee56 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_land.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Land Pie"> + <menu_item_call label="O Posiadłości" name="Place Information..."/> + <menu_item_call label="Usiądź tutaj" name="Sit Here"/> + <menu_item_call label="Kup posiadłość" name="Land Buy"/> + <menu_item_call label="Kup przepustkę" name="Land Buy Pass"/> + <menu_item_call label="Buduj" name="Create"/> + <menu_item_call label="Edytuj teren" name="Edit Terrain"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_landmark.xml b/indra/newview/skins/minimal/xui/pl/menu_landmark.xml new file mode 100644 index 0000000000..aa5808390c --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_landmark.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="landmark_overflow_menu"> + <menu_item_call label="Kopiuj SLurl" name="copy"/> + <menu_item_call label="Usuń" name="delete"/> + <menu_item_call label="Utwórz" name="pick"/> + <menu_item_call label="Dodaj do paska Ulubionych" name="add_to_favbar"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_login.xml b/indra/newview/skins/minimal/xui/pl/menu_login.xml new file mode 100644 index 0000000000..e50b694641 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_login.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu_bar name="Login Menu"> + <menu label="Ja" name="File"> + <menu_item_call label="Ustawienia" name="Preferences..."/> + <menu_item_call label="Wyłącz [APP_NAME]" name="Quit"/> + </menu> + <menu label="Pomoc" name="Help"> + <menu_item_call label="[SECOND_LIFE]: Pomoc" name="Second Life Help"/> + <menu_item_call label="O [APP_NAME]" name="About Second Life"/> + </menu> + <menu_item_check label="Pokaż ustawienia debugowania" name="Show Debug Menu"/> + <menu label="Debug" name="Debug"> + <menu_item_call label="Ustawienia debugowania" name="Debug Settings"/> + <menu_item_call label="Ustawienia UI/kolor" name="UI/Color Settings"/> + <menu label="UI Testy" name="UI Tests"/> + <menu_item_call label="Ustaw rozmiar interfejsu..." name="Set Window Size..."/> + <menu_item_call label="Wyświetl TOS" name="TOS"/> + <menu_item_call label="Wyświetl wiadomość krytyczną" name="Critical"/> + <menu_item_call label="Test przeglądarki mediów" name="Web Browser Test"/> + <menu_item_call label="Test zawartości strony" name="Web Content Floater Test"/> + <menu_item_check label="Pokaż siatkę" name="Show Grid Picker"/> + <menu_item_call label="Pokaż konsolę Zawiadomień" name="Show Notifications Console"/> + </menu> +</menu_bar> diff --git a/indra/newview/skins/minimal/xui/pl/menu_mini_map.xml b/indra/newview/skins/minimal/xui/pl/menu_mini_map.xml new file mode 100644 index 0000000000..8f86965416 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_mini_map.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="Zoom blisko" name="Zoom Close"/> + <menu_item_call label="Zoom średnio" name="Zoom Medium"/> + <menu_item_call label="Zoom daleko" name="Zoom Far"/> + <menu_item_call label="Zoom domyślny" name="Zoom Default"/> + <menu_item_check label="Obróć mapę" name="Rotate Map"/> + <menu_item_check label="Autocentrowanie" name="Auto Center"/> + <menu_item_call label="Zatrzymaj" name="Stop Tracking"/> + <menu_item_call label="Mapa Świata" name="World Map"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_navbar.xml b/indra/newview/skins/minimal/xui/pl/menu_navbar.xml new file mode 100644 index 0000000000..1d434670ee --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_navbar.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Navbar Menu"> + <menu_item_check label="Pokaż współrzędne" name="Show Coordinates"/> + <menu_item_check label="Pokaż właściwości posiadłości" name="Show Parcel Properties"/> + <menu_item_call label="Landmark" name="Landmark"/> + <menu_item_call label="Wytnij" name="Cut"/> + <menu_item_call label="Kopiuj" name="Copy"/> + <menu_item_call label="Wklej" name="Paste"/> + <menu_item_call label="Usuń" name="Delete"/> + <menu_item_call label="Zaznacz wszystko" name="Select All"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_nearby_chat.xml b/indra/newview/skins/minimal/xui/pl/menu_nearby_chat.xml new file mode 100644 index 0000000000..fe5bc6ba6f --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_nearby_chat.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="NearBy Chat Menu"> + <menu_item_call label="Pokaż osoby w pobliżu..." name="nearby_people"/> + <menu_item_check label="Pokaż zablokowany tekst" name="muted_text"/> + <menu_item_check label="Wyświetlaj ikonki znajomych" name="show_buddy_icons"/> + <menu_item_check label="Wyświetlaj imiona" name="show_names"/> + <menu_item_check label="Wyświetlaj ikonki i imiona" name="show_icons_and_names"/> + <menu_item_call label="Rozmiar czcionki" name="font_size"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_notification_well_button.xml b/indra/newview/skins/minimal/xui/pl/menu_notification_well_button.xml new file mode 100644 index 0000000000..bd3d42f9b1 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_notification_well_button.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Notification Well Button Context Menu"> + <menu_item_call label="Zamknij" name="Close All"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_object.xml b/indra/newview/skins/minimal/xui/pl/menu_object.xml new file mode 100644 index 0000000000..3da6c5c890 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_object.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Object Pie"> + <menu_item_call label="Dotknij" name="Object Touch"> + <menu_item_call.on_enable name="EnableTouch" parameter="Dotknij"/> + </menu_item_call> + <menu_item_call label="Edytuj" name="Edit..."/> + <menu_item_call label="Buduj" name="Build"/> + <menu_item_call label="Otwórz" name="Open"/> + <menu_item_call label="Usiądź tutaj" name="Object Sit"/> + <menu_item_call label="Wstań" name="Object Stand Up"/> + <menu_item_call label="Sprawdź" name="Object Inspect"/> + <menu_item_call label="Przybliż" name="Zoom In"/> + <context_menu label="Załóż na" name="Put On"> + <menu_item_call label="Załóż" name="Wear"/> + <menu_item_call label="Dodaj" name="Add"/> + <context_menu label="Dołącz" name="Object Attach"/> + <context_menu label="Dołącz HUD" name="Object Attach HUD"/> + </context_menu> + <context_menu label="Zarządzaj" name="Remove"> + <menu_item_call label="Raport" name="Report Abuse..."/> + <menu_item_call label="Zablokuj" name="Object Mute"/> + <menu_item_call label="Zwróć" name="Return..."/> + </context_menu> + <menu_item_call label="Weź" name="Pie Object Take"/> + <menu_item_call label="Weź kopię" name="Take Copy"/> + <menu_item_call label="Zapłać" name="Pay..."/> + <menu_item_call label="Kup" name="Buy..."/> + <menu_item_call label="Skasuj" name="Delete"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_object_icon.xml b/indra/newview/skins/minimal/xui/pl/menu_object_icon.xml new file mode 100644 index 0000000000..b499bca2db --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_object_icon.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Object Icon Menu"> + <menu_item_call label="Sprawdź..." name="Object Profile"/> + <menu_item_call label="Zablokuj..." name="Block"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_outfit_gear.xml b/indra/newview/skins/minimal/xui/pl/menu_outfit_gear.xml new file mode 100644 index 0000000000..1a70e76ec7 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_outfit_gear.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Gear Outfit"> + <menu_item_call label="Załóż - Zastąp obecny strój" name="wear"/> + <menu_item_call label="Załóż - Dodaj do bieżącego stroju" name="wear_add"/> + <menu_item_call label="Zdejmij - Usuń z obecnego stroju" name="take_off"/> + <menu label="Nowe ubranie" name="New Clothes"> + <menu_item_call label="Nowa koszula" name="New Shirt"/> + <menu_item_call label="Nowe spodnie" name="New Pants"/> + <menu_item_call label="Nowe buty" name="New Shoes"/> + <menu_item_call label="Nowe skarpetki" name="New Socks"/> + <menu_item_call label="Nowa kurtka" name="New Jacket"/> + <menu_item_call label="Nowa spódnica" name="New Skirt"/> + <menu_item_call label="Nowe rękawiczki" name="New Gloves"/> + <menu_item_call label="Nowa podkoszulka" name="New Undershirt"/> + <menu_item_call label="Nowa bielizna" name="New Underpants"/> + <menu_item_call label="Nowa maska alpha" name="New Alpha"/> + <menu_item_call label="Nowy tatuaż" name="New Tattoo"/> + </menu> + <menu label="Nowe części ciała" name="New Body Parts"> + <menu_item_call label="Nowy kształt" name="New Shape"/> + <menu_item_call label="Nowa skórka" name="New Skin"/> + <menu_item_call label="Nowe włosy" name="New Hair"/> + <menu_item_call label="Nowe oczy" name="New Eyes"/> + </menu> + <menu_item_call label="Zmień nazwę stroju" name="rename"/> + <menu_item_call label="Usuń strój" name="delete_outfit"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_outfit_tab.xml b/indra/newview/skins/minimal/xui/pl/menu_outfit_tab.xml new file mode 100644 index 0000000000..998e25f38e --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_outfit_tab.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Outfit"> + <menu_item_call label="Załóż - Zastąp obecny strój" name="wear_replace"/> + <menu_item_call label="Załóż - Dodaj do obecnego stroju" name="wear_add"/> + <menu_item_call label="Zdejmij - Usuń z obecnego stroju" name="take_off"/> + <menu_item_call label="Edytuj strój" name="edit"/> + <menu_item_call label="Zmień nazwę stroju" name="rename"/> + <menu_item_call label="Usuń strój" name="delete"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_participant_list.xml b/indra/newview/skins/minimal/xui/pl/menu_participant_list.xml new file mode 100644 index 0000000000..9e59102788 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_participant_list.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Participant List Context Menu"> + <menu_item_check label="Sortuj według imienia" name="SortByName"/> + <menu_item_check label="Sortuj według ostatniego mówcy" name="SortByRecentSpeakers"/> + <menu_item_call label="Zobacz profil" name="View Profile"/> + <menu_item_call label="Dodaj znajomość" name="Add Friend"/> + <menu_item_call label="IM" name="IM"/> + <menu_item_call label="Zadzwoń" name="Call"/> + <menu_item_call label="Udostępnij" name="Share"/> + <menu_item_call label="Zapłać" name="Pay"/> + <menu_item_check label="Przeglądaj ikonki" name="View Icons"/> + <menu_item_check label="Zablokuj głos" name="Block/Unblock"/> + <menu_item_check label="Zablokuj tekst" name="MuteText"/> + <context_menu label="Opcje Moderatora" name="Moderator Options"> + <menu_item_check label="Czat/IM dozwolony" name="AllowTextChat"/> + <menu_item_call label="Wycisz tego uczestnika" name="ModerateVoiceMuteSelected"/> + <menu_item_call label="Odblokuj wyciszenie tego uczestnika" name="ModerateVoiceUnMuteSelected"/> + <menu_item_call label="Wycisz wszystkich" name="ModerateVoiceMute"/> + <menu_item_call label="Cofnij wyciszenie wszystkim" name="ModerateVoiceUnmute"/> + </context_menu> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_people_friends_view_sort.xml b/indra/newview/skins/minimal/xui/pl/menu_people_friends_view_sort.xml new file mode 100644 index 0000000000..b62b85d30a --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_people_friends_view_sort.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_check label="Porządkuj według nazwy" name="sort_name"/> + <menu_item_check label="Porządkuj według statusu" name="sort_status"/> + <menu_item_check label="Wyświetlaj ikonki" name="view_icons"/> + <menu_item_check label="Zobacz udzielone prawa" name="view_permissions"/> + <menu_item_call label="Pokaż zablokowanych Rezydentów & obiekty" name="show_blocked_list"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_people_groups.xml b/indra/newview/skins/minimal/xui/pl/menu_people_groups.xml new file mode 100644 index 0000000000..ace5ebf888 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_people_groups.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_call label="Zobacz info" name="View Info"/> + <menu_item_call label="Czat" name="Chat"/> + <menu_item_call label="Rozmowa" name="Call"/> + <menu_item_call label="Aktywuj" name="Activate"/> + <menu_item_call label="Opuść" name="Leave"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_people_groups_view_sort.xml b/indra/newview/skins/minimal/xui/pl/menu_people_groups_view_sort.xml new file mode 100644 index 0000000000..c70ea2315f --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_people_groups_view_sort.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_check label="Wyświetlaj ikonki grupy" name="Display Group Icons"/> + <menu_item_call label="Opuść zaznaczone grupy" name="Leave Selected Group"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_people_nearby.xml b/indra/newview/skins/minimal/xui/pl/menu_people_nearby.xml new file mode 100644 index 0000000000..0111e0fd51 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_people_nearby.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Avatar Context Menu"> + <menu_item_call label="Zobacz profil" name="View Profile"/> + <menu_item_call label="Dodaj do znajomych" name="Add Friend"/> + <menu_item_call label="Usuń z listy znajomych" name="Remove Friend"/> + <menu_item_call label="IM" name="IM"/> + <menu_item_call label="Zadzwoń" name="Call"/> + <menu_item_call label="Mapa" name="Map"/> + <menu_item_call label="Udostępnij" name="Share"/> + <menu_item_call label="Zapłać" name="Pay"/> + <menu_item_check label="Zablokuj/Odblokuj" name="Block/Unblock"/> + <menu_item_call label="Teleportuj" name="teleport"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_people_nearby_multiselect.xml b/indra/newview/skins/minimal/xui/pl/menu_people_nearby_multiselect.xml new file mode 100644 index 0000000000..dcfc48fb60 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_people_nearby_multiselect.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Multi-Selected People Context Menu"> + <menu_item_call label="Dodaj znajomych" name="Add Friends"/> + <menu_item_call label="Usuń znajomych" name="Remove Friend"/> + <menu_item_call label="IM" name="IM"/> + <menu_item_call label="Zadzwoń" name="Call"/> + <menu_item_call label="Udostępnij" name="Share"/> + <menu_item_call label="Zapłać" name="Pay"/> + <menu_item_call label="Teleportuj" name="teleport"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_people_nearby_view_sort.xml b/indra/newview/skins/minimal/xui/pl/menu_people_nearby_view_sort.xml new file mode 100644 index 0000000000..8ec3820f84 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_people_nearby_view_sort.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_check label="Porządkuj według ostatnich rozmówców" name="sort_by_recent_speakers"/> + <menu_item_check label="Porządkuj według nazwy" name="sort_name"/> + <menu_item_check label="Porządkuj według odległości" name="sort_distance"/> + <menu_item_check label="Wyświetlaj ikonki" name="view_icons"/> + <menu_item_call label="Pokaż zablokowanych Rezydentów & obiekty" name="show_blocked_list"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_people_recent_view_sort.xml b/indra/newview/skins/minimal/xui/pl/menu_people_recent_view_sort.xml new file mode 100644 index 0000000000..b474a556bd --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_people_recent_view_sort.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_check label="Porządkuj według daty" name="sort_most"/> + <menu_item_check label="Porządkuj według nazwy" name="sort_name"/> + <menu_item_check label="Wyświetlaj ikonki" name="view_icons"/> + <menu_item_call label="Pokaż zablokowanych Rezydentów & obiekty" name="show_blocked_list"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_picks.xml b/indra/newview/skins/minimal/xui/pl/menu_picks.xml new file mode 100644 index 0000000000..6f6e4b7fa8 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_picks.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Picks"> + <menu_item_call label="Info" name="pick_info"/> + <menu_item_call label="Edytuj" name="pick_edit"/> + <menu_item_call label="Teleportuj" name="pick_teleport"/> + <menu_item_call label="Mapa" name="pick_map"/> + <menu_item_call label="Usuń" name="pick_delete"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_picks_plus.xml b/indra/newview/skins/minimal/xui/pl/menu_picks_plus.xml new file mode 100644 index 0000000000..e9c00f51a9 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_picks_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="picks_plus_menu"> + <menu_item_call label="Stwórz" name="create_pick"/> + <menu_item_call label="Nowa reklama" name="create_classified"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_place.xml b/indra/newview/skins/minimal/xui/pl/menu_place.xml new file mode 100644 index 0000000000..c3b72d6abb --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_place.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="place_overflow_menu"> + <menu_item_call label="Zapisz landmark" name="landmark"/> + <menu_item_call label="Utwórz" name="pick"/> + <menu_item_call label="Kup przepustkę" name="pass"/> + <menu_item_call label="Edytuj" name="edit"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_place_add_button.xml b/indra/newview/skins/minimal/xui/pl/menu_place_add_button.xml new file mode 100644 index 0000000000..3d0c1c87fb --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_place_add_button.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_folder_gear"> + <menu_item_call label="Dodaj folder" name="add_folder"/> + <menu_item_call label="Dodaj do landmarków" name="add_landmark"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_places_gear_folder.xml b/indra/newview/skins/minimal/xui/pl/menu_places_gear_folder.xml new file mode 100644 index 0000000000..d1f283b7aa --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_places_gear_folder.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_folder_gear"> + <menu_item_call label="Dodaj do landmarków" name="add_landmark"/> + <menu_item_call label="Dodaj folder" name="add_folder"/> + <menu_item_call label="Przywróć obiekt" name="restore_item"/> + <menu_item_call label="Wytnij" name="cut"/> + <menu_item_call label="Kopiuj" name="copy_folder"/> + <menu_item_call label="Wklej" name="paste"/> + <menu_item_call label="Zmień nazwę" name="rename"/> + <menu_item_call label="Usuń" name="delete"/> + <menu_item_call label="Rozwiń" name="expand"/> + <menu_item_call label="Schowaj" name="collapse"/> + <menu_item_call label="Rozwiń wszystkie foldery" name="expand_all"/> + <menu_item_call label="Schowaj wszystkie foldery" name="collapse_all"/> + <menu_item_check label="Sortuj według daty" name="sort_by_date"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_places_gear_landmark.xml b/indra/newview/skins/minimal/xui/pl/menu_places_gear_landmark.xml new file mode 100644 index 0000000000..0139d3a987 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_places_gear_landmark.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_ladmark_gear"> + <menu_item_call label="Teleportuj" name="teleport"/> + <menu_item_call label="Więcej informacji" name="more_info"/> + <menu_item_call label="Pokaż na mapie" name="show_on_map"/> + <menu_item_call label="Dodaj do landmarków" name="add_landmark"/> + <menu_item_call label="Dodaj folder" name="add_folder"/> + <menu_item_call label="Przywróć obiekt" name="restore_item"/> + <menu_item_call label="Wytnij" name="cut"/> + <menu_item_call label="Kopiuj landmark" name="copy_landmark"/> + <menu_item_call label="Kopiuj SLurl" name="copy_slurl"/> + <menu_item_call label="Wklej" name="paste"/> + <menu_item_call label="Zmień nazwę" name="rename"/> + <menu_item_call label="Usuń" name="delete"/> + <menu_item_call label="Rozwiń wszystkie foldery" name="expand_all"/> + <menu_item_call label="Schowaj wszystkie foldery" name="collapse_all"/> + <menu_item_check label="Sortuj według daty" name="sort_by_date"/> + <menu_item_call label="Stwórz Ulubione" name="create_pick"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_profile_overflow.xml b/indra/newview/skins/minimal/xui/pl/menu_profile_overflow.xml new file mode 100644 index 0000000000..ef836c8ecf --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_profile_overflow.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="profile_overflow_menu"> + <menu_item_call label="Mapa" name="show_on_map"/> + <menu_item_call label="Zapłać" name="pay"/> + <menu_item_call label="Udostępnij" name="share"/> + <menu_item_call label="Zablokuj" name="block"/> + <menu_item_call label="Odblokuj" name="unblock"/> + <menu_item_call label="Wyrzuć" name="kick"/> + <menu_item_call label="Unieruchom" name="freeze"/> + <menu_item_call label="Uruchom" name="unfreeze"/> + <menu_item_call label="CSR" name="csr"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_save_outfit.xml b/indra/newview/skins/minimal/xui/pl/menu_save_outfit.xml new file mode 100644 index 0000000000..4bc65eca38 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_save_outfit.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="save_outfit_menu"> + <menu_item_call label="Zapisz" name="save_outfit"/> + <menu_item_call label="Zapisz jako" name="save_as_new_outfit"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_script_chiclet.xml b/indra/newview/skins/minimal/xui/pl/menu_script_chiclet.xml new file mode 100644 index 0000000000..256500a402 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_script_chiclet.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="ScriptChiclet Menu"> + <menu_item_call label="Zamknij" name="Close"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_slurl.xml b/indra/newview/skins/minimal/xui/pl/menu_slurl.xml new file mode 100644 index 0000000000..862f538aa7 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_slurl.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="O miejscu" name="about_url"/> + <menu_item_call label="Teleportuj do miejsca" name="teleport_to_url"/> + <menu_item_call label="Mapa" name="show_on_map"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_teleport_history_gear.xml b/indra/newview/skins/minimal/xui/pl/menu_teleport_history_gear.xml new file mode 100644 index 0000000000..0e58592d46 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_teleport_history_gear.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Teleport History Gear Context Menu"> + <menu_item_call label="Rozwiń wszystkie foldery" name="Expand all folders"/> + <menu_item_call label="Schowaj wszystkie foldery" name="Collapse all folders"/> + <menu_item_call label="Wyczyść historię teleportacji" name="Clear Teleport History"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_teleport_history_item.xml b/indra/newview/skins/minimal/xui/pl/menu_teleport_history_item.xml new file mode 100644 index 0000000000..cd36c116b0 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_teleport_history_item.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Teleport History Item Context Menu"> + <menu_item_call label="Teleportuj" name="Teleport"/> + <menu_item_call label="Więcej szczegółów" name="More Information"/> + <menu_item_call label="Kopiuj do schowka" name="CopyToClipboard"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_teleport_history_tab.xml b/indra/newview/skins/minimal/xui/pl/menu_teleport_history_tab.xml new file mode 100644 index 0000000000..b12df08d6a --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_teleport_history_tab.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Teleport History Item Context Menu"> + <menu_item_call label="Otwórz" name="TabOpen"/> + <menu_item_call label="Zamknij" name="TabClose"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_text_editor.xml b/indra/newview/skins/minimal/xui/pl/menu_text_editor.xml new file mode 100644 index 0000000000..812f87bc1a --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_text_editor.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Text editor context menu"> + <menu_item_call label="Wytnij" name="Cut"/> + <menu_item_call label="Kopiuj" name="Copy"/> + <menu_item_call label="Wklej" name="Paste"/> + <menu_item_call label="Usuń" name="Delete"/> + <menu_item_call label="Zaznacz wszystko" name="Select All"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_topinfobar.xml b/indra/newview/skins/minimal/xui/pl/menu_topinfobar.xml new file mode 100644 index 0000000000..53536c8f1c --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_topinfobar.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_topinfobar"> + <menu_item_check label="Pokaż współprzędne" name="Show Coordinates"/> + <menu_item_check label="Pokaż O Posiadłości" name="Show Parcel Properties"/> + <menu_item_call label="Landmark" name="Landmark"/> + <menu_item_call label="Kopiuj" name="Copy"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_agent.xml b/indra/newview/skins/minimal/xui/pl/menu_url_agent.xml new file mode 100644 index 0000000000..db729be725 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_url_agent.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Pokaż profil Rezydenta" name="show_agent"/> + <menu_item_call label="Kopiuj nazwę do schowka" name="url_copy_label"/> + <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_group.xml b/indra/newview/skins/minimal/xui/pl/menu_url_group.xml new file mode 100644 index 0000000000..f340b3296a --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_url_group.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Pokaż szczegóły o grupie" name="show_group"/> + <menu_item_call label="Kopiuj grupę do schowka" name="url_copy_label"/> + <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_http.xml b/indra/newview/skins/minimal/xui/pl/menu_url_http.xml new file mode 100644 index 0000000000..e73f7b6745 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_url_http.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Otwórz przeglądarkę internetową" name="url_open"/> + <menu_item_call label="Otwórz w wewnętrzenej przeglądarce" name="url_open_internal"/> + <menu_item_call label="Otwórz w zewnętrznej przeglądarce" name="url_open_external"/> + <menu_item_call label="Kopiuj URL do schowka" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_inventory.xml b/indra/newview/skins/minimal/xui/pl/menu_url_inventory.xml new file mode 100644 index 0000000000..e36fa0dd2b --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_url_inventory.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Pokaż obiekt w szafie" name="show_item"/> + <menu_item_call label="Kopiuj nazwę do schowka" name="url_copy_label"/> + <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_map.xml b/indra/newview/skins/minimal/xui/pl/menu_url_map.xml new file mode 100644 index 0000000000..179ab1f676 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_url_map.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Pokaż na mapie" name="show_on_map"/> + <menu_item_call label="Teleportuj do miejsca" name="teleport_to_location"/> + <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_objectim.xml b/indra/newview/skins/minimal/xui/pl/menu_url_objectim.xml new file mode 100644 index 0000000000..7576208a9e --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_url_objectim.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Pokaż szczegóły o obiekcie" name="show_object"/> + <menu_item_call label="Pokaż na mapie" name="show_on_map"/> + <menu_item_call label="Teleportuj to miejsca obiektu" name="teleport_to_object"/> + <menu_item_call label="Kopiuj nazwę obiektu do schowka" name="url_copy_label"/> + <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_parcel.xml b/indra/newview/skins/minimal/xui/pl/menu_url_parcel.xml new file mode 100644 index 0000000000..1b8dd62137 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_url_parcel.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Pokaż szczegóły o miejscu" name="show_parcel"/> + <menu_item_call label="Pokaż na mapie" name="show_on_map"/> + <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_slapp.xml b/indra/newview/skins/minimal/xui/pl/menu_url_slapp.xml new file mode 100644 index 0000000000..eb83245c48 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_url_slapp.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Uruchom tę komendę" name="run_slapp"/> + <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_slurl.xml b/indra/newview/skins/minimal/xui/pl/menu_url_slurl.xml new file mode 100644 index 0000000000..4d4a5b4c4d --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_url_slurl.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Pokaż szczegóły o miejscu" name="show_place"/> + <menu_item_call label="Pokaż na mapie" name="show_on_map"/> + <menu_item_call label="Teleportuj do miejsca" name="teleport_to_location"/> + <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_teleport.xml b/indra/newview/skins/minimal/xui/pl/menu_url_teleport.xml new file mode 100644 index 0000000000..e225546930 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_url_teleport.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Teleportuj do tego miejsca" name="teleport"/> + <menu_item_call label="Pokaż na mapie" name="show_on_map"/> + <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_viewer.xml b/indra/newview/skins/minimal/xui/pl/menu_viewer.xml new file mode 100644 index 0000000000..0196dc8613 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_viewer.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu_bar name="Main Menu"> + <menu label="Pomoc" name="Help"> + <menu_item_call label="[SECOND_LIFE] Portal Pomocy" name="Second Life Help"/> + </menu> + <menu label="Zaawansowane" name="Advanced"> + <menu label="Skróty" name="Shortcuts"> + <menu_item_check label="Zacznij latać" name="Fly"/> + <menu_item_call label="Zamknij okno" name="Close Window"/> + <menu_item_call label="Zamknij wszystkie okna" name="Close All Windows"/> + <menu_item_call label="Reset widoku" name="Reset View"/> + </menu> + </menu> +</menu_bar> diff --git a/indra/newview/skins/minimal/xui/pl/menu_wearable_list_item.xml b/indra/newview/skins/minimal/xui/pl/menu_wearable_list_item.xml new file mode 100644 index 0000000000..bf85246be8 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_wearable_list_item.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Outfit Wearable Context Menu"> + <menu_item_call label="Zastąp" name="wear_replace"/> + <menu_item_call label="Załóż" name="wear_wear"/> + <menu_item_call label="Dodaj" name="wear_add"/> + <menu_item_call label="Zdejmij/Odłącz" name="take_off_or_detach"/> + <menu_item_call label="Odłącz" name="detach"/> + <context_menu label="Dołącz do" name="wearable_attach_to"/> + <context_menu label="Dołącz do załączników HUD" name="wearable_attach_to_hud"/> + <menu_item_call label="Zdejmij" name="take_off"/> + <menu_item_call label="Edytuj" name="edit"/> + <menu_item_call label="Profil obiektu" name="object_profile"/> + <menu_item_call label="Pokaż oryginalny" name="show_original"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_wearing_gear.xml b/indra/newview/skins/minimal/xui/pl/menu_wearing_gear.xml new file mode 100644 index 0000000000..47cafdbd99 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_wearing_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Gear Wearing"> + <menu_item_call label="Edytuj strój" name="edit"/> + <menu_item_call label="Zdejmij" name="takeoff"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_wearing_tab.xml b/indra/newview/skins/minimal/xui/pl/menu_wearing_tab.xml new file mode 100644 index 0000000000..7531437043 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_wearing_tab.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Wearing"> + <menu_item_call label="Zdejmij" name="take_off"/> + <menu_item_call label="Odłącz" name="detach"/> + <menu_item_call label="Edytuj strój" name="edit"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/notifications.xml b/indra/newview/skins/minimal/xui/pl/notifications.xml new file mode 100644 index 0000000000..6e62478ed0 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/notifications.xml @@ -0,0 +1,2907 @@ +<?xml version="1.0" encoding="utf-8"?> +<notifications> + <global name="skipnexttime"> + Nie pokazuj tej opcji następnym razem + </global> + <global name="alwayschoose"> + Pozwalaj na wybór tej opcji + </global> + <global name="implicitclosebutton"> + Zamknij + </global> + <template name="okbutton"> + <form> + <button name="OK_okbutton" text="$yestext"/> + </form> + </template> + <template name="okignore"> + <form> + <button name="OK_okignore" text="$yestext"/> + </form> + </template> + <template name="okcancelbuttons"> + <form> + <button name="OK_okcancelbuttons" text="$yestext"/> + <button name="Cancel_okcancelbuttons" text="$notext"/> + </form> + </template> + <template name="okcancelignore"> + <form> + <button name="OK_okcancelignore" text="$yestext"/> + <button name="Cancel_okcancelignore" text="$canceltext"/> + </form> + </template> + <template name="okhelpbuttons"> + <form> + <button name="OK_okhelpbuttons" text="$yestext"/> + <button name="Help" text="$helptext"/> + </form> + </template> + <template name="yesnocancelbuttons"> + <form> + <button name="Yes" text="$yestext"/> + <button name="No" text="$notext"/> + <button name="Cancel_yesnocancelbuttons" text="$canceltext"/> + </form> + </template> + <notification functor="GenericAcknowledge" label="Nieznany rodzaj komunikatu" name="MissingAlert"> + Twoja wersja klienta [APP_NAME] nie może wyświetlić odebranej wiadomości. Upewnij się, że posiadasz najnowszą wersję klienta. + +Szczegóły błędu: Błąd o nazwie '[_NAME]' nie został odnaleziony w pliku notifications.xml. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="FloaterNotFound"> + Błąd: nie można znaleźć następujących elementów: + +[CONTROLS] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="TutorialNotFound"> + Brak samouczka na ten temat + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="GenericAlert"> + [MESSAGE] + </notification> + <notification name="GenericAlertYesCancel"> + [MESSAGE] + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Tak"/> + </notification> + <notification name="BadInstallation"> + Podczas aktualizacji [APP_NAME] wystąpił błąd. Proszę odwiedzić stronę [http://get.secondlife.com pobierz najnowsza wersję] aby ściągnąć ostatnią wersję klienta. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="LoginFailedNoNetwork"> + Nie można połączyć z [SECOND_LIFE_GRID]. + '[DIAGNOSTIC]' +Upewnij się, że Twoje połączenie z internetem działa. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="MessageTemplateNotFound"> + Wzór komunikatu dla [PATH] nie został odnaleziony. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="WearableSave"> + Zapisać zmiany dotyczące ubrania/części ciała? + <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Nie Zapisuj" yestext="Zapisz"/> + </notification> + <notification name="CompileQueueSaveText"> + W trakcie ładwania tekstu dla skryptu pojawił się problem z następującego powodu: [REASON]. Spróbuj ponownie za kilka minut. + </notification> + <notification name="CompileQueueSaveBytecode"> + W trakcie ładowania skompilowanego skryptu pojawił się problem z następującego powodu: [REASON]. Spróbuj ponownie za kilka minut. + </notification> + <notification name="WriteAnimationFail"> + Problem w zapisywaniu danych animacji. Spróbuj ponownie za kilka minut. + </notification> + <notification name="UploadAuctionSnapshotFail"> + W trakcie ładwania obrazu aukcji pojawił się problem z następującego powodu: [REASON]. + </notification> + <notification name="UnableToViewContentsMoreThanOne"> + Nie można przeglądać zawartości więcej niż jednego obiektu naraz. +Wybierz pojedynczy obiekt i spróbuj jeszcze raz. + </notification> + <notification name="SaveClothingBodyChanges"> + Zapisać wszystkie zmiany dotyczące ubrania/cześci ciała? + <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Nie zapisuj" yestext="Zapisz"/> + </notification> + <notification name="FriendsAndGroupsOnly"> + Osoby spoza listy znajomych, których rozmowy głosowe i IM są ignorowane, nie wiedzą o tym. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="FavoritesOnLogin"> + Pamiętaj: kiedy wyłączysz tą opcję, każdy kto używa tego komputera, może zobaczyć Twoją listę ulubionych miejsc. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="GrantModifyRights"> + Udzielenie praw modyfikacji innemu Rezydentowi umożliwia modyfikację, usuwanie lub wzięcie JAKIEGOKOLWIEK z Twoich obiektów. Używaj tej opcji z rozwagą! +Czy chcesz udzielić prawa do modyfikacji [NAME]? + <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/> + </notification> + <notification name="GrantModifyRightsMultiple"> + Udzielenie praw modyfikacji innym Rezydentom umożliwia im modyfikację, usuwanie lub wzięcie JAKIEGOKOLWIEK z Twoich obiektów. Używaj tej opcji z rozwagą! +Czy chcesz dać prawa modyfikacji wybranym osobom? + <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/> + </notification> + <notification name="RevokeModifyRights"> + Czy chcesz odebrać prawa do modyfikacji [NAME]? + <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/> + </notification> + <notification name="RevokeModifyRightsMultiple"> + Czy chcesz odebrać prawa modyfikacji wybranym Rezydentom? + <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/> + </notification> + <notification name="UnableToCreateGroup"> + Założenie grupy nie jest możliwe. +[MESSAGE] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="PanelGroupApply"> + [NEEDS_APPLY_MESSAGE] +[WANT_APPLY_MESSAGE] + <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Ignoruj zmiany" yestext="Zastosuj zmiany"/> + </notification> + <notification name="MustSpecifyGroupNoticeSubject"> + Aby wysłać ogłoszenie do grupy musisz nadać mu tytuł. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="AddGroupOwnerWarning"> + Dodajesz członków do funkcji [ROLE_NAME]. +Ta funkcja nie może być odebrana. +Członkowie muszą sami zrezygnować z pełnienia tej funkcji. +Chcesz kontynuować? + <usetemplate ignoretext="Przed dodaniem nowego właściciela do grupy, proszę potwierdzić swoją decyzję." name="okcancelignore" notext="Nie" yestext="Tak"/> + </notification> + <notification name="AssignDangerousActionWarning"> + Dodajesz przywilej [ACTION_NAME] do fukcji [ROLE_NAME]. + +*UWAGA* +Członek w funkcji z tym przywilejem może przypisać siebie i innych członków nie będących właścicielami do funkcji dających więcej przywilejów niż posiadane obecnie potencjalnie dające możliwości zbliżone do możliwości właściciela. +Udzielaj tego przywileju z rozwagą." + +Dodać ten przywilej do funkcji [ROLE_NAME]? + <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/> + </notification> + <notification name="AssignDangerousAbilityWarning"> + Dodajesz przywilej [ACTION_NAME] do fukcji [ROLE_NAME] + +*UWAGA* +Członek w funkcji z tym przywilejem może przypisać sobie i innychm członkom nie będącym właścicielami wszystkie przywileje potencjalnie dające możliwości zbliżone do możliwości właściciela. +Udzielaj tego przywileju z rozwagą. + +Dodać ten przywilej do funkcji [ROLE_NAME]? + <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/> + </notification> + <notification name="AttachmentDrop"> + Wybrałeś opcję opuszczenia swojego załącznika. + Czy chcesz kontynuować? + <usetemplate ignoretext="Potwierdź przed zdjęciem załącznika." name="okcancelignore" notext="Nie" yestext="Tak"/> + </notification> + <notification name="JoinGroupCanAfford"> + Dołączenie do tej grupy kosztuje [COST]L$. +Chcesz kontynuować? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Dołącz"/> + </notification> + <notification name="JoinGroupNoCost"> + Dołączasz do grupy [NAME]. +Czy chcesz kontynuować? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Akceptuj"/> + </notification> + <notification name="JoinGroupCannotAfford"> + Członkostwo w tej grupie kosztuje [COST]L$ +Masz za mało L$ żeby zostać członkiem. + </notification> + <notification name="CreateGroupCost"> + Stworzenie tej grupy kosztuje 100L$. +W grupie powinien być więcej niż jeden członek, albo zostanie na zawsze skasowana. +Zaproś proszę członków w ciągu 48 godzin. + <usetemplate canceltext="Anuluj" name="okcancelbuttons" notext="Anuluj" yestext="Stwórz grupę za 100L$"/> + </notification> + <notification name="LandBuyPass"> + Za [COST]L$ możesz odwiedzić tą posiadłość ('[PARCEL_NAME]') na [TIME] godzin. Chcesz kupić przepustkę? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="SalePriceRestriction"> + Cena sprzedaży musi być wyższa niż 0L$ jeżeli sprzedajesz komukolwiek. +Musisz wybrać kupca jeżeli chcesz sprzedać za 0L$. + </notification> + <notification name="ConfirmLandSaleChange"> + Posiadłość o powierzchni [LAND_SIZE] m zostaje wystawiona na sprzedaż. +Cena wynosi [SALE_PRICE]L$ i sprzedaż będzie autoryzowana dla [NAME]. + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ConfirmLandSaleToAnyoneChange"> + UWAGA: Wybierając opcję "Sprzedaj Każdemu" udostępniasz swoją posiadłość do sprzedaży dla jakiegokolwiek Rezydenta [SECOND_LIFE] , nawet osób nieobecnych w tym regionie. + +Posiadłość o powierzchni [LAND_SIZE] m² zostaje wystawiona na sprzedaż. +Cena wynosi [SALE_PRICE]L$ i sprzedaż będzie autoryzowana dla [NAME]. + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ReturnObjectsDeededToGroup"> + Czy na pewno chcesz zwrócić wszystkie obiekty udostępnione grupie [NAME] na tej posiadłości do szafy ich poprzednich właścicieli? + +*UWAGA* Wybrana opcja spowoduje usunięcie wszystkich obiektów +udostępnionych grupie, które nie mają praw transferu! + +Obiekty: [N] + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ReturnObjectsOwnedByUser"> + Czy na pewno chcesz zwrócić wszystkie obiekty należące do Rezydenta [NAME] znajdujące się na tej posiadłości do szafy właściciela? + +Obiekty: [N] + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ReturnObjectsOwnedBySelf"> + Czy na pewno chcesz zwrócić wszystkie Twoje obiekty znajdujące się na tej posiadłości do swojej szafy? + +Obiekty: [N] + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ReturnObjectsNotOwnedBySelf"> + Czy na pewno chcesz zwrócić wszystkie obiekty, których nie jesteś właścicielem znajdujące się na tej posiadłości do szaf właścicieli? Wszystkie obiekty udostępnione grupie z prawem transferu, zostaną zwrócone poprzednim właścicielom. + +*UWAGA* Wybrana opcja spowoduje usunięcie wszystkich obiektów udostępnionych grupie, które nie mają praw transferu! + +Obiekty: [N] + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ReturnObjectsNotOwnedByUser"> + Czy na pewno chcesz zwrócić wszystkie obiekty, które nie należą do [NAME] znajdujące się na tej posiadłości do szaf właścicieli? Wszystkie obiekty udostępnione grupie z prawem transferu, zostaną zwrócone poprzednim właścicielom. + +*UWAGA* Wybrana opcja spowoduje usunięcie wszystkich obiektów udostępnionych grupie, które nie mają praw transferu! + +Obiekty: [N] + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ReturnAllTopObjects"> + Czy na pewno chcesz zwrócić wszystkie wymienione obiekty znajdujące się na tej posiadłości do szaf ich właścicieli? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="DisableAllTopObjects"> + Czy na pewno chcesz deaktywować wszystkie obiekty w tym Regionie? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ReturnObjectsNotOwnedByGroup"> + Zwrócić obiekty z tej posiadłości, które nie są udosępnione grupie [NAME] do ich właścicieli? + +Obiekty: [N] + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="UnableToDisableOutsideScripts"> + Nie można deaktywować skryptów. +Ten region pozwala na uszkodzenia. +Skrypty muszą pozostać aktywne dla prawidłowego działania broni. + </notification> + <notification name="MultipleFacesSelected"> + Obecnie zaznaczono wiele powierzchni. +Jeśli działanie będzie kontynuowane, oddzielne media będą ustawione na wielu powierzchniach obiektu. +W celu umieszczenia mediów tylko na jednej powierzchni skorzystaj z Wybierz powierzchnię i kliknij na wybranej powierzchni obiektu oraz kliknij Dodaj. + <usetemplate ignoretext="Media zostaną ustawione na wielu zaznaczonych powierzchniach" name="okcancelignore" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="MustBeInParcel"> + Musisz znajdować się wewnątrz posiadłości żeby wybrać punkt lądowania. + </notification> + <notification name="PromptRecipientEmail"> + Proszę wpisać adres emailowy odbiorcy. + </notification> + <notification name="PromptSelfEmail"> + Proszę wpisać swój adres emailowy. + </notification> + <notification name="PromptMissingSubjMsg"> + Wysłać widokówkę z domyślnym tematem i wiadomością? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ErrorProcessingSnapshot"> + Błąd w trakcie przetwarzania danych zdjęcia. + </notification> + <notification name="ErrorEncodingSnapshot"> + Błąd w kodowaniu zdjęcia. + </notification> + <notification name="ErrorUploadingPostcard"> + W trakcie ładowania zdjęcia pojawił się problem z następującego powodu: [REASON] + </notification> + <notification name="ErrorUploadingReportScreenshot"> + W trakcie ładowania zdjęcia ekranu do raportu pojawił się problem z następującego powodu: [REASON] + </notification> + <notification name="MustAgreeToLogIn"> + Musisz zaakceptować Warunki Umowy (Terms of Service) by kontynuować logowanie się do [SECOND_LIFE]. + </notification> + <notification name="CouldNotPutOnOutfit"> + Założenie stroju nie powiodło się. +Folder stroju nie zawiera żadnego ubrania, części ciała ani załączników. + </notification> + <notification name="CannotWearTrash"> + Nie możesz założyć ubrania, które znajduje się w koszu. + </notification> + <notification name="MaxAttachmentsOnOutfit"> + Nie można dołączyć obiektu. +Limit [MAX_ATTACHMENTS] załączników został przekroczony. Proszę najpierw odłączyć inny obiekt. + </notification> + <notification name="CannotWearInfoNotComplete"> + Nie możesz założyć tego artkułu ponieważ nie załadował się poprawnie. Spróbuj ponownie za kilka minut. + </notification> + <notification name="MustHaveAccountToLogIn"> + Oops! Brakuje czegoś. +Należy wprowadzić nazwę użytkownika. + +Potrzebujesz konta aby się zalogować do [SECOND_LIFE]. Czy chcesz utworzyć je teraz? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="InvalidCredentialFormat"> + Należy wprowadzić nazwę użytkownika lub imię oraz nazwisko Twojego awatara w pole nazwy użytkownika a następnie ponownie się zalogować. + </notification> + <notification name="DeleteClassified"> + Usunąć reklamę '[NAME]'? +Pamiętaj! Nie ma rekompensaty za poniesione koszta. + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="DeleteMedia"> + Wybrano usunięcie mediów związanych z tą powierzchnią. +Czy na pewno chcesz kontynuować? + <usetemplate ignoretext="Potwierdź przed usunięciem mediów z obiektu" name="okcancelignore" notext="Nie" yestext="Tak"/> + </notification> + <notification name="ClassifiedSave"> + Zapisać zmiany w reklamie [NAME]? + <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Nie Zapisuj" yestext="Zapisz"/> + </notification> + <notification name="ClassifiedInsufficientFunds"> + Nie posiadasz wystarczających środków aby dodać reklamę. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="DeleteAvatarPick"> + Usuń zdjęcie <nolink>[PICK]</nolink>? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="DeleteOutfits"> + Skasować wybrane stroje? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="PromptGoToEventsPage"> + Odwiedzić internetową stronę Imprez [SECOND_LIFE]? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="SelectProposalToView"> + Wybierz propozycję, którą chcesz zobaczyć. + </notification> + <notification name="SelectHistoryItemToView"> + Wybierz obiekt z historii, który chcesz zobaczyć. + </notification> + <notification name="CacheWillClear"> + Bufor danych zostanie wyczyszczony po restarcie aplikacji [APP_NAME]. + </notification> + <notification name="CacheWillBeMoved"> + Bufor danych zostanie przeniesiony po restarcie aplikacji [APP_NAME]. +Pamiętaj: Opcja ta wyczyszcza bufor danych. + </notification> + <notification name="ChangeConnectionPort"> + Ustawienia portu zostają zaktualizowane po restarcie aplikacji [APP_NAME]. + </notification> + <notification name="ChangeSkin"> + Nowa skórka zostanie wczytana po restarcie aplikacji [APP_NAME]. + </notification> + <notification name="ChangeLanguage"> + Zmiana języka zadziała po restarcie [APP_NAME]. + </notification> + <notification name="GoToAuctionPage"> + Odwiedzić stronę internetową [SECOND_LIFE] żeby zobaczyć szczgóły aukcji lub zrobić ofertę? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="SaveChanges"> + Zapisać zmiany? + <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Nie zapisuj" yestext="Zapisz"/> + </notification> + <notification name="GestureSaveFailedTooManySteps"> + Nie można zapisać gesturki. +Ta gesturka ma zbyt wiele etapów. +Usuń kilka etapów i zapisz jeszcze raz. + </notification> + <notification name="GestureSaveFailedTryAgain"> + Zapis gesturki nie powiódł się. Spróbuj jeszcze raz za kilka minut. + </notification> + <notification name="GestureSaveFailedObjectNotFound"> + Nie można zapisać gesturki ponieważ obiekt lub szafa powiązanego obiektu nie został znaleziony. +Obiekt może znajdować się zbyt daleko albo został usunięty. + </notification> + <notification name="GestureSaveFailedReason"> + Nie można zapisać gesturki z następującego powodu: [REASON]. Spróbuj zapisać jeszcze raz później. + </notification> + <notification name="SaveNotecardFailObjectNotFound"> + Nie można zapisać notki ponieważ obiekt lub szafa powiązanego obiektu nie został znaleziony. +Obiekt może znajdować się zbyt daleko albo został usunięty. + </notification> + <notification name="SaveNotecardFailReason"> + Nie można zapisać notki z następującego powodu: [REASON]. Spróbuj zapisać jeszcze raz później. + </notification> + <notification name="ScriptCannotUndo"> + Nie można cofnąć wszystkich zmian w Twojej wersji skryptu. +Czy chcesz załadować ostatnią wersję zapisaną na serwerze? +(*UWAGA* Ta operacja jest nieodwracalna.) + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="SaveScriptFailReason"> + Nie można zapisać skryptu z następującego powodu: [REASON]. Spróbuj zapisać jeszcze raz później. + </notification> + <notification name="SaveScriptFailObjectNotFound"> + Nie można zapisać skryptu ponieważ obiekt w którym się zawiera nie został znaleziony. +Obiekt może znajdować się zbyt daleko albo został usunięty. + </notification> + <notification name="SaveBytecodeFailReason"> + Nie można zapisać skompilowanego skryptu z następującego powodu: [REASON]. Spróbuj zapisać jeszcze raz póżniej. + </notification> + <notification name="StartRegionEmpty"> + Oops, Twoje miejsce startu nie zostało określone. +Wpisz proszę nazwę regionu w lokalizację startu w polu Lokalizacja Startu lub wybierz Moja ostatnia lokalizacja albo Miejsce Startu. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="CouldNotStartStopScript"> + Nie można uruchomić lub zatrzymać skryptu ponieważ obiekt w którym się zawiera nie został znaleziony. +Obiekt może znajdować się zbyt daleko albo został usunięty. + </notification> + <notification name="CannotDownloadFile"> + Nie można załadować pliku + </notification> + <notification name="CannotWriteFile"> + Nie można zapisać pliku [[FILE]] + </notification> + <notification name="UnsupportedHardware"> + Niestety Twój komputer nie spełnia minimalnych wymogów sprzętowych dla poprawnego działania [APP_NAME]. Możesz odczuwać bardzo niską wydajność operacyjną. Niestety portal pomocy, [SUPPORT_SITE] nie posiada informacji na temat poprawnej konfiguracji technicznej Twojego systemu. + +Po więcej info, odwiedź stronę [_URL] . + <url name="url" option="0"> + http://www.secondlife.com/corporate/sysreqs.php + </url> + <usetemplate ignoretext="Dysk twardy mojego komputera nie jest wspomagany" name="okcancelignore" notext="Nie" yestext="Tak"/> + </notification> + <notification name="UnknownGPU"> + Twój system jest wyposażony w kartę graficzną, która nie jest rozpoznana przez [APP_NAME]. +Zdarza się to często w przypadku nowego sprzętu, który nie był testowany z [APP_NAME]. Prawdopodobnie wystarczy dostosowanie ustawień grafiki aby działanie było poprawne. +(Ja > Właściwości > Grafika). + <form name="form"> + <ignore name="ignore" text="Karta graficzna nie została zidentyfikowana."/> + </form> + </notification> + <notification name="DisplaySettingsNoShaders"> + [APP_NAME] zawiesił się podczas inicjalizacji sterowników graficznych. +Jakość grafiki została zmniejszona - może to pomóc. +Pewne funkcje graficzne zostały wyłączone. Zalecamy aktualizcje sterowników graficznych. +Możesz podnieść jakość grafiki pod Ustawienia > Grafika. + </notification> + <notification name="RegionNoTerraforming"> + Region [REGION] nie pozwala na formowanie powierzchni ziemi. + </notification> + <notification name="CannotCopyWarning"> + Nie masz pozwolenia na kopiowanie następujących obiektów: +[ITEMS] +i stracisz je w momencie przekazania. Czy na pewno chcesz oddać te obiekty? + <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/> + </notification> + <notification name="CannotGiveItem"> + Podarowanie obiektu nie powiodło się. + </notification> + <notification name="TransactionCancelled"> + Transakcja anulowana + </notification> + <notification name="TooManyItems"> + Jednorazowo możesz podarować maksymalnie 42 obiekty z szafy. + </notification> + <notification name="NoItems"> + Nie masz praw do transferu wybranych obiektów. + </notification> + <notification name="CannotCopyCountItems"> + Nie masz praw do skopiowania [COUNT] wybranych obiektów. Obiekty znikną z Twojej szafy. +Na pewno chcesz oddać te obiekty? + <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/> + </notification> + <notification name="CannotGiveCategory"> + Nie masz praw do transferu wybranego foldera. + </notification> + <notification name="FreezeAvatar"> + Unieruchomić tego awatara? +Awatar tymczasowo nie będzie mógł się poruszać, nie będzie mógł używać czatu (IM) i nie będzie w stanie odziaływać na świat. + <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Odblokuj" yestext="Unieruchom"/> + </notification> + <notification name="FreezeAvatarFullname"> + Unieruchowmić [AVATAR_NAME]? +Ta osoba tymczasowo nie będzie mógła się poruszać, nie będzie mógł używać czatu (IM) i nie będzie w stanie odziaływać na świat. + <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Odblokuj" yestext="Unieruchom"/> + </notification> + <notification name="EjectAvatarFullname"> + Wyrzucić [AVATAR_NAME] z Twojej posiadłości? + <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wyrzuć i zabroń wstępu (ban)" yestext="Wyrzuć"/> + </notification> + <notification name="EjectAvatarFromGroup"> + Wyrzuć [AVATAR_NAME] z grupy [GROUP_NAME] + </notification> + <notification name="AcquireErrorTooManyObjects"> + BŁĄD OTRZYMYWANIA: Zbyt wiele wybranych obiektów. + </notification> + <notification name="AcquireErrorObjectSpan"> + BŁĄD OTRZYMYWANIA: Obiekty przekraczają granicę regionów. Przemieść wszystkie otrzymywane obiekty do jednego regionu. + </notification> + <notification name="PromptGoToCurrencyPage"> + [EXTRA] + +Odwiedź stronę [_URL] po więcej informacji na temat zakupu L$? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="UnableToLinkObjects"> + Nie można połączyć [COUNT] obiektów. +Maksymalnie można połączyć [MAX] obiektów. + </notification> + <notification name="CannotLinkIncompleteSet"> + Możesz łączyć tylko kompletne zbiory obiektów i musisz wybrać więcej niż jeden obiekt. + </notification> + <notification name="CannotLinkModify"> + Nie możesz połączyć obiektów ponieważ nie masz praw modyfikacji dla wszystkich obiektów. + +Upewnij się, że żaden z obiktów nie jest zablokowany i że wszystkie obiekty należą do Ciebie. + </notification> + <notification name="CannotLinkDifferentOwners"> + Nie możesz połączyć obiektów ponieważ należą one do różnych osób. + +Upewnij sie, że wszystkie wybrane obiekty należą do Ciebie. + </notification> + <notification name="NoFileExtension"> + Niepoprawna końcówka nazwy pliku: '[FILE]' + +Upewnij się, że nazwa pliku ma poprawaną końcówkę. + </notification> + <notification name="InvalidFileExtension"> + Niepoprawna końcówka nazwy pliku - [EXTENSION] +Oczekiwana - [VALIDS] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="CannotUploadSoundFile"> + Nie można otworzyć załadowanego pliku dźwiękowego: +[FILE] + </notification> + <notification name="SoundFileNotRIFF"> + Plik nie jest w formacie RIFF WAVE: +[FILE] + </notification> + <notification name="SoundFileNotPCM"> + Plik nie jest w formacie PCM WAVE: +[FILE] + </notification> + <notification name="SoundFileInvalidChannelCount"> + Plik zawiera niewłaściwą liczbę kanałów (musi być mono albo stereo): +[FILE] + </notification> + <notification name="SoundFileInvalidSampleRate"> + Plik zawiera niewłaścią częstotliwość (musi być 44.1k): +[FILE] + </notification> + <notification name="SoundFileInvalidWordSize"> + Plik zawiera niewłaściwą szerokość danych (musi być 8 albo 16 bitów): +[FILE] + </notification> + <notification name="SoundFileInvalidHeader"> + Brak bloku 'data' w nagłówku pliku WAV: +[FILE] + </notification> + <notification name="SoundFileInvalidChunkSize"> + Niewłaściwy rozmiar "chunk" w pliku WAV: +[FILE] + </notification> + <notification name="SoundFileInvalidTooLong"> + Plik audio jest zbyt długi (10 sekund maksimum): +[FILE] + </notification> + <notification name="CannotOpenTemporarySoundFile"> + Nie można otworzyć tymczasowego skompresowango pliku dźwiękowego w celu zapisu: [FILE] + </notification> + <notification name="UnknownVorbisEncodeFailure"> + Nieznany błąd kodowania Vorbis w: [FILE] + </notification> + <notification name="CannotEncodeFile"> + Kodowanie pliku: [FILE] nie powidło się. + </notification> + <notification name="CorruptedProtectedDataStore"> + Nie można wpisać Twojego imienia użytkownika ani hasła. To może się zdarzyć kiedy zmieniasz ustawienia sieci. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="CorruptResourceFile"> + Skorumpowany plik zasobów: [FILE] + </notification> + <notification name="UnknownResourceFileVersion"> + Nieznana wersja pliku zasobów Linden w pliku: [FILE] + </notification> + <notification name="UnableToCreateOutputFile"> + Nie można utworzyć pliku wyjściowego: [FILE] + </notification> + <notification name="DoNotSupportBulkAnimationUpload"> + [APP_NAME] obecnie nie wspomaga ładowania grupowego plików animacji. + </notification> + <notification name="CannotUploadReason"> + Ładowanie pliku [FILE] nie powiodło się z powodu: [REASON] +Spróbuj jeszcze raz póżniej. + </notification> + <notification name="LandmarkCreated"> + Dodano "[LANDMARK_NAME]" do folderu [FOLDER_NAME]. + </notification> + <notification name="LandmarkAlreadyExists"> + Posiadasz już landmark dla tej lokalizacji. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="CannotCreateLandmarkNotOwner"> + Nie możesz zapamiętać tego miejsca (LM) ponieważ właściciel posiadłości nie pozwala na to. + </notification> + <notification name="CannotRecompileSelectObjectsNoScripts"> + 'Rekompilacja' nie powiodła się. + +Wybierz obiekty zawierające skrypty. + </notification> + <notification name="CannotRecompileSelectObjectsNoPermission"> + 'Rekompilacja' nie powiodła się. + +Wybierz skryptowane obiekty do których masz prawa modyfikacji. + </notification> + <notification name="CannotResetSelectObjectsNoScripts"> + 'Resetowanie' nie powiodło się. + +Wybierz obiekty zawierające skrypty. + </notification> + <notification name="CannotResetSelectObjectsNoPermission"> + 'Resetowanie' nie powiodło się. + +Wybierz skryptowane obiekty do których masz prawa modyfikacji. + </notification> + <notification name="CannotOpenScriptObjectNoMod"> + Nie można otworzyć skryptu bez prawa do modyfikacji obiektu. + </notification> + <notification name="CannotSetRunningSelectObjectsNoScripts"> + 'Uruchomienie' skryptów nie powiodło się. + +Wybierz obiekty zawierające skrypty. + </notification> + <notification name="CannotSetRunningNotSelectObjectsNoScripts"> + 'Zatrzymanie' skryptów nie powiodło się. + +Wybierz obiekty zawierające skrypty. + </notification> + <notification name="NoFrontmostFloater"> + Brak górnego okna do zapisu. + </notification> + <notification name="SeachFilteredOnShortWords"> + Twoje zapytanie wyszukiwania zostło zmienione - zbyt krótkie słowa zostały usunięte. + +Nowe zapytanie: [FINALQUERY] + </notification> + <notification name="SeachFilteredOnShortWordsEmpty"> + Użyte terminy wyszukiwania były zbyt krótkie - wyszukiwanie zostało anulowane. + </notification> + <notification name="CouldNotTeleportReason"> + Teleportacja nie powiodła się. +[REASON] + </notification> + <notification name="invalid_tport"> + Niestety, pojawił się błąd podczas próby teleportacji. Proponujemy wylogowanie się i spróbowanie teleportacji ponownie. +Jeżeli nadal otrzymujesz tę wiadomość proponujemy odwiedzić stronę [SUPPORT_SITE]. + </notification> + <notification name="invalid_region_handoff"> + Niestety, pojawił się błąd podczas próby przedostania się na drugi region. Proponujemy wylogowanie się i spróbowanie przedostania się na drugi region ponownie. +Jeżeli nadal otrzymujesz tę wiadomość proponujemy odwiedzić stronę [SUPPORT_SITE]. + </notification> + <notification name="blocked_tport"> + Przepraszamy, teleportacja jest chwilowo niedostępna. Spróbuj jeszcze raz. +Jeśli nadal nie możesz się teleportować wyloguj się i ponownie zaloguj. + </notification> + <notification name="nolandmark_tport"> + Przepraszamy, ale nie możemy znaleźć miejsca docelowego. + </notification> + <notification name="timeout_tport"> + Przepraszamy, ale nie udało się przeprowadzić teleportacji. Spróbuj jeszcze raz. + </notification> + <notification name="noaccess_tport"> + Przepraszamy, ale nie masz dostępu do miejsca docelowego. + </notification> + <notification name="missing_attach_tport"> + Czekamy na Twoje akcesoria. Możesz poczekać kilka minut lub zrobić relog przed następną próbą teleportacji. + </notification> + <notification name="too_many_uploads_tport"> + Obecnie ten region ma problemy z ładowaniem obiektów w związku z czym teleportacja bardzo sie opóźnia. +Spróbuj jeszcze raz za kilka minut albo teleportuj się do mniej zatłoczonego miejsca. + </notification> + <notification name="expired_tport"> + Przepraszamy, ale nie udało się przeprowadzić teleportacji wystarczająco szybko. Spróbuj jeszcze raz za kilka minut. + </notification> + <notification name="expired_region_handoff"> + Przepraszamy, ale nie udało się przeprowadzić zmiany regionu wystarczająco szybko. Spróbuj jeszcze raz za kilka minut. + </notification> + <notification name="no_host"> + Nie możemy znaleść miejsca docelowego. To miejsce może być chwilowo nieosiągalne albo przestało istnieć. +Spróbuj jeszcze raz za kilka minut. + </notification> + <notification name="no_inventory_host"> + Szafa chwilowo nie działa. + </notification> + <notification name="CannotSetLandOwnerNothingSelected"> + Nie można wybrać właściciela posiadłości. +Posiadłość nie została wybrana. + </notification> + <notification name="CannotSetLandOwnerMultipleRegions"> + Nie można wybrać właściciela posiadłości ponieważ wybrany obszar przekracza granicę regionów. Wybierz mniejszy obszar i spróbuj jeszcze raz. + </notification> + <notification name="ForceOwnerAuctionWarning"> + Ta posiadłość jest wystawiona na aukcję. Wymuszenie własności anuluje aukcję i potencjalnie może zdenerwować zainteresowanych Rezydentów, jeżeli licytacja już się rozpoczęła. +Wymusić własność? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="CannotContentifyNothingSelected"> + Nie można sfinalizować: +Posiadłość nie została wybrana. + </notification> + <notification name="CannotContentifyNoRegion"> + Nie można sfinalizować: +Region nie znaleziony. + </notification> + <notification name="CannotReleaseLandNothingSelected"> + Nie można porzucić posiadłości: +Posiadłość nie została wybrana. + </notification> + <notification name="CannotReleaseLandNoRegion"> + Nie można porzucić posiadłości: +Region nie znaleziony. + </notification> + <notification name="CannotBuyLandNothingSelected"> + Nie można kupić posiadłości: +Posiadłość nie została wybrana. + </notification> + <notification name="CannotBuyLandNoRegion"> + Nie można kupić posiadłości: +Region nie znaleziony. + </notification> + <notification name="CannotCloseFloaterBuyLand"> + Okno zakupu landu nie może zostać zamknięte dopóki aplikacja [APP_NAME] nie określi ceny dla tej transkacji. + </notification> + <notification name="CannotDeedLandNothingSelected"> + Nie można przekazać posiadłości: +Posiadłość nie została wybrana. + </notification> + <notification name="CannotDeedLandNoGroup"> + Nie można przekazać posiadłości: +Grupa nie została wybrana. + </notification> + <notification name="CannotDeedLandNoRegion"> + Brak możliwości przepisania posiadłości grupie: +Region, gdzie posiadłość się znajduje nie został odnaleziony. + </notification> + <notification name="CannotDeedLandMultipleSelected"> + Nie można przekazać posiadłości: +Wiele posiadłości jest wybranych. + +Spróbuj wybrać pojedynczą posiadłość. + </notification> + <notification name="CannotDeedLandWaitingForServer"> + Nie można przekazać posiadłości: +Serwer aktualizuje dane własności. + +Spróbuj jeszcze raz póżniej. + </notification> + <notification name="CannotDeedLandNoTransfer"> + Nie możesz przekazać posiadłości: +Region [REGION] nie pozwala na transfer posiadłości. + </notification> + <notification name="CannotReleaseLandWatingForServer"> + Nie można porzucić posiadłości: +Serwer aktualizuje dane posiadłości. + +Spróbuj jeszcze raz póżniej. + </notification> + <notification name="CannotReleaseLandSelected"> + Nie możesz porzucić posiadłości: +Nie jesteś właścicielem wszystkich wybranych posiadłości. + +Wybierz pojedynczą posiadłość. + </notification> + <notification name="CannotReleaseLandDontOwn"> + Nie możesz porzucić posiadłości: +Nie masz praw do porzucenia tej posiadłości. + +Twoje posiadłości są podkreślone na zielono. + </notification> + <notification name="CannotReleaseLandRegionNotFound"> + Brak możliwości porzucenia posiadłości: +Region, gdzie posiadłość się znajduje nie został odnaleziony. + </notification> + <notification name="CannotReleaseLandNoTransfer"> + Nie możesz porzucić posiadłości: +Region [REGION] nie pozwala na transfer posiadłości. + </notification> + <notification name="CannotReleaseLandPartialSelection"> + Nie można porzucić posiadłości: +Musisz wybrać całą posiadłość by ją porzucić. +Wybierz całą posiadłość albo najpierw ją podziel. + </notification> + <notification name="ReleaseLandWarning"> + Porzucasz posiadłość o powierzchni [AREA] m². +Porzucenie tej posiadłości usunie ją z Twoich własności. +Nie otrzymasz za to żadnej opłaty. + +Porzucić posiadłość? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="CannotDivideLandNothingSelected"> + Nie można podzielić posiadłości: + +Posiadłość nie została wybrana. + </notification> + <notification name="CannotDivideLandPartialSelection"> + Nie można podzielić posiadłości: + +Posiadłość została wybrana w całości. +Spróbuj wybrać część posiadłości. + </notification> + <notification name="LandDivideWarning"> + Podział tej posiadłości stworzy dwie posiadłości z których każda będzie mogła mieć indywidualne ustawienia. +Niektóre ustawienia zostaną zmienione na domyślne po tej operacji. + +Podzielić posiadłość? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="CannotDivideLandNoRegion"> + Brak możliwości podziału posiadłości: +Region, gdzie posiadłość się znajduje nie został odnaleziony. + </notification> + <notification name="CannotJoinLandNoRegion"> + Brak możliwości złączenia posiadłości: +Region, gdzie posiadłość się znajduje nie został odnaleziony. + </notification> + <notification name="CannotJoinLandNothingSelected"> + Nie można połączyć posiadłości: +Posiadłości nie zostały wybrane. + </notification> + <notification name="CannotJoinLandEntireParcelSelected"> + Nie można połączyć posiadłości: +Tylko jedna posiadłość została wybrana. + +Wybierz obaszar usytuowany na obu posiadłościach. + </notification> + <notification name="CannotJoinLandSelection"> + Nie można połączyć posiadłości: +Musisz wybrać więcej niż jedną posiadłość. + +Wybierz obaszar usytuowany na obu posiadłościach. + </notification> + <notification name="JoinLandWarning"> + Połączenie tego obszaru utworzy jedną większą posiadłość ze wszystkich posiadłości przecinających wybrany prostokąt. Nazwa i opcje posiadłości bedą musiały zostać skonfigurowane. + +Połączyć posiadłości? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ConfirmNotecardSave"> + Ta notka musi być zapisana żeby mogła być skopiowana lub zobaczona. Zapisać notkę? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ConfirmItemCopy"> + Skopiować ten obiekt do Twojej szafy? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Skopiuj"/> + </notification> + <notification name="ResolutionSwitchFail"> + Zmiana rozdzielczości do [RESX] x [RESY] nie powidła się + </notification> + <notification name="ErrorUndefinedGrasses"> + Błąd: niezdefiniowane trawy: [SPECIES] + </notification> + <notification name="ErrorUndefinedTrees"> + Bład: niezdefiniowane drzewa: [SPECIES] + </notification> + <notification name="CannotSaveWearableOutOfSpace"> + Nie można zapisać '[NAME]' do pliku stroju. Musisz zwolnić trochę miejsca na Twoim komputerze i zapisać strój jeszcze raz. + </notification> + <notification name="CannotSaveToAssetStore"> + Nie można zapisać [NAME] w centralnym zbiorze danych. +Zazwyczaj jest to tymczasowy problem. Możesz kontynuować modyfikacje i zapisać strój ponownie za kilka minut. + </notification> + <notification name="YouHaveBeenLoggedOut"> + Nastąpiło wylogowanie z [SECOND_LIFE] + [MESSAGE] + <usetemplate name="okcancelbuttons" notext="Wyłącz" yestext="Kontynuuj"/> + </notification> + <notification name="OnlyOfficerCanBuyLand"> + Nie możesz kupić posiadłości dla grupy. +Nie masz praw kupowania posiadłości dla Twojej aktywnej grupy. + </notification> + <notification label="Add Friend" name="AddFriendWithMessage"> + Znajomi mogą pozwalać na odnajdywanie się wzajemnie na mapie i na otrzymywanie notyfikacji o logowaniu do [SECOND_LIFE]. + +Zaproponować znajomość [NAME]? + <form name="form"> + <input name="message"> + Chcesz zawrzeć znajomość? + </input> + <button name="Offer" text="OK"/> + <button name="Cancel" text="Anuluj"/> + </form> + </notification> + <notification label="Zapisz strój" name="SaveOutfitAs"> + Zapisz to co noszę jako nowy strój: + <form name="form"> + <input name="message"> + [DESC] (nowe) + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Anuluj"/> + </form> + </notification> + <notification label="Zapisz część stroju" name="SaveWearableAs"> + Zapisz obiekt w mojej Szafie jako: + <form name="form"> + <input name="message"> + [DESC] (nowy) + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Anuluj"/> + </form> + </notification> + <notification label="Zmień nazwę stroju" name="RenameOutfit"> + Nowa nazwa stroju: + <form name="form"> + <input name="new_name"> + [NAME] + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Anuluj"/> + </form> + </notification> + <notification name="RemoveFromFriends"> + Czy chcesz usunąć [NAME] z listy znajomych? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="RemoveMultipleFromFriends"> + Chcesz usunąć grupę osób z listy Twoich znajomych? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="GodDeleteAllScriptedPublicObjectsByUser"> + Na pewno chcesz usunąć wszystkie skryptowane obiekty należące do +** [AVATAR_NAME] ** +z posiadłości innych w tym symulatorze? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="GodDeleteAllScriptedObjectsByUser"> + Na pewno chcesz usunąć wszystkie skryptowane obiekty należące do +** [AVATAR_NAME] ** +ze wszystkich posiadłości w tym symulatorze? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="GodDeleteAllObjectsByUser"> + Na pewno chcesz usunąć wszystkie obiekty (skryptowane i nie) należące do +** [AVATAR_NAME] ** +ze wszystkich posiadłości w tym symulatorze? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="BlankClassifiedName"> + Musisz nadać tytuł Twojej reklamie. + </notification> + <notification name="MinClassifiedPrice"> + Minimalna cena za publikację wynosi [MIN_PRICE]L$. + +Wybierz wyższą cenę. + </notification> + <notification name="ConfirmItemDeleteHasLinks"> + Co najmiej jeden z elementów, które masz posiada połączone z nim obiekty. Jeśli go usuniesz połączenia zostaną usunięte na stałe. Zaleca się usunięcie połączeń w pierwszej kolejności. + +Jesteś pewnien/pewna, że chcesz usunąć te elementy? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteLock"> + Przynajmnie jeden z wybranych obiektów jest zablokowany. + +Na pewno chcesz usunąć te obiekty? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteNoCopy"> + Przynajmniej jeden z wybranych obiektów jest niekopiowalny. + +Na pewno chcesz usunąć te obiekty? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteNoOwn"> + Przynajmniej jeden z wybranych obiektów nie należy do Ciebie. + +Na pewno chcesz usunąć te obiekty? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteLockNoCopy"> + Przynajmnie jeden z wybranych obiektów jest zablokowany. +Przynajmniej jeden z wybranych obiektów jest niekopiwalny. + +Na pewno chcesz usunąć te obiekty? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteLockNoOwn"> + Przynajmnie jeden z wybranych obiektów jest zablokowany. +Przynajmniej jeden z wybranych obiektów nie należy do Ciebie. + +Na pewno chcesz usunąć te obiekty? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteNoCopyNoOwn"> + Przynajmniej jeden z wybranych obiektów jest niekopiowalny. +Przynajmniej jeden z wybranych obiektów nie należy do Ciebie. + +Na pewno chcesz usunąć te obiekty? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteLockNoCopyNoOwn"> + Przynajmnie jeden z wybranych obiektów jest zablokowany. +Przynajmniej jeden z wybranych obiektów jest niekopiwalny. +Przynajmniej jeden z wybranych obiektów nie należy do Ciebie. + +Na pewno chcesz usunąć te obiekty? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ConfirmObjectTakeLock"> + Przynajmnie jeden obiekt jest zablokowany. + +Na pewno chcesz usunąć te obiekty? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ConfirmObjectTakeNoOwn"> + Przynajmniej jeden obiekt nie należy do Ciebie. +Jeżeli będziesz kontynuować prawa następnego właściciela zostaną przypisane co, potencjalnie, może ograniczyć Twoje prawa do modyfikacji lub kopiowania obiektów. + +Na pewno chcesz wziąść te obiekty? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ConfirmObjectTakeLockNoOwn"> + Przynajmnie jeden obiekt jest zablokowany. +Przynajmniej jeden obiekt nie należy do Ciebie. +Jeżeli będziesz kontynuować prawa następnego właściciela zostaną przypisane co, potencjalnie, może ograniczyć Twoje prawa do modyfikacji lub kopiowania obiektów. + +Na pewno chcesz wziąść te obiekty? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="CantBuyLandAcrossMultipleRegions"> + Nie możesz kupić posiadłości ponieważ wybrany obszar przekracza granicę regionów. + +Wybierz mniejszy obszar i spróbuj jeszcze raz. + </notification> + <notification name="DeedLandToGroup"> + Po przekazaniu tej posiadłości grupa będzia musiała mieć i utrzymywać wystarczający kredyt na używanie posiadłości. Cena zakupu posiadłości nie jest zwracana właścicielowi. Jeżeli przekazana posiadłość zostanie sprzedana, cana sprzedaży zostanie podzielona pomiędzy członków grupy. + +Przekazać tą posiadłość o powierzchni [AREA] m² grupie '[GROUP_NAME]'? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="DeedLandToGroupWithContribution"> + Po przekazaniu tej posiadłości grupa będzia musiała mieć i utrzymywać wystarczający kredyt na używanie posiadłości. +Przekazanie będzie zawierać równoczesne przypisanie posiadłości do grupy od '[NAME]'. +Cena zakupu posiadłości nie jest zwracana właścicielowi. Jeżeli przekazana posiadłość zostanie sprzedana, cana sprzedaży zostanie podzielona pomiędzy członków grupy. + +Przekazać tą posiadłość o powierzchni [AREA] m² grupie '[GROUP_NAME]'? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="DisplaySetToSafe"> + Ustawienia grafiki zostały zmienione do bezpiecznego poziomu ponieważ opcja -safe została wybrana. + </notification> + <notification name="DisplaySetToRecommended"> + Ustawienia grafiki zostały zmienione do zalecanego poziomu na podstawie konfiguracji Twojego systemu. + </notification> + <notification name="ErrorMessage"> + [ERROR_MESSAGE] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="AvatarMovedDesired"> + Miejsce, do którego chcesz się teleportować jest chwilowo nieobecne. +Zostałeś przeniesiony do regionu sąsiedniego. + </notification> + <notification name="AvatarMovedLast"> + Twoje miejsce startu jest obecnie niedostępne. +Zostałeś przeniesiony do sąsiedniego regionu. + </notification> + <notification name="AvatarMovedHome"> + Twoje miejsce startu jest obecnie niedostępne. +Zostałeś przeniesiony do pobliskiego regionu. +Możesz ustawić nowe miejsce startu. + </notification> + <notification name="ClothingLoading"> + Twoje ubranie wciąż się ładuje. +Możesz normalnie używać [SECOND_LIFE], inni użytkownicy będą Cię widzieli poprawnie. + <form name="form"> + <ignore name="ignore" text="Ładowanie ubrań nadal trwa"/> + </form> + </notification> + <notification name="FirstRun"> + Instalacja [APP_NAME] zakończona. + +Jeżeli używasz [SECOND_LIFE] po raz pierwszy to musisz stworzyć konto żeby móc się zalogować. +Czy chcesz przejść na stronę [http://join.secondlife.com secondlife.com] żeby stworzyć nowe konto? + <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Nowe konto..."/> + </notification> + <notification name="LoginPacketNeverReceived"> + Problemy z połączeniem. Problem może być spowodowany Twoim połączeniem z Internetem albo może istnieć po stronie [SECOND_LIFE_GRID]. + +Możesz sprawdzić swoje połączenie z Internetem i spróbować ponownie za kilka minut lub połączyć się ze stroną pomocy technicznej tutaj [SUPPORT_SITE] lub wybrać Teleportuj by teleportować się do swojego miejsca startu. + <form name="form"> + <button name="OK" text="OK"/> + <button name="Help" text="Pomoc"/> + <button name="Teleport" text="Teleportuj"/> + </form> + </notification> + <notification name="WelcomeChooseSex"> + Twoja postać pojawi się za moment. + +Używaj strzałek żeby sie poruszać. +Naciśnij F1 w dowolnej chwili po pomoc albo żeby dowiedzieć się więcej o [SECOND_LIFE]. +Wybierz awatara właściwej płci. +Ten wybór będzie można później zmienić. + <usetemplate name="okcancelbuttons" notext="Kobieta" yestext="Mężczyzna"/> + </notification> + <notification name="CantTeleportToGrid"> + Nie można teleportować do [SLURL], ponieważ jest na innym gridzie ([GRID]) niż obecny grid ([CURRENT_GRID]). Proszę zamknąć przeglądarkę i spróbować ponownie. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="GeneralCertificateError"> + Połączenie z serwerem nie mogło zostać nawiązane. +[REASON] + +SubjectName: [SUBJECT_NAME_STRING] +IssuerName: [ISSUER_NAME_STRING] +Valid From: [VALID_FROM] +Valid To: [VALID_TO] +MD5 Fingerprint: [SHA1_DIGEST] +SHA1 Fingerprint: [MD5_DIGEST] +Key Usage: [KEYUSAGE] +Extended Key Usage: [EXTENDEDKEYUSAGE] +Subject Key Identifier: [SUBJECTKEYIDENTIFIER] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="TrustCertificateError"> + Wydawca certyfikatu dla tego serwera nie jest znany. + +Informacje o certyfikacie: +SubjectName: [SUBJECT_NAME_STRING] +IssuerName: [ISSUER_NAME_STRING] +Valid From: [VALID_FROM] +Valid To: [VALID_TO] +MD5 Fingerprint: [SHA1_DIGEST] +SHA1 Fingerprint: [MD5_DIGEST] +Key Usage: [KEYUSAGE] +Extended Key Usage: [EXTENDEDKEYUSAGE] +Subject Key Identifier: [SUBJECTKEYIDENTIFIER] + +Czy chcesz zaufać temu wydawcy? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Zaufaj"/> + </notification> + <notification name="NotEnoughCurrency"> + [NAME] [PRICE]L$ Masz za mało L$. + </notification> + <notification name="GrantedModifyRights"> + Masz teraz prawa modyfikacji obiektów należących do [NAME]. + </notification> + <notification name="RevokedModifyRights"> + Prawa modyfikacji obiektów należących do [NAME] zostały Ci odebrane. + </notification> + <notification name="FlushMapVisibilityCaches"> + To spowoduje wyczyszczenie buforów map regionu. +Jest to użyteczne wyłącznie podczas szukania błędów. +(Podczas produkcji poczekaj 5 minut i mapy wszystkich zostaną uaktualnione po relogu.) + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="BuyOneObjectOnly"> + Nie możesz zakupić więcej niż jednego obiektu w tym samym czasie. Proszę wybrać tylko jeden obiekt i spróbować ponowanie. + </notification> + <notification name="OnlyCopyContentsOfSingleItem"> + Nie można kopiować zawartości więcej niż jednego obiektu naraz. +Wybierz pojedynczy obiekt i spróbuj jeszcze raz. + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="KickUsersFromRegion"> + Teleportować wszystkich Rezydentów z tego regionu to ich miejsca startu? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="EstateObjectReturn"> + Na pewno chcesz odesłać wszystkie obiekty należące do +[USER_NAME] ? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="InvalidTerrainBitDepth"> + Nie można ustawić tekstur regionu: +Tekstura terenu [TEXTURE_NUM] ma niewłaściwą głębię koloru - [TEXTURE_BIT_DEPTH]. +Zamień teksturę [TEXTURE_NUM] na 24-o bitową teksturę o wymiarze 512x512 lub mniejszą i ponownie kliknij Zastosuj. + </notification> + <notification name="InvalidTerrainSize"> + Nie można ustawić tekstur regionu: +Tekstura terenu [TEXTURE_NUM] jest za duża - [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y]. +Zamień teksturę [TEXTURE_NUM] na 24-o bitową teksturę o wymiarze 512x512 lub mniejszą i ponownie kliknij Zastosuj. + </notification> + <notification name="RawUploadStarted"> + Ładowanie rozpoczęte. Może potrwać do dwóch minut zależnie od prędkości Twojego połączenia. + </notification> + <notification name="ConfirmBakeTerrain"> + Na pewno chcesz zapisać obecne ukształtowanie terenu jako punkt odniesienia dla górnego i dolnego limitu terenu i jako domyślą wartość dla opcji Odtwórz? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="MaxAllowedAgentOnRegion"> + Maksymalna liczba gości wynosi [MAX_AGENTS]. + </notification> + <notification name="MaxBannedAgentsOnRegion"> + Maksymalna liczba niepożądanych Rezydentów (banów) wynosi [MAX_BANNED]. + </notification> + <notification name="MaxAgentOnRegionBatch"> + Próba dodania [NUM_ADDED] osób nie powiodła się: +[MAX_AGENTS] [LIST_TYPE] limit przekroczony o [NUM_EXCESS]. + </notification> + <notification name="MaxAllowedGroupsOnRegion"> + Możesz mieć maksymalnie [MAX_GROUPS] dozwolonych grup. + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Ustal"/> + </notification> + <notification name="MaxManagersOnRegion"> + Możesz mieć maksymalnie [MAX_MANAGER] zarządców Majątku. + </notification> + <notification name="OwnerCanNotBeDenied"> + Nie możesz dodać właściciela majątku do listy 'Niepożądanych Rezydentów (banów)' majątku. + </notification> + <notification name="CanNotChangeAppearanceUntilLoaded"> + Nie możesz zmienić wyglądu podczas ładowania ubrań i kształtów. + </notification> + <notification name="ClassifiedMustBeAlphanumeric"> + Tytuł Twojej reklamy musi zaczynać się od litery (A-Z) albo cyfry. Znaki przestankowe są niedozwolone. + </notification> + <notification name="CantSetBuyObject"> + Nie możesz wybrać Kup obiekt ponieważ obiekt nie jest na sprzedaż. +Wybierz obiekt na sprzedaż i spróbuj jeszcze raz. + </notification> + <notification name="FinishedRawDownload"> + Plik surowego terenu załadowany pod: +[DOWNLOAD_PATH]. + </notification> + <notification name="DownloadWindowsMandatory"> + Nowa wersja [APP_NAME] została opublikowana. +[MESSAGE] +Musisz zainstalować nową wersję żeby używać [APP_NAME]. + <usetemplate name="okcancelbuttons" notext="Wyłącz program" yestext="Załaduj"/> + </notification> + <notification name="DownloadWindows"> + Uaktualniona wersja [APP_NAME] została opublikowana. +[MESSAGE] +Aktualizacja nie jest wymagana ale jest zalecana w celu poprawy prędkości i stabilności. + <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Załaduj"/> + </notification> + <notification name="DownloadWindowsReleaseForDownload"> + Uaktualniona wersja [APP_NAME] została opublikowana. +[MESSAGE] +Aktualizacja nie jest wymagana ale jest zalecana w celu poprawy prędkości i stabilności. + <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Załaduj"/> + </notification> + <notification name="DownloadLinuxMandatory"> + Nowa wersja [APP_NAME] jest dostępna. +[MESSAGE] +Musisz pobrać aktualizację aby korzystać z [APP_NAME]. + <usetemplate name="okcancelbuttons" notext="Wyjdź" yestext="Pobieranie"/> + </notification> + <notification name="DownloadLinux"> + Aktualizacja [APP_NAME] jest dostępna. +[MESSAGE] +Ta aktualizacja nie jest wymagana ale zaleca się jej instalację w celu poprawienia szybkości i stabilności. + <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Pobieranie"/> + </notification> + <notification name="DownloadLinuxReleaseForDownload"> + Uaktualniona wersja [APP_NAME]została opublikowana. +[MESSAGE] +Aktualizacja nie jest wymagana ale jest zalecana w celu poprawy prędkości i stabilności. + <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Pobieranie"/> + </notification> + <notification name="DownloadMacMandatory"> + Nowa wersja [APP_NAME] została opublikowana. +[MESSAGE] +Musisz zainstalować nową wersję żeby używać [APP_NAME]. + +Pobrać i zapisać w folderze Aplikacji? + <usetemplate name="okcancelbuttons" notext="Wyłącz program" yestext="Załaduj"/> + </notification> + <notification name="DownloadMac"> + Uaktualniona wersja [APP_NAME] została opublikowana. +[MESSAGE] +Aktualizacja nie jest wymagana ale jest zalecana w celu poprawy prędkości i stabilności. + +Pobrać i zapisać w folderze Aplikacji? + <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Załaduj"/> + </notification> + <notification name="DownloadMacReleaseForDownload"> + Uaktualniona wersja [APP_NAME] została opublikowana. +[MESSAGE] +Aktualizacja nie jest wymagana ale jest zalecana w celu poprawy prędkości i stabilności. + +Pobrać i zapisać w folderze Aplikacji? + <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Załaduj"/> + </notification> + <notification name="FailedUpdateInstall"> + Podczas aktualizacji pojawił się błąd. Proszę pobrać i zainstalować najnowszego klienta z http://secondlife.com/download. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="FailedRequiredUpdateInstall"> + Nie można zainstalować wymaganej aktualizacji. Nie będzie można zalogować się dopóki [APP_NAME] nie zostanie zaktualizowana. + Proszę pobrać i zainstalować najnowszą wersję z http://secondlife.com/download. + <usetemplate name="okbutton" yestext="Rezygnuj"/> + </notification> + <notification name="UpdaterServiceNotRunning"> + Istnieje obowiązkowa aktualizacja dla Second Life. Możesz ją pobrać z http://www.secondlife.com/downloads lub zainstalować teraz. + <usetemplate name="okcancelbuttons" notext="Opuść Second Life" yestext="Pobierz i zainstaluj teraz"/> + </notification> + <notification name="DownloadBackgroundTip"> + Aktualizacja dla [APP_NAME] została pobrana. +Wersja [VERSION] [[RELEASE_NOTES_FULL_URL] Informacja o tej aktualizacji] + <usetemplate name="okcancelbuttons" notext="Później..." yestext="Zainstaluj teraz i restartuj [APP_NAME]"/> + </notification> + <notification name="DownloadBackgroundDialog"> + Aktualizacja [APP_NAME] została pobrana. +Wersja [VERSION] [[RELEASE_NOTES_FULL_URL] Informacja o aktualizacji] + <usetemplate name="okcancelbuttons" notext="Później..." yestext="Zainstaluj teraz i restartuj [APP_NAME]"/> + </notification> + <notification name="RequiredUpdateDownloadedVerboseDialog"> + Pobrano wymaganą aktualizację. +Wersja [VERSION] + +W celu instalacji aktualizacji musi zostać wykonany restart [APP_NAME]. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="RequiredUpdateDownloadedDialog"> + W celu instalacji aktualizacji musi zostać wykonany restart [APP_NAME]. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="DeedObjectToGroup"> + Przekazanie tego obiektu spowoduje, że grupa: +* Otrzyma L$ zapłacone temu obiektowi + <usetemplate ignoretext="Proszę potwierdzić decyzję przed przepisaniem obiektu do grupy" name="okcancelignore" notext="Anuluj" yestext="Przekaż"/> + </notification> + <notification name="WebLaunchExternalTarget"> + Czy chcesz otworzyć swoją przeglądarkę internetową by zobaczyć zawartość? + <usetemplate ignoretext="Uruchom przeglądarkę internetową by zobaczyć stronę internetową" name="okcancelignore" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="WebLaunchJoinNow"> + By dokonać zmian i aktualizacji swojego konta, odwiedź [http://secondlife.com/account/ Dashboard]. + <usetemplate ignoretext="Uruchom przeglądarkę internetową by dokonać zmian w konfiguracji mojego konta" name="okcancelignore" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="WebLaunchSecurityIssues"> + Odwiedź [SECOND_LIFE] Wiki i zobacz jak zgłaszać problemy z bezpieczeństwem danych. + <usetemplate ignoretext="Uruchom przeglądarkę internetową by dowiedzieć się więcej na temat zgłaszania problemów bezpieczeństwa" name="okcancelignore" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="WebLaunchQAWiki"> + Odwiedź [SECOND_LIFE] Wiki pytań i odpowiedzi. + <usetemplate ignoretext="Uruchom przeglądarkę internetową by zobaczyć QA Wiki" name="okcancelignore" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="WebLaunchPublicIssue"> + Odwiedź [SECOND_LIFE] katalog publicznych problemów, gdzie możesz zgłaszać błędy i inne problemy. + <usetemplate ignoretext="Uruchom przeglądarkę internetową by wysłać Błędy klienta" name="okcancelignore" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="WebLaunchSupportWiki"> + Otwórz oficjalny blog Lindenów żeby zobaczyć nowe wiadomości i informacje. + <usetemplate ignoretext="Uruchom przeglądarkę internetową by zobaczyć blog" name="okcancelignore" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="WebLaunchLSLGuide"> + Czy chcesz otworzyć samouczek Języka skryptowania? + <usetemplate ignoretext="Uruchom przeglądarkę internetową by samouczek Języka skryptowania" name="okcancelignore" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="WebLaunchLSLWiki"> + Czy napewno chcesz odwiedzić portal LSL Portal? + <usetemplate ignoretext="Uruchom przeglądarkę internetową by LSL Portal" name="okcancelignore" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ReturnToOwner"> + Czy na pewno chcesz zwrócić wybrane obiekty do ich właścicieli? Wszystkie udostępnione obiekty z prawem transferu zostaną zwrócone poprzednim właścicielom. + +*UWAGA* Wszystkie udostępnione obiekty bez prawa transferu zostaną usunięte! + <usetemplate ignoretext="Potwierdź zanim zwrócisz obiekty do ich właścicieli" name="okcancelignore" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="GroupLeaveConfirmMember"> + Jesteś członkiem grupy [GROUP]. +Chcesz opuścić grupę? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ConfirmKick"> + Napewno chcesz wyrzucić wszystkich Rezydentów z gridu? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Wyrzuć wszystkich Rezydentów"/> + </notification> + <notification name="MuteLinden"> + Przepraszamy, ale nie możesz zablokować Lindena. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="CannotStartAuctionAlreadyForSale"> + Aukcja nie może zostać rozpoczęta w posiadłości, która została już wcześniej wystawiona na aukcję. Deaktywuj opcję sprzedaży posiadłości jeżeli chcesz rozpocząć aukcję. + </notification> + <notification label="Zablokuj obiekty według wpisanej nazwy" name="MuteByNameFailed"> + Rezydent/obiekt jest już zablokowany. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="RemoveItemWarn"> + Pomimo, że jest to dozwolone, usunięcie zawartości może zniszczyć obiekt. Chcesz usunąć? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="CantOfferCallingCard"> + Nie możesz dać wizytówki w tym momencie. Spróbuj jeszcze raz za chwilę. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="CantOfferFriendship"> + Nie możesz zaoferować znajomości w tym momencie. Spróbuj jeszcze raz za chwilę. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="BusyModeSet"> + Tryb Pracy jest włączony. +Czat i IM będą ukryte. Wysłane IM będą otrzymywały Twoją odpowiedź Trybu Pracy. Propozycje teleportacji będą odrzucone. +Dodatkowo, wszystkie podarowane dla Ciebie obiekty będą automatycznie zapisywane w folderze "Kosz" w Twojej szafie. + <usetemplate ignoretext="Status zmieniony na Tryb pracy" name="okignore" yestext="OK"/> + </notification> + <notification name="JoinedTooManyGroupsMember"> + Należysz już do maksymalnej ilości grup. Opuść proszę przynajmniej jedną grupę żeby przyjąć członkostwo w tej grupie, albo odmów. +[NAME] oferuje Ci członkostwo w grupie. + <usetemplate name="okcancelbuttons" notext="Odmów" yestext="Przyjmij"/> + </notification> + <notification name="JoinedTooManyGroups"> + Należysz już do maksymalnej ilości grup. Opuść proszę przynajmiej jedną grupę żeby przyjąć członkostwo w tej grupie, albo odmów. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="KickUser"> + Wyrzuć tego Rezydenta, wysyłając następujący komunikat. + <form name="form"> + <input name="message"> + Administrator wylogował Cię. + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Anuluj"/> + </form> + </notification> + <notification name="KickAllUsers"> + Z jakim komunikatem wyrzucić wszystkich użytkowników z regionu? + <form name="form"> + <input name="message"> + Administrator wylogował Cię. + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Anuluj"/> + </form> + </notification> + <notification name="FreezeUser"> + Unieruchom tego Rezydenta, wysyłając następujący komunikat. + <form name="form"> + <input name="message"> + Unieruchomiono Cię. Nie możesz się ruszać ani rozmawiać. Administrator skontaktuje się z Tobą poprzez IM. + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Anuluj"/> + </form> + </notification> + <notification name="UnFreezeUser"> + Cofnij unieruchomienie tego Rezydenta, wysyłając następujący komunikat. + <form name="form"> + <input name="message"> + Odblokowano Cię. + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Anuluj"/> + </form> + </notification> + <notification name="SetDisplayNameSuccess"> + Witaj [DISPLAY_NAME]! + +Podobnie jak w realnym życiu potrzeba trochę czasu zanim wszyscy dowiedzą się o nowej nazwie. Kolejne kilka dni zajmie [http://wiki.secondlife.com/wiki/Setting_your_display_name aktualizacja nazwy] w obiektach, skryptach, wyszukiwarce, etc. + </notification> + <notification name="SetDisplayNameBlocked"> + Przepraszamy, nie można zmienić Twojej wyświetlanej nazwy. Jeśli uważasz ze jest to spowodowane błędem skontaktuj się z obsługą klienta. + </notification> + <notification name="SetDisplayNameFailedLength"> + Przepraszamy, ta nazwa jest zbyt długa. Wyświetlana nazwa może mieć maksymalnie [LENGTH] znaków. + +Proszę wprowadzić krótszą nazwę. + </notification> + <notification name="SetDisplayNameFailedGeneric"> + Przepraszamy, nie można ustawić Twojej wyświetlanej nazwy. Spróbuj ponownie później. + </notification> + <notification name="SetDisplayNameMismatch"> + Podana wyświetlana nazwa nie pasuje. Proszę wprowadzić ją ponownie. + </notification> + <notification name="AgentDisplayNameUpdateThresholdExceeded"> + Przepraszamy, musisz jeszcze poczekać zanim będzie można zmienić Twoją wyświetlaną nazwę. + +Zobacz http://wiki.secondlife.com/wiki/Setting_your_display_name + +Proszę spróbować ponownie później. + </notification> + <notification name="AgentDisplayNameSetBlocked"> + Przepraszamy, nie można ustawić wskazanej nazwy, ponieważ zawiera zabronione słowa. + + Proszę spróbować wprowadzić inną nazwę. + </notification> + <notification name="AgentDisplayNameSetInvalidUnicode"> + Wyświetlana nazwa, którą chcesz ustawić zawiera niepoprawne znaki. + </notification> + <notification name="AgentDisplayNameSetOnlyPunctuation"> + Twoje wyświetlane imię musi zawierać litery inne niż znaki interpunkcyjne. + </notification> + <notification name="DisplayNameUpdate"> + [OLD_NAME] ([SLID]) jest od tej pory znana/znany jako [NEW_NAME]. + </notification> + <notification name="OfferTeleport"> + Zaproponować teleportację do miejsca Twojego pobytu z tą wiadomością? + <form name="form"> + <input name="message"> + Zapraszam do siebie. Region: [REGION] + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Anuluj"/> + </form> + </notification> + <notification name="OfferTeleportFromGod"> + Wysłać propozycję teleportacji do Twojego miejsca? + <form name="form"> + <input name="message"> + Zapraszam do siebie. Region: [REGION] + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Anuluj"/> + </form> + </notification> + <notification name="TeleportFromLandmark"> + Na pewno chcesz się teleportować do <nolink>[LOCATION]</nolink>? + <usetemplate ignoretext="Potwierdź próbę teleportacji do zapisanego miejsca" name="okcancelignore" notext="Anuluj" yestext="Teleportuj"/> + </notification> + <notification name="TeleportToPick"> + Teleportuj do [PICK]? + <usetemplate ignoretext="Potwierdź, że chcesz teleportować się do miejsca w Ulubionych" name="okcancelignore" notext="Anuluj" yestext="Teleportuj"/> + </notification> + <notification name="TeleportToClassified"> + Teleportuj do [CLASSIFIED]? + <usetemplate ignoretext="Potwierdź, że chcesz teleportować się do lokalizacji z reklamy" name="okcancelignore" notext="Anuluj" yestext="Teleportuj"/> + </notification> + <notification name="TeleportToHistoryEntry"> + Teleportuj do [HISTORY_ENTRY]? + <usetemplate ignoretext="Potwierdź teleportację do lokalizacji z historii" name="okcancelignore" notext="Anuluj" yestext="Teleportuj"/> + </notification> + <notification label="Wiadomość do Wszystkich w Twoim Majątku" name="MessageEstate"> + Wpisz krótką wiadomość która zostanie wysłana do wszystkich osób w Twoim majątku. + <form name="form"> + <input name="message"/> + <button name="OK" text="OK"/> + <button name="Cancel" text="Anuluj"/> + </form> + </notification> + <notification label="Zmiana Majątku Lindenów" name="ChangeLindenEstate"> + Czy napewno chcesz zmienić ustawienia majątku Linden (mainland, teen grid, orientacja, itp). + +Jest to wyjątkowo niebezpieczna decyzja, odczuwalna przez wszystkich Rezydentów. Dla mainland, spowoduje to zmianę tysięcy regionów oraz ich przestrzeń serwerową. + +Kontynuować? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification label="Zmiana Dostępu do Majątku Lindenów" name="ChangeLindenAccess"> + Dokonujesz zmiany w liście dostępu Regionu głównego należącego do Lindenów (Regiony Główne, Teen Grid, Orientacja). + +Żądana operacja jest wyjątkowo niebezpieczna dla wszystkich Rezydentów przebywających w regionie i powinna być używana wyłącznie w celu zablokowania opcji pozwalającej na przeniesienie obiektów/L$ do/z sieci. +Dodatkowo, zmiany dokonane w Regionie Głównym mogą spowodować problemy przestrzeni serwerowej innych regionów. + +Kontynuować? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification label="Wybierz Majątek" name="EstateAllowedAgentAdd"> + Dodać do listy dostępu do tego majątku czy do [ALL_ESTATES]? + <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majątki" yestext="Ten majątek"/> + </notification> + <notification label="Wybierz Majątek" name="EstateAllowedAgentRemove"> + Usunąć z listy dostępu do tego majątku czy do [ALL_ESTATES]? + <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majątki" yestext="Ten majątek"/> + </notification> + <notification label="Wybierz Majątek" name="EstateAllowedGroupAdd"> + Dodać do listy dostępu grup do tego majątku czy do [ALL_ESTATES]? + <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majątki" yestext="Ten majątek"/> + </notification> + <notification label="Wybierz Majątek" name="EstateAllowedGroupRemove"> + Usunąć z listy dostępu grup do tego majątku czy do [ALL_ESTATES]? + <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majątki" yestext="Ten majątek"/> + </notification> + <notification label="Wybierz Majątek" name="EstateBannedAgentAdd"> + Zablokować dostęp do tego majątku czy do [ALL_ESTATES]? + <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majątki" yestext="Ten majątek"/> + </notification> + <notification label="Wybierz Majątek" name="EstateBannedAgentRemove"> + Zdjąć tego Rezydenta z listy niepożądanych (bany) dla tego majątku czy dla [ALL_ESTATES]? + <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majątki" yestext="Ten majątek"/> + </notification> + <notification label="Wybierz Majątek" name="EstateManagerAdd"> + Dodać zarządce majątku do tego majątku czy do [ALL_ESTATES]? + <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majątki" yestext="Ten majątek"/> + </notification> + <notification label="Wybierz Majątek" name="EstateManagerRemove"> + Usunąć zarządce majątku z tego majątku czy z [ALL_ESTATES]? + <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majątki" yestext="Ten majątek"/> + </notification> + <notification label="Potwierdź Wyrzucenie" name="EstateKickUser"> + Wyrzucić [EVIL_USER] z tego majątku? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="EstateChangeCovenant"> + Na pewno chcesz zminić treść umowy dla tego majątku? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="RegionEntryAccessBlocked"> + Ze względu na Twój wiek, nie jesteś uprawniony do przebywania w tym regionie. Może być to wynikiem braku informacji na temat weryfikacji Twojego wieku. + +Upewnij się, że masz zainstalowaną najnowszą wersję klienta i skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać więcej informacji na temat dostępu do regionów z podanym rodzajem treści jaką zawiera. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="RegionEntryAccessBlocked_KB"> + Ze względu na Twój wiek, nie jesteś uprawniony do przebywania w tym regionie. + +Skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać więcej informacji na temat dostępu do regionów z podanym rodzajem treści jaką zawiera. + <url name="url"> + https://support.secondlife.com/ics/support/default.asp?deptID=4417&task=knowledge&questionID=6010 + </url> + <usetemplate ignoretext="Ze względu na Twój wiek, nie jesteś uprawniony do przebywania w tym regionie. Może być to wynikiem braku informacji na temat weryfikacji Twojego wieku." name="okcancelignore" notext="Zamknij" yestext="[SECOND_LIFE]:Pomoc"/> + </notification> + <notification name="RegionEntryAccessBlocked_Notify"> + Ze względu na Twój wiek, nie jesteś uprawniony do przebywania w tym regionie. + </notification> + <notification name="RegionEntryAccessBlocked_Change"> + Nie masz zezwolenia na przebywanie w tym Regionie z powodu Twojego statusu ustawień wieku. + +W celu uzyskania dostępu do tego regiony zmień proszę swój status ustawień wieku. Będziesz mógł/mogła szukać i mieć dostęp do treści [REGIONMATURITY]. W celu cofnięcia zmian wybierz z menu Ja > Ustawienia > Ogólne. + <form name="form"> + <button name="OK" text="Zmień ustawienia"/> + <button default="true" name="Cancel" text="Zamknij"/> + <ignore name="ignore" text="Moje ustawienia wieku nie dopuszczają do regionu"/> + </form> + </notification> + <notification name="PreferredMaturityChanged"> + Twoja obecna klasyfikacja wieku to [RATING]. + </notification> + <notification name="LandClaimAccessBlocked"> + W związku ze statusem ustawień Twojego wieku, nie możesz odzyskać tej posiadłości. Możesz potrzebować weryfikacji wieku bądź instalacji najnowszej wersji klienta. + +Upewnij się, że masz zainstalowaną najnowszą wersję klienta i skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać więcej informacji na temat dostępu do regionów z podanym rodzajem treści jaką zawiera. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="LandClaimAccessBlocked_KB"> + Ze względu na Twój wiek, nie możesz odzyskać tej posiadłości. + +Skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać więcej informacji na temat dostępu do regionów z podanym rodzajem treści jaką zawiera. + <url name="url"> + https://support.secondlife.com/ics/support/default.asp?deptID=4417&task=knowledge&questionID=6010 + </url> + <usetemplate ignoretext="W związku ze statusem ustawień Twojego wieku, nie możesz odzyskać tej posiadłości." name="okcancelignore" notext="Zamknij" yestext="[SECOND_LIFE]:Pomoc"/> + </notification> + <notification name="LandClaimAccessBlocked_Notify"> + Ze względu na Twój wiek, nie możesz odzyskać tej posiadłości. + </notification> + <notification name="LandClaimAccessBlocked_Change"> + W związku ze statusem ustawień Twojego wieku, nie możesz odzyskać tej posiadłości. + +Możesz wybrać 'Zmień Ustawienia' by dokonać zmian w ustawieniach Twojego wieku by uzyskać dostęp do regionu. Wówczas będziesz w stanie znaleźć oraz mieć dostęp do [REGIONMATURITY] treści. Jeżeli zdecydujesz się na powrót do poprzednich ustawień, wybierz Ja > Ustawienia > Główne. + <usetemplate ignoretext="Ze względu na Twój wiek, nie możesz odzyskać tej posiadłości." name="okcancelignore" notext="Zamknij" yestext="Zmień Ustawienia"/> + </notification> + <notification name="LandBuyAccessBlocked"> + Ze względu na Twój wiek, nie możesz kupić tej posiadłości. Może być to wynikiem braku informacji na temat weryfikacji Twojego wieku. + +Upewnij się, że masz zainstalowaną najnowszą wersję klienta i skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać więcej informacji na temat dostępu do regionów z podanym rodzajem treści jaką zawiera. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="LandBuyAccessBlocked_KB"> + Ze względu na Twój wiek, nie możesz kupić tej posiadłości. + +Skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać więcej informacji na temat dostępu do regionów z podanym rodzajem treści jaką zawiera. + <url name="url"> + https://support.secondlife.com/ics/support/default.asp?deptID=4417&task=knowledge&questionID=6010 + </url> + <usetemplate ignoretext="Ze względu na Twój wiek, nie możesz kupić tej posiadłości." name="okcancelignore" notext="Zamknij" yestext="[SECOND_LIFE]:Pomoc"/> + </notification> + <notification name="LandBuyAccessBlocked_Notify"> + Ze względu na Twój wiek, nie możesz kupić tej posiadłości. + </notification> + <notification name="LandBuyAccessBlocked_Change"> + W związku ze statusem ustawień Twojego wieku, nie możesz kupić tej posiadłości. + +Możesz wybrać 'Zmień Ustawienia' by dokonać zmian w ustawieniach Twojego wieku by uzyskać dostęp do regionu. Wówczas będziesz w stanie znaleźć oraz mieć dostęp do [REGIONMATURITY] treści. Jeżeli zdecydujesz się na powrót do poprzednich ustawień, wybierz Ja > Ustawienia > Główne. + <usetemplate ignoretext="W związku ze statusem ustawień Twojego wieku, nie możesz kupić tej posiadłości." name="okcancelignore" notext="Zamknij" yestext="Zmień Ustawienia"/> + </notification> + <notification name="TooManyPrimsSelected"> + Zbyt wiele wybranych obiektów. Wybierz [MAX_PRIM_COUNT] lub mniej i spróbuj ponownie + </notification> + <notification name="ProblemImportingEstateCovenant"> + Problem z importem umowy majątku. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="ProblemAddingEstateManager"> + Problemy z dodawaniem nowego zarządcy majątku. Jeden lub więcaj majątk może mieć wypełnioną listę zarządców. + </notification> + <notification name="ProblemAddingEstateGeneric"> + Problemy z dodawaniem do listy majątku. Jeden lub więcaj majątk może mieć wypełnioną listę. + </notification> + <notification name="UnableToLoadNotecardAsset"> + Brak możliwości załadowania noty w tej chwili. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="NotAllowedToViewNotecard"> + Niewystarczające prawa do zobaczenia notki przypisanej do wybranego ID. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="MissingNotecardAssetID"> + ID notki nie znalezione w bazie danych. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="PublishClassified"> + Pamiętaj: Opłaty za reklamę są bezzwrotne. + +Zamieścić tą reklamę za [AMOUNT]L$? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="SetClassifiedMature"> + Czy ta reklama zawiera treść 'Mature'? + <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Nie" yestext="Tak"/> + </notification> + <notification name="SetGroupMature"> + Czy ta grupa zawiera treść 'Mature'? + <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Nie" yestext="Tak"/> + </notification> + <notification label="Potwierdź Restart" name="ConfirmRestart"> + Na pewno chcesz zrobić restart tego regionu za 2 minuty? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification label="Wiadomość do Wszystkich w tym Regionie" name="MessageRegion"> + Wpisz krótką wiadomość która zostanie wysłana do wszystkich osób w tym regionie. + <form name="form"> + <input name="message"/> + <button name="OK" text="OK"/> + <button name="Cancel" text="Anuluj"/> + </form> + </notification> + <notification label="Zmienione Restrykcje Wieku dla Regionu" name="RegionMaturityChange"> + Ustawienie restrykcji wieku dla regionu zostało zmienione. +Zazwyczaj musi upłynąć nieco czasu zanim ta zmiana zostanie odzwierciedlona na mapie. + +Aby wejść do regionu Adult, Rezydenci muszą posiadać zweryfikowane konto, albo w wyniku weryfikacji wieku albo płatości. + </notification> + <notification label="Wersja Niezgodna z Systemem Rozmów" name="VoiceVersionMismatch"> + Ta wersja [APP_NAME] nie jest kompatybilna z systemem rozmów w tym Regionie. Musisz zainstalować aktualną wersję [APP_NAME] aby komunikacja głosowa działała poprawnie. + </notification> + <notification label="Nie Można Kupić Obiektów" name="BuyObjectOneOwner"> + Jednorazowo możesz kupować tylko od jednego właściciela. +Wybierz pojedynczy obiekt i spróbuj jeszcze raz. + </notification> + <notification label="Nie Można Kupić Zawartości" name="BuyContentsOneOnly"> + Jednorazowo możesz kupić zawartość tylko jednego obiektu. +Wybierz pojedynczy obiekt i spróbuj jeszcze raz. + </notification> + <notification label="Nie Można Kupić Zawartości" name="BuyContentsOneOwner"> + Jednorazowo możesz kupować tylko od jednego właściciela. +Wybierz pojedynczy obiekt i spróbuj jeszcze raz. + </notification> + <notification name="BuyOriginal"> + Kupić oryginalny obiekt od [OWNER] za [PRICE]L$? +Zostaniesz właścicielem tego obiektu z następującymi prawami: + Modyfikacje: [MODIFYPERM] + Kopiowanie: [COPYPERM] + Odsprzedawanie i oddawanie: [RESELLPERM] + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="BuyOriginalNoOwner"> + Kupić oryginalny obiekt za [PRICE]L$? +Zostaniesz właścicielem tego obiektu z następującymi prawami: + Modyfikacje: [MODIFYPERM] + Kopiowanie: [COPYPERM] + Odsprzedawanie i oddawanie: [RESELLPERM] + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="BuyCopy"> + Kupić kopię obiektu od [OWNER] za [PRICE]L$? +Obiekt zostanie skopiowany do Twojej szafy z następującymi prawami: + Modyfikacje: [MODIFYPERM] + Kopiowanie: [COPYPERM] + Odsprzedawanie i oddawanie: [RESELLPERM] + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="BuyCopyNoOwner"> + Kupić kopię obiektu za [PRICE]L$? +Obiekt zostanie skopiowany do Twojej szafy z następującymi prawami: + Modyfikacje: [MODIFYPERM] + Kopiowanie: [COPYPERM] + Odsprzedawanie i oddawanie: [RESELLPERM] + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="BuyContents"> + Kupić zawartość od [OWNER] za [PRICE]L$? +Zawartość zostanie skopiowana do Twojej szafy. + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="BuyContentsNoOwner"> + Kupić zawartość za [PRICE]L$? +Zawartość zostanie skopiowana do Twojej szafy. + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ConfirmPurchase"> + Ta transakcja spowoduje: +[ACTION] + +Na pewno chcesz dokonać tego zakupu? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ConfirmPurchasePassword"> + Ta transakcja spowoduje: +[ACTION] + +Na pewno chcesz dokonać tego zakupu? +Wpisz hasło ponownie i kliknij OK. + <form name="form"> + <input name="message"/> + <button name="ConfirmPurchase" text="OK"/> + <button name="Cancel" text="Anuluj"/> + </form> + </notification> + <notification name="SetPickLocation"> + Uwaga: +Lokalizacja tego wyboru została zaktualizowana ale pozostałe szczegóły zachowają oryginalne wartości. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="MoveInventoryFromObject"> + Wybrane obiekty Szafy nie mają praw kopiowania. +Obiekty zostaną przeniesione do Twojej Szafy, nie zostaną skopiowane. + +Przenieść obiekty Szafy? + <usetemplate ignoretext="Uprzedź przed przeniesieniem zawartości niekopiowalnej z obiektu" name="okcancelignore" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="MoveInventoryFromScriptedObject"> + Wybrane obiekty Szafy nie mają praw kopiowania. +Obiekty zostaną przeniesione do Twojej Szafy, nie zostaną skopiowane. +Ponieważ obiekty zawierają skrypty, przeniesienie obiektów do Twojej Szafy może spowodować niepoprawne działanie skryptów. + +Przenieść obiekty szafy? + <usetemplate ignoretext="Uprzedź przed przeniesieniem zawartości niekopiowalnej z obiektu, która może uszkodzić skrypty obiektu" name="okcancelignore" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ClickActionNotPayable"> + Uwaga: Opcja Zapłać obiektowi została wybrana, ale żeby ta opcja działała musi być dodany skrypt z funkcją money(). + <form name="form"> + <ignore name="ignore" text="Opcja Zapłać Obiektowi została aktywowana podczas budowania obiektów bez skryptu z funkcją money()."/> + </form> + </notification> + <notification name="OpenObjectCannotCopy"> + W tym obiekcie nie ma elementów które możesz skopiować. + </notification> + <notification name="WebLaunchAccountHistory"> + Przejść na stronę [http://secondlife.com/account/ Dashboard] żeby zobaczyć historię konta? + <usetemplate ignoretext="Uruchom przeglądarkę internetową by zobaczyć historię konta" name="okcancelignore" notext="Anuluj" yestext="Idź na stronę"/> + </notification> + <notification name="ConfirmQuit"> + Na pewno chcesz skończyć? + <usetemplate ignoretext="Na pewno chcesz skończyć?" name="okcancelignore" notext="Nie kończ" yestext="Wyłącz"/> + </notification> + <notification name="DeleteItems"> + [QUESTION] + <usetemplate ignoretext="Potwierdź, że na pewno chcesz skasować obiekty" name="okcancelignore" notext="Cofnij" yestext="OK"/> + </notification> + <notification name="HelpReportAbuseEmailLL"> + Używaj tej opcji do zgłaszania nadużyć [http://secondlife.com/corporate/tos.php Warunków Umowy (Terms of Service)] i [http://secondlife.com/corporate/cs.php Standardów Społeczeństwa (Community Standards)]. + +Wszystkie zgłoszone nadużycia są badane i rozwiązywane. + </notification> + <notification name="HelpReportAbuseSelectCategory"> + Wybierz kategorię dla tego raportu o nadużyciu. +Określenie kategorii pomoże nam w klasyfikacji i prztwarzaniu raportu. + </notification> + <notification name="HelpReportAbuseAbuserNameEmpty"> + Wprowadź imię i nazwisko osoby popełniającej nadużycie. +Dokładne dane pomogą nam w klasyfikacji i prztwarzaniu raportu. + </notification> + <notification name="HelpReportAbuseAbuserLocationEmpty"> + Wprowadź nazwę miejsca gdzie popełniono nadużycie. +Dokładne dane pomogą nam w klasyfikacji i prztwarzaniu raportu. + </notification> + <notification name="HelpReportAbuseSummaryEmpty"> + Wprowadź opis popełnionego nadużycia. +Dokładne dane pomogą nam w klasyfikacji i prztwarzaniu raportu. + </notification> + <notification name="HelpReportAbuseDetailsEmpty"> + Wprowadź szczgółowy opis popełnionego nadużycia. +Podaj maksymalną ilość szczgółów oraz imiona i nazwiska osób związanych z nadużyciem które zgłaszasz. +Dokładne dane pomogą nam w klasyfikacji i prztwarzaniu raportu. + </notification> + <notification name="HelpReportAbuseContainsCopyright"> + Szanowny Rezydencie, + +Jeżeli składasz raport dotyczący naruszenia praw autorskich proszę się upewnić, że robisz to poprawnie: + +(1) Przypadek Nadużycia. Możesz złożyć raport jeżeli sądzisz, że Rezydent narusza system przywilejów [SECOND_LIFE], na przykład używając CopyBot lub podobnych narzędzi robiących kopie, naruszając prawa autorskie. Komisja Nadużyć bada wykroczenia i stosuje akcje dyscyplinarne za zachowania sprzeczne z zasadami Warunków Umowy [SECOND_LIFE] [http://secondlife.com/corporate/tos.php Terms of Service] i Standardów Społeczeństwa [http://secondlife.com/corporate/cs.php Community Standards]. Komisja Nadużyć nie zajmuje się i nie odpowiada na żądania usunięcia treści ze środowiska [SECOND_LIFE]. + +(2) Przypadek DMCA lub Usuwanie Treści. Aby wystąpić z żądaniem o usunięcie treści ze środowiska [SECOND_LIFE] MUSISZ przedłożyć ważne zawiadomienie o nadużyciu zgodne z naszą polityką DMCA [http://secondlife.com/corporate/dmca.php DMCA Policy]. + +Jeżeli chcesz kontynuować dalej zamknij to okno i dokończ wysyłanie raportu. Może być potrzebny wybór kategorii 'CopyBot albo Nadużycie Przywilejów'. + +Dziękujemy, + +Linden Lab + </notification> + <notification name="FailedRequirementsCheck"> + Brak następujących wymaganych komponentów w [FLOATER]: +[COMPONENTS] + </notification> + <notification label="Zamień Istniejący Dodatek" name="ReplaceAttachment"> + Obecnie masz już dołączony obiekt do tej części Twojego ciała. +Chcesz go zamienić na wybrany obiekt? + <form name="form"> + <ignore name="ignore" save_option="true" text="Obecnie masz już dołączony obiekt do tej części Twojego ciała.Chcesz go zamienić na wybrany obiekt?"/> + <button ignore="Zamień automatycznie" name="Yes" text="OK"/> + <button ignore="Nie zamieniaj" name="No" text="Anuluj"/> + </form> + </notification> + <notification label="Ostrzeżenie Trybu Pracy" name="BusyModePay"> + Jesteś w Trybie pracy co oznacza, że nie dostaniesz żadnych obiektów w zamian za tą opłatę. + +Chcesz wyłączyć Tryb pracy przed zakończeniem tej tranzakcji? + <form name="form"> + <ignore name="ignore" save_option="true" text="Jesteś w Trybie Pracy co oznacza, że nie dostaniesz żadnych obiektów w zamian za tą opłatę. Chcesz wyłączyć Tryb Pracy przed zakończeniem tej transakcji?"/> + <button ignore="Zawsz wyłączaj tryb pracy" name="Yes" text="OK"/> + <button ignore="Nie wyłączaj trybu pracy" name="No" text="Anuluj"/> + </form> + </notification> + <notification name="ConfirmDeleteProtectedCategory"> + Ten folder '[FOLDERNAME]' to folder systemowy. Usunięcie foldera systemowego spowoduje niestabilność. Czy na pewno chcesz go skasować? + <usetemplate ignoretext="Potwierdź zanim folder systemu zostanie skasowany" name="okcancelignore" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ConfirmEmptyTrash"> + Na pewno chcesz permanentnie usunąć zawartość Kosza? + <usetemplate ignoretext="Potwierdź przed usunięciem zawartości Kosza" name="okcancelignore" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ConfirmClearBrowserCache"> + Na pewno chcesz wyczyścić bufor przeglądarki? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ConfirmClearCookies"> + Na pewno chcesz wyczyścić ciasteczka? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Tak"/> + </notification> + <notification name="ConfirmClearMediaUrlList"> + Na pewno chcesz wyczyścić listę zapisanych linków? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Tak"/> + </notification> + <notification name="ConfirmEmptyLostAndFound"> + Na pewno chcesz permanentnie usunąć zawartość Twojego foldera Zgubione i odnalezione? + <usetemplate ignoretext="Potwierdź przed usunięciem zawartości foldera Zagubione i odnalezione" name="okcancelignore" notext="Nie" yestext="Tak"/> + </notification> + <notification name="CopySLURL"> + Następujący link SLURL został skopiowany do schowka: + [SLURL] + +Zamieść go na stronie internetowej żeby umożliwić innym łatwy dostęp do tego miejsca, albo wklej go do panela adresu Twojej przeglądarki żeby go otworzyć. + <form name="form"> + <ignore name="ignore" text="SLurl skopiowany do schowka"/> + </form> + </notification> + <notification name="WLSavePresetAlert"> + Chcesz zmienić zapisane ustawienia? + <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/> + </notification> + <notification name="WLDeletePresetAlert"> + Chcesz usunąć [SKY]? + <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/> + </notification> + <notification name="WLNoEditDefault"> + Nie możesz edytować lub usunąć domyślnych ustawień. + </notification> + <notification name="WLMissingSky"> + Ten plik cyklu dziennego używa brakującego pliku nieba: [SKY]. + </notification> + <notification name="PPSaveEffectAlert"> + Efekt post-procesu już istnieje. Chcesz zapisać nowy na jego miejsce? + <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/> + </notification> + <notification name="NewSkyPreset"> + Nazwij nowe niebo. + <form name="form"> + <input name="message"> + Nowe ustawienie + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Anuluj"/> + </form> + </notification> + <notification name="ExistsSkyPresetAlert"> + Ustawienie już istnieje! + </notification> + <notification name="NewWaterPreset"> + Nazwij nowe ustawienie wody. + <form name="form"> + <input name="message"> + Nowe ustawienie + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Anuluj"/> + </form> + </notification> + <notification name="ExistsWaterPresetAlert"> + Ustawienie już istnieje! + </notification> + <notification name="WaterNoEditDefault"> + Domyślne ustawienie nie może być zmienione ani usunięte. + </notification> + <notification name="ChatterBoxSessionStartError"> + Błąd podczas rozpoczynania czatu/IM z [RECIPIENT]. +[REASON] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="ChatterBoxSessionEventError"> + [EVENT] +[REASON] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="ForceCloseChatterBoxSession"> + Twój czat/IM z [NAME] zostanie zamknięty. +[REASON] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="Cannot_Purchase_an_Attachment"> + Rzeczy nie mogą być kupione jeżeli są częścią załącznika. + </notification> + <notification label="Prośba o Zgodę na Pobieranie L$" name="DebitPermissionDetails"> + Akceptując tą prośbę wyrażasz zgodę na ciągłe pobieranie Lindenów (L$) z Twojego konta. Żeby cofnąć to pozwolenie właściciel obiektu będzie musiał usunąć ten obiekt albo zresetowć skrypty obieku. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="AutoWearNewClothing"> + Czy chcesz automatycznie nosić ubranie które tworzysz? + <usetemplate ignoretext="Załóż ubranie automatycznie będąc w trybie Edycji Wyglądu" name="okcancelignore" notext="Nie" yestext="Tak"/> + </notification> + <notification name="NotAgeVerified"> + Nie masz dostępu do tej posiadłości ze względu na brak weryfikacji Twojego wieku. Czy chcesz odwiedzić stronę [SECOND_LIFE] żeby to zmienić? + +[_URL] + <url name="url" option="0"> + https://secondlife.com/account/verification.php + </url> + <usetemplate ignoretext="Brak weryfikacji wieku" name="okcancelignore" notext="Nie" yestext="Tak"/> + </notification> + <notification name="Cannot enter parcel: no payment info on file"> + Nie masz dostępu do tej posiadłości ze względu na brak danych o Twoim koncie. Czy chcesz odwiedzić stronę [SECOND_LIFE] żeby to zmienić? + +[_URL] + <url name="url" option="0"> + https://secondlife.com/account/ + </url> + <usetemplate ignoretext="Brak danych o koncie" name="okcancelignore" notext="Nie" yestext="Tak"/> + </notification> + <notification name="MissingString"> + Zdanie [STRING_NAME] nie znalezione w strings.xml + </notification> + <notification name="SystemMessageTip"> + [MESSAGE] + </notification> + <notification name="IMSystemMessageTip"> + [MESSAGE] + </notification> + <notification name="Cancelled"> + Anulowane + </notification> + <notification name="CancelledSit"> + Siadanie anulowane + </notification> + <notification name="CancelledAttach"> + Dołączenie anulowane + </notification> + <notification name="ReplacedMissingWearable"> + Barkujące ubranie/części ciała zastąpiono domyślnymi obiektami. + </notification> + <notification name="GroupNotice"> + Temat: [SUBJECT], Treść: [MESSAGE] + </notification> + <notification name="FriendOnline"> + [NAME] jest w Second Life + </notification> + <notification name="FriendOffline"> + [NAME] opuszcza Second Life + </notification> + <notification name="AddSelfFriend"> + Nie możesz dodać siebie do listy znajomych. + </notification> + <notification name="UploadingAuctionSnapshot"> + Ładowanie obrazu z Internetu... +(Zajmuje około 5 minut.) + </notification> + <notification name="UploadPayment"> + Ładowanie kosztowało [AMOUNT]L$. + </notification> + <notification name="UploadWebSnapshotDone"> + Ładowanie obrazu z Internetu zakończne pomyślnie. + </notification> + <notification name="UploadSnapshotDone"> + Ładowanie zdjęcia zakończone pomyślnie. + </notification> + <notification name="TerrainDownloaded"> + Plik terrain.raw ściągniety. + </notification> + <notification name="GestureMissing"> + Gesturka [NAME] nie znaleziony w bazie danych. + </notification> + <notification name="UnableToLoadGesture"> + Ładowanie gesturki [NAME] nie powiodło się. + </notification> + <notification name="LandmarkMissing"> + Miejsce (LM) nie znalezione w bazie danych. + </notification> + <notification name="UnableToLoadLandmark"> + Ładowanie miejsca (LM) nie powiodło się. +Spróbuj jeszcze raz. + </notification> + <notification name="CapsKeyOn"> + Twój Caps Lock jest włączony. +Ponieważ to ma wpływ na wpisywane hasło, możesz chcieć go wyłączyć. + </notification> + <notification name="NotecardMissing"> + Notka nie została znaleziona w bazie danych. + </notification> + <notification name="NotecardNoPermissions"> + Nie masz pozwolenia na zobaczenie notki. + </notification> + <notification name="RezItemNoPermissions"> + Nie masz pozwolenia na stworzenie obiektu. + </notification> + <notification name="UnableToLoadNotecard"> + Nie można załadować danych notki w tym momencie. + </notification> + <notification name="ScriptMissing"> + Skrypt nie znaleziony w bazie danych. + </notification> + <notification name="ScriptNoPermissions"> + Nie masz pozwolenia na zobaczenie skryptu. + </notification> + <notification name="UnableToLoadScript"> + Ładowanie skryptu nie powiodło się. +Spróbuj jeszcze raz. + </notification> + <notification name="IncompleteInventory"> + Zawartość obiektów którą chcesz podarować nie jest dostępna lokalnie. Spróbuj podarować te obiekty jeszcze raz za jakiś czas. + </notification> + <notification name="CannotModifyProtectedCategories"> + Nie możesz zmienić chronionych kategorii. + </notification> + <notification name="CannotRemoveProtectedCategories"> + Nie możesz usunąć chronionych kategorii. + </notification> + <notification name="UnableToBuyWhileDownloading"> + Nie można kupować w trakcie ładowania danych obiektu. +Spróbuj jeszcze raz. + </notification> + <notification name="UnableToLinkWhileDownloading"> + Nie można łączyć w trakcie ładowania danych obiektu. +Spróbuj jeszcze raz. + </notification> + <notification name="CannotBuyObjectsFromDifferentOwners"> + Nie możesz jednocześnie kupować obiektów od różnych osób. +Wybierz jeden obiekt. + </notification> + <notification name="ObjectNotForSale"> + Obiekt nie jest na sprzedaż. + </notification> + <notification name="EnteringGodMode"> + Włącznie trybu boskiego, poziom [LEVEL] + </notification> + <notification name="LeavingGodMode"> + Wyłączanie trybu boskiego, poziom [LEVEL] + </notification> + <notification name="CopyFailed"> + Nie masz praw do skopiowania wybranych obiektów. + </notification> + <notification name="InventoryAccepted"> + Podarunek od Ciebie został przyjęty przez [NAME]. + </notification> + <notification name="InventoryDeclined"> + Podarunek od Ciebie został odrzucony przez [NAME]. + </notification> + <notification name="ObjectMessage"> + [NAME]: [MESSAGE] + </notification> + <notification name="CallingCardAccepted"> + Twoja wizytówka została przyjęta. + </notification> + <notification name="CallingCardDeclined"> + Twoja wizytówka została odrzucona. + </notification> + <notification name="TeleportToLandmark"> + Jesteś w Głównym Regionie i możesz się stąd teleportować do innych miejsc jak '[NAME]' wybierając Moja Szafa w prawym dolnym rogu ekranu +i wybierając folder Zapisane Miejsca (LM). +(Kliknij dwa razy na miejsce (LM) i wybierz 'Teleport' żeby tam się przenieść.) + </notification> + <notification name="TeleportToPerson"> + Możesz skontaktować się z Rezydentem '[NAME]' poprzez otworzenie panelu Ludzie po prawej stronie ekranu. +Wybierz Rezydenta z listy, następnie kliknij 'IM' na dole panelu. +(Możesz także kliknąć podwójnie na ich imię na liście, lub prawym przyciskiem i wybrać 'IM'). + </notification> + <notification name="CantSelectLandFromMultipleRegions"> + Nie możesz przekraczać granic serwera wybierając obszar. +Spróbuj wybrać mniejszy obszar. + </notification> + <notification name="SearchWordBanned"> + Pewne frazy podczas wyszukiwania zostały usunięte w związku z restrykcjami zawartymi w Standardach Społecznościowych (Community Standards). + </notification> + <notification name="NoContentToSearch"> + Proszę wybrać przynajmiej jeden z podanych rodzajów treści jaką zawiera region podczas wyszukiwania ('General', 'Moderate', lub 'Adult'). + </notification> + <notification name="SystemMessage"> + [MESSAGE] + </notification> + <notification name="PaymentReceived"> + [MESSAGE] + </notification> + <notification name="PaymentSent"> + [MESSAGE] + </notification> + <notification name="EventNotification"> + Zawiadomienie o imprezie: + +[NAME] +[DATE] + <form name="form"> + <button name="Details" text="Szczegóły"/> + <button name="Cancel" text="Anuluj"/> + </form> + </notification> + <notification name="TransferObjectsHighlighted"> + Obiekty na tej posiadłości które zostaną przekazane kupcowi tej posiadłości są teraz rozjaśnione. + +* Drzewa i trawy które zostaną przekazne nie są rozjaśnione. + <form name="form"> + <button name="Done" text="Zastosuj"/> + </form> + </notification> + <notification name="DeactivatedGesturesTrigger"> + Zablokowane gesturki z jednakowym aktywowaniem: +[NAMES] + </notification> + <notification name="NoQuickTime"> + Wygląda na to, że QuickTime z Apple nie jest zainstalowany na Twoim komputerze. +Jeżeli chcesz odtwarzać media na tej posiadłości które używają QuickTime idź do [http://www.apple.com/quicktime strona QuickTime] i zainstaluj odtwarzacz. + </notification> + <notification name="NoPlugin"> + Nie znaleziono wtyczki mediów dla "[MIME_TYPE]" typu mime. Media tego typu będą niedostępne. + </notification> + <notification name="MediaPluginFailed"> + Następujące wtyczki mediów nie działają: + [PLUGIN] + +Zainstaluj proszę wtyczki ponownie lub skontaktuj się z dostawcą jeśli nadal problem będzie występował. + <form name="form"> + <ignore name="ignore" text="Wtyczka mediów nie działa"/> + </form> + </notification> + <notification name="OwnedObjectsReturned"> + Twoje obiekty z wybranej posiadłości zostały zwrócone do Twojej Szafy. + </notification> + <notification name="OtherObjectsReturned"> + Obiekty należące do [NAME] na wybranej posiadłości zostały zwrócone do Szafy tej osoby. + </notification> + <notification name="OtherObjectsReturned2"> + Obiekty z posiadłości należącej do Rezydenta'[NAME]' zostały zwrócone do właściciela. + </notification> + <notification name="GroupObjectsReturned"> + Obiekty z wybranej posiadłości przypisane do grupy [GROUPNAME] zostały zwrócone do szafy ich właścicieli. +Przekazywalne obiekty przekazne grupie zostały zwrócone do ich poprzednich właścicieli. +Nieprzekazywalne obiekty przekazane grupie zostały usunięte. + </notification> + <notification name="UnOwnedObjectsReturned"> + Obiekty z wybranej posiadłości które nie należą do Ciebie zostały zwrócone do ich właścicieli. + </notification> + <notification name="ServerObjectMessage"> + Wiadomość od [NAME]: +<nolink>[MSG]</nolink> + </notification> + <notification name="NotSafe"> + Ta posiadłość pozwala na uszkodzenia. +Możesz doznać tutaj urazu. Jeżeli zginiesz nastąpi teleportacja do Twojego miejsca startu. + </notification> + <notification name="NoFly"> + Ta posiadłość nie pozwala na latanie. +Nie możesz tutaj latać. + </notification> + <notification name="PushRestricted"> + Popychanie niedozwolone. Nie możesz tutaj popychać innych, chyba, że jesteś właścicielem tej posiadłości. + </notification> + <notification name="NoVoice"> + Ta posiadłość nie pozwala na rozmowy. + </notification> + <notification name="NoBuild"> + Ta posiadłość nie pozwala na budowanie. Nie możesz tworzyć tutaj obiektów. + </notification> + <notification name="ScriptsStopped"> + Administrator czasowo zatrzymał skrypty w tym regionie. + </notification> + <notification name="ScriptsNotRunning"> + Żadne skrypty nie działają w tym regionie. + </notification> + <notification name="NoOutsideScripts"> + Ta posiadłość nie pozwala na zewnętrzne skrypty. + +Żadne skrypty nie będą tutaj działać za wyjątkiem skryptów należących do właściciela posiadłości. + </notification> + <notification name="ClaimPublicLand"> + Tylko publiczne posiadłości w tym regionie mogą być przejęte. + </notification> + <notification name="RegionTPAccessBlocked"> + Ze względu na Twój wiek, nie jesteś uprawniony do przebywania w tym regionie. Możesz potrzebować weryfikacji wieku bądź instalacji najnowszej wersji klienta. + +Skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać więcej informacji na temat dostępu do regionów z podanym rodzajem treści jaką zawiera. + </notification> + <notification name="URBannedFromRegion"> + Zostałeś zbanowany w regionie. + </notification> + <notification name="NoTeenGridAccess"> + Twoje konto nie może zostać połączone z podanym regionem Teen Grid. + </notification> + <notification name="ImproperPaymentStatus"> + Nie posiadasz odpowiedniego statusu płatniczego by uzyskać dostęp do regionu. + </notification> + <notification name="MustGetAgeParcel"> + By móc przebywać na tej posiadłości wymagana jest weryfikacja Twojego wieku. + </notification> + <notification name="NoDestRegion"> + Żądana lokalizacja regionu nie została odnaleziona. + </notification> + <notification name="NotAllowedInDest"> + Brak dostępu do podanej lokalizacji. + </notification> + <notification name="RegionParcelBan"> + Nie możesz przejść przez zamkniętą posiadłość. Spróbuj skorzystać z innej drogi. + </notification> + <notification name="TelehubRedirect"> + Zostałeś przeniesiony do teleportera. + </notification> + <notification name="CouldntTPCloser"> + Brak możliwości teleportacji do bliższej lokacji. + </notification> + <notification name="TPCancelled"> + Teleportacja anulowana. + </notification> + <notification name="FullRegionTryAgain"> + Region, który chcesz odwiedzić jest w tej chwili pełny. +Spróbuj ponowanie za kilka minut. + </notification> + <notification name="GeneralFailure"> + Nieudana próba. + </notification> + <notification name="RoutedWrongRegion"> + Wysłano niewłaściwe połączenie do regionu. Proszę spróbować ponownie. + </notification> + <notification name="NoValidAgentID"> + Nieważny identyfikator agenta. + </notification> + <notification name="NoValidSession"> + Nieważny identyfikator sesji. + </notification> + <notification name="NoValidCircuit"> + Nieważny obwód kodowania. + </notification> + <notification name="NoValidTimestamp"> + Niewłaściwy czas zapisu. + </notification> + <notification name="NoPendingConnection"> + Brak możliwości wykonania połączenia. + </notification> + <notification name="InternalUsherError"> + Podczas teleportacji nastąpił błąd wewnętrzny, który może być wynikiem problemów serwera. + </notification> + <notification name="NoGoodTPDestination"> + Brak lokalizacji punktu do teleportacji w podanym regionie. + </notification> + <notification name="InternalErrorRegionResolver"> + Podczas próby odnalezienia globalnych współrzędych dla żądanej teleportacji pojawił się wewnętrzny błąd. Może być to wynikiem problemów serwera. + </notification> + <notification name="NoValidLanding"> + Nieważny punkt lądowania. + </notification> + <notification name="NoValidParcel"> + Nieważana posiadłość. + </notification> + <notification name="ObjectGiveItem"> + Obiekt o nazwie <nolink>[OBJECTFROMNAME]</nolink>, którego właścicielem jest [NAME_SLURL] oferuje Tobie [ITEM_SLURL]. Korzystanie z tego obieku wymaga przelączenia się na tryb zaawansowany, w którym będzie można odszukać obiekt w Twojej Szafie. W celu przełączenia trybu życia na zaawansowany, zamknij i uruchom ponownie aplikację. Przed ponownym zalogowaniem zmień tryb życia na ekranie logowania. + <form name="form"> + <button name="Keep" text="Zaakceptuj obiekt"/> + <button name="Discard" text="Odrzuć obiekt"/> + <button name="Mute" text="Zablokuj obiekt"/> + </form> + </notification> + <notification name="UserGiveItem"> + [NAME_SLURL] proponuje Tobie [ITEM_SLURL]. Korzystanie z tego obieku wymaga przelączenia się na tryb zaawansowany, w którym będzie można odszukać obiekt w Twojej Szafie. W celu przełączenia trybu życia na zaawansowany, zamknij i uruchom ponownie aplikację. Przed ponownym zalogowaniem zmień tryb życia na ekranie logowania. + <form name="form"> + <button name="Show" text="Zaakceptuj obiekt"/> + <button name="Discard" text="Odrzuć obiekt"/> + <button name="Mute" text="Zablokuj użytkownika"/> + </form> + </notification> + <notification name="GodMessage"> + [NAME] + +[MESSAGE] + </notification> + <notification name="JoinGroup"> + [MESSAGE] + <form name="form"> + <button name="Join" text="Zaakceptuj"/> + <button name="Decline" text="Odmów"/> + <button name="Info" text="Info"/> + </form> + </notification> + <notification name="TeleportOffered"> + [NAME_SLURL] proponuje Ci teleportację do siebie: + +[MESSAGE] - [MATURITY_STR] <icon>[MATURITY_ICON]</icon> + <form name="form"> + <button name="Teleport" text="Teleportuj"/> + <button name="Cancel" text="Anuluj"/> + </form> + </notification> + <notification name="TeleportOfferSent"> + Oferta teleportacji wysłana do [TO_NAME] + </notification> + <notification name="GotoURL"> + [MESSAGE] +[URL] + <form name="form"> + <button name="Later" text="Póżniej"/> + <button name="GoNow..." text="Teraz..."/> + </form> + </notification> + <notification name="OfferFriendship"> + [NAME_SLURL] proponuje znajomość. + +[MESSAGE] + +(Będziecie mogli widzieć swój status online) + <form name="form"> + <button name="Accept" text="Zaakceptuj"/> + <button name="Decline" text="Odmów"/> + </form> + </notification> + <notification name="FriendshipOffered"> + Oferta znajomości dla [TO_NAME] + </notification> + <notification name="OfferFriendshipNoMessage"> + [NAME_SLURL] proponuje Ci znajomość. + +(Z zalożenia będzie widzić swój status online.) + <form name="form"> + <button name="Accept" text="Zaakceptuj"/> + <button name="Decline" text="Odmów"/> + </form> + </notification> + <notification name="FriendshipAccepted"> + Twoja propozycja znajomości została przyjęta przez [NAME]. + </notification> + <notification name="FriendshipDeclined"> + Twoja propozycja znajomości została odrzucona przez [NAME]. + </notification> + <notification name="FriendshipAcceptedByMe"> + Propozycja znajomości została zaakceptowana. + </notification> + <notification name="FriendshipDeclinedByMe"> + Propozycja znajomości została odrzucona. + </notification> + <notification name="OfferCallingCard"> + [NAME] oferuje swoją wizytówkę. +Wizytówka w Twojej Szafie umożliwi szybki kontakt IM z tym Rezydentem. + <form name="form"> + <button name="Accept" text="Zaakceptuj"/> + <button name="Decline" text="Odmów"/> + </form> + </notification> + <notification name="RegionRestartMinutes"> + Restart regionu za [MINUTES] min. +Nastąpi wylogowanie jeżeli zostaniesz w tym regionie. + </notification> + <notification name="RegionRestartSeconds"> + Restart regionu za [SECONDS] sec. +Nastąpi wylogowanie jeżeli zostaniesz w tym regionie. + </notification> + <notification name="LoadWebPage"> + Załadować stronę [URL]? + +[MESSAGE] + +Od obiektu: <nolink>[OBJECTNAME]</nolink>, właściciel właściciel: [NAME]? + <form name="form"> + <button name="Gotopage" text="Załaduj"/> + <button name="Cancel" text="Anuluj"/> + </form> + </notification> + <notification name="FailedToFindWearableUnnamed"> + [TYPE] - nie znaleziono w bazie danych. + </notification> + <notification name="FailedToFindWearable"> + [TYPE] [DESC] - nie znaleziono w bazie danych. + </notification> + <notification name="InvalidWearable"> + Obiekt, który chcesz założyć używa narzędzia nieobecnego w wersji klienta, którą używasz. By go założyć ściągnij najnowszą wersję [APP_NAME]. + </notification> + <notification name="ScriptQuestion"> + Obiekt '<nolink>[OBJECTNAME]</nolink>', którego właścicielem jest '[NAME]', chciałby: + +[QUESTIONS] +Czy się zgadzasz? + <form name="form"> + <button name="Yes" text="Tak"/> + <button name="No" text="Nie"/> + <button name="Mute" text="Zablokuj"/> + </form> + </notification> + <notification name="ScriptQuestionCaution"> + Obiekt '<nolink>[OBJECTNAME]</nolink>', którego właścicielem jest '[NAME]' chciałby: + +[QUESTIONS] +Jeśli nie ufasz temu obiektowi i jego kreatorowi, odmów. + +Czy się zgadzasz? + <form name="form"> + <button name="Grant" text="Zaakceptuj"/> + <button name="Deny" text="Odmów"/> + <button name="Details" text="Szczegóły..."/> + </form> + </notification> + <notification name="ScriptDialog"> + [NAME]'s '<nolink>[TITLE]</nolink>' +[MESSAGE] + <form name="form"> + <button name="Ignore" text="Zignoruj"/> + </form> + </notification> + <notification name="ScriptDialogGroup"> + [GROUPNAME]'s '<nolink>[TITLE]</nolink>' +[MESSAGE] + <form name="form"> + <button name="Ignore" text="Zignoruj"/> + </form> + </notification> + <notification name="BuyLindenDollarSuccess"> + Dziękujemy za wpłatę! + +Twój stan konta L$ zostanie zaktualizowany w momencie zakończenia transakcji. Jeżeli w ciągu 20 minut, Twój balans konta nie ulegnie zmianie, transakcja została anulowana. W tym przypadku, pobrana kwota zostanie zwrócona na stan konta w US$. + +Status transkacji możesz sprawdzić odwiedzając Historię Transakcji swojego konta na [http://secondlife.com/account/ Dashboard] + </notification> + <notification name="FirstOverrideKeys"> + Twoje sterujące klawisze zostały przejęte przez obiekt. +Użyj strzałek lub AWSD żeby sprawdzić ich działanie. +Niektóre obiekty (np broń) wymagają trybu panoramicznego. +Nacisnij 'M' żeby go wybrać. + </notification> + <notification name="FirstSandbox"> + Ten region to piaskownica. + +Obiekty które tu zbudujesz mogą zostać usunięte jak opuścisz ten obszar - piaskownice są regularnie czyszczone, sprawdź informacje na górze ekranu obok nazwy regionu. + </notification> + <notification name="MaxListSelectMessage"> + Maksymalnie możesz wybrać [MAX_SELECT] rzeczy +z tej listy. + </notification> + <notification name="VoiceInviteP2P"> + [NAME] zaprasza Cię do rozmowy głosem. +Wybierz Zaakceptuj żeby rozmawiać albo Odmów żeby nie przyjąć zaproszenia. +Wybierz Zablokuj żeby wyciszyć dzwoniącą osób + <form name="form"> + <button name="Accept" text="Zaakceptuj"/> + <button name="Decline" text="Odmów"/> + <button name="Mute" text="Zablokuj"/> + </form> + </notification> + <notification name="AutoUnmuteByIM"> + Wysłano [NAME] prywatną wiadomość i ta osoba została automatycznie odblokowana. + </notification> + <notification name="AutoUnmuteByMoney"> + Przekazano [NAME] pieniądze i ta osoba została automatycznie odblokowana. + </notification> + <notification name="AutoUnmuteByInventory"> + Zaoferowno [NAME] obiekty i ta osoba została automatycznie odblokowana. + </notification> + <notification name="VoiceInviteGroup"> + [NAME] zaczyna rozmowę z grupą [GROUP]. +Wybierz Zaakceptuj żeby rozmawiać albo Odmów żeby nie przyjąć zaproszenia. Wybierz Zablokuj żeby wyciszyć dzwoniącą osobę. + <form name="form"> + <button name="Accept" text="Zaakceptuj"/> + <button name="Decline" text="Odmów"/> + <button name="Mute" text="Zablokuj"/> + </form> + </notification> + <notification name="VoiceInviteAdHoc"> + [NAME] zaczyna konferencję głosem. +Wybierz Zaakceptuj żeby rozmawiać albo Odmów żeby nie przyjąć zaproszenia. Wybierz Zablokuj żeby wyciszyć dzwoniącą osobę. + <form name="form"> + <button name="Accept" text="Zaakceptuj"/> + <button name="Decline" text="Odmów"/> + <button name="Mute" text="Zablokuj"/> + </form> + </notification> + <notification name="InviteAdHoc"> + [NAME] zaprasza Cię do konferencji poprzez Czat/IM. +Wybierz Zaakceptuj żeby zacząć czat albo Odmów żeby nie przyjąć zaproszenia. Wybierz Zablokuj żeby wyciszyć tą osobę. + <form name="form"> + <button name="Accept" text="Zaakceptuj"/> + <button name="Decline" text="Odmów"/> + <button name="Mute" text="Block"/> + </form> + </notification> + <notification name="VoiceChannelFull"> + Rozmowa w której chcesz uczestniczyć, [VOICE_CHANNEL_NAME], nie akceptuje więcej rozmówców. Spróbuj póżniej. + </notification> + <notification name="ProximalVoiceChannelFull"> + Przepraszamy. Limit rozmów został przekroczony w tym obszarze. Spróbuj w innym miejscu. + </notification> + <notification name="VoiceChannelDisconnected"> + [VOICE_CHANNEL_NAME] odłączył się. Przełączanie do rozmowy przestrzennej. + </notification> + <notification name="VoiceChannelDisconnectedP2P"> + [VOICE_CHANNEL_NAME] skończył rozmowę. Przełączanie do rozmowy przestrzennej. + </notification> + <notification name="P2PCallDeclined"> + [VOICE_CHANNEL_NAME] odmówił połączenia. Przełączanie do rozmowy przestrzennej. + </notification> + <notification name="P2PCallNoAnswer"> + [VOICE_CHANNEL_NAME] nie odpowiada. Przełączanie do rozmowy przestrzennej. + </notification> + <notification name="VoiceChannelJoinFailed"> + Brak połączenia z [VOICE_CHANNEL_NAME], spróbuj póżniej. Przełączanie do rozmowy przestrzennej. + </notification> + <notification name="VoiceLoginRetry"> + Tworzymy kanał głosu dla Ciebie. Moze potrwać minutę. + </notification> + <notification name="VoiceEffectsExpired"> + Subskrypcja jednego lub więcej z Voice Morph wygasła. +[[URL] Kliknij tutaj] oby odnowić subskrypcję. + </notification> + <notification name="VoiceEffectsExpiredInUse"> + Czas aktywności Voice Morph wygasł, normalne ustawienia Twojego głosu zostały zastosowane. +[[URL] Kliknij tutaj] aby odnowić subskrypcję. + </notification> + <notification name="VoiceEffectsWillExpire"> + Jedno lub więcej z Twoich Voice Morph wygaśnie za mniej niż [INTERVAL] dni. +[[URL] Klinij tutaj] aby odnowić subskrypcję. + </notification> + <notification name="VoiceEffectsNew"> + Nowe Voice Morph są dostępne! + </notification> + <notification name="Cannot enter parcel: not a group member"> + Nie masz dostępu do posiadłości, nie należysz do właściwej grupy. + </notification> + <notification name="Cannot enter parcel: banned"> + Masz wzbroniony wstęp na tą posiadłości (ban). + </notification> + <notification name="Cannot enter parcel: not on access list"> + Nie masz dostępu do posiadłości, nie jesteś na liście dostępu. + </notification> + <notification name="VoiceNotAllowed"> + Nie masz pozwolenia na połączenie z rozmową [VOICE_CHANNEL_NAME]. + </notification> + <notification name="VoiceCallGenericError"> + Błąd podczas łączenia z rozmową [VOICE_CHANNEL_NAME]. Spróbuj póżniej. + </notification> + <notification name="UnsupportedCommandSLURL"> + Nie można otworzyć wybranego SLurl. + </notification> + <notification name="BlockedSLURL"> + SLurl został otrzymany z niesprawdzonej przeglądarki i został zablokowany dla bezpieczeństwa. + </notification> + <notification name="ThrottledSLURL"> + Wiele SLurlów zostało otrzymanych w krótkim czasie od niesprawdzonej przeglądarki. +Zostaną zablokowane na kilka sekund dla bezpieczeństwa. + </notification> + <notification name="IMToast"> + [MESSAGE] + <form name="form"> + <button name="respondbutton" text="Odpowiedź"/> + </form> + </notification> + <notification name="ConfirmCloseAll"> + Czy chcesz zamknąć wszystkie wiadomości IM? + <usetemplate ignoretext="Potwierdź, przed zamknięciem wszystkich wiadomości prywatnych (IM)." name="okcancelignore" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="AttachmentSaved"> + Załącznik został zapisany. + </notification> + <notification name="UnableToFindHelpTopic"> + Nie można znależć tematu pomocy dla tego elementu. + </notification> + <notification name="ObjectMediaFailure"> + Błąd serwera: aktualizacja mediów nie powiodła się. +'[ERROR]' + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="TextChatIsMutedByModerator"> + Twój czat został wyciszony przez moderatora. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="VoiceIsMutedByModerator"> + Twoja rozmowa głosowa została wyciszona przez moderatora. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="ConfirmClearTeleportHistory"> + Czy na pewno chcesz usunąć historię teleportacji? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="BottomTrayButtonCanNotBeShown"> + Wybrany przycisk nie może zostać wyświetlony w tej chwili. +Przycisk zostanie wyświetlony w przypadku dostatecznej ilości przestrzeni. + </notification> + <notification name="ShareNotification"> + Zaznacz Rezydentów, z którymi chcesz się podzielić. + </notification> + <notification name="ShareItemsConfirmation"> + Czy na pewno chcesz udostępnić następujące obiekty: + +<nolink>[ITEMS]</nolink> + +następującym Rezydentom: + +[RESIDENTS] + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Ok"/> + </notification> + <notification name="ItemsShared"> + Obiekty zostały udostępnione. + </notification> + <notification name="DeedToGroupFail"> + Przekazanie grupie nie powiodło się. + </notification> + <notification name="AvatarRezNotification"> + ( [EXISTENCE] sekund w Second Life) +Awatar '[NAME]' rozchmurzył się po [TIME] sekundach. + </notification> + <notification name="AvatarRezSelfBakedDoneNotification"> + ( [EXISTENCE] sekund w Second Life) +You finished baking your outfit after [TIME] seconds. + </notification> + <notification name="AvatarRezSelfBakedUpdateNotification"> + ( [EXISTENCE] sekund w Second Life ) +Wysłano aktualizację wyglądu po [TIME] sekundach. +[STATUS] + </notification> + <notification name="AvatarRezCloudNotification"> + ( [EXISTENCE] sekund w Second Life ) +Awatar '[NAME]' stał się chmurą. + </notification> + <notification name="AvatarRezArrivedNotification"> + ( [EXISTENCE] sekund w Second Life) +Awatar '[NAME]' pojawił się. + </notification> + <notification name="AvatarRezLeftCloudNotification"> + ( [EXISTENCE] sekund w Second Life ) +Awatar '[NAME]' pozostał [TIME] sekund chmurą. + </notification> + <notification name="AvatarRezEnteredAppearanceNotification"> + ( [EXISTENCE] sekund w Second Life ) +Awatar '[NAME]' rozpoczął edycję wyglądu. + </notification> + <notification name="AvatarRezLeftAppearanceNotification"> + ( [EXISTENCE] sekund w Second Life ) +Awatar '[NAME]' opuścił edycję wyglądu. + </notification> + <notification name="NoConnect"> + Występuje problem z połączeniem [PROTOCOL] [HOSTID]. +Proszę sprawdź swoją sieć i ustawienia firewall. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="NoVoiceConnect"> + Występuje problem z Twoim połączniem głosowym: + +[HOSTID] + +Komunikacja głosowa nie będzie dostępna. +Proszę sprawdź swoją sieć i ustawienia firewall. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="AvatarRezLeftNotification"> + ( [EXISTENCE] sekund w Second Life) +Awatar '[NAME]' pozostał w pełni załadowany. + </notification> + <notification name="AvatarRezSelfBakedTextureUploadNotification"> + ( [EXISTENCE] sekund w Second Life ) +Zbakowane tekstury [RESOLUTION] dla '[BODYREGION]' zostały załadowane po[TIME] sekundach. + </notification> + <notification name="AvatarRezSelfBakedTextureUpdateNotification"> + ( [EXISTENCE] sekund w Second Life ) +Zbakowane tekstury zostały lokalnie zaktualizowane [RESOLUTION] dla '[BODYREGION]' po [TIME] sekundach. + </notification> + <notification name="ConfirmLeaveCall"> + Czy jestes pewien/pewna, że chcesz zakończyć rozmowę? + <usetemplate ignoretext="Potwierdź zanim rozmowa głosowa zostanie zakończona" name="okcancelignore" notext="Nie" yestext="Tak"/> + </notification> + <notification name="ConfirmMuteAll"> + Wybrano wyciszenie wszystkich uczestników rozmowy głosowej w grupie. +To spowoduje również wyciszenie wszystkich Rezydentów, którzy dołączą póżniej do rozmowy, nawet jeśli zakończysz rozmowę. + +Wyciszyć wszystkich? + <usetemplate ignoretext="Potwierdź zanim zostaną wyciszeni wszyscy uczestnicy rozmowy głosowej w grupie" name="okcancelignore" notext="Anuluj" yestext="Ok"/> + </notification> + <notification label="Czat" name="HintChat"> + W celu przylączenia się do rozmowy zacznij pisać w poniższym polu czatu. + </notification> + <notification label="Wstań" name="HintSit"> + Aby wstać i opuścić pozycję siedzącą, kliknij przycisk Wstań. + </notification> + <notification label="Odkrywaj Świat" name="HintDestinationGuide"> + Destination Guide zawiera tysiące nowych miejsc do odkrycia. Wybierz lokalizację i teleportuj się aby rozpocząć zwiedzanie. + </notification> + <notification label="Schowek" name="HintSidePanel"> + Schowek umożliwia szybki dostęp do Twojej Szafy, ubrań, profili i innych w panelu bocznym. + </notification> + <notification label="Ruch" name="HintMove"> + Aby chodzić lub biegać, otwórz panel ruchu i użyj strzałek do nawigacji. Możesz także używać strzałek z klawiatury. + </notification> + <notification label="Wyświetlana nazwa" name="HintDisplayName"> + Ustaw wyświetlaną nazwę, którą możesz zmieniać tutaj. Jest ona dodatkiem do unikatowej nazwy użytkownika, która nie może być zmieniona. Możesz zmienić sposób w jaki widzisz nazwy innych osób w Twoich Ustawieniach. + </notification> + <notification label="Ruch" name="HintMoveArrows"> + Użyj przycisków ze strzałkami z klawiatury aby chodzić. Jeśli wciśniesz strzałkę 'do góry' podwójnie, zaczniesz biec. + </notification> + <notification label="Widok" name="HintView"> + To change your camera view, use the Orbit and Pan controls. Zresetuj widok poprzez wciśnięcie klawisza Esc lub chodzenie. + </notification> + <notification label="Szafa" name="HintInventory"> + Sprawdź swoją Szafę aby znaleźć obiekty. Najnowsze obiekty mogą być łatwo odnalezione w zakładce Nowe obiekty. + </notification> + <notification label="Otrzymano L$!" name="HintLindenDollar"> + Tutaj znajduje się Twoj bieżący bilans L$. Kliknij Kup aby kupić więcej L$. + </notification> + <notification name="PopupAttempt"> + Wyskakujące okienko zostało zablokowane. + <form name="form"> + <ignore name="ignore" text="Zezwól na wyskakujące okienka"/> + <button name="open" text="Otwórz wyskakujące okno."/> + </form> + </notification> + <notification name="AuthRequest"> + Strpna '<nolink>[HOST_NAME]</nolink>' w domenie '[REALM]' wymaga nazwy użytkownika i hasła. + <form name="form"> + <input name="username" text="Nazwa użytkownika"/> + <input name="password" text="Hasło"/> + <button name="ok" text="Wyślij"/> + <button name="cancel" text="Anuluj"/> + </form> + </notification> + <notification label="" name="ModeChange"> + Zmiana trybu wymaga restartu. + <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/> + </notification> + <notification label="" name="NoClassifieds"> + Tworzenie i edycja reklam jest możliwa tylko w trybie zaawansowanym. Czy chcesz wylogować się i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania. + <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/> + </notification> + <notification label="" name="NoGroupInfo"> + Tworzenie i edycja grup jest możliwa tylko w trybie zaawansowanym. Czy chcesz wylogować się i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania. + <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/> + </notification> + <notification label="" name="NoPicks"> + Tworzenie i edycja Ulubionych jest możliwa jedynie w trybie zaawansowanym. Czy chcesz się wylogować i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania. + <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/> + </notification> + <notification label="" name="NoWorldMap"> + Oglądanie mapy świata jest możliwe tylko w trybie zaawansowanym. Czy chcesz się wylogować i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania. + <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/> + </notification> + <notification label="" name="NoVoiceCall"> + Rozmowy głosowe są możliwe tylko w trybie zaawansowanym. Czy chcesz wylogować się i zmienić tryb? + <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/> + </notification> + <notification label="" name="NoAvatarShare"> + Udostępnienie jest możliwe tylko w trybie zaawansowanym. Czy chcesz wylogować się i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania. + <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/> + </notification> + <notification label="" name="NoAvatarPay"> + Płacenie innym Rezydentom jest możliwe tylko w trybie zaawansowanym. Czy chcesz się wylogować i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania. + <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/> + </notification> + <global name="UnsupportedCPU"> + - Prędkość Twojego CPU nie spełnia minimalnych wymagań. + </global> + <global name="UnsupportedGLRequirements"> + Wygląda na to, że Twój system nie spełnia wymagań sprzętowych [APP_NAME]. [APP_NAME] wymaga karty graficznej kompatybilnej z OpenGL z multiteksturami. Jeżeli masz taką kartę zainstaluj najnowsze sterowniki do niej i uaktualnienia systemu operacyjnego. + +Jeżeli wciąż masz problemy sprawdź: [SUPPORT_SITE]. + </global> + <global name="UnsupportedCPUAmount"> + 796 + </global> + <global name="UnsupportedRAMAmount"> + 510 + </global> + <global name="UnsupportedGPU"> + - Twoja karta graficzna nie spełnia minimalnych wymagań. + </global> + <global name="UnsupportedRAM"> + - Pamięć Twojego systemu nie spełnia minimalnych wymagań. + </global> + <global name="You can only set your 'Home Location' on your land or at a mainland Infohub."> + Jeśli jesteś właścicielem posiadłości, możesz ustawić na niej miejsce startu. +W innym przypadku możesz poszukać na mapie miejsca oznaczone jako "Infohub". + </global> + <global name="You died and have been teleported to your home location"> + Nastąpiła śmierć i teleportacja do Miejsca Startu. + </global> +</notifications> diff --git a/indra/newview/skins/minimal/xui/pl/panel_adhoc_control_panel.xml b/indra/newview/skins/minimal/xui/pl/panel_adhoc_control_panel.xml new file mode 100644 index 0000000000..ba0c85e4ef --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/panel_adhoc_control_panel.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <layout_stack name="vertical_stack"> + <layout_panel name="call_btn_panel"> + <button label="Dzwoń" name="call_btn"/> + </layout_panel> + <layout_panel name="end_call_btn_panel"> + <button label="Zakończ rozmowę" name="end_call_btn"/> + </layout_panel> + <layout_panel name="voice_ctrls_btn_panel"> + <button label="Przełączniki głosu" name="voice_ctrls_btn"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/pl/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/pl/panel_bottomtray.xml new file mode 100644 index 0000000000..f49d820938 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/panel_bottomtray.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="bottom_tray"> + <string name="DragIndicationImageName" value="Accordion_ArrowOpened_Off"/> + <string name="SpeakBtnToolTip" value="Włącza/wyłącza mikrofon"/> + <string name="VoiceControlBtnToolTip" value="Pokazuje/Ukrywa panel kontroli głosu"/> + <layout_stack name="toolbar_stack"> + <layout_panel name="gesture_panel"> + <gesture_combo_list label="Gesturki" name="Gesture" tool_tip="Pokazuje/Ukrywa gesturki"/> + </layout_panel> + <layout_panel name="cam_panel"> + <bottomtray_button label="Widok" name="camera_btn" tool_tip="Pokaż/Ukryj ustawienia kamery"/> + </layout_panel> + <layout_panel name="avatar_and_destinations_panel"> + <bottomtray_button label="Atrakcje turystyczne" name="destination_btn" tool_tip="Pokaż okno dotyczące ludzi"/> + </layout_panel> + <layout_panel name="avatar_and_destinations_panel"> + <bottomtray_button label="Mój awatar" name="avatar_btn"/> + </layout_panel> + <layout_panel name="people_panel"> + <bottomtray_button label="Ludzie" name="show_people_button" tool_tip="Pokazuje okno dotyczące ludzi"/> + </layout_panel> + <layout_panel name="profile_panel"> + <bottomtray_button label="Profil" name="show_profile_btn" tool_tip="Pokazuje okno profilu."/> + </layout_panel> + <layout_panel name="howto_panel"> + <bottomtray_button label="POMOC" name="show_help_btn" tool_tip="Otwiera temat pomocy Second Life"/> + </layout_panel> + <layout_panel name="im_well_panel"> + <chiclet_im_well name="im_well"> + <button name="Unread IM messages" tool_tip="Rozmowy"/> + </chiclet_im_well> + </layout_panel> + <layout_panel name="notification_well_panel"> + <chiclet_notification name="notification_well"> + <button name="Unread" tool_tip="Ogłoszenia"/> + </chiclet_notification> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/pl/panel_group_control_panel.xml b/indra/newview/skins/minimal/xui/pl/panel_group_control_panel.xml new file mode 100644 index 0000000000..074f572a4c --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/panel_group_control_panel.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <layout_stack name="vertical_stack"> + <layout_panel name="group_info_btn_panel"> + <button label="Grupa" name="group_info_btn"/> + </layout_panel> + <layout_panel name="call_btn_panel"> + <button label="Dzwoń" name="call_btn"/> + </layout_panel> + <layout_panel name="end_call_btn_panel"> + <button label="Zakończ rozmowę" name="end_call_btn"/> + </layout_panel> + <layout_panel name="voice_ctrls_btn_panel"> + <button label="Otwórz kontroler głosu" name="voice_ctrls_btn"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/pl/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/pl/panel_im_control_panel.xml new file mode 100644 index 0000000000..4aadd3b93b --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/panel_im_control_panel.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <layout_stack name="button_stack"> + <layout_panel name="view_profile_btn_panel"> + <button label="Profil" name="view_profile_btn"/> + </layout_panel> + <layout_panel name="add_friend_btn_panel"> + <button label="Poznaj" name="add_friend_btn"/> + </layout_panel> + <layout_panel name="teleport_btn_panel"> + <button label="Teleportuj" name="teleport_btn" tool_tip="Teleportuj"/> + </layout_panel> + <layout_panel name="share_btn_panel"> + <button label="Udostępnij" name="share_btn"/> + </layout_panel> + <layout_panel name="pay_btn_panel"> + <button label="Zapłać" name="pay_btn"/> + </layout_panel> + <layout_panel name="call_btn_panel"> + <button label="Dzwoń" name="call_btn"/> + </layout_panel> + <layout_panel name="end_call_btn_panel"> + <button label="Zakończ rozmowę" name="end_call_btn"/> + </layout_panel> + <layout_panel name="voice_ctrls_btn_panel"> + <button label="Przełączniki głosu" name="voice_ctrls_btn"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/pl/panel_login.xml b/indra/newview/skins/minimal/xui/pl/panel_login.xml new file mode 100644 index 0000000000..dc8e7399af --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/panel_login.xml @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_login"> + <panel.string name="forgot_password_url"> + http://secondlife.com/account/request.php + </panel.string> + <layout_stack name="login_widgets"> + <layout_panel name="login"> + <text name="username_text"> + Użytkownik: + </text> + <combo_box name="username_combo" tool_tip="Nazwę użytkownika wybierasz przy rejestracji, np. bobsmith12 lub Steller Sunshine"/> + <text name="password_text"> + Hasło: + </text> + <check_box label="Zapamiętaj hasło" name="remember_check"/> + <button label="Połącz" name="connect_btn"/> + <text name="mode_selection_text"> + Tryb życia: + </text> + <combo_box name="mode_combo" tool_tip="Wybierz tryb życia. Wybierz tryb turystyczny dla łatwego zwiedzania i czatowania. Wybierz tryb zaawansowany aby mieć dostęp do większej ilości opcji."> + <combo_box.item label="Turystyczny" name="Basic"/> + <combo_box.item label="Zaawansowany" name="Advanced"/> + </combo_box> + <text name="start_location_text"> + Rozpocznij w: + </text> + <combo_box name="start_location_combo"> + <combo_box.item label="Ostatnie Miejsce" name="MyLastLocation"/> + <combo_box.item label="Moje Miejsce Startu" name="MyHome"/> + <combo_box.item label="<Wpisz Region>" name="Typeregionname"/> + </combo_box> + </layout_panel> + <layout_panel name="links"> + <text name="create_new_account_text"> + Utwórz nowe konto + </text> + <text name="forgot_password_text"> + Zapomniałeś swojej nazwy użytkownika lub hasła? + </text> + <text name="login_help"> + Potrzebujesz pomocy z logowaniem się? + </text> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/pl/panel_navigation_bar.xml b/indra/newview/skins/minimal/xui/pl/panel_navigation_bar.xml new file mode 100644 index 0000000000..b01e686c41 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/panel_navigation_bar.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="navigation_bar"> + <panel name="navigation_panel"> + <pull_button name="back_btn" tool_tip="Wróć do poprzedniej lokalizacji"/> + <pull_button name="forward_btn" tool_tip="Idź do następnej lokalizacji"/> + <button name="home_btn" tool_tip="Teleportuj do miejsca startu"/> + <location_input label="Lokalizacja" name="location_combo"/> + <search_combo_box label="Szukaj" name="search_combo_box" tool_tip="Szukaj"> + <combo_editor label="Szukaj [SECOND_LIFE]" name="search_combo_editor"/> + </search_combo_box> + </panel> + <favorites_bar name="favorite" tool_tip="Przeciągnij swoje landmarki tutaj by szybko dostać się do swoich ulubionych miejsc w Second Life!"> + <label name="favorites_bar_label" tool_tip="Przeciągnij swoje landmarki tutaj by szybko dostać się do swoich ulubionych miejsc w Second Life!"> + Pasek Ulubionych + </label> + <chevron_button name=">>" tool_tip="Pokaż więcej Moich Ulubionych"/> + </favorites_bar> +</panel> diff --git a/indra/newview/skins/minimal/xui/pl/panel_people.xml b/indra/newview/skins/minimal/xui/pl/panel_people.xml new file mode 100644 index 0000000000..dbfee739f4 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/panel_people.xml @@ -0,0 +1,94 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- Side tray panel --> +<panel label="Ludzie" name="people_panel"> + <string name="no_recent_people" value="Brak ostatnich rozmówców. Chcesz spotkać ludzi? Skorzystaj z przycisku "Atrakcje turystyczne" poniżej."/> + <string name="no_filtered_recent_people" value="Brak ostatnich rozmówców posiadających wskazane imię."/> + <string name="no_one_near" value="Nie ma nikogo w pobliżu. Chcesz spotkać ludzi? Skorzystaj z przycisku "Atrakcje turystyczne" poniżej."/> + <string name="no_one_filtered_near" value="Nie ma nikogo o wskazanym imieniu w pobliżu."/> + <string name="no_friends_online" value="Brak dostępnych znajomych"/> + <string name="no_friends" value="Brak znajomych"/> + <string name="no_friends_msg"> + Kliknij prawym przyciskiem na Rezydenta aby dodać go do listy znajomych. +Chcesz spotkać ludzi? Skorzystaj z przycisku "Atrakcje turystyczne" poniżej. + </string> + <string name="no_filtered_friends_msg"> + Nie znaleziono tego czego szukasz? Skorzystaj z przycisku "Atrakcje turystyczne" poniżej. + </string> + <string name="people_filter_label" value="Filtruj ludzi"/> + <string name="groups_filter_label" value="Filtruj grupy"/> + <string name="no_filtered_groups_msg" value="Nie znaleziono tego czego szukasz? Spróbuj [secondlife:///app/search/groups/[SEARCH_TERM] Szukaj]."/> + <string name="no_groups_msg" value="Chcesz dołączyć do grup? Spróbuj [secondlife:///app/search/groups Szukaj]."/> + <string name="MiniMapToolTipMsg" value="[REGION](Podwójne kliknięcie otwiera mapę, wciśnij Shift i przeciągnij myszką aby przesunąć)"/> + <string name="AltMiniMapToolTipMsg" value="[REGION](Podwójne kliknięcie aktywuje teleportację, wciśnij Shift i przeciągnij myszką aby przesunąć)"/> + <filter_editor label="Filtr" name="filter_input"/> + <tab_container name="tabs"> + <panel label="W POBLIŻU" name="nearby_panel"> + <panel label="bottom_panel" name="bottom_panel"> + <menu_button name="nearby_view_sort_btn" tool_tip="Opcje"/> + <button name="add_friend_btn" tool_tip="Dodaj wybranego Rezydenta do znajomych"/> + </panel> + </panel> + <panel label="ZNAJOMI" name="friends_panel"> + <accordion name="friends_accordion"> + <accordion_tab name="tab_online" title="Dostępni"/> + <accordion_tab name="tab_all" title="Wszyscy"/> + </accordion> + <panel label="bottom_panel" name="bottom_panel"> + <layout_stack name="bottom_panel"> + <layout_panel name="options_gear_btn_panel"> + <menu_button name="friends_viewsort_btn" tool_tip="Pokaż opcje dodatkowe"/> + </layout_panel> + <layout_panel name="add_btn_panel"> + <button name="add_btn" tool_tip="Dodaj wybranego Rezydenta do znajomych"/> + </layout_panel> + <layout_panel name="trash_btn_panel"> + <dnd_button name="del_btn" tool_tip="Usuń zaznaczoną osobę ze swojej listy znajomych"/> + </layout_panel> + </layout_stack> + </panel> + </panel> + <panel label="GRUPY" name="groups_panel"> + <panel label="bottom_panel" name="bottom_panel"> + <menu_button name="groups_viewsort_btn" tool_tip="Opcje"/> + <button name="plus_btn" tool_tip="Dołącz do grupy/Stwórz nową grupę"/> + <button name="activate_btn" tool_tip="Aktywuj wybraną grupę"/> + </panel> + </panel> + <panel label="OSTATNIE" name="recent_panel"> + <panel label="bottom_panel" name="bottom_panel"> + <menu_button name="recent_viewsort_btn" tool_tip="Opcje"/> + <button name="add_friend_btn" tool_tip="Dodaj wybranego Rezydenta do znajomych"/> + </panel> + </panel> + </tab_container> + <panel name="button_bar"> + <layout_stack name="bottom_bar_ls"> + <layout_panel name="view_profile_btn_lp"> + <button label="Profil" name="view_profile_btn" tool_tip="Pokaż zdjęcie, grupy i inne informacje o Rezydencie"/> + </layout_panel> + <layout_panel name="chat_btn_lp"> + <button label="IM" name="im_btn" tool_tip="Otwórz wiadomości IM"/> + </layout_panel> + <layout_panel name="chat_btn_lp"> + <button label="Dzwoń" name="call_btn" tool_tip="Zadzwoń do tego Rezydenta"/> + </layout_panel> + <layout_panel name="chat_btn_lp"> + <button label="Udostępnij" name="share_btn" tool_tip="Udostępnij obiekt z Szafy"/> + </layout_panel> + <layout_panel name="chat_btn_lp"> + <button label="Teleportuj" name="teleport_btn" tool_tip="Zaproponuj teleport"/> + </layout_panel> + </layout_stack> + <layout_stack name="bottom_bar_ls1"> + <layout_panel name="group_info_btn_lp"> + <button label="Profil grupy" name="group_info_btn" tool_tip="Pokaż informacje o grupie"/> + </layout_panel> + <layout_panel name="chat_btn_lp"> + <button label="Czat grupy" name="chat_btn" tool_tip="Otwórz sesję czatu"/> + </layout_panel> + <layout_panel name="group_call_btn_lp"> + <button label="Rozmowa głosowa w grupie" name="group_call_btn" tool_tip="Rozmowa głosowa w tej grupie"/> + </layout_panel> + </layout_stack> + </panel> +</panel> diff --git a/indra/newview/skins/minimal/xui/pl/panel_side_tray_tab_caption.xml b/indra/newview/skins/minimal/xui/pl/panel_side_tray_tab_caption.xml new file mode 100644 index 0000000000..95cd7c53dc --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/panel_side_tray_tab_caption.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="sidetray_tab_panel"> + <text name="sidetray_tab_title" value="Schowek"/> + <button name="undock" tool_tip="Odłącz"/> + <button name="dock" tool_tip="Przyłącz"/> + <button name="show_help" tool_tip="Pomoc"/> +</panel> diff --git a/indra/newview/skins/minimal/xui/pl/panel_status_bar.xml b/indra/newview/skins/minimal/xui/pl/panel_status_bar.xml new file mode 100644 index 0000000000..6aa0d27bb8 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/panel_status_bar.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="status"> + <panel.string name="StatBarDaysOfWeek"> + Niedziela:Poniedziałek:Wtorek:Środa:Czwartek:Piątek:Sobota + </panel.string> + <panel.string name="StatBarMonthsOfYear"> + Styczeń:Luty:Marzec:Kwiecień:Maj:Czerwiec:Lipiec:Styczeń:Wrzesień:Październik:Listopad:Grudzień + </panel.string> + <panel.string name="packet_loss_tooltip"> + Utracone pakiety + </panel.string> + <panel.string name="bandwidth_tooltip"> + Przepustowość + </panel.string> + <panel.string name="time"> + [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt] + </panel.string> + <panel.string name="timeTooltip"> + [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt] + </panel.string> + <panel.string name="buycurrencylabel"> + L$ [AMT] + </panel.string> + <panel name="balance_bg"> + <text name="balance" tool_tip="Kliknij aby odświeżyć bilans L$" value="L$20"/> + <button label="Kup L$" name="buyL" tool_tip="Kliknij aby kupić więcej L$"/> + </panel> + <text name="TimeText" tool_tip="Obecny czas (Pacyficzny)"> + 24:00 AM PST + </text> + <button name="media_toggle_btn" tool_tip="Start/Stop wszystkie media (Muzyka, Video, WWW)"/> + <button name="volume_btn" tool_tip="Regulacja głośności"/> +</panel> -- cgit v1.2.3 From 6e5794376d5b64dffd965265d484e67346e02f31 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Thu, 28 Apr 2011 19:04:08 -0700 Subject: STORM-1039 FIXED Bad iterator access in llavatarnamecache.cpp:564 fixed crash on startup --- indra/llmessage/llavatarnamecache.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 33e6709983..e0b77e3105 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -554,7 +554,7 @@ void LLAvatarNameCache::eraseUnrefreshed() { sLastExpireCheck = now; - for (cache_t::iterator it = sCache.begin(); it != sCache.end(); ++it) + for (cache_t::iterator it = sCache.begin(); it != sCache.end();) { const LLAvatarName& av_name = it->second; if (av_name.mExpires < max_unrefreshed) @@ -564,7 +564,7 @@ void LLAvatarNameCache::eraseUnrefreshed() << " user '" << av_name.mUsername << "' " << "expired " << now - av_name.mExpires << " secs ago" << LL_ENDL; - sCache.erase(it); + sCache.erase(it++); } } LL_INFOS("AvNameCache") << sCache.size() << " cached avatar names" << LL_ENDL; -- cgit v1.2.3 From 443e38f94d3c8538b457304bbe17ed0ab04eeef2 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Thu, 28 Apr 2011 19:13:15 -0700 Subject: fixed build (again) --- indra/llxuixml/llinitparam.h | 1 - 1 file changed, 1 deletion(-) diff --git a/indra/llxuixml/llinitparam.h b/indra/llxuixml/llinitparam.h index 70dad4c8bf..a853999e94 100644 --- a/indra/llxuixml/llinitparam.h +++ b/indra/llxuixml/llinitparam.h @@ -1343,7 +1343,6 @@ namespace LLInitParam { mCurChoice = other.mCurChoice; return BaseBlock::mergeBlock(selfBlockDescriptor(), other, overwrite); - return false; } // clear out old choice when param has changed -- cgit v1.2.3 From 72c43237fc184d07936edbc4f1dbd18d394c4ce9 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Thu, 28 Apr 2011 19:33:20 -0700 Subject: STORM-1039 FIXED Bad iterator access in llavatarnamecache.cpp:564 missed else case --- indra/llmessage/llavatarnamecache.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index e0b77e3105..97f2792686 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -566,6 +566,10 @@ void LLAvatarNameCache::eraseUnrefreshed() << LL_ENDL; sCache.erase(it++); } + else + { + ++it; + } } LL_INFOS("AvNameCache") << sCache.size() << " cached avatar names" << LL_ENDL; } -- cgit v1.2.3 From 2d5b5e37d5dfc53ffff2026cbbf1e1c66f81e2ea Mon Sep 17 00:00:00 2001 From: Eli Linden <eli@lindenlab.com> Date: Fri, 29 Apr 2011 13:16:15 -0700 Subject: WIP CT-641 PL translation for Viewer set23 --- .../skins/default/xui/pl/floater_beacons.xml | 1 + .../skins/default/xui/pl/menu_avatar_self.xml | 1 + .../skins/default/xui/pl/menu_bottomtray.xml | 2 +- .../skins/default/xui/pl/menu_inventory.xml | 1 + .../skins/default/xui/pl/menu_inventory_add.xml | 1 + .../skins/default/xui/pl/menu_outfit_gear.xml | 5 +- indra/newview/skins/default/xui/pl/menu_viewer.xml | 5 + .../newview/skins/default/xui/pl/notifications.xml | 17 ++- .../skins/default/xui/pl/panel_edit_wearable.xml | 6 + .../default/xui/pl/panel_preferences_chat.xml | 4 +- .../default/xui/pl/panel_preferences_colors.xml | 10 +- .../default/xui/pl/panel_preferences_graphics1.xml | 6 +- indra/newview/skins/default/xui/pl/strings.xml | 123 +++++++++++++++++++++ 13 files changed, 169 insertions(+), 13 deletions(-) diff --git a/indra/newview/skins/default/xui/pl/floater_beacons.xml b/indra/newview/skins/default/xui/pl/floater_beacons.xml index 547db2b351..e6286a6ac1 100644 --- a/indra/newview/skins/default/xui/pl/floater_beacons.xml +++ b/indra/newview/skins/default/xui/pl/floater_beacons.xml @@ -17,5 +17,6 @@ <check_box label="Obiekty dotykalne" name="touch_only"/> <check_box label="Źródła dźwięku" name="sounds"/> <check_box label="Źródła cząsteczek" name="particles"/> + <check_box label="Źródła mediów" name="moapbeacon"/> </panel> </floater> diff --git a/indra/newview/skins/default/xui/pl/menu_avatar_self.xml b/indra/newview/skins/default/xui/pl/menu_avatar_self.xml index d481475803..8eb501c5b8 100644 --- a/indra/newview/skins/default/xui/pl/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/pl/menu_avatar_self.xml @@ -14,6 +14,7 @@ <menu_item_call label="Podkoszulek" name="Self Undershirt"/> <menu_item_call label="Bieliznę" name="Self Underpants"/> <menu_item_call label="Tatuaż" name="Self Tattoo"/> + <menu_item_call label="Fizyka" name="Self Physics"/> <menu_item_call label="Ubranie alpha" name="Self Alpha"/> <menu_item_call label="Wszystko" name="All Clothes"/> </context_menu> diff --git a/indra/newview/skins/default/xui/pl/menu_bottomtray.xml b/indra/newview/skins/default/xui/pl/menu_bottomtray.xml index 8da40dcedf..1ec5883cfe 100644 --- a/indra/newview/skins/default/xui/pl/menu_bottomtray.xml +++ b/indra/newview/skins/default/xui/pl/menu_bottomtray.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="hide_camera_move_controls_menu"> - <menu_item_check label="Rozmowy głosowe aktywne" name="EnableVoiceChat"/> + <menu_item_check label="Rozpocznij rozmowę głosową" name="EnableVoiceChat"/> <menu_item_check label="Przycisk gesturki" name="ShowGestureButton"/> <menu_item_check label="Przycisk ruchu" name="ShowMoveButton"/> <menu_item_check label="Przycisk widoku" name="ShowCameraButton"/> diff --git a/indra/newview/skins/default/xui/pl/menu_inventory.xml b/indra/newview/skins/default/xui/pl/menu_inventory.xml index e47ffa0e18..5492f78b26 100644 --- a/indra/newview/skins/default/xui/pl/menu_inventory.xml +++ b/indra/newview/skins/default/xui/pl/menu_inventory.xml @@ -25,6 +25,7 @@ <menu_item_call label="Nowa bielizna" name="New Underpants"/> <menu_item_call label="Nowa maska alpha" name="New Alpha Mask"/> <menu_item_call label="Nowy tatuaż" name="New Tattoo"/> + <menu_item_call label="Nowa fizyka" name="New Physics"/> </menu> <menu label="Nowa Część Ciała" name="New Body Parts"> <menu_item_call label="Nowy kształt" name="New Shape"/> diff --git a/indra/newview/skins/default/xui/pl/menu_inventory_add.xml b/indra/newview/skins/default/xui/pl/menu_inventory_add.xml index 4a56586aaf..04f9b94f7c 100644 --- a/indra/newview/skins/default/xui/pl/menu_inventory_add.xml +++ b/indra/newview/skins/default/xui/pl/menu_inventory_add.xml @@ -23,6 +23,7 @@ <menu_item_call label="Nowa bielizna" name="New Underpants"/> <menu_item_call label="Nowa maska alpha" name="New Alpha"/> <menu_item_call label="Nowy tatuaż" name="New Tattoo"/> + <menu_item_call label="Nowa fizyka" name="New Physics"/> </menu> <menu label="Nowa Część Ciała" name="New Body Parts"> <menu_item_call label="Nowy kształt" name="New Shape"/> diff --git a/indra/newview/skins/default/xui/pl/menu_outfit_gear.xml b/indra/newview/skins/default/xui/pl/menu_outfit_gear.xml index 1a70e76ec7..c093557e86 100644 --- a/indra/newview/skins/default/xui/pl/menu_outfit_gear.xml +++ b/indra/newview/skins/default/xui/pl/menu_outfit_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Gear Outfit"> +<toggleable_menu name="Gear Outfit"> <menu_item_call label="Załóż - Zastąp obecny strój" name="wear"/> <menu_item_call label="Załóż - Dodaj do bieżącego stroju" name="wear_add"/> <menu_item_call label="Zdejmij - Usuń z obecnego stroju" name="take_off"/> @@ -14,6 +14,7 @@ <menu_item_call label="Nowa podkoszulka" name="New Undershirt"/> <menu_item_call label="Nowa bielizna" name="New Underpants"/> <menu_item_call label="Nowa maska alpha" name="New Alpha"/> + <menu_item_call label="Nowa fizyka" name="New Physics"/> <menu_item_call label="Nowy tatuaż" name="New Tattoo"/> </menu> <menu label="Nowe części ciała" name="New Body Parts"> @@ -24,4 +25,4 @@ </menu> <menu_item_call label="Zmień nazwę stroju" name="rename"/> <menu_item_call label="Usuń strój" name="delete_outfit"/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pl/menu_viewer.xml b/indra/newview/skins/default/xui/pl/menu_viewer.xml index 9c01e53a01..e869806d04 100644 --- a/indra/newview/skins/default/xui/pl/menu_viewer.xml +++ b/indra/newview/skins/default/xui/pl/menu_viewer.xml @@ -334,4 +334,9 @@ </menu> <menu_item_call label="Boskie narzędzia" name="God Tools"/> </menu> + <menu label="Admin" name="Deprecated"> + <menu label="Take Off Clothing" name="Take Off Clothing"> + <menu_item_call label="Fizyka" name="Physics"/> + </menu> + </menu> </menu_bar> diff --git a/indra/newview/skins/default/xui/pl/notifications.xml b/indra/newview/skins/default/xui/pl/notifications.xml index e36df9bca7..63f976a314 100644 --- a/indra/newview/skins/default/xui/pl/notifications.xml +++ b/indra/newview/skins/default/xui/pl/notifications.xml @@ -2807,6 +2807,13 @@ Wyciszyć wszystkich? <notification label="Wstań" name="HintSit"> Aby wstać i opuścić pozycję siedzącą, kliknij przycisk Wstań. </notification> + <notification label="Mów" name="HintSpeak"> + Kliknij przycisk "Mów" aby włączyć i wyłączyć Twój mikrofon. + +Kliknij w strzałkę aby zobaczyć panel kontroli głosu. + +Ukrycie przycisku "Mów" zdezaktywuje głos. + </notification> <notification label="Odkrywaj Świat" name="HintDestinationGuide"> Destination Guide zawiera tysiące nowych miejsc do odkrycia. Wybierz lokalizację i teleportuj się aby rozpocząć zwiedzanie. </notification> @@ -2816,12 +2823,16 @@ Wyciszyć wszystkich? <notification label="Ruch" name="HintMove"> Aby chodzić lub biegać, otwórz panel ruchu i użyj strzałek do nawigacji. Możesz także używać strzałek z klawiatury. </notification> + <notification label="" name="HintMoveClick"> + 1. Kliknij aby chodzić. +Kliknij gdziekolwiek na ziemi aby przejść do wskazanego miejsca. + +2. Kliknij i przeciągnij aby zmienić widok. +Kliknij i przeciągnij gdziekolwiek aby obrócić widok. + </notification> <notification label="Wyświetlana nazwa" name="HintDisplayName"> Ustaw wyświetlaną nazwę, którą możesz zmieniać tutaj. Jest ona dodatkiem do unikatowej nazwy użytkownika, która nie może być zmieniona. Możesz zmienić sposób w jaki widzisz nazwy innych osób w Twoich Ustawieniach. </notification> - <notification label="Ruch" name="HintMoveArrows"> - Użyj przycisków ze strzałkami z klawiatury aby chodzić. Jeśli wciśniesz strzałkę 'do góry' podwójnie, zaczniesz biec. - </notification> <notification label="Widok" name="HintView"> To change your camera view, use the Orbit and Pan controls. Zresetuj widok poprzez wciśnięcie klawisza Esc lub chodzenie. </notification> diff --git a/indra/newview/skins/default/xui/pl/panel_edit_wearable.xml b/indra/newview/skins/default/xui/pl/panel_edit_wearable.xml index d1157b910d..2027b8715b 100644 --- a/indra/newview/skins/default/xui/pl/panel_edit_wearable.xml +++ b/indra/newview/skins/default/xui/pl/panel_edit_wearable.xml @@ -45,6 +45,9 @@ <string name="edit_tattoo_title"> Edycja tatuażu </string> + <string name="edit_physics_title"> + Edycja fizyki + </string> <string name="shape_desc_text"> Kształt: </string> @@ -90,6 +93,9 @@ <string name="tattoo_desc_text"> Tatuaż: </string> + <string name="physics_desc_text"> + Fizyka: + </string> <labeled_back_button label="Zapisz" name="back_btn" tool_tip="Powrót do edycji stroju"/> <text name="edit_wearable_title" value="Edycja kształtu"/> <panel label="Koszula" name="wearable_type_panel"> diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml index 4a4e6509ab..3251099f74 100644 --- a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml @@ -30,7 +30,9 @@ <spinner label="Czas widoczności czatu w pobliżu:" name="nearby_toasts_lifetime"/> <spinner label="Czas znikania czatu w pobliżu:" name="nearby_toasts_fadingtime"/> <check_box name="translate_chat_checkbox"/> - <text name="translate_chb_label" >Używaj translatora podczas rozmowy (wspierany przez Google)</text> + <text name="translate_chb_label"> + Użyj translatora podczas rozmowy (wspierany przez Google) + </text> <text name="translate_language_text"> Przetłumacz czat na: </text> diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_colors.xml b/indra/newview/skins/default/xui/pl/panel_preferences_colors.xml index 3d1160882b..3affda57bf 100644 --- a/indra/newview/skins/default/xui/pl/panel_preferences_colors.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_colors.xml @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Kolory" name="colors_panel"> <text name="effects_color_textbox"> - Moje efekty (selection beam): + Moje efekty (opcje wyboru): </text> <color_swatch name="effect_color_swatch" tool_tip="Kliknij aby wybrać kolor"/> <text name="font_colors"> - Kolor czcionki czatu: + Kolory czcionki czatu: </text> <text name="text_box1"> Ja @@ -34,8 +34,8 @@ <color_swatch name="background" tool_tip="Wybierz kolor taga"/> <slider label="Przeźroczystość:" name="bubble_chat_opacity" tool_tip="Wybierz przeźroczystość taga"/> <text name="floater_opacity"> - Przeźroczystość: + Floater Opacity: </text> - <slider label="Aktywny:" name="active"/> - <slider label="Niekatywny:" name="inactive"/> + <slider label="Aktywne:" name="active"/> + <slider label="Nieaktywne:" name="inactive"/> </panel> diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml index 0f21aa9dd1..f2beef091a 100644 --- a/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml @@ -40,6 +40,10 @@ <combo_box.item label="Awatary i obiekty" name="3"/> <combo_box.item label="Wszystko" name="4"/> </combo_box> + <slider label="Fizyka awatara:" name="AvatarPhysicsDetail"/> + <text name="AvatarPhysicsDetailText"> + Niska + </text> <slider label="Pole widzenia:" name="DrawDistance"/> <text name="DrawDistanceMeterText2"> m @@ -78,7 +82,7 @@ Mało </text> <text name="AvatarRenderingText"> - Rendering awatarów + Rendering awatara: </text> <check_box initial_value="true" label="Impostoryzacja awatarowa" name="AvatarImpostors"/> <check_box initial_value="true" label="Rendering awatara przez GPU" name="AvatarVertexProgram"/> diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml index 05a567262c..94708ba448 100644 --- a/indra/newview/skins/default/xui/pl/strings.xml +++ b/indra/newview/skins/default/xui/pl/strings.xml @@ -852,6 +852,9 @@ <string name="tattoo"> Tatuaż </string> + <string name="physics"> + Fizyka + </string> <string name="invalid"> niewłaściwa funkcja </string> @@ -891,6 +894,9 @@ <string name="tattoo_not_worn"> Tatuaż nie jest założony </string> + <string name="physics_not_worn"> + Fizyka niezałożona + </string> <string name="invalid_not_worn"> nieważny </string> @@ -939,6 +945,9 @@ <string name="create_new_tattoo"> Nowy tatuaż </string> + <string name="create_new_physics"> + Stwórz nową fizykę + </string> <string name="create_new_invalid"> nieważny </string> @@ -2175,6 +2184,114 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE]. <string name="Bulbous Nose"> Bulwiasty nos </string> + <string name="Breast Physics Mass"> + Masa piersi + </string> + <string name="Breast Physics Smoothing"> + Wygładzanie piersi + </string> + <string name="Breast Physics Gravity"> + Grawitacja piersi + </string> + <string name="Breast Physics Drag"> + Ściśnięcie piersi + </string> + <string name="Breast Physics InOut Max Effect"> + Efekt max + </string> + <string name="Breast Physics InOut Spring"> + Sprężystość + </string> + <string name="Breast Physics InOut Gain"> + Wzmocnienie + </string> + <string name="Breast Physics InOut Damping"> + Tłumienie + </string> + <string name="Breast Physics UpDown Max Effect"> + Efekt max + </string> + <string name="Breast Physics UpDown Spring"> + Sprężystość + </string> + <string name="Breast Physics UpDown Gain"> + Wzmocnienie + </string> + <string name="Breast Physics UpDown Damping"> + Tłumienie + </string> + <string name="Breast Physics LeftRight Max Effect"> + Efekt max + </string> + <string name="Breast Physics LeftRight Spring"> + Sprężystość + </string> + <string name="Breast Physics LeftRight Gain"> + Wzmocnienie + </string> + <string name="Breast Physics LeftRight Damping"> + Tłumienie + </string> + <string name="Belly Physics Mass"> + Masa brzucha + </string> + <string name="Belly Physics Smoothing"> + Wygładzanie brzucha + </string> + <string name="Belly Physics Gravity"> + Grawitacja brzucha + </string> + <string name="Belly Physics Drag"> + Ściśnięcie brzucha + </string> + <string name="Belly Physics UpDown Max Effect"> + Efekt max + </string> + <string name="Belly Physics UpDown Spring"> + Sprężystość + </string> + <string name="Belly Physics UpDown Gain"> + Wzmocnienie + </string> + <string name="Belly Physics UpDown Damping"> + Tłumienie + </string> + <string name="Butt Physics Mass"> + Masa pośladków + </string> + <string name="Butt Physics Smoothing"> + Wygładzanie pośladków + </string> + <string name="Butt Physics Gravity"> + Grawitacja pośladków + </string> + <string name="Butt Physics Drag"> + Ściśnięcie pośladków + </string> + <string name="Butt Physics UpDown Max Effect"> + Efekt max + </string> + <string name="Butt Physics UpDown Spring"> + Sprężystość + </string> + <string name="Butt Physics UpDown Gain"> + Wzmocnienie + </string> + <string name="Butt Physics UpDown Damping"> + Tłumienie + </string> + <string name="Butt Physics LeftRight Max Effect"> + Efekt max + </string> + <string name="Butt Physics LeftRight Spring"> + Sprężystość + </string> + <string name="Butt Physics LeftRight Gain"> + Wzmocnienie + </string> + <string name="Butt Physics LeftRight Damping"> + Tłumienie + </string> <string name="Bushy Eyebrows"> Bujne brwi </string> @@ -2184,6 +2301,9 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE]. <string name="Butt Size"> Rozmiar pośladków </string> + <string name="Butt Gravity"> + Grawitacja pośladków + </string> <string name="bustle skirt"> Bustle Skirt </string> @@ -3659,6 +3779,9 @@ Raport o Nadużyciu <string name="New Tattoo"> Nowy tatuaż </string> + <string name="New Physics"> + Nowa fizyka + </string> <string name="Invalid Wearable"> Nieaktualne ubranie/część ciała </string> -- cgit v1.2.3 From 4bfb06944a677f1dc710b1ea27c18bff84dfd98f Mon Sep 17 00:00:00 2001 From: Eli Linden <eli@lindenlab.com> Date: Fri, 29 Apr 2011 13:16:32 -0700 Subject: WIP CT-641 PL translation for Viewer set23, new files --- indra/newview/skins/default/xui/pl/menu_media_ctrl.xml | 6 ++++++ indra/newview/skins/default/xui/pl/panel_edit_physics.xml | 14 ++++++++++++++ .../skins/default/xui/pl/panel_scrolling_param_base.xml | 4 ++++ 3 files changed, 24 insertions(+) create mode 100644 indra/newview/skins/default/xui/pl/menu_media_ctrl.xml create mode 100644 indra/newview/skins/default/xui/pl/panel_edit_physics.xml create mode 100644 indra/newview/skins/default/xui/pl/panel_scrolling_param_base.xml diff --git a/indra/newview/skins/default/xui/pl/menu_media_ctrl.xml b/indra/newview/skins/default/xui/pl/menu_media_ctrl.xml new file mode 100644 index 0000000000..60dc3673a9 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/menu_media_ctrl.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="media ctrl context menu"> + <menu_item_call label="Wytnij" name="Cut"/> + <menu_item_call label="Kopiuj" name="Copy"/> + <menu_item_call label="Wklej" name="Paste"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/pl/panel_edit_physics.xml b/indra/newview/skins/default/xui/pl/panel_edit_physics.xml new file mode 100644 index 0000000000..a773a52a59 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_edit_physics.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_physics_panel"> + <panel label="" name="accordion_panel"> + <accordion name="physics_accordion"> + <accordion_tab name="physics_breasts_updown_tab" title="Podskakiwanie piersi"/> + <accordion_tab name="physics_breasts_inout_tab" title="Rowek między piersiami"/> + <accordion_tab name="physics_breasts_leftright_tab" title="Kołysanie piersi"/> + <accordion_tab name="physics_belly_tab" title="Poskakiwanie brzucha"/> + <accordion_tab name="physics_butt_tab" title="Podksakiwanie pośladków"/> + <accordion_tab name="physics_butt_leftright_tab" title="Kołysanie pośladków"/> + <accordion_tab name="physics_advanced_tab" title="Zaawansowane parametry"/> + </accordion> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/pl/panel_scrolling_param_base.xml new file mode 100644 index 0000000000..fa659040ea --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_scrolling_param_base.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="LLScrollingPanelParamBase"> + <slider label="[DESC]" name="param slider"/> +</panel> -- cgit v1.2.3 From d7954ba38f81172f0062ae55479aff0709615bdd Mon Sep 17 00:00:00 2001 From: Xiaohong Bao <bao@lindenlab.com> Date: Fri, 29 Apr 2011 15:23:03 -0600 Subject: fix for SH-688: Viewer crash when uploading a large .dae file and clicking the X button in upper right hand corner of the upload model floater on Mac Build --- indra/llprimitive/llmodel.cpp | 19 ++++-------------- indra/newview/llfloatermodelpreview.cpp | 34 ++++++++++++++++++++++++++++++++- indra/newview/llfloatermodelpreview.h | 8 +++++++- 3 files changed, 44 insertions(+), 17 deletions(-) diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp index 5af1122451..794cdb83d5 100644 --- a/indra/llprimitive/llmodel.cpp +++ b/indra/llprimitive/llmodel.cpp @@ -232,27 +232,16 @@ LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& fa domPRef p = tri->getP(); domListOfUInts& idx = p->getValue(); - domListOfFloats v; - domListOfFloats tc; - domListOfFloats n; + domListOfFloats dummy ; + domListOfFloats& v = pos_source ? pos_source->getFloat_array()->getValue() : dummy ; + domListOfFloats& tc = tc_source ? tc_source->getFloat_array()->getValue() : dummy ; + domListOfFloats& n = norm_source ? norm_source->getFloat_array()->getValue() : dummy ; if (pos_source) { - v = pos_source->getFloat_array()->getValue(); face.mExtents[0].set(v[0], v[1], v[2]); face.mExtents[1].set(v[0], v[1], v[2]); } - - if (tc_source) - { - tc = tc_source->getFloat_array()->getValue(); - } - - if (norm_source) - { - n = norm_source->getFloat_array()->getValue(); - } - LLVolumeFace::VertexMapData::PointMap point_map; diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index c66b2255eb..ae0e1b7d46 100644 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -104,6 +104,7 @@ //static S32 LLFloaterModelPreview::sUploadAmount = 10; LLFloaterModelPreview* LLFloaterModelPreview::sInstance = NULL; +std::list<LLModelLoader*> LLModelLoader::sActiveLoaderList; const S32 PREVIEW_BORDER_WIDTH = 2; const S32 PREVIEW_RESIZE_HANDLE_SIZE = S32(RESIZE_HANDLE_WIDTH * OO_SQRT2) + PREVIEW_BORDER_WIDTH; @@ -1087,6 +1088,15 @@ LLModelLoader::LLModelLoader( std::string filename, S32 lod, LLModelPreview* pre { mTrySLM = false; } + + assert_main_thread(); + sActiveLoaderList.push_back(this) ; +} + +LLModelLoader::~LLModelLoader() +{ + assert_main_thread(); + sActiveLoaderList.remove(this); } void stretch_extents(LLModel* model, LLMatrix4a& mat, LLVector4a& min, LLVector4a& max, BOOL& first_transform) @@ -1872,8 +1882,24 @@ bool LLModelLoader::loadFromSLM(const std::string& filename) return true; } +//static +bool LLModelLoader::isAlive(LLModelLoader* loader) +{ + if(!loader) + { + return false ; + } + + std::list<LLModelLoader*>::iterator iter = sActiveLoaderList.begin() ; + for(; iter != sActiveLoaderList.end() && (*iter) != loader; ++iter) ; + + return *iter == loader ; +} + void LLModelLoader::loadModelCallback() { + assert_main_thread(); + if (mPreview) { mPreview->loadModelCallback(mLod); @@ -1884,6 +1910,12 @@ void LLModelLoader::loadModelCallback() apr_sleep(100); } + //doubel check if "this" is valid before deleting it, in case it is aborted during running. + if(!isAlive(this)) + { + return ; + } + //cleanup model loader if (mPreview) { @@ -2693,7 +2725,7 @@ LLModelPreview::~LLModelPreview() if (mModelLoader) { delete mModelLoader; - mModelLoader->mPreview = NULL; + mModelLoader = NULL; } //*HACK : *TODO : turn this back on when we understand why this crashes //glodShutdown(); diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h index 186bf114d1..192f84c221 100644 --- a/indra/newview/llfloatermodelpreview.h +++ b/indra/newview/llfloatermodelpreview.h @@ -80,7 +80,7 @@ public: BOOL mFirstTransform; LLVector3 mExtents[2]; bool mTrySLM; - + std::map<daeElement*, LLPointer<LLModel> > mModel; typedef std::vector<LLPointer<LLModel> > model_list; @@ -99,6 +99,8 @@ public: LLModelLoader( std::string filename, S32 lod, LLModelPreview* preview, JointTransformMap& jointMap, std::deque<std::string>& jointsFromNodes ); + ~LLModelLoader() ; + virtual void run(); bool doLoadModel(); bool loadFromSLM(const std::string& filename); @@ -131,6 +133,10 @@ public: std::map<std::string, std::string> mJointMap; JointTransformMap& mJointList; std::deque<std::string>& mJointsFromNode; + +private: + static std::list<LLModelLoader*> sActiveLoaderList; + static bool isAlive(LLModelLoader* loader) ; }; class LLFloaterModelPreview : public LLFloater -- cgit v1.2.3 From 367823ced0cc885474850b4400c7936d667a7d7a Mon Sep 17 00:00:00 2001 From: callum <none@none> Date: Fri, 29 Apr 2011 15:35:22 -0700 Subject: EXP-623 FIX Selecting fly option while on click to walk path flys avatar to end point but avatar spins and shakes when arriving at click point --- indra/newview/llagent.cpp | 3 +++ indra/newview/lltoolpie.cpp | 9 +++++++++ indra/newview/lltoolpie.h | 1 + 3 files changed, 13 insertions(+) diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 7d491a7774..a6d2c96d52 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -62,6 +62,7 @@ #include "llstatusbar.h" #include "llteleportflags.h" #include "lltool.h" +#include "lltoolpie.h" #include "lltoolmgr.h" #include "lltrans.h" #include "llurlentry.h" @@ -559,6 +560,8 @@ void LLAgent::setFlying(BOOL fly) // static void LLAgent::toggleFlying() { + LLToolPie::instance().stopClickToWalk(); + BOOL fly = !gAgent.getFlying(); gAgent.mMoveTimer.reset(); diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index 06e0d17b8c..9ec4d33036 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -688,6 +688,15 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask) return LLTool::handleMouseUp(x, y, mask); } +void LLToolPie::stopClickToWalk() +{ + mPick.mPosGlobal = gAgent.getPositionGlobal(); + handle_go_to(); + if(mAutoPilotDestination) + { + mAutoPilotDestination->markDead(); + } +} BOOL LLToolPie::handleDoubleClick(S32 x, S32 y, MASK mask) { diff --git a/indra/newview/lltoolpie.h b/indra/newview/lltoolpie.h index 22359a6db8..d7c79ee223 100644 --- a/indra/newview/lltoolpie.h +++ b/indra/newview/lltoolpie.h @@ -67,6 +67,7 @@ public: LLObjectSelection* getLeftClickSelection() { return (LLObjectSelection*)mLeftClickSelection; } void resetSelection(); void blockClickToWalk() { mBlockClickToWalk = true; } + void stopClickToWalk(); static void selectionPropertiesReceived(); -- cgit v1.2.3 From 314961674a508c7d13cc889d914b0ded99376f9b Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Fri, 29 Apr 2011 15:52:48 -0700 Subject: EXP-769 Group call requests received in Basic mode --- indra/newview/app_settings/settings.xml | 6 +++--- indra/newview/app_settings/settings_minimal.xml | 6 +++--- indra/newview/llimview.cpp | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index f2a0e5ac19..b95c83e1ac 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -11662,10 +11662,10 @@ <key>Value</key> <integer>0</integer> </map> - <key>VoiceCallsRejectAll</key> + <key>VoiceCallsRejectGroup</key> <map> <key>Comment</key> - <string>Silently reject all incoming voice calls.</string> + <string>Silently reject all incoming group voice calls.</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -11673,7 +11673,7 @@ <key>Value</key> <integer>0</integer> </map> - <key>VoiceDisableMic</key> + <key>VoiceDisableMic</key> <map> <key>Comment</key> <string>Completely disable the ability to open the mic.</string> diff --git a/indra/newview/app_settings/settings_minimal.xml b/indra/newview/app_settings/settings_minimal.xml index 60aecb279c..3d470b27c1 100644 --- a/indra/newview/app_settings/settings_minimal.xml +++ b/indra/newview/app_settings/settings_minimal.xml @@ -117,14 +117,14 @@ <key>Value</key> <integer>0</integer> </map> - <key>VoiceCallsRejectAll</key> + <key>VoiceCallsRejectGroup</key> <map> <key>Comment</key> - <string>Silently reject all incoming voice calls.</string> + <string>Silently reject all incoming group voice calls.</string> <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>0</integer> + <integer>1</integer> </map> <key>VoiceDisableMic</key> <map> diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index ec3fe48151..38c5ba71bd 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -2696,10 +2696,10 @@ void LLIMMgr::inviteToSession( if (voice_invite) { - if ( // if we're rejecting all incoming call requests - gSavedSettings.getBOOL("VoiceCallsRejectAll") + if ( // if we are rejecting group calls + (gSavedSettings.getBOOL("VoiceCallsRejectGroup") && notify_box_type == "VoiceInviteGroup") || // or we're rejecting non-friend voice calls and this isn't a friend - || (gSavedSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(caller_id) == NULL)) + (gSavedSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(caller_id) == NULL)) ) { // silently decline the call -- cgit v1.2.3 From 5fe3675564f1c7d8cf13e94f43d32be5ea45940b Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Fri, 29 Apr 2011 15:53:14 -0700 Subject: EXP-761, EXP-758 --- indra/newview/llbottomtray.cpp | 42 +++++++++++++++------- indra/newview/llspeakbutton.cpp | 20 ----------- indra/newview/llspeakbutton.h | 5 --- .../skins/minimal/xui/en/panel_bottomtray.xml | 2 +- 4 files changed, 30 insertions(+), 39 deletions(-) diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index 0371b7be71..6d40786b08 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -378,12 +378,13 @@ void LLBottomTray::onChange(EStatusType status, const std::string &channelURI, b } // We have to enable/disable right and left parts of speak button separately (EXT-4648) - mSpeakBtn->setSpeakBtnEnabled(enable); + getChild<LLButton>("speak_btn")->setEnabled(enable); + // skipped to avoid button blinking if (status != STATUS_JOINING && status!= STATUS_LEFT_CHANNEL) { bool voice_status = LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking(); - mSpeakBtn->setFlyoutBtnEnabled(voice_status); + getChild<LLButton>("speak_flyout_btn")->setEnabled(voice_status); if (voice_status) { LLFirstUse::speak(true); @@ -566,17 +567,21 @@ BOOL LLBottomTray::postBuild() setRightMouseDownCallback(boost::bind(&LLBottomTray::showBottomTrayContextMenu,this, _2, _3,_4)); mSpeakPanel = getChild<LLPanel>("speak_panel"); - mSpeakBtn = getChild<LLSpeakButton>("talk"); - LLHints::registerHintTarget("speak_btn", mSpeakBtn->getHandle()); + mSpeakBtn = findChild<LLSpeakButton>("talk"); + if (mSpeakBtn) + { + LLHints::registerHintTarget("speak_btn", mSpeakBtn->getHandle()); + + // Localization tool doesn't understand custom buttons like <talk_button> + mSpeakBtn->setSpeakToolTip( getString("SpeakBtnToolTip") ); + mSpeakBtn->setShowToolTip( getString("VoiceControlBtnToolTip") ); + } // Both parts of speak button should be initially disabled because // it takes some time between logging in to world and connecting to voice channel. - mSpeakBtn->setSpeakBtnEnabled(false); - mSpeakBtn->setFlyoutBtnEnabled(false); + getChild<LLButton>("speak_btn")->setEnabled(false); + getChild<LLButton>("speak_flyout_btn")->setEnabled(false); - // Localization tool doesn't understand custom buttons like <talk_button> - mSpeakBtn->setSpeakToolTip( getString("SpeakBtnToolTip") ); - mSpeakBtn->setShowToolTip( getString("VoiceControlBtnToolTip") ); // Registering Chat Bar to receive Voice client status change notifications. LLVoiceClient::getInstance()->addObserver(this); @@ -872,6 +877,10 @@ void LLBottomTray::draw() getChild<LLButton>("show_help_btn")->setToggleState(help_floater_visible); + bool openmic = LLVoiceClient::getInstance()->getUserPTTState(); + bool voiceenabled = LLVoiceClient::getInstance()->voiceEnabled(); + getChild<LLButton>("speak_btn")->setToggleState(openmic && voiceenabled); + getChild<LLOutputMonitorCtrl>("chat_zone_indicator")->setIsMuted(!voiceenabled); } @@ -1345,7 +1354,11 @@ void LLBottomTray::processShrinkButtons(S32& required_width, S32& buttons_freed_ if (possible_shrink_width > 0) { - mSpeakBtn->setLabelVisible(false); + if (mSpeakBtn) + { + mSpeakBtn->setLabelVisible(false); + } + mSpeakPanel->reshape(panel_width - possible_shrink_width, mSpeakPanel->getRect().getHeight()); required_width += possible_shrink_width; @@ -1442,10 +1455,13 @@ void LLBottomTray::processExtendButtons(S32& available_width) S32 possible_extend_width = panel_max_width - panel_width; if (possible_extend_width >= 0 && possible_extend_width <= available_width + available_width_chiclet) // HACK: this button doesn't change size so possible_extend_width will be 0 - { - mSpeakBtn->setLabelVisible(true); + { + if (mSpeakBtn) + { + mSpeakBtn->setLabelVisible(true); + } + mSpeakPanel->reshape(panel_max_width, mSpeakPanel->getRect().getHeight()); - log(mSpeakBtn, "speak button is extended"); if( available_width > possible_extend_width) { diff --git a/indra/newview/llspeakbutton.cpp b/indra/newview/llspeakbutton.cpp index d52e0a6c86..d3e96f8dfb 100644 --- a/indra/newview/llspeakbutton.cpp +++ b/indra/newview/llspeakbutton.cpp @@ -54,26 +54,6 @@ LLSpeakButton::Params::Params() // See widgets/talk_button.xml } -void LLSpeakButton::draw() -{ - // LLVoiceClient::getInstance() is the authoritative global source of info regarding our open-mic state, we merely reflect that state. - bool openmic = LLVoiceClient::getInstance()->getUserPTTState(); - bool voiceenabled = LLVoiceClient::getInstance()->voiceEnabled(); - mSpeakBtn->setToggleState(openmic && voiceenabled); - mOutputMonitor->setIsMuted(!voiceenabled); - LLUICtrl::draw(); -} -void LLSpeakButton::setSpeakBtnEnabled(bool enabled) -{ - LLButton* speak_btn = getChild<LLButton>("speak_btn"); - speak_btn->setEnabled(enabled); -} -void LLSpeakButton::setFlyoutBtnEnabled(bool enabled) -{ - LLButton* show_btn = getChild<LLBottomtrayButton>("speak_flyout_btn"); - show_btn->setEnabled(enabled); -} - LLSpeakButton::LLSpeakButton(const Params& p) : LLUICtrl(p) , mOutputMonitor(NULL) diff --git a/indra/newview/llspeakbutton.h b/indra/newview/llspeakbutton.h index 2fdf80c1f2..7db01112ef 100644 --- a/indra/newview/llspeakbutton.h +++ b/indra/newview/llspeakbutton.h @@ -53,12 +53,7 @@ public: }; /*virtual*/ ~LLSpeakButton(); - /*virtual*/ void draw(); - // methods for enabling/disabling right and left parts of speak button separately(EXT-4648) - void setSpeakBtnEnabled(bool enabled); - void setFlyoutBtnEnabled(bool enabled); - // *HACK: Need to put tooltips in a translatable location, // the panel that contains this button. void setSpeakToolTip(const std::string& msg); diff --git a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml index aff22c7e45..49eead5079 100644 --- a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml @@ -105,7 +105,7 @@ min_height="28" min_width="20" mouse_opaque="false" - name="flyout_panel" + name="speak_flyout_panel" top_delta="0" user_resize="false" width="20"> -- cgit v1.2.3 From af41eb0d2c9f45c545c0470d44b91147e74c82a4 Mon Sep 17 00:00:00 2001 From: callum <none@none> Date: Fri, 29 Apr 2011 15:54:45 -0700 Subject: EXP-742 FIX [PUBLIC] CTRL-ALT-w doesn't "spin_over" --- indra/newview/skins/default/xui/en/menu_viewer.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 51610c0ae0..81b7d35253 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -2696,7 +2696,7 @@ <menu_item_call label="Web Content Browser" name="Web Content Browser" - shortcut="control|alt|W"> + shortcut="control|shift|Z"> <menu_item_call.on_click function="Advanced.WebContentTest" parameter="http://google.com"/> -- cgit v1.2.3 From 1cfe5567699fbd1ba096e4511454d3eba21ea77c Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Mon, 2 May 2011 09:25:08 -0400 Subject: STORM-1215: restore INSTALL_PROPRIETARY in Release builds, remove incorrect use of LL_RELEASE_FOR_DOWNLOAD from ReleaseOS --- autobuild.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/autobuild.xml b/autobuild.xml index 2ac869b20a..7686b48cf5 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1674,6 +1674,7 @@ <string>-DCMAKE_BUILD_TYPE:STRING=Release</string> <string>-DWORD_SIZE:STRING=32</string> <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> + <string>-DINSTALL_PROPRIETARY=TRUE</string> </array> </map> <key>name</key> @@ -1691,7 +1692,6 @@ <string>-DWORD_SIZE:STRING=32</string> <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DLL_RELEASE_FOR_DOWNLOAD:BOOL=YES</string> </array> <key>arguments</key> <array> -- cgit v1.2.3 From 79c89bc0e61ce99a8b2aa2de83d63a37554296ba Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Mon, 2 May 2011 10:04:23 -0400 Subject: Added tag 2.6.7-start for changeset ce588bc1ae8e --- .hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/.hgtags b/.hgtags index 59bb25c228..74930bc111 100644 --- a/.hgtags +++ b/.hgtags @@ -107,3 +107,4 @@ d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc 2.6.3-beta1 74cd32a06837b0c2cb793b2e8d4d82f5d49462b2 2.6.4-start f632f87bb71b0f13d21f2f64b0c42cedb008c749 2.6.4-start 800cefce8d364ffdd2f383cbecb91294da3ea424 2.6.6-start +ce588bc1ae8e3a90ee5e1f5de71a346886a9fd8b 2.6.7-start -- cgit v1.2.3 From b9bb792c478d703c6442351ecb563c0a67f77111 Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Mon, 2 May 2011 10:05:00 -0400 Subject: increment viewer version to 2.6.8 --- indra/llcommon/llversionviewer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h index 58f96df8ab..08026c38a6 100644 --- a/indra/llcommon/llversionviewer.h +++ b/indra/llcommon/llversionviewer.h @@ -29,7 +29,7 @@ const S32 LL_VERSION_MAJOR = 2; const S32 LL_VERSION_MINOR = 6; -const S32 LL_VERSION_PATCH = 7; +const S32 LL_VERSION_PATCH = 8; const S32 LL_VERSION_BUILD = 0; const char * const LL_CHANNEL = "Second Life Developer"; -- cgit v1.2.3 From 50caebbad7f2e8f743b6a08831df2e525e8e6baa Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" <vir@lindenlab.com> Date: Mon, 2 May 2011 10:39:18 -0400 Subject: Added handler for final mesh object upload --- indra/newview/llmeshrepository.cpp | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) mode change 100644 => 100755 indra/newview/llmeshrepository.cpp diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp old mode 100644 new mode 100755 index e20e918a2a..dd2ffdf7f1 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -454,6 +454,29 @@ public: }; +class LLModelObjectUploadResponder: public LLCurl::Responder +{ + LLSD mObjectAsset; + LLMeshUploadThread* mThread; + +public: + LLModelObjectUploadResponder(LLMeshUploadThread* thread, const LLSD& object_asset): + mThread(thread), + mObjectAsset(object_asset) + { + } + + virtual void completedRaw(U32 status, const std::string& reason, + const LLChannelDescriptors& channels, + const LLIOPipe::buffer_ptr_t& buffer) + { + assert_main_thread(); + + llinfos << "completed" << llendl; + mThread->mPendingUploads--; + mThread->mFinished = true; + } +}; LLMeshRepoThread::LLMeshRepoThread() : LLThread("mesh repo", NULL) @@ -1467,10 +1490,13 @@ void LLMeshUploadThread::run() if(!isDiscarded()) { - LLHTTPClient::post(url, object_asset, new LLHTTPClient::Responder()); + mPendingUploads++; + LLHTTPClient::post(url, object_asset, new LLModelObjectUploadResponder(this,object_asset)); + } + else + { + mFinished = true; } - - mFinished = true; } void LLMeshUploadThread::uploadModel(LLMeshUploadData& data) -- cgit v1.2.3 From c0e6d606e617e7f92fc492ffbad03f5fadb8d3a3 Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Mon, 2 May 2011 15:25:24 -0500 Subject: STORM-1210 : Fix python merge glitch so to pass Release build (again) --- indra/lib/python/indra/ipc/llmessage.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/indra/lib/python/indra/ipc/llmessage.py b/indra/lib/python/indra/ipc/llmessage.py index 6161badc70..91fb36b72c 100644 --- a/indra/lib/python/indra/ipc/llmessage.py +++ b/indra/lib/python/indra/ipc/llmessage.py @@ -26,8 +26,6 @@ THE SOFTWARE. $/LicenseInfo$ """ -from sets import Set, ImmutableSet - from compatibility import Incompatible, Older, Newer, Same from tokenstream import TokenStream @@ -44,8 +42,8 @@ class Template: def compatibleWithBase(self, base): messagenames = ( - ImmutableSet(self.messages.keys()) - | ImmutableSet(base.messages.keys()) + frozenset(self.messages.keys()) + | frozenset(base.messages.keys()) ) compatibility = Same() -- cgit v1.2.3 From 814e540e85d0f8dc3b50ade6b1b3194e7cbb57fb Mon Sep 17 00:00:00 2001 From: callum <none@none> Date: Mon, 2 May 2011 13:40:41 -0700 Subject: EXP-743 FIX Side bar panel is visible on login screen after getting 'We're having trouble connecting' message --- indra/newview/skins/default/xui/en/main_view.xml | 16 +++++++++------- indra/newview/skins/minimal/xui/en/main_view.xml | 15 ++++++++------- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml index e5ae0b950a..3ead67ca57 100644 --- a/indra/newview/skins/default/xui/en/main_view.xml +++ b/indra/newview/skins/default/xui/en/main_view.xml @@ -8,12 +8,6 @@ tab_stop="false" name="main_view" width="1024"> - <panel top="0" - follows="all" - height="768" - mouse_opaque="false" - name="login_panel_holder" - width="1024"/> <layout_stack border_size="0" follows="all" mouse_opaque="false" @@ -133,7 +127,14 @@ user_resize="false" visible="false" width="333"/> - </layout_stack> + </layout_stack> + <panel top="0" + follows="all" + height="500" + mouse_opaque="false" + name="login_panel_holder" + width="1024"/> + <panel follows="all" height="500" left="0" @@ -171,6 +172,7 @@ top="0" width="1024" visible="false"/> + <view mouse_opaque="false" follows="all" name="menu_bar_holder" diff --git a/indra/newview/skins/minimal/xui/en/main_view.xml b/indra/newview/skins/minimal/xui/en/main_view.xml index 45ba785c1f..ac5bae2f3b 100644 --- a/indra/newview/skins/minimal/xui/en/main_view.xml +++ b/indra/newview/skins/minimal/xui/en/main_view.xml @@ -8,13 +8,6 @@ tab_stop="false" name="main_view" width="1024"> - <panel top="0" - follows="all" - height="768" - mouse_opaque="false" - name="login_panel_holder" - width="1024"/> - <layout_stack border_size="0" follows="all" mouse_opaque="false" @@ -96,6 +89,14 @@ name="stand_stop_flying_container" visible="false" width="500"/> + + <panel top="0" + follows="all" + height="500" + mouse_opaque="false" + name="login_panel_holder" + width="1024"/> + <panel follows="all" height="500" left="0" -- cgit v1.2.3 From a4e49310a57cab3d5041ec733d80ce50dadf4c64 Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Mon, 2 May 2011 18:01:27 -0500 Subject: STORM-1210 fsqrtf cleanup --- indra/newview/llmanipscale.cpp | 2 +- indra/newview/llselectmgr.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp index 78d1e717f2..738d82e732 100644 --- a/indra/newview/llmanipscale.cpp +++ b/indra/newview/llmanipscale.cpp @@ -259,7 +259,7 @@ void LLManipScale::render() // range != zero F32 fraction_of_fov = BOX_HANDLE_BASE_SIZE / (F32) LLViewerCamera::getInstance()->getViewHeightInPixels(); F32 apparent_angle = fraction_of_fov * LLViewerCamera::getInstance()->getView(); // radians - mBoxHandleSize = fsqrtf(range_squared) * tan(apparent_angle) * BOX_HANDLE_BASE_FACTOR; + mBoxHandleSize = (F32) sqrtf(range_squared) * tan(apparent_angle) * BOX_HANDLE_BASE_FACTOR; } else { diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index f76cbcb465..9b264b81c7 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -6983,7 +6983,7 @@ bool LLSelectMgr::selectionMove(const LLVector3& displ, // factor the distance into the displacement vector. This will get us // equally visible movements for both close and far away selections. - F32 min_dist = sqrt(fsqrtf(min_dist_squared)) / 2; + F32 min_dist = sqrt((F32) sqrtf(min_dist_squared)) / 2; displ_global.setVec(displ.mV[0] * min_dist, displ.mV[1] * min_dist, displ.mV[2] * min_dist); -- cgit v1.2.3 From 315eee3a7c87c5ee2154013d3fa0356c80bfab2e Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Mon, 2 May 2011 16:11:46 -0700 Subject: Backed out changeset: d38e4f4982a0 --- indra/newview/app_settings/settings_minimal.xml | 8 +- .../skins/default/xui/en/panel_bottomtray.xml | 676 ++++++++++----------- .../minimal/xui/en/panel_adhoc_control_panel.xml | 35 ++ .../skins/minimal/xui/en/panel_bottomtray.xml | 38 ++ .../minimal/xui/en/panel_im_control_panel.xml | 33 + 5 files changed, 448 insertions(+), 342 deletions(-) diff --git a/indra/newview/app_settings/settings_minimal.xml b/indra/newview/app_settings/settings_minimal.xml index bc97ec00e9..60aecb279c 100644 --- a/indra/newview/app_settings/settings_minimal.xml +++ b/indra/newview/app_settings/settings_minimal.xml @@ -52,7 +52,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>0</integer> + <integer>1</integer> </map> <key>HelpURLFormat</key> <map> @@ -124,7 +124,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>1</integer> + <integer>0</integer> </map> <key>VoiceDisableMic</key> <map> @@ -133,7 +133,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>1</integer> + <integer>0</integer> </map> <key>ScriptsCanShowUI</key> <map> @@ -290,7 +290,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>0</integer> + <integer>1</integer> </map> <key>EnableAvatarShare</key> <map> diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index a6e5e7a219..57a22037cd 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -13,31 +13,31 @@ top="28" width="1310"> <string - name="DragIndicationImageName" - value="Accordion_ArrowOpened_Off" /> + name="DragIndicationImageName" + value="Accordion_ArrowOpened_Off" /> <string - name="SpeakBtnToolTip" - value="Turns microphone on/off" /> + name="SpeakBtnToolTip" + value="Turns microphone on/off" /> <string - name="VoiceControlBtnToolTip" - value="Shows/hides voice control panel" /> + name="VoiceControlBtnToolTip" + value="Shows/hides voice control panel" /> <layout_stack - border_size="0" - clip="false" - follows="all" - height="28" + border_size="0" + clip="false" + follows="all" + height="28" layout="topleft" left="0" - mouse_opaque="false" - name="toolbar_stack" - orientation="horizontal" - top="0" - width="1310"> + mouse_opaque="false" + name="toolbar_stack" + orientation="horizontal" + top="0" + width="1310"> <layout_panel - auto_resize="false" - user_resize="false" - min_width="2" - width="2" /> + auto_resize="false" + user_resize="false" + min_width="2" + width="2" /> <layout_panel auto_resize="false" layout="topleft" @@ -47,16 +47,16 @@ mouse_opaque="false" name="chat_bar_layout_panel" user_resize="true" - width="250" > - <panel - name="chat_bar" - filename="panel_nearby_chat_bar.xml" - left="0" - height="28" - width="248" - top="0" - mouse_opaque="false" - follows="left|right" + width="310" > + <panel + name="chat_bar" + filename="panel_nearby_chat_bar.xml" + left="0" + height="28" + width="308" + top="0" + mouse_opaque="false" + follows="left|right" /> </layout_panel> <!-- @@ -82,17 +82,17 @@ width="5" /> </layout_panel> <layout_panel - auto_resize="false" - follows="left|right" - height="28" - layout="topleft" - min_height="28" - min_width="59" - mouse_opaque="false" - name="speak_panel" - top_delta="0" - user_resize="false" - width="108"> + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_height="28" + min_width="59" + mouse_opaque="false" + name="speak_panel" + top_delta="0" + user_resize="false" + width="108"> <talk_button follows="left|right" height="23" @@ -120,36 +120,36 @@ </talk_button> </layout_panel> <layout_panel - auto_resize="false" - follows="right" - height="28" - layout="topleft" - min_height="28" - min_width="65" - mouse_opaque="false" - name="gesture_panel" - top_delta="0" - user_resize="false" - width="85"> + auto_resize="false" + follows="right" + height="28" + layout="topleft" + min_height="28" + min_width="65" + mouse_opaque="false" + name="gesture_panel" + top_delta="0" + user_resize="false" + width="85"> <gesture_combo_list - follows="left|right" - height="23" - label="Gesture" - layout="topleft" - left="0" - name="Gesture" - tool_tip="Shows/hides gestures" - top="5" - width="82"> + follows="left|right" + height="23" + label="Gesture" + layout="topleft" + left="0" + name="Gesture" + tool_tip="Shows/hides gestures" + top="5" + width="82"> <combo_button - pad_right="10" - use_ellipses="true" /> + pad_right="10" + use_ellipses="true" /> <combo_list - page_lines="17" /> + page_lines="17" /> </gesture_combo_list> </layout_panel> <layout_panel - auto_resize="false" + auto_resize="false" follows="right" height="28" layout="topleft" @@ -181,58 +181,58 @@ </layout_panel> <layout_panel auto_resize="false" - follows="left|right" - height="28" - layout="topleft" - min_height="28" - min_width="52" - mouse_opaque="false" - name="cam_panel" - user_resize="false" - width="83"> + follows="left|right" + height="28" + layout="topleft" + min_height="28" + min_width="52" + mouse_opaque="false" + name="cam_panel" + user_resize="false" + width="83"> <bottomtray_button - follows="left|right" - height="23" - image_pressed="PushButton_Press" - image_pressed_selected="PushButton_Selected_Press" - image_selected="PushButton_Selected_Press" - is_toggle="true" - label="View" - layout="topleft" - left="0" - name="camera_btn" - tool_tip="Shows/hides camera controls" - top="5" - use_ellipses="true" - width="80"> + follows="left|right" + height="23" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + is_toggle="true" + label="View" + layout="topleft" + left="0" + name="camera_btn" + tool_tip="Shows/hides camera controls" + top="5" + use_ellipses="true" + width="80"> <init_callback - function="Button.SetDockableFloaterToggle" - parameter="camera" /> + function="Button.SetDockableFloaterToggle" + parameter="camera" /> </bottomtray_button> </layout_panel> <layout_panel - auto_resize="false" - follows="left|right" - height="28" - layout="topleft" + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" min_width="40" - mouse_opaque="false" + mouse_opaque="false" name="snapshot_panel" - user_resize="false" + user_resize="false" width="39"> <bottomtray_button - follows="left|right" - height="23" + follows="left|right" + height="23" image_overlay="Snapshot_Off" - image_pressed="PushButton_Press" - image_pressed_selected="PushButton_Selected_Press" - image_selected="PushButton_Selected_Press" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" is_toggle="true" - layout="topleft" - left="0" + layout="topleft" + left="0" name="snapshots" tool_tip="Take snapshot" - top="5" + top="5" width="36"> <init_callback function="Button.SetFloaterToggle" @@ -240,33 +240,33 @@ </bottomtray_button> </layout_panel> <layout_panel - auto_resize="false" - follows="left|right" - height="28" - layout="topleft" - min_height="28" + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_height="28" min_width="52" - mouse_opaque="false" + mouse_opaque="false" name="build_btn_panel" - user_resize="false" + user_resize="false" width="83"> <!--*FIX: Build Floater is not opened with default registration. Will be fixed soon. Disabled for now. --> <bottomtray_button - follows="left|right" - height="23" - image_pressed="PushButton_Press" - image_pressed_selected="PushButton_Selected_Press" - image_selected="PushButton_Selected_Press" + follows="left|right" + height="23" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" is_toggle="true" label="Build" - layout="topleft" - left="0" + layout="topleft" + left="0" name="build_btn" tool_tip="Shows/hides Build Tools" - top="5" - use_ellipses="true" + top="5" + use_ellipses="true" width="80"> <commit_callback function="Build.Toggle" @@ -274,181 +274,181 @@ Disabled for now. </bottomtray_button> </layout_panel> <layout_panel - auto_resize="false" - follows="left|right" - height="28" - layout="topleft" - min_height="28" + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_height="28" min_width="52" - mouse_opaque="false" + mouse_opaque="false" name="search_btn_panel" user_resize="false" - width="83"> - <bottomtray_button - follows="left|right" - height="23" - image_pressed="PushButton_Press" - image_pressed_selected="PushButton_Selected_Press" - image_selected="PushButton_Selected_Press" - is_toggle="true" - label="Search" - layout="topleft" - left="0" - name="search_btn" - tool_tip="Shows/hides Search" - top="5" - use_ellipses="true" - width="80"> - <init_callback - function="Button.SetFloaterToggle" - parameter="search" /> - </bottomtray_button> - </layout_panel> - <layout_panel - auto_resize="false" - follows="left|right" - height="28" - layout="topleft" - min_height="28" - min_width="52" - mouse_opaque="false" - name="world_map_btn_panel" - user_resize="false" - width="83"> - <bottomtray_button - follows="left|right" - height="23" - image_pressed="PushButton_Press" - image_pressed_selected="PushButton_Selected_Press" - image_selected="PushButton_Selected_Press" - is_toggle="true" - label="Map" - layout="topleft" - left="0" - name="world_map_btn" - tool_tip="Shows/hides World Map" - top="5" - use_ellipses="true" - width="80"> - <init_callback - function="Button.SetFloaterToggle" - parameter="world_map" /> - </bottomtray_button> - </layout_panel> - <layout_panel - auto_resize="false" - follows="left|right" - height="28" - layout="topleft" - min_height="28" - min_width="62" - mouse_opaque="false" - name="mini_map_btn_panel" - user_resize="false" - width="83"> - <bottomtray_button - follows="left|right" - height="23" - image_pressed="PushButton_Press" - image_pressed_selected="PushButton_Selected_Press" - image_selected="PushButton_Selected_Press" - is_toggle="true" - label="Mini-Map" - layout="topleft" - left="0" - name="mini_map_btn" - tool_tip="Shows/hides Mini-Map" - top="5" - use_ellipses="true" - width="80"> - <init_callback - function="Button.SetFloaterToggle" - parameter="mini_map" /> - </bottomtray_button> - </layout_panel> - <layout_panel - follows="left|right" - height="30" - layout="topleft" - min_width="95" - mouse_opaque="false" - name="chiclet_list_panel" - top="0" - user_resize="false" - width="189"> -<!--*NOTE: min_width of the chiclet_panel (chiclet_list) must be the same + width="83"> + <bottomtray_button + follows="left|right" + height="23" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + is_toggle="true" + label="Search" + layout="topleft" + left="0" + name="search_btn" + tool_tip="Shows/hides Search" + top="5" + use_ellipses="true" + width="80"> + <init_callback + function="Button.SetFloaterToggle" + parameter="search" /> + </bottomtray_button> + </layout_panel> + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_height="28" + min_width="52" + mouse_opaque="false" + name="world_map_btn_panel" + user_resize="false" + width="83"> + <bottomtray_button + follows="left|right" + height="23" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + is_toggle="true" + label="Map" + layout="topleft" + left="0" + name="world_map_btn" + tool_tip="Shows/hides World Map" + top="5" + use_ellipses="true" + width="80"> + <init_callback + function="Button.SetFloaterToggle" + parameter="world_map" /> + </bottomtray_button> + </layout_panel> + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_height="28" + min_width="52" + mouse_opaque="false" + name="mini_map_btn_panel" + user_resize="false" + width="83"> + <bottomtray_button + follows="left|right" + height="23" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + is_toggle="true" + label="Mini-Map" + layout="topleft" + left="0" + name="mini_map_btn" + tool_tip="Shows/hides Mini-Map" + top="5" + use_ellipses="true" + width="80"> + <init_callback + function="Button.SetFloaterToggle" + parameter="mini_map" /> + </bottomtray_button> + </layout_panel> + <layout_panel + follows="left|right" + height="30" + layout="topleft" + min_width="95" + mouse_opaque="false" + name="chiclet_list_panel" + top="0" + user_resize="false" + width="189"> + <!--*NOTE: min_width of the chiclet_panel (chiclet_list) must be the same as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. EXT-991--> <chiclet_panel - chiclet_padding="4" - follows="left|right" - height="24" - layout="topleft" - left="1" - min_width="95" - mouse_opaque="false" - name="chiclet_list" - top="7" - width="189"> + chiclet_padding="4" + follows="left|right" + height="24" + layout="topleft" + left="1" + min_width="95" + mouse_opaque="false" + name="chiclet_list" + top="7" + width="189"> <button - auto_resize="true" - follows="right" - height="29" - image_hover_selected="SegmentedBtn_Left_Over" - image_hover_unselected="SegmentedBtn_Left_Over" - image_overlay="Arrow_Small_Left" - image_pressed="SegmentedBtn_Left_Press" - image_pressed_selected="SegmentedBtn_Left_Press" - image_selected="SegmentedBtn_Left_Off" - image_unselected="SegmentedBtn_Left_Off" - layout="topleft" - name="chicklet_left_scroll_button" - tab_stop="false" - top="-28" - visible="false" - width="7" /> + auto_resize="true" + follows="right" + height="29" + image_hover_selected="SegmentedBtn_Left_Over" + image_hover_unselected="SegmentedBtn_Left_Over" + image_overlay="Arrow_Small_Left" + image_pressed="SegmentedBtn_Left_Press" + image_pressed_selected="SegmentedBtn_Left_Press" + image_selected="SegmentedBtn_Left_Off" + image_unselected="SegmentedBtn_Left_Off" + layout="topleft" + name="chicklet_left_scroll_button" + tab_stop="false" + top="-28" + visible="false" + width="7" /> <button - auto_resize="true" - follows="right" - height="29" - image_hover_selected="SegmentedBtn_Right_Over" - image_hover_unselected="SegmentedBtn_Right_Over" - image_overlay="Arrow_Small_Right" - image_pressed="SegmentedBtn_Right_Press" - image_pressed_selected="SegmentedBtn_Right_Press" - image_selected="SegmentedBtn_Right_Off" - image_unselected="SegmentedBtn_Right_Off" - layout="topleft" - name="chicklet_right_scroll_button" - tab_stop="false" - top="-28" - visible="false" - width="7" /> + auto_resize="true" + follows="right" + height="29" + image_hover_selected="SegmentedBtn_Right_Over" + image_hover_unselected="SegmentedBtn_Right_Over" + image_overlay="Arrow_Small_Right" + image_pressed="SegmentedBtn_Right_Press" + image_pressed_selected="SegmentedBtn_Right_Press" + image_selected="SegmentedBtn_Right_Off" + image_unselected="SegmentedBtn_Right_Off" + layout="topleft" + name="chicklet_right_scroll_button" + tab_stop="false" + top="-28" + visible="false" + width="7" /> </chiclet_panel> </layout_panel> <layout_panel auto_resize="false" - user_resize="false" - width="4" - min_width="4"/> + user_resize="false" + width="4" + min_width="4"/> <layout_panel - auto_resize="false" - follows="right" - height="28" - layout="topleft" - min_height="28" - min_width="37" - name="im_well_panel" - top="0" - user_resize="false" - width="37"> + auto_resize="false" + follows="right" + height="28" + layout="topleft" + min_height="28" + min_width="37" + name="im_well_panel" + top="0" + user_resize="false" + width="37"> <chiclet_im_well - follows="right" - height="28" - layout="topleft" - left="0" - max_displayed_count="99" - name="im_well" - top="0" - width="35"> + follows="right" + height="28" + layout="topleft" + left="0" + max_displayed_count="99" + name="im_well" + top="0" + width="35"> <!-- Emulate 4 states of button by background images, see details in EXT-3147. The same should be for notification_well button xml attribute Description @@ -458,73 +458,73 @@ image_pressed "Lit" - there are new messages image_pressed_selected "Lit" + "Selected" - there are new messages and the Well is open --> <button - auto_resize="true" - follows="right" - halign="center" - height="23" - image_overlay="Unread_IM" - image_overlay_alignment="center" - image_pressed="WellButton_Lit" - image_pressed_selected="WellButton_Lit_Selected" - image_selected="PushButton_Press" - label_color="Black" - left="0" - name="Unread IM messages" - tool_tip="Conversations" - width="34"> + auto_resize="true" + follows="right" + halign="center" + height="23" + image_overlay="Unread_IM" + image_overlay_alignment="center" + image_pressed="WellButton_Lit" + image_pressed_selected="WellButton_Lit_Selected" + image_selected="PushButton_Press" + label_color="Black" + left="0" + name="Unread IM messages" + tool_tip="Conversations" + width="34"> <init_callback - function="Button.SetDockableFloaterToggle" - parameter="im_well_window" /> + function="Button.SetDockableFloaterToggle" + parameter="im_well_window" /> </button> </chiclet_im_well> </layout_panel> <layout_panel - auto_resize="false" - follows="right" - height="28" - layout="topleft" - min_height="28" - min_width="37" - name="notification_well_panel" - top="0" - user_resize="false" - width="37"> + auto_resize="false" + follows="right" + height="28" + layout="topleft" + min_height="28" + min_width="37" + name="notification_well_panel" + top="0" + user_resize="false" + width="37"> <chiclet_notification - follows="right" - height="23" - layout="topleft" - left="0" - max_displayed_count="99" - name="notification_well" - top="5" - width="35"> + follows="right" + height="23" + layout="topleft" + left="0" + max_displayed_count="99" + name="notification_well" + top="5" + width="35"> <button - auto_resize="true" - bottom_pad="3" - follows="right" - halign="center" - height="23" - image_overlay="Notices_Unread" - image_overlay_alignment="center" - image_pressed="WellButton_Lit" - image_pressed_selected="WellButton_Lit_Selected" - image_selected="PushButton_Press" - label_color="Black" - left="0" - name="Unread" - tool_tip="Notifications" - width="34"> + auto_resize="true" + bottom_pad="3" + follows="right" + halign="center" + height="23" + image_overlay="Notices_Unread" + image_overlay_alignment="center" + image_pressed="WellButton_Lit" + image_pressed_selected="WellButton_Lit_Selected" + image_selected="PushButton_Press" + label_color="Black" + left="0" + name="Unread" + tool_tip="Notifications" + width="34"> <init_callback - function="Button.SetDockableFloaterToggle" - parameter="notification_well_window" /> + function="Button.SetDockableFloaterToggle" + parameter="notification_well_window" /> </button> </chiclet_notification> </layout_panel> <layout_panel - auto_resize="false" - user_resize="false" - min_width="4" - name="DUMMY2" - width="8" /> + auto_resize="false" + user_resize="false" + min_width="4" + name="DUMMY2" + width="8" /> </layout_stack> </panel> diff --git a/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml index 5730adab8a..39d1a90850 100644 --- a/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml +++ b/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml @@ -42,5 +42,40 @@ show_speaking_indicator="false" width="147" /> </layout_panel> + <layout_panel + auto_resize="false" + follows="top|left|right" + height="25" + layout="topleft" + min_height="25" + width="130" + name="call_btn_panel" + user_resize="false" + visible="false"> + <button + follows="all" + height="20" + label="Call" + name="call_btn" + width="130" + top="5" /> + </layout_panel> + <layout_panel + auto_resize="false" + follows="top|left|right" + height="25" + layout="topleft" + min_height="25" + width="130" + name="end_call_btn_panel" + user_resize="false" + visible="false"> + <button + follows="all" + height="20" + label="Leave Call" + name="end_call_btn" + top="5"/> + </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml index e0c0bd13d9..95f2010e44 100644 --- a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml @@ -61,6 +61,44 @@ </layout_panel> <layout_panel auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_height="28" + min_width="59" + mouse_opaque="false" + name="speak_panel" + top_delta="0" + user_resize="false" + width="108"> + <talk_button + follows="left|right" + height="23" + layout="topleft" + left="0" + name="talk" + top="5" + width="105"> + <show_button + tab_stop="true"> + <init_callback + function="Button.SetDockableFloaterToggle" + parameter="voice_controls" /> + </show_button> + <!-- do not remove halign attribute with default value. otherwise it can't be overridden in other locales. + & pad_right is default value for long label which can be right aligned. See EXT-6318 --> + <speak_button + halign="center" + label="Speak" + label_selected="Speak" + name="speak_btn" + pad_right="20" + tab_stop="true" + use_ellipses="true" /> + </talk_button> + </layout_panel> + <layout_panel + auto_resize="false" follows="right" height="28" layout="topleft" diff --git a/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml index c3f46f11e0..be13bc1bb7 100644 --- a/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml +++ b/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml @@ -77,6 +77,39 @@ tool_tip = "Offer to teleport this person" width="140" /> </layout_panel> + <layout_panel + auto_resize="false" + follows="top|left|right" + height="25" + layout="topleft" + min_height="25" + width="140" + name="call_btn_panel" + user_resize="false"> + <button + follows="left|top|right" + height="23" + label="Call" + name="call_btn" + width="140" /> + </layout_panel> + <layout_panel + auto_resize="false" + follows="top|left|right" + height="25" + layout="topleft" + min_height="25" + width="140" + name="end_call_btn_panel" + user_resize="false" + visible="false"> + <button + follows="left|top|right" + height="23" + label="End Call" + name="end_call_btn" + width="140" /> + </layout_panel> <layout_panel mouse_opaque="false" auto_resize="true" -- cgit v1.2.3 From f085d242dc9c47cfa55cdd3a79413fe6ed84ede5 Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Mon, 2 May 2011 16:37:10 -0700 Subject: EXP-763 Cannot close IM window using X in upper corner while in a voice call --- indra/newview/skins/minimal/xui/en/notification_visibility.xml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/indra/newview/skins/minimal/xui/en/notification_visibility.xml b/indra/newview/skins/minimal/xui/en/notification_visibility.xml index 616b544847..bdd3c3d4a4 100644 --- a/indra/newview/skins/minimal/xui/en/notification_visibility.xml +++ b/indra/newview/skins/minimal/xui/en/notification_visibility.xml @@ -1,12 +1,9 @@ <?xml version="1.0" ?> <notification_visibility> - <respond name="VoiceInviteP2P" response="Decline"/> - <respond name="VoiceInviteAdHoc" response="Decline"/> <respond name="VoiceInviteGroup" response="Decline"/> <!-- group and voice are disabled features --> <hide tag="group"/> - <hide tag="voice"/> <!-- no spammy scripts --> <!-- <hide name="ScriptDialog"/> --> @@ -16,6 +13,7 @@ <hide name="FirstInventory"/> <hide name="HintSidePanel"/> <hide name="HintMove"/> + <hide name="HintSpeak"/> <hide name="HintDisplayName"/> <hide name="HintInventory"/> <hide name="HintLindenDollar"/> -- cgit v1.2.3 From 5b29bd3660852cdca3416ba779fbfdc032f8f222 Mon Sep 17 00:00:00 2001 From: Eli Linden <eli@lindenlab.com> Date: Mon, 2 May 2011 17:12:16 -0700 Subject: sync up with viewer-development --- .../skins/default/xui/en/widgets/avatar_icon.xml | 1 + .../skins/default/xui/en/widgets/scroll_bar.xml | 18 +++++++++++------- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml b/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml index a1e32e44de..4d69dda7eb 100644 --- a/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml +++ b/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <avatar_icon + name="avatar_icon" default_icon_name="Generic_Person_Large" use_draw_context_alpha="false"> </avatar_icon> diff --git a/indra/newview/skins/default/xui/en/widgets/scroll_bar.xml b/indra/newview/skins/default/xui/en/widgets/scroll_bar.xml index 830ea12e41..e6d4bff8b5 100644 --- a/indra/newview/skins/default/xui/en/widgets/scroll_bar.xml +++ b/indra/newview/skins/default/xui/en/widgets/scroll_bar.xml @@ -6,20 +6,24 @@ track_color="ScrollbarTrackColor" thumb_color="ScrollbarThumbColor" thickness="15"> - <up_button image_unselected="ScrollArrow_Up" + <up_button name="up_button" + image_unselected="ScrollArrow_Up" image_selected="ScrollArrow_Up" scale_image="true" hover_glow_amount="0.35"/> - <down_button image_unselected="ScrollArrow_Down" + <down_button name="down_button" + image_unselected="ScrollArrow_Down" image_selected="ScrollArrow_Down" scale_image="true" hover_glow_amount="0.35"/> - <left_button image_unselected="ScrollArrow_Left" + <left_button name="left_button" + image_unselected="ScrollArrow_Left" image_selected="ScrollArrow_Left" scale_image="true" hover_glow_amount="0.35"/> - <right_button image_unselected="ScrollArrow_Right" - image_selected="ScrollArrow_Right" - scale_image="true" - hover_glow_amount="0.35"/> + <right_button name="right_button" + image_unselected="ScrollArrow_Right" + image_selected="ScrollArrow_Right" + scale_image="true" + hover_glow_amount="0.35"/> </scroll_bar> -- cgit v1.2.3 From 6431f7fb287d357f9800aac7ce5496c7a7cd063f Mon Sep 17 00:00:00 2001 From: Eli Linden <eli@lindenlab.com> Date: Mon, 2 May 2011 17:14:53 -0700 Subject: WIP VWR-25074 add missing string in English, pending actual Danish translation --- indra/newview/skins/default/xui/da/notifications.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/indra/newview/skins/default/xui/da/notifications.xml b/indra/newview/skins/default/xui/da/notifications.xml index a3c4897ee1..376538872f 100644 --- a/indra/newview/skins/default/xui/da/notifications.xml +++ b/indra/newview/skins/default/xui/da/notifications.xml @@ -748,6 +748,7 @@ Prøv venligst igen senere. [OLD_NAME] ([SLID]) er nu kendt som [NEW_NAME]. </notification> <notification name="OfferTeleport"> + Offer a teleport to your location with the following message? <form name="form"> <input name="message"> Mød mig i [REGION] -- cgit v1.2.3 From 8f720b59d35d172b0a34ff73c7724d9bae258aa2 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed <nat@lindenlab.com> Date: Mon, 2 May 2011 20:49:47 -0400 Subject: CHOP-599: if build.sh creates summary.json, package it with viewer. Recent versions of the viewer's build-dependent build.sh create and upload a summary.json file in the top level of the source repository checkout. Bundle that into the viewer installer. This is the one file that contains the viewer's version. --- indra/newview/viewer_manifest.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index f671c770ea..450d274fd7 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -114,6 +114,16 @@ class ViewerManifest(LLManifest): # Files in the newview/ directory self.path("gpu_table.txt") + # The summary.json file gets left in the base checkout dir by + # build.sh. It's only created for a build.sh build, therefore we + # have to check whether it exists. :-P + summary_json = "summary.json" + summary_json_path = os.path.join(os.pardir, os.pardir, summary_json) + if os.path.exists(os.path.join(self.get_src_prefix(), summary_json_path)): + self.path(summary_json_path, summary_json) + else: + print "No %s" % os.path.join(self.get_src_prefix(), summary_json_path) + def login_channel(self): """Channel reported for login and upgrade purposes ONLY; used for A/B testing""" -- cgit v1.2.3 From f5355e9580a9cb0d6397ed3dbea048ba2bcbdf8e Mon Sep 17 00:00:00 2001 From: Nat Goodspeed <nat@lindenlab.com> Date: Tue, 3 May 2011 13:40:10 -0400 Subject: CHOP-599: create summary.json early enough to package with installer. viewer_manifest.py will now package a summary.json file, if present; but previously build.sh didn't create that file until after the viewer build. --- build.sh | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/build.sh b/build.sh index d112e5ea1c..3d3f0d5616 100755 --- a/build.sh +++ b/build.sh @@ -125,6 +125,7 @@ if test -f scripts/update_version_files.py ; then --verbose \ | sed -n -e "s,Setting viewer channel/version: '\([^']*\)' / '\([^']*\)',VIEWER_CHANNEL='\1';VIEWER_VERSION='\2',p")\ || fail update_version_files.py + echo "{\"Type\":\"viewer\",\"Version\":\"${VIEWER_VERSION}\"}" > summary.json end_section UpdateVer fi @@ -262,9 +263,7 @@ then else upload_item installer "$package" binary/octet-stream upload_item quicklink "$package" binary/octet-stream - - echo "{\"Type\":\"viewer\",\"Version\":\"${VIEWER_VERSION}\"}" > summary.json - upload_item installer summary.json text/plain + [ -f summary.json ] && upload_item installer summary.json text/plain # Upload crash reporter files. case "$last_built_variant" in -- cgit v1.2.3 From b0ebba414e2b2924b1fb9e238a000408fd5358f8 Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Tue, 3 May 2011 10:43:32 -0700 Subject: merge fix for voice --- indra/newview/app_settings/settings_minimal.xml | 8 ++--- .../minimal/xui/en/panel_adhoc_control_panel.xml | 35 ++++++++++++++++++++++ .../minimal/xui/en/panel_im_control_panel.xml | 33 ++++++++++++++++++++ 3 files changed, 72 insertions(+), 4 deletions(-) diff --git a/indra/newview/app_settings/settings_minimal.xml b/indra/newview/app_settings/settings_minimal.xml index f2816c28f3..2180abdcee 100644 --- a/indra/newview/app_settings/settings_minimal.xml +++ b/indra/newview/app_settings/settings_minimal.xml @@ -52,7 +52,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>0</integer> + <integer>1</integer> </map> <key>HelpURLFormat</key> <map> @@ -124,7 +124,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>1</integer> + <integer>0</integer> </map> <key>VoiceDisableMic</key> <map> @@ -133,7 +133,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>1</integer> + <integer>0</integer> </map> <key>ScriptsCanShowUI</key> <map> @@ -290,7 +290,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>0</integer> + <integer>1</integer> </map> <key>EnableAvatarShare</key> <map> diff --git a/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml index 5730adab8a..39d1a90850 100644 --- a/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml +++ b/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml @@ -42,5 +42,40 @@ show_speaking_indicator="false" width="147" /> </layout_panel> + <layout_panel + auto_resize="false" + follows="top|left|right" + height="25" + layout="topleft" + min_height="25" + width="130" + name="call_btn_panel" + user_resize="false" + visible="false"> + <button + follows="all" + height="20" + label="Call" + name="call_btn" + width="130" + top="5" /> + </layout_panel> + <layout_panel + auto_resize="false" + follows="top|left|right" + height="25" + layout="topleft" + min_height="25" + width="130" + name="end_call_btn_panel" + user_resize="false" + visible="false"> + <button + follows="all" + height="20" + label="Leave Call" + name="end_call_btn" + top="5"/> + </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml index c3f46f11e0..be13bc1bb7 100644 --- a/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml +++ b/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml @@ -77,6 +77,39 @@ tool_tip = "Offer to teleport this person" width="140" /> </layout_panel> + <layout_panel + auto_resize="false" + follows="top|left|right" + height="25" + layout="topleft" + min_height="25" + width="140" + name="call_btn_panel" + user_resize="false"> + <button + follows="left|top|right" + height="23" + label="Call" + name="call_btn" + width="140" /> + </layout_panel> + <layout_panel + auto_resize="false" + follows="top|left|right" + height="25" + layout="topleft" + min_height="25" + width="140" + name="end_call_btn_panel" + user_resize="false" + visible="false"> + <button + follows="left|top|right" + height="23" + label="End Call" + name="end_call_btn" + width="140" /> + </layout_panel> <layout_panel mouse_opaque="false" auto_resize="true" -- cgit v1.2.3 From 76221ab9b3d5e4a185dfdfeb39719724739566ab Mon Sep 17 00:00:00 2001 From: Eli Linden <eli@lindenlab.com> Date: Tue, 3 May 2011 11:55:21 -0700 Subject: FIX VWR-25074 add missing Danish translation --- indra/newview/skins/default/xui/da/notifications.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/skins/default/xui/da/notifications.xml b/indra/newview/skins/default/xui/da/notifications.xml index 376538872f..30b54d3eb2 100644 --- a/indra/newview/skins/default/xui/da/notifications.xml +++ b/indra/newview/skins/default/xui/da/notifications.xml @@ -748,7 +748,7 @@ Prøv venligst igen senere. [OLD_NAME] ([SLID]) er nu kendt som [NEW_NAME]. </notification> <notification name="OfferTeleport"> - Offer a teleport to your location with the following message? + Tilbyd en teleport til din position med følgende besked? <form name="form"> <input name="message"> Mød mig i [REGION] -- cgit v1.2.3 From 8b4b2e375d2478f106a3d918ec8dbb839bb045ab Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Tue, 3 May 2011 15:31:30 -0400 Subject: Fix for line endings style (dos2unix). Updated header blocks for llphysicsshapebuilderutil classes. --- indra/llmath/llvolume.cpp | 14466 +++++++++++++------------- indra/llrender/llglheaders.h | 12 +- indra/newview/llphysicsshapebuilderutil.cpp | 44 +- indra/newview/llphysicsshapebuilderutil.h | 94 +- indra/newview/llvoavatar.h | 2180 ++-- indra/newview/llvocache.cpp | 1512 +-- 6 files changed, 9158 insertions(+), 9150 deletions(-) diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index dc360818d6..70e1e1f312 100644 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -1,7233 +1,7233 @@ -/** - - * @file llvolume.cpp - * - * $LicenseInfo:firstyear=2002&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -#include "linden_common.h" -#include "llmemory.h" -#include "llmath.h" - -#include <set> -#if !LL_WINDOWS -#include <stdint.h> -#endif - -#include "llerror.h" -#include "llmemtype.h" - -#include "llvolumemgr.h" -#include "v2math.h" -#include "v3math.h" -#include "v4math.h" -#include "m4math.h" -#include "m3math.h" -#include "llmatrix3a.h" -#include "lloctree.h" -#include "lldarray.h" -#include "llvolume.h" -#include "llvolumeoctree.h" -#include "llstl.h" -#include "llsdserialize.h" -#include "llvector4a.h" -#include "llmatrix4a.h" - -#define DEBUG_SILHOUETTE_BINORMALS 0 -#define DEBUG_SILHOUETTE_NORMALS 0 // TomY: Use this to display normals using the silhouette -#define DEBUG_SILHOUETTE_EDGE_MAP 0 // DaveP: Use this to display edge map using the silhouette - -const F32 CUT_MIN = 0.f; -const F32 CUT_MAX = 1.f; -const F32 MIN_CUT_DELTA = 0.02f; - -const F32 HOLLOW_MIN = 0.f; -const F32 HOLLOW_MAX = 0.95f; -const F32 HOLLOW_MAX_SQUARE = 0.7f; - -const F32 TWIST_MIN = -1.f; -const F32 TWIST_MAX = 1.f; - -const F32 RATIO_MIN = 0.f; -const F32 RATIO_MAX = 2.f; // Tom Y: Inverted sense here: 0 = top taper, 2 = bottom taper - -const F32 HOLE_X_MIN= 0.05f; -const F32 HOLE_X_MAX= 1.0f; - -const F32 HOLE_Y_MIN= 0.05f; -const F32 HOLE_Y_MAX= 0.5f; - -const F32 SHEAR_MIN = -0.5f; -const F32 SHEAR_MAX = 0.5f; - -const F32 REV_MIN = 1.f; -const F32 REV_MAX = 4.f; - -const F32 TAPER_MIN = -1.f; -const F32 TAPER_MAX = 1.f; - -const F32 SKEW_MIN = -0.95f; -const F32 SKEW_MAX = 0.95f; - -const F32 SCULPT_MIN_AREA = 0.002f; -const S32 SCULPT_MIN_AREA_DETAIL = 1; - -extern BOOL gDebugGL; - -void assert_aligned(void* ptr, uintptr_t alignment) -{ -#if 0 - uintptr_t t = (uintptr_t) ptr; - if (t%alignment != 0) - { - llerrs << "WTF?" << llendl; - } -#endif -} - -BOOL check_same_clock_dir( const LLVector3& pt1, const LLVector3& pt2, const LLVector3& pt3, const LLVector3& norm) -{ - LLVector3 test = (pt2-pt1)%(pt3-pt2); - - //answer - if(test * norm < 0) - { - return FALSE; - } - else - { - return TRUE; - } -} - -BOOL LLLineSegmentBoxIntersect(const LLVector3& start, const LLVector3& end, const LLVector3& center, const LLVector3& size) -{ - return LLLineSegmentBoxIntersect(start.mV, end.mV, center.mV, size.mV); -} - -BOOL LLLineSegmentBoxIntersect(const F32* start, const F32* end, const F32* center, const F32* size) -{ - F32 fAWdU[3]; - F32 dir[3]; - F32 diff[3]; - - for (U32 i = 0; i < 3; i++) - { - dir[i] = 0.5f * (end[i] - start[i]); - diff[i] = (0.5f * (end[i] + start[i])) - center[i]; - fAWdU[i] = fabsf(dir[i]); - if(fabsf(diff[i])>size[i] + fAWdU[i]) return false; - } - - float f; - f = dir[1] * diff[2] - dir[2] * diff[1]; if(fabsf(f)>size[1]*fAWdU[2] + size[2]*fAWdU[1]) return false; - f = dir[2] * diff[0] - dir[0] * diff[2]; if(fabsf(f)>size[0]*fAWdU[2] + size[2]*fAWdU[0]) return false; - f = dir[0] * diff[1] - dir[1] * diff[0]; if(fabsf(f)>size[0]*fAWdU[1] + size[1]*fAWdU[0]) return false; - - return true; -} - - - -// intersect test between triangle vert0, vert1, vert2 and a ray from orig in direction dir. -// returns TRUE if intersecting and returns barycentric coordinates in intersection_a, intersection_b, -// and returns the intersection point along dir in intersection_t. - -// Moller-Trumbore algorithm -BOOL LLTriangleRayIntersect(const LLVector4a& vert0, const LLVector4a& vert1, const LLVector4a& vert2, const LLVector4a& orig, const LLVector4a& dir, - F32& intersection_a, F32& intersection_b, F32& intersection_t) -{ - - /* find vectors for two edges sharing vert0 */ - LLVector4a edge1; - edge1.setSub(vert1, vert0); - - LLVector4a edge2; - edge2.setSub(vert2, vert0); - - /* begin calculating determinant - also used to calculate U parameter */ - LLVector4a pvec; - pvec.setCross3(dir, edge2); - - /* if determinant is near zero, ray lies in plane of triangle */ - LLVector4a det; - det.setAllDot3(edge1, pvec); - - if (det.greaterEqual(LLVector4a::getEpsilon()).getGatheredBits() & 0x7) - { - /* calculate distance from vert0 to ray origin */ - LLVector4a tvec; - tvec.setSub(orig, vert0); - - /* calculate U parameter and test bounds */ - LLVector4a u; - u.setAllDot3(tvec,pvec); - - if ((u.greaterEqual(LLVector4a::getZero()).getGatheredBits() & 0x7) && - (u.lessEqual(det).getGatheredBits() & 0x7)) - { - /* prepare to test V parameter */ - LLVector4a qvec; - qvec.setCross3(tvec, edge1); - - /* calculate V parameter and test bounds */ - LLVector4a v; - v.setAllDot3(dir, qvec); - - - //if (!(v < 0.f || u + v > det)) - - LLVector4a sum_uv; - sum_uv.setAdd(u, v); - - S32 v_gequal = v.greaterEqual(LLVector4a::getZero()).getGatheredBits() & 0x7; - S32 sum_lequal = sum_uv.lessEqual(det).getGatheredBits() & 0x7; - - if (v_gequal && sum_lequal) - { - /* calculate t, scale parameters, ray intersects triangle */ - LLVector4a t; - t.setAllDot3(edge2,qvec); - - t.div(det); - u.div(det); - v.div(det); - - intersection_a = u[0]; - intersection_b = v[0]; - intersection_t = t[0]; - return TRUE; - } - } - } - - return FALSE; -} - -BOOL LLTriangleRayIntersectTwoSided(const LLVector4a& vert0, const LLVector4a& vert1, const LLVector4a& vert2, const LLVector4a& orig, const LLVector4a& dir, - F32& intersection_a, F32& intersection_b, F32& intersection_t) -{ - F32 u, v, t; - - /* find vectors for two edges sharing vert0 */ - LLVector4a edge1; - edge1.setSub(vert1, vert0); - - - LLVector4a edge2; - edge2.setSub(vert2, vert0); - - /* begin calculating determinant - also used to calculate U parameter */ - LLVector4a pvec; - pvec.setCross3(dir, edge2); - - /* if determinant is near zero, ray lies in plane of triangle */ - F32 det = edge1.dot3(pvec).getF32(); - - - if (det > -F_APPROXIMATELY_ZERO && det < F_APPROXIMATELY_ZERO) - { - return FALSE; - } - - F32 inv_det = 1.f / det; - - /* calculate distance from vert0 to ray origin */ - LLVector4a tvec; - tvec.setSub(orig, vert0); - - /* calculate U parameter and test bounds */ - u = (tvec.dot3(pvec).getF32()) * inv_det; - if (u < 0.f || u > 1.f) - { - return FALSE; - } - - /* prepare to test V parameter */ - tvec.sub(edge1); - - /* calculate V parameter and test bounds */ - v = (dir.dot3(tvec).getF32()) * inv_det; - - if (v < 0.f || u + v > 1.f) - { - return FALSE; - } - - /* calculate t, ray intersects triangle */ - t = (edge2.dot3(tvec).getF32()) * inv_det; - - intersection_a = u; - intersection_b = v; - intersection_t = t; - - - return TRUE; -} - -//helper for non-aligned vectors -BOOL LLTriangleRayIntersect(const LLVector3& vert0, const LLVector3& vert1, const LLVector3& vert2, const LLVector3& orig, const LLVector3& dir, - F32& intersection_a, F32& intersection_b, F32& intersection_t, BOOL two_sided) -{ - LLVector4a vert0a, vert1a, vert2a, origa, dira; - vert0a.load3(vert0.mV); - vert1a.load3(vert1.mV); - vert2a.load3(vert2.mV); - origa.load3(orig.mV); - dira.load3(dir.mV); - - if (two_sided) - { - return LLTriangleRayIntersectTwoSided(vert0a, vert1a, vert2a, origa, dira, - intersection_a, intersection_b, intersection_t); - } - else - { - return LLTriangleRayIntersect(vert0a, vert1a, vert2a, origa, dira, - intersection_a, intersection_b, intersection_t); - } -} - -class LLVolumeOctreeRebound : public LLOctreeTravelerDepthFirst<LLVolumeTriangle> -{ -public: - const LLVolumeFace* mFace; - - LLVolumeOctreeRebound(const LLVolumeFace* face) - { - mFace = face; - } - - virtual void visit(const LLOctreeNode<LLVolumeTriangle>* branch) - { //this is a depth first traversal, so it's safe to assum all children have complete - //bounding data - - LLVolumeOctreeListener* node = (LLVolumeOctreeListener*) branch->getListener(0); - - LLVector4a& min = node->mExtents[0]; - LLVector4a& max = node->mExtents[1]; - - if (!branch->getData().empty()) - { //node has data, find AABB that binds data set - const LLVolumeTriangle* tri = *(branch->getData().begin()); - - //initialize min/max to first available vertex - min = *(tri->mV[0]); - max = *(tri->mV[0]); - - for (LLOctreeNode<LLVolumeTriangle>::const_element_iter iter = - branch->getData().begin(); iter != branch->getData().end(); ++iter) - { //for each triangle in node - - //stretch by triangles in node - tri = *iter; - - min.setMin(min, *tri->mV[0]); - min.setMin(min, *tri->mV[1]); - min.setMin(min, *tri->mV[2]); - - max.setMax(max, *tri->mV[0]); - max.setMax(max, *tri->mV[1]); - max.setMax(max, *tri->mV[2]); - } - } - else if (!branch->getChildren().empty()) - { //no data, but child nodes exist - LLVolumeOctreeListener* child = (LLVolumeOctreeListener*) branch->getChild(0)->getListener(0); - - //initialize min/max to extents of first child - min = child->mExtents[0]; - max = child->mExtents[1]; - } - else - { - llerrs << "WTF? Empty leaf" << llendl; - } - - for (S32 i = 0; i < branch->getChildCount(); ++i) - { //stretch by child extents - LLVolumeOctreeListener* child = (LLVolumeOctreeListener*) branch->getChild(i)->getListener(0); - min.setMin(min, child->mExtents[0]); - max.setMax(max, child->mExtents[1]); - } - - node->mBounds[0].setAdd(min, max); - node->mBounds[0].mul(0.5f); - - node->mBounds[1].setSub(max,min); - node->mBounds[1].mul(0.5f); - } -}; - -//------------------------------------------------------------------- -// statics -//------------------------------------------------------------------- - - -//---------------------------------------------------- - -LLProfile::Face* LLProfile::addCap(S16 faceID) -{ - LLMemType m1(LLMemType::MTYPE_VOLUME); - - Face *face = vector_append(mFaces, 1); - - face->mIndex = 0; - face->mCount = mTotal; - face->mScaleU= 1.0f; - face->mCap = TRUE; - face->mFaceID = faceID; - return face; -} - -LLProfile::Face* LLProfile::addFace(S32 i, S32 count, F32 scaleU, S16 faceID, BOOL flat) -{ - LLMemType m1(LLMemType::MTYPE_VOLUME); - - Face *face = vector_append(mFaces, 1); - - face->mIndex = i; - face->mCount = count; - face->mScaleU= scaleU; - - face->mFlat = flat; - face->mCap = FALSE; - face->mFaceID = faceID; - return face; -} - -// What is the bevel parameter used for? - DJS 04/05/02 -// Bevel parameter is currently unused but presumedly would support -// filleted and chamfered corners -void LLProfile::genNGon(const LLProfileParams& params, S32 sides, F32 offset, F32 bevel, F32 ang_scale, S32 split) -{ - LLMemType m1(LLMemType::MTYPE_VOLUME); - - // Generate an n-sided "circular" path. - // 0 is (1,0), and we go counter-clockwise along a circular path from there. - const F32 tableScale[] = { 1, 1, 1, 0.5f, 0.707107f, 0.53f, 0.525f, 0.5f }; - F32 scale = 0.5f; - F32 t, t_step, t_first, t_fraction, ang, ang_step; - LLVector3 pt1,pt2; - - F32 begin = params.getBegin(); - F32 end = params.getEnd(); - - t_step = 1.0f / sides; - ang_step = 2.0f*F_PI*t_step*ang_scale; - - // Scale to have size "match" scale. Compensates to get object to generally fill bounding box. - - S32 total_sides = llround(sides / ang_scale); // Total number of sides all around - - if (total_sides < 8) - { - scale = tableScale[total_sides]; - } - - t_first = floor(begin * sides) / (F32)sides; - - // pt1 is the first point on the fractional face. - // Starting t and ang values for the first face - t = t_first; - ang = 2.0f*F_PI*(t*ang_scale + offset); - pt1.setVec(cos(ang)*scale,sin(ang)*scale, t); - - // Increment to the next point. - // pt2 is the end point on the fractional face - t += t_step; - ang += ang_step; - pt2.setVec(cos(ang)*scale,sin(ang)*scale,t); - - t_fraction = (begin - t_first)*sides; - - // Only use if it's not almost exactly on an edge. - if (t_fraction < 0.9999f) - { - LLVector3 new_pt = lerp(pt1, pt2, t_fraction); - mProfile.push_back(new_pt); - } - - // There's lots of potential here for floating point error to generate unneeded extra points - DJS 04/05/02 - while (t < end) - { - // Iterate through all the integer steps of t. - pt1.setVec(cos(ang)*scale,sin(ang)*scale,t); - - if (mProfile.size() > 0) { - LLVector3 p = mProfile[mProfile.size()-1]; - for (S32 i = 0; i < split && mProfile.size() > 0; i++) { - mProfile.push_back(p+(pt1-p) * 1.0f/(float)(split+1) * (float)(i+1)); - } - } - mProfile.push_back(pt1); - - t += t_step; - ang += ang_step; - } - - t_fraction = (end - (t - t_step))*sides; - - // pt1 is the first point on the fractional face - // pt2 is the end point on the fractional face - pt2.setVec(cos(ang)*scale,sin(ang)*scale,t); - - // Find the fraction that we need to add to the end point. - t_fraction = (end - (t - t_step))*sides; - if (t_fraction > 0.0001f) - { - LLVector3 new_pt = lerp(pt1, pt2, t_fraction); - - if (mProfile.size() > 0) { - LLVector3 p = mProfile[mProfile.size()-1]; - for (S32 i = 0; i < split && mProfile.size() > 0; i++) { - mProfile.push_back(p+(new_pt-p) * 1.0f/(float)(split+1) * (float)(i+1)); - } - } - mProfile.push_back(new_pt); - } - - // If we're sliced, the profile is open. - if ((end - begin)*ang_scale < 0.99f) - { - if ((end - begin)*ang_scale > 0.5f) - { - mConcave = TRUE; - } - else - { - mConcave = FALSE; - } - mOpen = TRUE; - if (params.getHollow() <= 0) - { - // put center point if not hollow. - mProfile.push_back(LLVector3(0,0,0)); - } - } - else - { - // The profile isn't open. - mOpen = FALSE; - mConcave = FALSE; - } - - mTotal = mProfile.size(); -} - -void LLProfile::genNormals(const LLProfileParams& params) -{ - S32 count = mProfile.size(); - - S32 outer_count; - if (mTotalOut) - { - outer_count = mTotalOut; - } - else - { - outer_count = mTotal / 2; - } - - mEdgeNormals.resize(count * 2); - mEdgeCenters.resize(count * 2); - mNormals.resize(count); - - LLVector2 pt0,pt1; - - BOOL hollow = (params.getHollow() > 0); - - S32 i0, i1, i2, i3, i4; - - // Parametrically generate normal - for (i2 = 0; i2 < count; i2++) - { - mNormals[i2].mV[0] = mProfile[i2].mV[0]; - mNormals[i2].mV[1] = mProfile[i2].mV[1]; - if (hollow && (i2 >= outer_count)) - { - mNormals[i2] *= -1.f; - } - if (mNormals[i2].magVec() < 0.001) - { - // Special case for point at center, get adjacent points. - i1 = (i2 - 1) >= 0 ? i2 - 1 : count - 1; - i0 = (i1 - 1) >= 0 ? i1 - 1 : count - 1; - i3 = (i2 + 1) < count ? i2 + 1 : 0; - i4 = (i3 + 1) < count ? i3 + 1 : 0; - - pt0.setVec(mProfile[i1].mV[VX] + mProfile[i1].mV[VX] - mProfile[i0].mV[VX], - mProfile[i1].mV[VY] + mProfile[i1].mV[VY] - mProfile[i0].mV[VY]); - pt1.setVec(mProfile[i3].mV[VX] + mProfile[i3].mV[VX] - mProfile[i4].mV[VX], - mProfile[i3].mV[VY] + mProfile[i3].mV[VY] - mProfile[i4].mV[VY]); - - mNormals[i2] = pt0 + pt1; - mNormals[i2] *= 0.5f; - } - mNormals[i2].normVec(); - } - - S32 num_normal_sets = isConcave() ? 2 : 1; - for (S32 normal_set = 0; normal_set < num_normal_sets; normal_set++) - { - S32 point_num; - for (point_num = 0; point_num < mTotal; point_num++) - { - LLVector3 point_1 = mProfile[point_num]; - point_1.mV[VZ] = 0.f; - - LLVector3 point_2; - - if (isConcave() && normal_set == 0 && point_num == (mTotal - 1) / 2) - { - point_2 = mProfile[mTotal - 1]; - } - else if (isConcave() && normal_set == 1 && point_num == mTotal - 1) - { - point_2 = mProfile[(mTotal - 1) / 2]; - } - else - { - LLVector3 delta_pos; - S32 neighbor_point = (point_num + 1) % mTotal; - while(delta_pos.magVecSquared() < 0.01f * 0.01f) - { - point_2 = mProfile[neighbor_point]; - delta_pos = point_2 - point_1; - neighbor_point = (neighbor_point + 1) % mTotal; - if (neighbor_point == point_num) - { - break; - } - } - } - - point_2.mV[VZ] = 0.f; - LLVector3 face_normal = (point_2 - point_1) % LLVector3::z_axis; - face_normal.normVec(); - mEdgeNormals[normal_set * count + point_num] = face_normal; - mEdgeCenters[normal_set * count + point_num] = lerp(point_1, point_2, 0.5f); - } - } -} - - -// Hollow is percent of the original bounding box, not of this particular -// profile's geometry. Thus, a swept triangle needs lower hollow values than -// a swept square. -LLProfile::Face* LLProfile::addHole(const LLProfileParams& params, BOOL flat, F32 sides, F32 offset, F32 box_hollow, F32 ang_scale, S32 split) -{ - // Note that addHole will NOT work for non-"circular" profiles, if we ever decide to use them. - - // Total add has number of vertices on outside. - mTotalOut = mTotal; - - // Why is the "bevel" parameter -1? DJS 04/05/02 - genNGon(params, llfloor(sides),offset,-1, ang_scale, split); - - Face *face = addFace(mTotalOut, mTotal-mTotalOut,0,LL_FACE_INNER_SIDE, flat); - - std::vector<LLVector3> pt; - pt.resize(mTotal) ; - - for (S32 i=mTotalOut;i<mTotal;i++) - { - pt[i] = mProfile[i] * box_hollow; - } - - S32 j=mTotal-1; - for (S32 i=mTotalOut;i<mTotal;i++) - { - mProfile[i] = pt[j--]; - } - - for (S32 i=0;i<(S32)mFaces.size();i++) - { - if (mFaces[i].mCap) - { - mFaces[i].mCount *= 2; - } - } - - return face; -} - - - -BOOL LLProfile::generate(const LLProfileParams& params, BOOL path_open,F32 detail, S32 split, - BOOL is_sculpted, S32 sculpt_size) -{ - LLMemType m1(LLMemType::MTYPE_VOLUME); - - if ((!mDirty) && (!is_sculpted)) - { - return FALSE; - } - mDirty = FALSE; - - if (detail < MIN_LOD) - { - llinfos << "Generating profile with LOD < MIN_LOD. CLAMPING" << llendl; - detail = MIN_LOD; - } - - mProfile.clear(); - mFaces.clear(); - - // Generate the face data - S32 i; - F32 begin = params.getBegin(); - F32 end = params.getEnd(); - F32 hollow = params.getHollow(); - - // Quick validation to eliminate some server crashes. - if (begin > end - 0.01f) - { - llwarns << "LLProfile::generate() assertion failed (begin >= end)" << llendl; - return FALSE; - } - - S32 face_num = 0; - - switch (params.getCurveType() & LL_PCODE_PROFILE_MASK) - { - case LL_PCODE_PROFILE_SQUARE: - { - genNGon(params, 4,-0.375, 0, 1, split); - if (path_open) - { - addCap (LL_FACE_PATH_BEGIN); - } - - for (i = llfloor(begin * 4.f); i < llfloor(end * 4.f + .999f); i++) - { - addFace((face_num++) * (split +1), split+2, 1, LL_FACE_OUTER_SIDE_0 << i, TRUE); - } - - for (i = 0; i <(S32) mProfile.size(); i++) - { - // Scale by 4 to generate proper tex coords. - mProfile[i].mV[2] *= 4.f; - } - - if (hollow) - { - switch (params.getCurveType() & LL_PCODE_HOLE_MASK) - { - case LL_PCODE_HOLE_TRIANGLE: - // This offset is not correct, but we can't change it now... DK 11/17/04 - addHole(params, TRUE, 3, -0.375f, hollow, 1.f, split); - break; - case LL_PCODE_HOLE_CIRCLE: - // TODO: Compute actual detail levels for cubes - addHole(params, FALSE, MIN_DETAIL_FACES * detail, -0.375f, hollow, 1.f); - break; - case LL_PCODE_HOLE_SAME: - case LL_PCODE_HOLE_SQUARE: - default: - addHole(params, TRUE, 4, -0.375f, hollow, 1.f, split); - break; - } - } - - if (path_open) { - mFaces[0].mCount = mTotal; - } - } - break; - case LL_PCODE_PROFILE_ISOTRI: - case LL_PCODE_PROFILE_RIGHTTRI: - case LL_PCODE_PROFILE_EQUALTRI: - { - genNGon(params, 3,0, 0, 1, split); - for (i = 0; i <(S32) mProfile.size(); i++) - { - // Scale by 3 to generate proper tex coords. - mProfile[i].mV[2] *= 3.f; - } - - if (path_open) - { - addCap(LL_FACE_PATH_BEGIN); - } - - for (i = llfloor(begin * 3.f); i < llfloor(end * 3.f + .999f); i++) - { - addFace((face_num++) * (split +1), split+2, 1, LL_FACE_OUTER_SIDE_0 << i, TRUE); - } - if (hollow) - { - // Swept triangles need smaller hollowness values, - // because the triangle doesn't fill the bounding box. - F32 triangle_hollow = hollow / 2.f; - - switch (params.getCurveType() & LL_PCODE_HOLE_MASK) - { - case LL_PCODE_HOLE_CIRCLE: - // TODO: Actually generate level of detail for triangles - addHole(params, FALSE, MIN_DETAIL_FACES * detail, 0, triangle_hollow, 1.f); - break; - case LL_PCODE_HOLE_SQUARE: - addHole(params, TRUE, 4, 0, triangle_hollow, 1.f, split); - break; - case LL_PCODE_HOLE_SAME: - case LL_PCODE_HOLE_TRIANGLE: - default: - addHole(params, TRUE, 3, 0, triangle_hollow, 1.f, split); - break; - } - } - } - break; - case LL_PCODE_PROFILE_CIRCLE: - { - // If this has a square hollow, we should adjust the - // number of faces a bit so that the geometry lines up. - U8 hole_type=0; - F32 circle_detail = MIN_DETAIL_FACES * detail; - if (hollow) - { - hole_type = params.getCurveType() & LL_PCODE_HOLE_MASK; - if (hole_type == LL_PCODE_HOLE_SQUARE) - { - // Snap to the next multiple of four sides, - // so that corners line up. - circle_detail = llceil(circle_detail / 4.0f) * 4.0f; - } - } - - S32 sides = (S32)circle_detail; - - if (is_sculpted) - sides = sculpt_size; - - genNGon(params, sides); - - if (path_open) - { - addCap (LL_FACE_PATH_BEGIN); - } - - if (mOpen && !hollow) - { - addFace(0,mTotal-1,0,LL_FACE_OUTER_SIDE_0, FALSE); - } - else - { - addFace(0,mTotal,0,LL_FACE_OUTER_SIDE_0, FALSE); - } - - if (hollow) - { - switch (hole_type) - { - case LL_PCODE_HOLE_SQUARE: - addHole(params, TRUE, 4, 0, hollow, 1.f, split); - break; - case LL_PCODE_HOLE_TRIANGLE: - addHole(params, TRUE, 3, 0, hollow, 1.f, split); - break; - case LL_PCODE_HOLE_CIRCLE: - case LL_PCODE_HOLE_SAME: - default: - addHole(params, FALSE, circle_detail, 0, hollow, 1.f); - break; - } - } - } - break; - case LL_PCODE_PROFILE_CIRCLE_HALF: - { - // If this has a square hollow, we should adjust the - // number of faces a bit so that the geometry lines up. - U8 hole_type=0; - // Number of faces is cut in half because it's only a half-circle. - F32 circle_detail = MIN_DETAIL_FACES * detail * 0.5f; - if (hollow) - { - hole_type = params.getCurveType() & LL_PCODE_HOLE_MASK; - if (hole_type == LL_PCODE_HOLE_SQUARE) - { - // Snap to the next multiple of four sides (div 2), - // so that corners line up. - circle_detail = llceil(circle_detail / 2.0f) * 2.0f; - } - } - genNGon(params, llfloor(circle_detail), 0.5f, 0.f, 0.5f); - if (path_open) - { - addCap(LL_FACE_PATH_BEGIN); - } - if (mOpen && !params.getHollow()) - { - addFace(0,mTotal-1,0,LL_FACE_OUTER_SIDE_0, FALSE); - } - else - { - addFace(0,mTotal,0,LL_FACE_OUTER_SIDE_0, FALSE); - } - - if (hollow) - { - switch (hole_type) - { - case LL_PCODE_HOLE_SQUARE: - addHole(params, TRUE, 2, 0.5f, hollow, 0.5f, split); - break; - case LL_PCODE_HOLE_TRIANGLE: - addHole(params, TRUE, 3, 0.5f, hollow, 0.5f, split); - break; - case LL_PCODE_HOLE_CIRCLE: - case LL_PCODE_HOLE_SAME: - default: - addHole(params, FALSE, circle_detail, 0.5f, hollow, 0.5f); - break; - } - } - - // Special case for openness of sphere - if ((params.getEnd() - params.getBegin()) < 1.f) - { - mOpen = TRUE; - } - else if (!hollow) - { - mOpen = FALSE; - mProfile.push_back(mProfile[0]); - mTotal++; - } - } - break; - default: - llerrs << "Unknown profile: getCurveType()=" << params.getCurveType() << llendl; - break; - }; - - if (path_open) - { - addCap(LL_FACE_PATH_END); // bottom - } - - if ( mOpen) // interior edge caps - { - addFace(mTotal-1, 2,0.5,LL_FACE_PROFILE_BEGIN, TRUE); - - if (hollow) - { - addFace(mTotalOut-1, 2,0.5,LL_FACE_PROFILE_END, TRUE); - } - else - { - addFace(mTotal-2, 2,0.5,LL_FACE_PROFILE_END, TRUE); - } - } - - //genNormals(params); - - return TRUE; -} - - - -BOOL LLProfileParams::importFile(LLFILE *fp) -{ - LLMemType m1(LLMemType::MTYPE_VOLUME); - - const S32 BUFSIZE = 16384; - char buffer[BUFSIZE]; /* Flawfinder: ignore */ - // *NOTE: changing the size or type of these buffers will require - // changing the sscanf below. - char keyword[256]; /* Flawfinder: ignore */ - char valuestr[256]; /* Flawfinder: ignore */ - keyword[0] = 0; - valuestr[0] = 0; - F32 tempF32; - U32 tempU32; - - while (!feof(fp)) - { - if (fgets(buffer, BUFSIZE, fp) == NULL) - { - buffer[0] = '\0'; - } - - sscanf( /* Flawfinder: ignore */ - buffer, - " %255s %255s", - keyword, valuestr); - if (!strcmp("{", keyword)) - { - continue; - } - if (!strcmp("}",keyword)) - { - break; - } - else if (!strcmp("curve", keyword)) - { - sscanf(valuestr,"%d",&tempU32); - setCurveType((U8) tempU32); - } - else if (!strcmp("begin",keyword)) - { - sscanf(valuestr,"%g",&tempF32); - setBegin(tempF32); - } - else if (!strcmp("end",keyword)) - { - sscanf(valuestr,"%g",&tempF32); - setEnd(tempF32); - } - else if (!strcmp("hollow",keyword)) - { - sscanf(valuestr,"%g",&tempF32); - setHollow(tempF32); - } - else - { - llwarns << "unknown keyword " << keyword << " in profile import" << llendl; - } - } - - return TRUE; -} - - -BOOL LLProfileParams::exportFile(LLFILE *fp) const -{ - fprintf(fp,"\t\tprofile 0\n"); - fprintf(fp,"\t\t{\n"); - fprintf(fp,"\t\t\tcurve\t%d\n", getCurveType()); - fprintf(fp,"\t\t\tbegin\t%g\n", getBegin()); - fprintf(fp,"\t\t\tend\t%g\n", getEnd()); - fprintf(fp,"\t\t\thollow\t%g\n", getHollow()); - fprintf(fp, "\t\t}\n"); - return TRUE; -} - - -BOOL LLProfileParams::importLegacyStream(std::istream& input_stream) -{ - LLMemType m1(LLMemType::MTYPE_VOLUME); - - const S32 BUFSIZE = 16384; - char buffer[BUFSIZE]; /* Flawfinder: ignore */ - // *NOTE: changing the size or type of these buffers will require - // changing the sscanf below. - char keyword[256]; /* Flawfinder: ignore */ - char valuestr[256]; /* Flawfinder: ignore */ - keyword[0] = 0; - valuestr[0] = 0; - F32 tempF32; - U32 tempU32; - - while (input_stream.good()) - { - input_stream.getline(buffer, BUFSIZE); - sscanf( /* Flawfinder: ignore */ - buffer, - " %255s %255s", - keyword, - valuestr); - if (!strcmp("{", keyword)) - { - continue; - } - if (!strcmp("}",keyword)) - { - break; - } - else if (!strcmp("curve", keyword)) - { - sscanf(valuestr,"%d",&tempU32); - setCurveType((U8) tempU32); - } - else if (!strcmp("begin",keyword)) - { - sscanf(valuestr,"%g",&tempF32); - setBegin(tempF32); - } - else if (!strcmp("end",keyword)) - { - sscanf(valuestr,"%g",&tempF32); - setEnd(tempF32); - } - else if (!strcmp("hollow",keyword)) - { - sscanf(valuestr,"%g",&tempF32); - setHollow(tempF32); - } - else - { - llwarns << "unknown keyword " << keyword << " in profile import" << llendl; - } - } - - return TRUE; -} - - -BOOL LLProfileParams::exportLegacyStream(std::ostream& output_stream) const -{ - output_stream <<"\t\tprofile 0\n"; - output_stream <<"\t\t{\n"; - output_stream <<"\t\t\tcurve\t" << (S32) getCurveType() << "\n"; - output_stream <<"\t\t\tbegin\t" << getBegin() << "\n"; - output_stream <<"\t\t\tend\t" << getEnd() << "\n"; - output_stream <<"\t\t\thollow\t" << getHollow() << "\n"; - output_stream << "\t\t}\n"; - return TRUE; -} - -LLSD LLProfileParams::asLLSD() const -{ - LLSD sd; - - sd["curve"] = getCurveType(); - sd["begin"] = getBegin(); - sd["end"] = getEnd(); - sd["hollow"] = getHollow(); - return sd; -} - -bool LLProfileParams::fromLLSD(LLSD& sd) -{ - setCurveType(sd["curve"].asInteger()); - setBegin((F32)sd["begin"].asReal()); - setEnd((F32)sd["end"].asReal()); - setHollow((F32)sd["hollow"].asReal()); - return true; -} - -void LLProfileParams::copyParams(const LLProfileParams ¶ms) -{ - LLMemType m1(LLMemType::MTYPE_VOLUME); - setCurveType(params.getCurveType()); - setBegin(params.getBegin()); - setEnd(params.getEnd()); - setHollow(params.getHollow()); -} - - -LLPath::~LLPath() -{ -} - -void LLPath::genNGon(const LLPathParams& params, S32 sides, F32 startOff, F32 end_scale, F32 twist_scale) -{ - // Generates a circular path, starting at (1, 0, 0), counterclockwise along the xz plane. - const F32 tableScale[] = { 1, 1, 1, 0.5f, 0.707107f, 0.53f, 0.525f, 0.5f }; - - F32 revolutions = params.getRevolutions(); - F32 skew = params.getSkew(); - F32 skew_mag = fabs(skew); - F32 hole_x = params.getScaleX() * (1.0f - skew_mag); - F32 hole_y = params.getScaleY(); - - // Calculate taper begin/end for x,y (Negative means taper the beginning) - F32 taper_x_begin = 1.0f; - F32 taper_x_end = 1.0f - params.getTaperX(); - F32 taper_y_begin = 1.0f; - F32 taper_y_end = 1.0f - params.getTaperY(); - - if ( taper_x_end > 1.0f ) - { - // Flip tapering. - taper_x_begin = 2.0f - taper_x_end; - taper_x_end = 1.0f; - } - if ( taper_y_end > 1.0f ) - { - // Flip tapering. - taper_y_begin = 2.0f - taper_y_end; - taper_y_end = 1.0f; - } - - // For spheres, the radius is usually zero. - F32 radius_start = 0.5f; - if (sides < 8) - { - radius_start = tableScale[sides]; - } - - // Scale the radius to take the hole size into account. - radius_start *= 1.0f - hole_y; - - // Now check the radius offset to calculate the start,end radius. (Negative means - // decrease the start radius instead). - F32 radius_end = radius_start; - F32 radius_offset = params.getRadiusOffset(); - if (radius_offset < 0.f) - { - radius_start *= 1.f + radius_offset; - } - else - { - radius_end *= 1.f - radius_offset; - } - - // Is the path NOT a closed loop? - mOpen = ( (params.getEnd()*end_scale - params.getBegin() < 1.0f) || - (skew_mag > 0.001f) || - (fabs(taper_x_end - taper_x_begin) > 0.001f) || - (fabs(taper_y_end - taper_y_begin) > 0.001f) || - (fabs(radius_end - radius_start) > 0.001f) ); - - F32 ang, c, s; - LLQuaternion twist, qang; - PathPt *pt; - LLVector3 path_axis (1.f, 0.f, 0.f); - //LLVector3 twist_axis(0.f, 0.f, 1.f); - F32 twist_begin = params.getTwistBegin() * twist_scale; - F32 twist_end = params.getTwist() * twist_scale; - - // We run through this once before the main loop, to make sure - // the path begins at the correct cut. - F32 step= 1.0f / sides; - F32 t = params.getBegin(); - pt = vector_append(mPath, 1); - ang = 2.0f*F_PI*revolutions * t; - s = sin(ang)*lerp(radius_start, radius_end, t); - c = cos(ang)*lerp(radius_start, radius_end, t); - - - pt->mPos.setVec(0 + lerp(0,params.getShear().mV[0],s) - + lerp(-skew ,skew, t) * 0.5f, - c + lerp(0,params.getShear().mV[1],s), - s); - pt->mScale.mV[VX] = hole_x * lerp(taper_x_begin, taper_x_end, t); - pt->mScale.mV[VY] = hole_y * lerp(taper_y_begin, taper_y_end, t); - pt->mTexT = t; - - // Twist rotates the path along the x,y plane (I think) - DJS 04/05/02 - twist.setQuat (lerp(twist_begin,twist_end,t) * 2.f * F_PI - F_PI,0,0,1); - // Rotate the point around the circle's center. - qang.setQuat (ang,path_axis); - pt->mRot = twist * qang; - - t+=step; - - // Snap to a quantized parameter, so that cut does not - // affect most sample points. - t = ((S32)(t * sides)) / (F32)sides; - - // Run through the non-cut dependent points. - while (t < params.getEnd()) - { - pt = vector_append(mPath, 1); - - ang = 2.0f*F_PI*revolutions * t; - c = cos(ang)*lerp(radius_start, radius_end, t); - s = sin(ang)*lerp(radius_start, radius_end, t); - - pt->mPos.setVec(0 + lerp(0,params.getShear().mV[0],s) - + lerp(-skew ,skew, t) * 0.5f, - c + lerp(0,params.getShear().mV[1],s), - s); - - pt->mScale.mV[VX] = hole_x * lerp(taper_x_begin, taper_x_end, t); - pt->mScale.mV[VY] = hole_y * lerp(taper_y_begin, taper_y_end, t); - pt->mTexT = t; - - // Twist rotates the path along the x,y plane (I think) - DJS 04/05/02 - twist.setQuat (lerp(twist_begin,twist_end,t) * 2.f * F_PI - F_PI,0,0,1); - // Rotate the point around the circle's center. - qang.setQuat (ang,path_axis); - pt->mRot = twist * qang; - - t+=step; - } - - // Make one final pass for the end cut. - t = params.getEnd(); - pt = vector_append(mPath, 1); - ang = 2.0f*F_PI*revolutions * t; - c = cos(ang)*lerp(radius_start, radius_end, t); - s = sin(ang)*lerp(radius_start, radius_end, t); - - pt->mPos.setVec(0 + lerp(0,params.getShear().mV[0],s) - + lerp(-skew ,skew, t) * 0.5f, - c + lerp(0,params.getShear().mV[1],s), - s); - pt->mScale.mV[VX] = hole_x * lerp(taper_x_begin, taper_x_end, t); - pt->mScale.mV[VY] = hole_y * lerp(taper_y_begin, taper_y_end, t); - pt->mTexT = t; - - // Twist rotates the path along the x,y plane (I think) - DJS 04/05/02 - twist.setQuat (lerp(twist_begin,twist_end,t) * 2.f * F_PI - F_PI,0,0,1); - // Rotate the point around the circle's center. - qang.setQuat (ang,path_axis); - pt->mRot = twist * qang; - - mTotal = mPath.size(); -} - -const LLVector2 LLPathParams::getBeginScale() const -{ - LLVector2 begin_scale(1.f, 1.f); - if (getScaleX() > 1) - { - begin_scale.mV[0] = 2-getScaleX(); - } - if (getScaleY() > 1) - { - begin_scale.mV[1] = 2-getScaleY(); - } - return begin_scale; -} - -const LLVector2 LLPathParams::getEndScale() const -{ - LLVector2 end_scale(1.f, 1.f); - if (getScaleX() < 1) - { - end_scale.mV[0] = getScaleX(); - } - if (getScaleY() < 1) - { - end_scale.mV[1] = getScaleY(); - } - return end_scale; -} - -BOOL LLPath::generate(const LLPathParams& params, F32 detail, S32 split, - BOOL is_sculpted, S32 sculpt_size) -{ - LLMemType m1(LLMemType::MTYPE_VOLUME); - - if ((!mDirty) && (!is_sculpted)) - { - return FALSE; - } - - if (detail < MIN_LOD) - { - llinfos << "Generating path with LOD < MIN! Clamping to 1" << llendl; - detail = MIN_LOD; - } - - mDirty = FALSE; - S32 np = 2; // hardcode for line - - mPath.clear(); - mOpen = TRUE; - - // Is this 0xf0 mask really necessary? DK 03/02/05 - switch (params.getCurveType() & 0xf0) - { - default: - case LL_PCODE_PATH_LINE: - { - // Take the begin/end twist into account for detail. - np = llfloor(fabs(params.getTwistBegin() - params.getTwist()) * 3.5f * (detail-0.5f)) + 2; - if (np < split+2) - { - np = split+2; - } - - mStep = 1.0f / (np-1); - - mPath.resize(np); - - LLVector2 start_scale = params.getBeginScale(); - LLVector2 end_scale = params.getEndScale(); - - for (S32 i=0;i<np;i++) - { - F32 t = lerp(params.getBegin(),params.getEnd(),(F32)i * mStep); - mPath[i].mPos.setVec(lerp(0,params.getShear().mV[0],t), - lerp(0,params.getShear().mV[1],t), - t - 0.5f); - mPath[i].mRot.setQuat(lerp(F_PI * params.getTwistBegin(),F_PI * params.getTwist(),t),0,0,1); - mPath[i].mScale.mV[0] = lerp(start_scale.mV[0],end_scale.mV[0],t); - mPath[i].mScale.mV[1] = lerp(start_scale.mV[1],end_scale.mV[1],t); - mPath[i].mTexT = t; - } - } - break; - - case LL_PCODE_PATH_CIRCLE: - { - // Increase the detail as the revolutions and twist increase. - F32 twist_mag = fabs(params.getTwistBegin() - params.getTwist()); - - S32 sides = (S32)llfloor(llfloor((MIN_DETAIL_FACES * detail + twist_mag * 3.5f * (detail-0.5f))) * params.getRevolutions()); - - if (is_sculpted) - sides = sculpt_size; - - genNGon(params, sides); - } - break; - - case LL_PCODE_PATH_CIRCLE2: - { - if (params.getEnd() - params.getBegin() >= 0.99f && - params.getScaleX() >= .99f) - { - mOpen = FALSE; - } - - //genNGon(params, llfloor(MIN_DETAIL_FACES * detail), 4.f, 0.f); - genNGon(params, llfloor(MIN_DETAIL_FACES * detail)); - - F32 t = 0.f; - F32 tStep = 1.0f / mPath.size(); - - F32 toggle = 0.5f; - for (S32 i=0;i<(S32)mPath.size();i++) - { - mPath[i].mPos.mV[0] = toggle; - if (toggle == 0.5f) - toggle = -0.5f; - else - toggle = 0.5f; - t += tStep; - } - } - - break; - - case LL_PCODE_PATH_TEST: - - np = 5; - mStep = 1.0f / (np-1); - - mPath.resize(np); - - for (S32 i=0;i<np;i++) - { - F32 t = (F32)i * mStep; - mPath[i].mPos.setVec(0, - lerp(0, -sin(F_PI*params.getTwist()*t)*0.5f,t), - lerp(-0.5, cos(F_PI*params.getTwist()*t)*0.5f,t)); - mPath[i].mScale.mV[0] = lerp(1,params.getScale().mV[0],t); - mPath[i].mScale.mV[1] = lerp(1,params.getScale().mV[1],t); - mPath[i].mTexT = t; - mPath[i].mRot.setQuat(F_PI * params.getTwist() * t,1,0,0); - } - - break; - }; - - if (params.getTwist() != params.getTwistBegin()) mOpen = TRUE; - - //if ((int(fabsf(params.getTwist() - params.getTwistBegin())*100))%100 != 0) { - // mOpen = TRUE; - //} - - return TRUE; -} - -BOOL LLDynamicPath::generate(const LLPathParams& params, F32 detail, S32 split, - BOOL is_sculpted, S32 sculpt_size) -{ - LLMemType m1(LLMemType::MTYPE_VOLUME); - - mOpen = TRUE; // Draw end caps - if (getPathLength() == 0) - { - // Path hasn't been generated yet. - // Some algorithms later assume at least TWO path points. - resizePath(2); - for (U32 i = 0; i < 2; i++) - { - mPath[i].mPos.setVec(0, 0, 0); - mPath[i].mRot.setQuat(0, 0, 0); - mPath[i].mScale.setVec(1, 1); - mPath[i].mTexT = 0; - } - } - - return TRUE; -} - - -BOOL LLPathParams::importFile(LLFILE *fp) -{ - LLMemType m1(LLMemType::MTYPE_VOLUME); - - const S32 BUFSIZE = 16384; - char buffer[BUFSIZE]; /* Flawfinder: ignore */ - // *NOTE: changing the size or type of these buffers will require - // changing the sscanf below. - char keyword[256]; /* Flawfinder: ignore */ - char valuestr[256]; /* Flawfinder: ignore */ - keyword[0] = 0; - valuestr[0] = 0; - - F32 tempF32; - F32 x, y; - U32 tempU32; - - while (!feof(fp)) - { - if (fgets(buffer, BUFSIZE, fp) == NULL) - { - buffer[0] = '\0'; - } - - sscanf( /* Flawfinder: ignore */ - buffer, - " %255s %255s", - keyword, valuestr); - if (!strcmp("{", keyword)) - { - continue; - } - if (!strcmp("}",keyword)) - { - break; - } - else if (!strcmp("curve", keyword)) - { - sscanf(valuestr,"%d",&tempU32); - setCurveType((U8) tempU32); - } - else if (!strcmp("begin",keyword)) - { - sscanf(valuestr,"%g",&tempF32); - setBegin(tempF32); - } - else if (!strcmp("end",keyword)) - { - sscanf(valuestr,"%g",&tempF32); - setEnd(tempF32); - } - else if (!strcmp("scale",keyword)) - { - // Legacy for one dimensional scale per path - sscanf(valuestr,"%g",&tempF32); - setScale(tempF32, tempF32); - } - else if (!strcmp("scale_x", keyword)) - { - sscanf(valuestr, "%g", &x); - setScaleX(x); - } - else if (!strcmp("scale_y", keyword)) - { - sscanf(valuestr, "%g", &y); - setScaleY(y); - } - else if (!strcmp("shear_x", keyword)) - { - sscanf(valuestr, "%g", &x); - setShearX(x); - } - else if (!strcmp("shear_y", keyword)) - { - sscanf(valuestr, "%g", &y); - setShearY(y); - } - else if (!strcmp("twist",keyword)) - { - sscanf(valuestr,"%g",&tempF32); - setTwist(tempF32); - } - else if (!strcmp("twist_begin", keyword)) - { - sscanf(valuestr, "%g", &y); - setTwistBegin(y); - } - else if (!strcmp("radius_offset", keyword)) - { - sscanf(valuestr, "%g", &y); - setRadiusOffset(y); - } - else if (!strcmp("taper_x", keyword)) - { - sscanf(valuestr, "%g", &y); - setTaperX(y); - } - else if (!strcmp("taper_y", keyword)) - { - sscanf(valuestr, "%g", &y); - setTaperY(y); - } - else if (!strcmp("revolutions", keyword)) - { - sscanf(valuestr, "%g", &y); - setRevolutions(y); - } - else if (!strcmp("skew", keyword)) - { - sscanf(valuestr, "%g", &y); - setSkew(y); - } - else - { - llwarns << "unknown keyword " << " in path import" << llendl; - } - } - return TRUE; -} - - -BOOL LLPathParams::exportFile(LLFILE *fp) const -{ - fprintf(fp, "\t\tpath 0\n"); - fprintf(fp, "\t\t{\n"); - fprintf(fp, "\t\t\tcurve\t%d\n", getCurveType()); - fprintf(fp, "\t\t\tbegin\t%g\n", getBegin()); - fprintf(fp, "\t\t\tend\t%g\n", getEnd()); - fprintf(fp, "\t\t\tscale_x\t%g\n", getScaleX() ); - fprintf(fp, "\t\t\tscale_y\t%g\n", getScaleY() ); - fprintf(fp, "\t\t\tshear_x\t%g\n", getShearX() ); - fprintf(fp, "\t\t\tshear_y\t%g\n", getShearY() ); - fprintf(fp,"\t\t\ttwist\t%g\n", getTwist()); - - fprintf(fp,"\t\t\ttwist_begin\t%g\n", getTwistBegin()); - fprintf(fp,"\t\t\tradius_offset\t%g\n", getRadiusOffset()); - fprintf(fp,"\t\t\ttaper_x\t%g\n", getTaperX()); - fprintf(fp,"\t\t\ttaper_y\t%g\n", getTaperY()); - fprintf(fp,"\t\t\trevolutions\t%g\n", getRevolutions()); - fprintf(fp,"\t\t\tskew\t%g\n", getSkew()); - - fprintf(fp, "\t\t}\n"); - return TRUE; -} - - -BOOL LLPathParams::importLegacyStream(std::istream& input_stream) -{ - LLMemType m1(LLMemType::MTYPE_VOLUME); - - const S32 BUFSIZE = 16384; - char buffer[BUFSIZE]; /* Flawfinder: ignore */ - // *NOTE: changing the size or type of these buffers will require - // changing the sscanf below. - char keyword[256]; /* Flawfinder: ignore */ - char valuestr[256]; /* Flawfinder: ignore */ - keyword[0] = 0; - valuestr[0] = 0; - - F32 tempF32; - F32 x, y; - U32 tempU32; - - while (input_stream.good()) - { - input_stream.getline(buffer, BUFSIZE); - sscanf( /* Flawfinder: ignore */ - buffer, - " %255s %255s", - keyword, valuestr); - if (!strcmp("{", keyword)) - { - continue; - } - if (!strcmp("}",keyword)) - { - break; - } - else if (!strcmp("curve", keyword)) - { - sscanf(valuestr,"%d",&tempU32); - setCurveType((U8) tempU32); - } - else if (!strcmp("begin",keyword)) - { - sscanf(valuestr,"%g",&tempF32); - setBegin(tempF32); - } - else if (!strcmp("end",keyword)) - { - sscanf(valuestr,"%g",&tempF32); - setEnd(tempF32); - } - else if (!strcmp("scale",keyword)) - { - // Legacy for one dimensional scale per path - sscanf(valuestr,"%g",&tempF32); - setScale(tempF32, tempF32); - } - else if (!strcmp("scale_x", keyword)) - { - sscanf(valuestr, "%g", &x); - setScaleX(x); - } - else if (!strcmp("scale_y", keyword)) - { - sscanf(valuestr, "%g", &y); - setScaleY(y); - } - else if (!strcmp("shear_x", keyword)) - { - sscanf(valuestr, "%g", &x); - setShearX(x); - } - else if (!strcmp("shear_y", keyword)) - { - sscanf(valuestr, "%g", &y); - setShearY(y); - } - else if (!strcmp("twist",keyword)) - { - sscanf(valuestr,"%g",&tempF32); - setTwist(tempF32); - } - else if (!strcmp("twist_begin", keyword)) - { - sscanf(valuestr, "%g", &y); - setTwistBegin(y); - } - else if (!strcmp("radius_offset", keyword)) - { - sscanf(valuestr, "%g", &y); - setRadiusOffset(y); - } - else if (!strcmp("taper_x", keyword)) - { - sscanf(valuestr, "%g", &y); - setTaperX(y); - } - else if (!strcmp("taper_y", keyword)) - { - sscanf(valuestr, "%g", &y); - setTaperY(y); - } - else if (!strcmp("revolutions", keyword)) - { - sscanf(valuestr, "%g", &y); - setRevolutions(y); - } - else if (!strcmp("skew", keyword)) - { - sscanf(valuestr, "%g", &y); - setSkew(y); - } - else - { - llwarns << "unknown keyword " << " in path import" << llendl; - } - } - return TRUE; -} - - -BOOL LLPathParams::exportLegacyStream(std::ostream& output_stream) const -{ - output_stream << "\t\tpath 0\n"; - output_stream << "\t\t{\n"; - output_stream << "\t\t\tcurve\t" << (S32) getCurveType() << "\n"; - output_stream << "\t\t\tbegin\t" << getBegin() << "\n"; - output_stream << "\t\t\tend\t" << getEnd() << "\n"; - output_stream << "\t\t\tscale_x\t" << getScaleX() << "\n"; - output_stream << "\t\t\tscale_y\t" << getScaleY() << "\n"; - output_stream << "\t\t\tshear_x\t" << getShearX() << "\n"; - output_stream << "\t\t\tshear_y\t" << getShearY() << "\n"; - output_stream <<"\t\t\ttwist\t" << getTwist() << "\n"; - - output_stream <<"\t\t\ttwist_begin\t" << getTwistBegin() << "\n"; - output_stream <<"\t\t\tradius_offset\t" << getRadiusOffset() << "\n"; - output_stream <<"\t\t\ttaper_x\t" << getTaperX() << "\n"; - output_stream <<"\t\t\ttaper_y\t" << getTaperY() << "\n"; - output_stream <<"\t\t\trevolutions\t" << getRevolutions() << "\n"; - output_stream <<"\t\t\tskew\t" << getSkew() << "\n"; - - output_stream << "\t\t}\n"; - return TRUE; -} - -LLSD LLPathParams::asLLSD() const -{ - LLSD sd = LLSD(); - sd["curve"] = getCurveType(); - sd["begin"] = getBegin(); - sd["end"] = getEnd(); - sd["scale_x"] = getScaleX(); - sd["scale_y"] = getScaleY(); - sd["shear_x"] = getShearX(); - sd["shear_y"] = getShearY(); - sd["twist"] = getTwist(); - sd["twist_begin"] = getTwistBegin(); - sd["radius_offset"] = getRadiusOffset(); - sd["taper_x"] = getTaperX(); - sd["taper_y"] = getTaperY(); - sd["revolutions"] = getRevolutions(); - sd["skew"] = getSkew(); - - return sd; -} - -bool LLPathParams::fromLLSD(LLSD& sd) -{ - setCurveType(sd["curve"].asInteger()); - setBegin((F32)sd["begin"].asReal()); - setEnd((F32)sd["end"].asReal()); - setScaleX((F32)sd["scale_x"].asReal()); - setScaleY((F32)sd["scale_y"].asReal()); - setShearX((F32)sd["shear_x"].asReal()); - setShearY((F32)sd["shear_y"].asReal()); - setTwist((F32)sd["twist"].asReal()); - setTwistBegin((F32)sd["twist_begin"].asReal()); - setRadiusOffset((F32)sd["radius_offset"].asReal()); - setTaperX((F32)sd["taper_x"].asReal()); - setTaperY((F32)sd["taper_y"].asReal()); - setRevolutions((F32)sd["revolutions"].asReal()); - setSkew((F32)sd["skew"].asReal()); - return true; -} - -void LLPathParams::copyParams(const LLPathParams ¶ms) -{ - setCurveType(params.getCurveType()); - setBegin(params.getBegin()); - setEnd(params.getEnd()); - setScale(params.getScaleX(), params.getScaleY() ); - setShear(params.getShearX(), params.getShearY() ); - setTwist(params.getTwist()); - setTwistBegin(params.getTwistBegin()); - setRadiusOffset(params.getRadiusOffset()); - setTaper( params.getTaperX(), params.getTaperY() ); - setRevolutions(params.getRevolutions()); - setSkew(params.getSkew()); -} - -S32 profile_delete_lock = 1 ; -LLProfile::~LLProfile() -{ - if(profile_delete_lock) - { - llerrs << "LLProfile should not be deleted here!" << llendl ; - } -} - - -S32 LLVolume::sNumMeshPoints = 0; - -LLVolume::LLVolume(const LLVolumeParams ¶ms, const F32 detail, const BOOL generate_single_face, const BOOL is_unique) - : mParams(params) -{ - LLMemType m1(LLMemType::MTYPE_VOLUME); - - mUnique = is_unique; - mFaceMask = 0x0; - mDetail = detail; - mSculptLevel = -2; - mIsTetrahedron = FALSE; - mLODScaleBias.setVec(1,1,1); - mHullPoints = NULL; - mHullIndices = NULL; - mNumHullPoints = 0; - mNumHullIndices = 0; - - // set defaults - if (mParams.getPathParams().getCurveType() == LL_PCODE_PATH_FLEXIBLE) - { - mPathp = new LLDynamicPath(); - } - else - { - mPathp = new LLPath(); - } - mProfilep = new LLProfile(); - - mGenerateSingleFace = generate_single_face; - - generate(); - - if (mParams.getSculptID().isNull() && mParams.getSculptType() == LL_SCULPT_TYPE_NONE) - { - createVolumeFaces(); - } -} - -void LLVolume::resizePath(S32 length) -{ - mPathp->resizePath(length); - mVolumeFaces.clear(); -} - -void LLVolume::regen() -{ - generate(); - createVolumeFaces(); -} - -void LLVolume::genBinormals(S32 face) -{ - mVolumeFaces[face].createBinormals(); -} - -LLVolume::~LLVolume() -{ - sNumMeshPoints -= mMesh.size(); - delete mPathp; - - profile_delete_lock = 0 ; - delete mProfilep; - profile_delete_lock = 1 ; - - mPathp = NULL; - mProfilep = NULL; - mVolumeFaces.clear(); - - free(mHullPoints); - mHullPoints = NULL; - free(mHullIndices); - mHullIndices = NULL; -} - -BOOL LLVolume::generate() -{ - LLMemType m1(LLMemType::MTYPE_VOLUME); - llassert_always(mProfilep); - - //Added 10.03.05 Dave Parks - // Split is a parameter to LLProfile::generate that tesselates edges on the profile - // to prevent lighting and texture interpolation errors on triangles that are - // stretched due to twisting or scaling on the path. - S32 split = (S32) ((mDetail)*0.66f); - - if (mParams.getPathParams().getCurveType() == LL_PCODE_PATH_LINE && - (mParams.getPathParams().getScale().mV[0] != 1.0f || - mParams.getPathParams().getScale().mV[1] != 1.0f) && - (mParams.getProfileParams().getCurveType() == LL_PCODE_PROFILE_SQUARE || - mParams.getProfileParams().getCurveType() == LL_PCODE_PROFILE_ISOTRI || - mParams.getProfileParams().getCurveType() == LL_PCODE_PROFILE_EQUALTRI || - mParams.getProfileParams().getCurveType() == LL_PCODE_PROFILE_RIGHTTRI)) - { - split = 0; - } - - mLODScaleBias.setVec(0.5f, 0.5f, 0.5f); - - F32 profile_detail = mDetail; - F32 path_detail = mDetail; - - U8 path_type = mParams.getPathParams().getCurveType(); - U8 profile_type = mParams.getProfileParams().getCurveType(); - - if (path_type == LL_PCODE_PATH_LINE && profile_type == LL_PCODE_PROFILE_CIRCLE) - { //cylinders don't care about Z-Axis - mLODScaleBias.setVec(0.6f, 0.6f, 0.0f); - } - else if (path_type == LL_PCODE_PATH_CIRCLE) - { - mLODScaleBias.setVec(0.6f, 0.6f, 0.6f); - } - - //******************************************************************** - //debug info, to be removed - if((U32)(mPathp->mPath.size() * mProfilep->mProfile.size()) > (1u << 20)) - { - llinfos << "sizeS: " << mPathp->mPath.size() << " sizeT: " << mProfilep->mProfile.size() << llendl ; - llinfos << "path_detail : " << path_detail << " split: " << split << " profile_detail: " << profile_detail << llendl ; - llinfos << mParams << llendl ; - llinfos << "more info to check if mProfilep is deleted or not." << llendl ; - llinfos << mProfilep->mNormals.size() << " : " << mProfilep->mFaces.size() << " : " << mProfilep->mEdgeNormals.size() << " : " << mProfilep->mEdgeCenters.size() << llendl ; - - llerrs << "LLVolume corrupted!" << llendl ; - } - //******************************************************************** - - BOOL regenPath = mPathp->generate(mParams.getPathParams(), path_detail, split); - BOOL regenProf = mProfilep->generate(mParams.getProfileParams(), mPathp->isOpen(),profile_detail, split); - - if (regenPath || regenProf ) - { - S32 sizeS = mPathp->mPath.size(); - S32 sizeT = mProfilep->mProfile.size(); - - //******************************************************************** - //debug info, to be removed - if((U32)(sizeS * sizeT) > (1u << 20)) - { - llinfos << "regenPath: " << (S32)regenPath << " regenProf: " << (S32)regenProf << llendl ; - llinfos << "sizeS: " << sizeS << " sizeT: " << sizeT << llendl ; - llinfos << "path_detail : " << path_detail << " split: " << split << " profile_detail: " << profile_detail << llendl ; - llinfos << mParams << llendl ; - llinfos << "more info to check if mProfilep is deleted or not." << llendl ; - llinfos << mProfilep->mNormals.size() << " : " << mProfilep->mFaces.size() << " : " << mProfilep->mEdgeNormals.size() << " : " << mProfilep->mEdgeCenters.size() << llendl ; - - llerrs << "LLVolume corrupted!" << llendl ; - } - //******************************************************************** - - sNumMeshPoints -= mMesh.size(); - mMesh.resize(sizeT * sizeS); - sNumMeshPoints += mMesh.size(); - - //generate vertex positions - - // Run along the path. - for (S32 s = 0; s < sizeS; ++s) - { - LLVector2 scale = mPathp->mPath[s].mScale; - LLQuaternion rot = mPathp->mPath[s].mRot; - - // Run along the profile. - for (S32 t = 0; t < sizeT; ++t) - { - S32 m = s*sizeT + t; - Point& pt = mMesh[m]; - - pt.mPos.mV[0] = mProfilep->mProfile[t].mV[0] * scale.mV[0]; - pt.mPos.mV[1] = mProfilep->mProfile[t].mV[1] * scale.mV[1]; - pt.mPos.mV[2] = 0.0f; - pt.mPos = pt.mPos * rot; - pt.mPos += mPathp->mPath[s].mPos; - } - } - - for (std::vector<LLProfile::Face>::iterator iter = mProfilep->mFaces.begin(); - iter != mProfilep->mFaces.end(); ++iter) - { - LLFaceID id = iter->mFaceID; - mFaceMask |= id; - } - - return TRUE; - } - return FALSE; -} - -void LLVolumeFace::VertexData::init() -{ - if (!mData) - { - mData = (LLVector4a*) malloc(sizeof(LLVector4a)*2); - } -} - -LLVolumeFace::VertexData::VertexData() -{ - mData = NULL; - init(); -} - -LLVolumeFace::VertexData::VertexData(const VertexData& rhs) -{ - mData = NULL; - *this = rhs; -} - -const LLVolumeFace::VertexData& LLVolumeFace::VertexData::operator=(const LLVolumeFace::VertexData& rhs) -{ - if (this != &rhs) - { - init(); - LLVector4a::memcpyNonAliased16((F32*) mData, (F32*) rhs.mData, 2*sizeof(LLVector4a)); - mTexCoord = rhs.mTexCoord; - } - return *this; -} - -LLVolumeFace::VertexData::~VertexData() -{ - free(mData); - mData = NULL; -} - -LLVector4a& LLVolumeFace::VertexData::getPosition() -{ - return mData[POSITION]; -} - -LLVector4a& LLVolumeFace::VertexData::getNormal() -{ - return mData[NORMAL]; -} - -const LLVector4a& LLVolumeFace::VertexData::getPosition() const -{ - return mData[POSITION]; -} - -const LLVector4a& LLVolumeFace::VertexData::getNormal() const -{ - return mData[NORMAL]; -} - - -void LLVolumeFace::VertexData::setPosition(const LLVector4a& pos) -{ - mData[POSITION] = pos; -} - -void LLVolumeFace::VertexData::setNormal(const LLVector4a& norm) -{ - mData[NORMAL] = norm; -} - -bool LLVolumeFace::VertexData::operator<(const LLVolumeFace::VertexData& rhs)const -{ - const F32* lp = this->getPosition().getF32ptr(); - const F32* rp = rhs.getPosition().getF32ptr(); - - if (lp[0] != rp[0]) - { - return lp[0] < rp[0]; - } - - if (rp[1] != lp[1]) - { - return lp[1] < rp[1]; - } - - if (rp[2] != lp[2]) - { - return lp[2] < rp[2]; - } - - lp = getNormal().getF32ptr(); - rp = rhs.getNormal().getF32ptr(); - - if (lp[0] != rp[0]) - { - return lp[0] < rp[0]; - } - - if (rp[1] != lp[1]) - { - return lp[1] < rp[1]; - } - - if (rp[2] != lp[2]) - { - return lp[2] < rp[2]; - } - - if (mTexCoord.mV[0] != rhs.mTexCoord.mV[0]) - { - return mTexCoord.mV[0] < rhs.mTexCoord.mV[0]; - } - - return mTexCoord.mV[1] < rhs.mTexCoord.mV[1]; -} - -bool LLVolumeFace::VertexData::operator==(const LLVolumeFace::VertexData& rhs)const -{ - return mData[POSITION].equals3(rhs.getPosition()) && - mData[NORMAL].equals3(rhs.getNormal()) && - mTexCoord == rhs.mTexCoord; -} - -bool LLVolumeFace::VertexData::compareNormal(const LLVolumeFace::VertexData& rhs, F32 angle_cutoff) const -{ - bool retval = false; - if (rhs.mData[POSITION].equals3(mData[POSITION]) && rhs.mTexCoord == mTexCoord) - { - if (angle_cutoff > 1.f) - { - retval = (mData[NORMAL].equals3(rhs.mData[NORMAL])); - } - else - { - F32 cur_angle = rhs.mData[NORMAL].dot3(mData[NORMAL]).getF32(); - retval = cur_angle > angle_cutoff; - } - } - - return retval; -} - -bool LLVolume::unpackVolumeFaces(std::istream& is, S32 size) -{ - //input stream is now pointing at a zlib compressed block of LLSD - //decompress block - LLSD mdl; - if (!unzip_llsd(mdl, is, size)) - { - llwarns << "not a valid mesh asset!" << llendl; - return false; - } - - { - U32 face_count = mdl.size(); - - if (face_count == 0) - { - llerrs << "WTF?" << llendl; - } - - mVolumeFaces.resize(face_count); - - for (U32 i = 0; i < face_count; ++i) - { - LLSD::Binary pos = mdl[i]["Position"]; - LLSD::Binary norm = mdl[i]["Normal"]; - LLSD::Binary tc = mdl[i]["TexCoord0"]; - LLSD::Binary idx = mdl[i]["TriangleList"]; - - LLVolumeFace& face = mVolumeFaces[i]; - - //copy out indices - face.resizeIndices(idx.size()/2); - - if (idx.empty() || face.mNumIndices < 3) - { //why is there an empty index list? - llerrs <<"WTF?" << llendl; - continue; - } - - U16* indices = (U16*) &(idx[0]); - for (U32 j = 0; j < idx.size()/2; ++j) - { - face.mIndices[j] = indices[j]; - } - - //copy out vertices - U32 num_verts = pos.size()/(3*2); - face.resizeVertices(num_verts); - - if (mdl[i].has("Weights")) - { - face.allocateWeights(num_verts); - - LLSD::Binary weights = mdl[i]["Weights"]; - - U32 idx = 0; - - U32 cur_vertex = 0; - while (idx < weights.size() && cur_vertex < num_verts) - { - const U8 END_INFLUENCES = 0xFF; - U8 joint = weights[idx++]; - - U32 cur_influence = 0; - LLVector4 wght(0,0,0,0); - - while (joint != END_INFLUENCES && idx < weights.size()) - { - U16 influence = weights[idx++]; - influence |= ((U16) weights[idx++] << 8); - - F32 w = llclamp((F32) influence / 65535.f, 0.f, 0.99999f); - wght.mV[cur_influence++] = (F32) joint + w; - - if (cur_influence >= 4) - { - joint = END_INFLUENCES; - } - else - { - joint = weights[idx++]; - } - } - - face.mWeights[cur_vertex].loadua(wght.mV); - - cur_vertex++; - } - - if (cur_vertex != num_verts || idx != weights.size()) - { - llwarns << "Vertex weight count does not match vertex count!" << llendl; - } - - } - - LLVector3 minp; - LLVector3 maxp; - LLVector2 min_tc; - LLVector2 max_tc; - - minp.setValue(mdl[i]["PositionDomain"]["Min"]); - maxp.setValue(mdl[i]["PositionDomain"]["Max"]); - LLVector4a min_pos, max_pos; - min_pos.load3(minp.mV); - max_pos.load3(maxp.mV); - - min_tc.setValue(mdl[i]["TexCoord0Domain"]["Min"]); - max_tc.setValue(mdl[i]["TexCoord0Domain"]["Max"]); - - LLVector4a pos_range; - pos_range.setSub(max_pos, min_pos); - LLVector2 tc_range = max_tc - min_tc; - - LLVector4a* pos_out = face.mPositions; - LLVector4a* norm_out = face.mNormals; - LLVector2* tc_out = face.mTexCoords; - - for (U32 j = 0; j < num_verts; ++j) - { - U16* v = (U16*) &(pos[j*3*2]); - - pos_out->set((F32) v[0], (F32) v[1], (F32) v[2]); - pos_out->div(65535.f); - pos_out->mul(pos_range); - pos_out->add(min_pos); - - pos_out++; - - U16* n = (U16*) &(norm[j*3*2]); - - norm_out->set((F32) n[0], (F32) n[1], (F32) n[2]); - norm_out->div(65535.f); - norm_out->mul(2.f); - norm_out->sub(1.f); - norm_out++; - - U16* t = (U16*) &(tc[j*2*2]); - - tc_out->mV[0] = (F32) t[0] / 65535.f * tc_range.mV[0] + min_tc.mV[0]; - tc_out->mV[1] = (F32) t[1] / 65535.f * tc_range.mV[1] + min_tc.mV[1]; - - tc_out++; - } - - - // modifier flags? - bool do_mirror = (mParams.getSculptType() & LL_SCULPT_FLAG_MIRROR); - bool do_invert = (mParams.getSculptType() &LL_SCULPT_FLAG_INVERT); - - - // translate to actions: - bool do_reflect_x = false; - bool do_reverse_triangles = false; - bool do_invert_normals = false; - - if (do_mirror) - { - do_reflect_x = true; - do_reverse_triangles = !do_reverse_triangles; - } - - if (do_invert) - { - do_invert_normals = true; - do_reverse_triangles = !do_reverse_triangles; - } - - // now do the work - - if (do_reflect_x) - { - LLVector4a* p = (LLVector4a*) face.mPositions; - LLVector4a* n = (LLVector4a*) face.mNormals; - - for (S32 i = 0; i < face.mNumVertices; i++) - { - p[i].mul(-1.0f); - n[i].mul(-1.0f); - } - } - - if (do_invert_normals) - { - LLVector4a* n = (LLVector4a*) face.mNormals; - - for (S32 i = 0; i < face.mNumVertices; i++) - { - n[i].mul(-1.0f); - } - } - - if (do_reverse_triangles) - { - for (U32 j = 0; j < face.mNumIndices; j += 3) - { - // swap the 2nd and 3rd index - S32 swap = face.mIndices[j+1]; - face.mIndices[j+1] = face.mIndices[j+2]; - face.mIndices[j+2] = swap; - } - } - - //calculate bounding box - LLVector4a& min = face.mExtents[0]; - LLVector4a& max = face.mExtents[1]; - - min.clear(); - max.clear(); - min = max = face.mPositions[0]; - - for (S32 i = 1; i < face.mNumVertices; ++i) - { - min.setMin(min, face.mPositions[i]); - max.setMax(max, face.mPositions[i]); - } - } - } - - mSculptLevel = 0; // success! - - cacheOptimize(); - - return true; -} - -void tetrahedron_set_normal(LLVolumeFace::VertexData* cv) -{ - LLVector4a v0; - v0.setSub(cv[1].getPosition(), cv[0].getNormal()); - LLVector4a v1; - v1.setSub(cv[2].getNormal(), cv[0].getPosition()); - - cv[0].getNormal().setCross3(v0,v1); - cv[0].getNormal().normalize3fast(); - cv[1].setNormal(cv[0].getNormal()); - cv[2].setNormal(cv[1].getNormal()); -} - -BOOL LLVolume::isTetrahedron() -{ - return mIsTetrahedron; -} - -void LLVolume::makeTetrahedron() -{ - mVolumeFaces.clear(); - - LLVolumeFace face; - - F32 x = 0.25f; - LLVector4a p[] = - { //unit tetrahedron corners - LLVector4a(x,x,x), - LLVector4a(-x,-x,x), - LLVector4a(-x,x,-x), - LLVector4a(x,-x,-x) - }; - - face.mExtents[0].splat(-x); - face.mExtents[1].splat(x); - - LLVolumeFace::VertexData cv[3]; - - //set texture coordinates - cv[0].mTexCoord = LLVector2(0,0); - cv[1].mTexCoord = LLVector2(1,0); - cv[2].mTexCoord = LLVector2(0.5f, 0.5f*F_SQRT3); - - - //side 1 - cv[0].setPosition(p[1]); - cv[1].setPosition(p[0]); - cv[2].setPosition(p[2]); - - tetrahedron_set_normal(cv); - - face.resizeVertices(12); - face.resizeIndices(12); - - LLVector4a* v = (LLVector4a*) face.mPositions; - LLVector4a* n = (LLVector4a*) face.mNormals; - LLVector2* tc = (LLVector2*) face.mTexCoords; - - v[0] = cv[0].getPosition(); - v[1] = cv[1].getPosition(); - v[2] = cv[2].getPosition(); - v += 3; - - n[0] = cv[0].getNormal(); - n[1] = cv[1].getNormal(); - n[2] = cv[2].getNormal(); - n += 3; - - tc[0] = cv[0].mTexCoord; - tc[1] = cv[1].mTexCoord; - tc[2] = cv[2].mTexCoord; - tc += 3; - - - //side 2 - cv[0].setPosition(p[3]); - cv[1].setPosition(p[0]); - cv[2].setPosition(p[1]); - - tetrahedron_set_normal(cv); - - v[0] = cv[0].getPosition(); - v[1] = cv[1].getPosition(); - v[2] = cv[2].getPosition(); - v += 3; - - n[0] = cv[0].getNormal(); - n[1] = cv[1].getNormal(); - n[2] = cv[2].getNormal(); - n += 3; - - tc[0] = cv[0].mTexCoord; - tc[1] = cv[1].mTexCoord; - tc[2] = cv[2].mTexCoord; - tc += 3; - - //side 3 - cv[0].setPosition(p[3]); - cv[1].setPosition(p[1]); - cv[2].setPosition(p[2]); - - tetrahedron_set_normal(cv); - - v[0] = cv[0].getPosition(); - v[1] = cv[1].getPosition(); - v[2] = cv[2].getPosition(); - v += 3; - - n[0] = cv[0].getNormal(); - n[1] = cv[1].getNormal(); - n[2] = cv[2].getNormal(); - n += 3; - - tc[0] = cv[0].mTexCoord; - tc[1] = cv[1].mTexCoord; - tc[2] = cv[2].mTexCoord; - tc += 3; - - //side 4 - cv[0].setPosition(p[2]); - cv[1].setPosition(p[0]); - cv[2].setPosition(p[3]); - - tetrahedron_set_normal(cv); - - v[0] = cv[0].getPosition(); - v[1] = cv[1].getPosition(); - v[2] = cv[2].getPosition(); - v += 3; - - n[0] = cv[0].getNormal(); - n[1] = cv[1].getNormal(); - n[2] = cv[2].getNormal(); - n += 3; - - tc[0] = cv[0].mTexCoord; - tc[1] = cv[1].mTexCoord; - tc[2] = cv[2].mTexCoord; - tc += 3; - - //set index buffer - for (U16 i = 0; i < 12; i++) - { - face.mIndices[i] = i; - } - - mVolumeFaces.push_back(face); - mSculptLevel = 0; - mIsTetrahedron = TRUE; -} - -void LLVolume::copyVolumeFaces(const LLVolume* volume) -{ - mVolumeFaces = volume->mVolumeFaces; - mSculptLevel = 0; - mIsTetrahedron = FALSE; -} - -void LLVolume::cacheOptimize() -{ - for (S32 i = 0; i < mVolumeFaces.size(); ++i) - { - mVolumeFaces[i].cacheOptimize(); - } -} - - -S32 LLVolume::getNumFaces() const -{ - U8 sculpt_type = (mParams.getSculptType() & LL_SCULPT_TYPE_MASK); - - if (sculpt_type == LL_SCULPT_TYPE_MESH) - { - return LL_SCULPT_MESH_MAX_FACES; - } - - return (S32)mProfilep->mFaces.size(); -} - - -void LLVolume::createVolumeFaces() -{ - LLMemType m1(LLMemType::MTYPE_VOLUME); - - if (mGenerateSingleFace) - { - // do nothing - } - else - { - S32 num_faces = getNumFaces(); - BOOL partial_build = TRUE; - if (num_faces != mVolumeFaces.size()) - { - partial_build = FALSE; - mVolumeFaces.resize(num_faces); - } - // Initialize volume faces with parameter data - for (S32 i = 0; i < (S32)mVolumeFaces.size(); i++) - { - LLVolumeFace& vf = mVolumeFaces[i]; - LLProfile::Face& face = mProfilep->mFaces[i]; - vf.mBeginS = face.mIndex; - vf.mNumS = face.mCount; - if (vf.mNumS < 0) - { - llerrs << "Volume face corruption detected." << llendl; - } - - vf.mBeginT = 0; - vf.mNumT= getPath().mPath.size(); - vf.mID = i; - - // Set the type mask bits correctly - if (mParams.getProfileParams().getHollow() > 0) - { - vf.mTypeMask |= LLVolumeFace::HOLLOW_MASK; - } - if (mProfilep->isOpen()) - { - vf.mTypeMask |= LLVolumeFace::OPEN_MASK; - } - if (face.mCap) - { - vf.mTypeMask |= LLVolumeFace::CAP_MASK; - if (face.mFaceID == LL_FACE_PATH_BEGIN) - { - vf.mTypeMask |= LLVolumeFace::TOP_MASK; - } - else - { - llassert(face.mFaceID == LL_FACE_PATH_END); - vf.mTypeMask |= LLVolumeFace::BOTTOM_MASK; - } - } - else if (face.mFaceID & (LL_FACE_PROFILE_BEGIN | LL_FACE_PROFILE_END)) - { - vf.mTypeMask |= LLVolumeFace::FLAT_MASK | LLVolumeFace::END_MASK; - } - else - { - vf.mTypeMask |= LLVolumeFace::SIDE_MASK; - if (face.mFlat) - { - vf.mTypeMask |= LLVolumeFace::FLAT_MASK; - } - if (face.mFaceID & LL_FACE_INNER_SIDE) - { - vf.mTypeMask |= LLVolumeFace::INNER_MASK; - if (face.mFlat && vf.mNumS > 2) - { //flat inner faces have to copy vert normals - vf.mNumS = vf.mNumS*2; - if (vf.mNumS < 0) - { - llerrs << "Volume face corruption detected." << llendl; - } - } - } - else - { - vf.mTypeMask |= LLVolumeFace::OUTER_MASK; - } - } - } - - for (face_list_t::iterator iter = mVolumeFaces.begin(); - iter != mVolumeFaces.end(); ++iter) - { - (*iter).create(this, partial_build); - } - } -} - - -inline LLVector3 sculpt_rgb_to_vector(U8 r, U8 g, U8 b) -{ - // maps RGB values to vector values [0..255] -> [-0.5..0.5] - LLVector3 value; - value.mV[VX] = r / 255.f - 0.5f; - value.mV[VY] = g / 255.f - 0.5f; - value.mV[VZ] = b / 255.f - 0.5f; - - return value; -} - -inline U32 sculpt_xy_to_index(U32 x, U32 y, U16 sculpt_width, U16 sculpt_height, S8 sculpt_components) -{ - U32 index = (x + y * sculpt_width) * sculpt_components; - return index; -} - - -inline U32 sculpt_st_to_index(S32 s, S32 t, S32 size_s, S32 size_t, U16 sculpt_width, U16 sculpt_height, S8 sculpt_components) -{ - U32 x = (U32) ((F32)s/(size_s) * (F32) sculpt_width); - U32 y = (U32) ((F32)t/(size_t) * (F32) sculpt_height); - - return sculpt_xy_to_index(x, y, sculpt_width, sculpt_height, sculpt_components); -} - - -inline LLVector3 sculpt_index_to_vector(U32 index, const U8* sculpt_data) -{ - LLVector3 v = sculpt_rgb_to_vector(sculpt_data[index], sculpt_data[index+1], sculpt_data[index+2]); - - return v; -} - -inline LLVector3 sculpt_st_to_vector(S32 s, S32 t, S32 size_s, S32 size_t, U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data) -{ - U32 index = sculpt_st_to_index(s, t, size_s, size_t, sculpt_width, sculpt_height, sculpt_components); - - return sculpt_index_to_vector(index, sculpt_data); -} - -inline LLVector3 sculpt_xy_to_vector(U32 x, U32 y, U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data) -{ - U32 index = sculpt_xy_to_index(x, y, sculpt_width, sculpt_height, sculpt_components); - - return sculpt_index_to_vector(index, sculpt_data); -} - - -F32 LLVolume::sculptGetSurfaceArea() -{ - // test to see if image has enough variation to create non-degenerate geometry - - F32 area = 0; - - S32 sizeS = mPathp->mPath.size(); - S32 sizeT = mProfilep->mProfile.size(); - - for (S32 s = 0; s < sizeS-1; s++) - { - for (S32 t = 0; t < sizeT-1; t++) - { - // get four corners of quad - LLVector3 p1 = mMesh[(s )*sizeT + (t )].mPos; - LLVector3 p2 = mMesh[(s+1)*sizeT + (t )].mPos; - LLVector3 p3 = mMesh[(s )*sizeT + (t+1)].mPos; - LLVector3 p4 = mMesh[(s+1)*sizeT + (t+1)].mPos; - - // compute the area of the quad by taking the length of the cross product of the two triangles - LLVector3 cross1 = (p1 - p2) % (p1 - p3); - LLVector3 cross2 = (p4 - p2) % (p4 - p3); - area += (cross1.magVec() + cross2.magVec()) / 2.0; - } - } - - return area; -} - -// create placeholder shape -void LLVolume::sculptGeneratePlaceholder() -{ - LLMemType m1(LLMemType::MTYPE_VOLUME); - - S32 sizeS = mPathp->mPath.size(); - S32 sizeT = mProfilep->mProfile.size(); - - S32 line = 0; - - // for now, this is a sphere. - for (S32 s = 0; s < sizeS; s++) - { - for (S32 t = 0; t < sizeT; t++) - { - S32 i = t + line; - Point& pt = mMesh[i]; - - - F32 u = (F32)s/(sizeS-1); - F32 v = (F32)t/(sizeT-1); - - const F32 RADIUS = (F32) 0.3; - - pt.mPos.mV[0] = (F32)(sin(F_PI * v) * cos(2.0 * F_PI * u) * RADIUS); - pt.mPos.mV[1] = (F32)(sin(F_PI * v) * sin(2.0 * F_PI * u) * RADIUS); - pt.mPos.mV[2] = (F32)(cos(F_PI * v) * RADIUS); - - } - line += sizeT; - } -} - -// create the vertices from the map -void LLVolume::sculptGenerateMapVertices(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data, U8 sculpt_type) -{ - U8 sculpt_stitching = sculpt_type & LL_SCULPT_TYPE_MASK; - BOOL sculpt_invert = sculpt_type & LL_SCULPT_FLAG_INVERT; - BOOL sculpt_mirror = sculpt_type & LL_SCULPT_FLAG_MIRROR; - BOOL reverse_horizontal = (sculpt_invert ? !sculpt_mirror : sculpt_mirror); // XOR - - - LLMemType m1(LLMemType::MTYPE_VOLUME); - - S32 sizeS = mPathp->mPath.size(); - S32 sizeT = mProfilep->mProfile.size(); - - S32 line = 0; - for (S32 s = 0; s < sizeS; s++) - { - // Run along the profile. - for (S32 t = 0; t < sizeT; t++) - { - S32 i = t + line; - Point& pt = mMesh[i]; - - S32 reversed_t = t; - - if (reverse_horizontal) - { - reversed_t = sizeT - t - 1; - } - - U32 x = (U32) ((F32)reversed_t/(sizeT-1) * (F32) sculpt_width); - U32 y = (U32) ((F32)s/(sizeS-1) * (F32) sculpt_height); - - - if (y == 0) // top row stitching - { - // pinch? - if (sculpt_stitching == LL_SCULPT_TYPE_SPHERE) - { - x = sculpt_width / 2; - } - } - - if (y == sculpt_height) // bottom row stitching - { - // wrap? - if (sculpt_stitching == LL_SCULPT_TYPE_TORUS) - { - y = 0; - } - else - { - y = sculpt_height - 1; - } - - // pinch? - if (sculpt_stitching == LL_SCULPT_TYPE_SPHERE) - { - x = sculpt_width / 2; - } - } - - if (x == sculpt_width) // side stitching - { - // wrap? - if ((sculpt_stitching == LL_SCULPT_TYPE_SPHERE) || - (sculpt_stitching == LL_SCULPT_TYPE_TORUS) || - (sculpt_stitching == LL_SCULPT_TYPE_CYLINDER)) - { - x = 0; - } - - else - { - x = sculpt_width - 1; - } - } - - pt.mPos = sculpt_xy_to_vector(x, y, sculpt_width, sculpt_height, sculpt_components, sculpt_data); - - if (sculpt_mirror) - { - pt.mPos.mV[VX] *= -1.f; - } - } - - line += sizeT; - } -} - - -const S32 SCULPT_REZ_1 = 6; // changed from 4 to 6 - 6 looks round whereas 4 looks square -const S32 SCULPT_REZ_2 = 8; -const S32 SCULPT_REZ_3 = 16; -const S32 SCULPT_REZ_4 = 32; - -S32 sculpt_sides(F32 detail) -{ - - // detail is usually one of: 1, 1.5, 2.5, 4.0. - - if (detail <= 1.0) - { - return SCULPT_REZ_1; - } - if (detail <= 2.0) - { - return SCULPT_REZ_2; - } - if (detail <= 3.0) - { - return SCULPT_REZ_3; - } - else - { - return SCULPT_REZ_4; - } -} - - - -// determine the number of vertices in both s and t direction for this sculpt -void sculpt_calc_mesh_resolution(U16 width, U16 height, U8 type, F32 detail, S32& s, S32& t) -{ - // this code has the following properties: - // 1) the aspect ratio of the mesh is as close as possible to the ratio of the map - // while still using all available verts - // 2) the mesh cannot have more verts than is allowed by LOD - // 3) the mesh cannot have more verts than is allowed by the map - - S32 max_vertices_lod = (S32)pow((double)sculpt_sides(detail), 2.0); - S32 max_vertices_map = width * height / 4; - - S32 vertices; - if (max_vertices_map > 0) - vertices = llmin(max_vertices_lod, max_vertices_map); - else - vertices = max_vertices_lod; - - - F32 ratio; - if ((width == 0) || (height == 0)) - ratio = 1.f; - else - ratio = (F32) width / (F32) height; - - - s = (S32)(F32) sqrt(((F32)vertices / ratio)); - - s = llmax(s, 4); // no degenerate sizes, please - t = vertices / s; - - t = llmax(t, 4); // no degenerate sizes, please - s = vertices / t; -} - -// sculpt replaces generate() for sculpted surfaces -void LLVolume::sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data, S32 sculpt_level) -{ - LLMemType m1(LLMemType::MTYPE_VOLUME); - U8 sculpt_type = mParams.getSculptType(); - - BOOL data_is_empty = FALSE; - - if (sculpt_width == 0 || sculpt_height == 0 || sculpt_components < 3 || sculpt_data == NULL) - { - sculpt_level = -1; - data_is_empty = TRUE; - } - - S32 requested_sizeS = 0; - S32 requested_sizeT = 0; - - sculpt_calc_mesh_resolution(sculpt_width, sculpt_height, sculpt_type, mDetail, requested_sizeS, requested_sizeT); - - mPathp->generate(mParams.getPathParams(), mDetail, 0, TRUE, requested_sizeS); - mProfilep->generate(mParams.getProfileParams(), mPathp->isOpen(), mDetail, 0, TRUE, requested_sizeT); - - S32 sizeS = mPathp->mPath.size(); // we requested a specific size, now see what we really got - S32 sizeT = mProfilep->mProfile.size(); // we requested a specific size, now see what we really got - - // weird crash bug - DEV-11158 - trying to collect more data: - if ((sizeS == 0) || (sizeT == 0)) - { - llwarns << "sculpt bad mesh size " << sizeS << " " << sizeT << llendl; - } - - sNumMeshPoints -= mMesh.size(); - mMesh.resize(sizeS * sizeT); - sNumMeshPoints += mMesh.size(); - - //generate vertex positions - if (!data_is_empty) - { - sculptGenerateMapVertices(sculpt_width, sculpt_height, sculpt_components, sculpt_data, sculpt_type); - - // don't test lowest LOD to support legacy content DEV-33670 - if (mDetail > SCULPT_MIN_AREA_DETAIL) - { - if (sculptGetSurfaceArea() < SCULPT_MIN_AREA) - { - data_is_empty = TRUE; - } - } - } - - if (data_is_empty) - { - sculptGeneratePlaceholder(); - } - - - - for (S32 i = 0; i < (S32)mProfilep->mFaces.size(); i++) - { - mFaceMask |= mProfilep->mFaces[i].mFaceID; - } - - mSculptLevel = sculpt_level; - - // Delete any existing faces so that they get regenerated - mVolumeFaces.clear(); - - createVolumeFaces(); -} - - - - -BOOL LLVolume::isCap(S32 face) -{ - return mProfilep->mFaces[face].mCap; -} - -BOOL LLVolume::isFlat(S32 face) -{ - return mProfilep->mFaces[face].mFlat; -} - - -bool LLVolumeParams::isSculpt() const -{ - return mSculptID.notNull(); -} - -bool LLVolumeParams::isMeshSculpt() const -{ - return isSculpt() && ((mSculptType & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH); -} - -bool LLVolumeParams::operator==(const LLVolumeParams ¶ms) const -{ - return ( (getPathParams() == params.getPathParams()) && - (getProfileParams() == params.getProfileParams()) && - (mSculptID == params.mSculptID) && - (mSculptType == params.mSculptType) ); -} - -bool LLVolumeParams::operator!=(const LLVolumeParams ¶ms) const -{ - return ( (getPathParams() != params.getPathParams()) || - (getProfileParams() != params.getProfileParams()) || - (mSculptID != params.mSculptID) || - (mSculptType != params.mSculptType) ); -} - -bool LLVolumeParams::operator<(const LLVolumeParams ¶ms) const -{ - if( getPathParams() != params.getPathParams() ) - { - return getPathParams() < params.getPathParams(); - } - - if (getProfileParams() != params.getProfileParams()) - { - return getProfileParams() < params.getProfileParams(); - } - - if (mSculptID != params.mSculptID) - { - return mSculptID < params.mSculptID; - } - - return mSculptType < params.mSculptType; - - -} - -void LLVolumeParams::copyParams(const LLVolumeParams ¶ms) -{ - LLMemType m1(LLMemType::MTYPE_VOLUME); - mProfileParams.copyParams(params.mProfileParams); - mPathParams.copyParams(params.mPathParams); - mSculptID = params.getSculptID(); - mSculptType = params.getSculptType(); -} - -// Less restricitve approx 0 for volumes -const F32 APPROXIMATELY_ZERO = 0.001f; -bool approx_zero( F32 f, F32 tolerance = APPROXIMATELY_ZERO) -{ - return (f >= -tolerance) && (f <= tolerance); -} - -// return true if in range (or nearly so) -static bool limit_range(F32& v, F32 min, F32 max, F32 tolerance = APPROXIMATELY_ZERO) -{ - F32 min_delta = v - min; - if (min_delta < 0.f) - { - v = min; - if (!approx_zero(min_delta, tolerance)) - return false; - } - F32 max_delta = max - v; - if (max_delta < 0.f) - { - v = max; - if (!approx_zero(max_delta, tolerance)) - return false; - } - return true; -} - -bool LLVolumeParams::setBeginAndEndS(const F32 b, const F32 e) -{ - bool valid = true; - - // First, clamp to valid ranges. - F32 begin = b; - valid &= limit_range(begin, 0.f, 1.f - MIN_CUT_DELTA); - - F32 end = e; - if (end >= .0149f && end < MIN_CUT_DELTA) end = MIN_CUT_DELTA; // eliminate warning for common rounding error - valid &= limit_range(end, MIN_CUT_DELTA, 1.f); - - valid &= limit_range(begin, 0.f, end - MIN_CUT_DELTA, .01f); - - // Now set them. - mProfileParams.setBegin(begin); - mProfileParams.setEnd(end); - - return valid; -} - -bool LLVolumeParams::setBeginAndEndT(const F32 b, const F32 e) -{ - bool valid = true; - - // First, clamp to valid ranges. - F32 begin = b; - valid &= limit_range(begin, 0.f, 1.f - MIN_CUT_DELTA); - - F32 end = e; - valid &= limit_range(end, MIN_CUT_DELTA, 1.f); - - valid &= limit_range(begin, 0.f, end - MIN_CUT_DELTA, .01f); - - // Now set them. - mPathParams.setBegin(begin); - mPathParams.setEnd(end); - - return valid; -} - -bool LLVolumeParams::setHollow(const F32 h) -{ - // Validate the hollow based on path and profile. - U8 profile = mProfileParams.getCurveType() & LL_PCODE_PROFILE_MASK; - U8 hole_type = mProfileParams.getCurveType() & LL_PCODE_HOLE_MASK; - - F32 max_hollow = HOLLOW_MAX; - - // Only square holes have trouble. - if (LL_PCODE_HOLE_SQUARE == hole_type) - { - switch(profile) - { - case LL_PCODE_PROFILE_CIRCLE: - case LL_PCODE_PROFILE_CIRCLE_HALF: - case LL_PCODE_PROFILE_EQUALTRI: - max_hollow = HOLLOW_MAX_SQUARE; - } - } - - F32 hollow = h; - bool valid = limit_range(hollow, HOLLOW_MIN, max_hollow); - mProfileParams.setHollow(hollow); - - return valid; -} - -bool LLVolumeParams::setTwistBegin(const F32 b) -{ - F32 twist_begin = b; - bool valid = limit_range(twist_begin, TWIST_MIN, TWIST_MAX); - mPathParams.setTwistBegin(twist_begin); - return valid; -} - -bool LLVolumeParams::setTwistEnd(const F32 e) -{ - F32 twist_end = e; - bool valid = limit_range(twist_end, TWIST_MIN, TWIST_MAX); - mPathParams.setTwistEnd(twist_end); - return valid; -} - -bool LLVolumeParams::setRatio(const F32 x, const F32 y) -{ - F32 min_x = RATIO_MIN; - F32 max_x = RATIO_MAX; - F32 min_y = RATIO_MIN; - F32 max_y = RATIO_MAX; - // If this is a circular path (and not a sphere) then 'ratio' is actually hole size. - U8 path_type = mPathParams.getCurveType(); - U8 profile_type = mProfileParams.getCurveType() & LL_PCODE_PROFILE_MASK; - if ( LL_PCODE_PATH_CIRCLE == path_type && - LL_PCODE_PROFILE_CIRCLE_HALF != profile_type) - { - // Holes are more restricted... - min_x = HOLE_X_MIN; - max_x = HOLE_X_MAX; - min_y = HOLE_Y_MIN; - max_y = HOLE_Y_MAX; - } - - F32 ratio_x = x; - bool valid = limit_range(ratio_x, min_x, max_x); - F32 ratio_y = y; - valid &= limit_range(ratio_y, min_y, max_y); - - mPathParams.setScale(ratio_x, ratio_y); - - return valid; -} - -bool LLVolumeParams::setShear(const F32 x, const F32 y) -{ - F32 shear_x = x; - bool valid = limit_range(shear_x, SHEAR_MIN, SHEAR_MAX); - F32 shear_y = y; - valid &= limit_range(shear_y, SHEAR_MIN, SHEAR_MAX); - mPathParams.setShear(shear_x, shear_y); - return valid; -} - -bool LLVolumeParams::setTaperX(const F32 v) -{ - F32 taper = v; - bool valid = limit_range(taper, TAPER_MIN, TAPER_MAX); - mPathParams.setTaperX(taper); - return valid; -} - -bool LLVolumeParams::setTaperY(const F32 v) -{ - F32 taper = v; - bool valid = limit_range(taper, TAPER_MIN, TAPER_MAX); - mPathParams.setTaperY(taper); - return valid; -} - -bool LLVolumeParams::setRevolutions(const F32 r) -{ - F32 revolutions = r; - bool valid = limit_range(revolutions, REV_MIN, REV_MAX); - mPathParams.setRevolutions(revolutions); - return valid; -} - -bool LLVolumeParams::setRadiusOffset(const F32 offset) -{ - bool valid = true; - - // If this is a sphere, just set it to 0 and get out. - U8 path_type = mPathParams.getCurveType(); - U8 profile_type = mProfileParams.getCurveType() & LL_PCODE_PROFILE_MASK; - if ( LL_PCODE_PROFILE_CIRCLE_HALF == profile_type || - LL_PCODE_PATH_CIRCLE != path_type ) - { - mPathParams.setRadiusOffset(0.f); - return true; - } - - // Limit radius offset, based on taper and hole size y. - F32 radius_offset = offset; - F32 taper_y = getTaperY(); - F32 radius_mag = fabs(radius_offset); - F32 hole_y_mag = fabs(getRatioY()); - F32 taper_y_mag = fabs(taper_y); - // Check to see if the taper effects us. - if ( (radius_offset > 0.f && taper_y < 0.f) || - (radius_offset < 0.f && taper_y > 0.f) ) - { - // The taper does not help increase the radius offset range. - taper_y_mag = 0.f; - } - F32 max_radius_mag = 1.f - hole_y_mag * (1.f - taper_y_mag) / (1.f - hole_y_mag); - - // Enforce the maximum magnitude. - F32 delta = max_radius_mag - radius_mag; - if (delta < 0.f) - { - // Check radius offset sign. - if (radius_offset < 0.f) - { - radius_offset = -max_radius_mag; - } - else - { - radius_offset = max_radius_mag; - } - valid = approx_zero(delta, .1f); - } - - mPathParams.setRadiusOffset(radius_offset); - return valid; -} - -bool LLVolumeParams::setSkew(const F32 skew_value) -{ - bool valid = true; - - // Check the skew value against the revolutions. - F32 skew = llclamp(skew_value, SKEW_MIN, SKEW_MAX); - F32 skew_mag = fabs(skew); - F32 revolutions = getRevolutions(); - F32 scale_x = getRatioX(); - F32 min_skew_mag = 1.0f - 1.0f / (revolutions * scale_x + 1.0f); - // Discontinuity; A revolution of 1 allows skews below 0.5. - if ( fabs(revolutions - 1.0f) < 0.001) - min_skew_mag = 0.0f; - - // Clip skew. - F32 delta = skew_mag - min_skew_mag; - if (delta < 0.f) - { - // Check skew sign. - if (skew < 0.0f) - { - skew = -min_skew_mag; - } - else - { - skew = min_skew_mag; - } - valid = approx_zero(delta, .01f); - } - - mPathParams.setSkew(skew); - return valid; -} - -bool LLVolumeParams::setSculptID(const LLUUID sculpt_id, U8 sculpt_type) -{ - mSculptID = sculpt_id; - mSculptType = sculpt_type; - return true; -} - -bool LLVolumeParams::setType(U8 profile, U8 path) -{ - bool result = true; - // First, check profile and path for validity. - U8 profile_type = profile & LL_PCODE_PROFILE_MASK; - U8 hole_type = (profile & LL_PCODE_HOLE_MASK) >> 4; - U8 path_type = path >> 4; - - if (profile_type > LL_PCODE_PROFILE_MAX) - { - // Bad profile. Make it square. - profile = LL_PCODE_PROFILE_SQUARE; - result = false; - llwarns << "LLVolumeParams::setType changing bad profile type (" << profile_type - << ") to be LL_PCODE_PROFILE_SQUARE" << llendl; - } - else if (hole_type > LL_PCODE_HOLE_MAX) - { - // Bad hole. Make it the same. - profile = profile_type; - result = false; - llwarns << "LLVolumeParams::setType changing bad hole type (" << hole_type - << ") to be LL_PCODE_HOLE_SAME" << llendl; - } - - if (path_type < LL_PCODE_PATH_MIN || - path_type > LL_PCODE_PATH_MAX) - { - // Bad path. Make it linear. - result = false; - llwarns << "LLVolumeParams::setType changing bad path (" << path - << ") to be LL_PCODE_PATH_LINE" << llendl; - path = LL_PCODE_PATH_LINE; - } - - mProfileParams.setCurveType(profile); - mPathParams.setCurveType(path); - return result; -} - -// static -bool LLVolumeParams::validate(U8 prof_curve, F32 prof_begin, F32 prof_end, F32 hollow, - U8 path_curve, F32 path_begin, F32 path_end, - F32 scx, F32 scy, F32 shx, F32 shy, - F32 twistend, F32 twistbegin, F32 radiusoffset, - F32 tx, F32 ty, F32 revolutions, F32 skew) -{ - LLVolumeParams test_params; - if (!test_params.setType (prof_curve, path_curve)) - { - return false; - } - if (!test_params.setBeginAndEndS (prof_begin, prof_end)) - { - return false; - } - if (!test_params.setBeginAndEndT (path_begin, path_end)) - { - return false; - } - if (!test_params.setHollow (hollow)) - { - return false; - } - if (!test_params.setTwistBegin (twistbegin)) - { - return false; - } - if (!test_params.setTwistEnd (twistend)) - { - return false; - } - if (!test_params.setRatio (scx, scy)) - { - return false; - } - if (!test_params.setShear (shx, shy)) - { - return false; - } - if (!test_params.setTaper (tx, ty)) - { - return false; - } - if (!test_params.setRevolutions (revolutions)) - { - return false; - } - if (!test_params.setRadiusOffset (radiusoffset)) - { - return false; - } - if (!test_params.setSkew (skew)) - { - return false; - } - return true; -} - -S32 *LLVolume::getTriangleIndices(U32 &num_indices) const -{ - LLMemType m1(LLMemType::MTYPE_VOLUME); - - S32 expected_num_triangle_indices = getNumTriangleIndices(); - if (expected_num_triangle_indices > MAX_VOLUME_TRIANGLE_INDICES) - { - // we don't allow LLVolumes with this many vertices - llwarns << "Couldn't allocate triangle indices" << llendl; - num_indices = 0; - return NULL; - } - - S32* index = new S32[expected_num_triangle_indices]; - S32 count = 0; - - // Let's do this totally diffently, as we don't care about faces... - // Counter-clockwise triangles are forward facing... - - BOOL open = getProfile().isOpen(); - BOOL hollow = (mParams.getProfileParams().getHollow() > 0); - BOOL path_open = getPath().isOpen(); - S32 size_s, size_s_out, size_t; - S32 s, t, i; - size_s = getProfile().getTotal(); - size_s_out = getProfile().getTotalOut(); - size_t = getPath().mPath.size(); - - // NOTE -- if the construction of the triangles below ever changes - // then getNumTriangleIndices() method may also have to be updated. - - if (open) /* Flawfinder: ignore */ - { - if (hollow) - { - // Open hollow -- much like the closed solid, except we - // we need to stitch up the gap between s=0 and s=size_s-1 - - for (t = 0; t < size_t - 1; t++) - { - // The outer face, first cut, and inner face - for (s = 0; s < size_s - 1; s++) - { - i = s + t*size_s; - index[count++] = i; // x,y - index[count++] = i + 1; // x+1,y - index[count++] = i + size_s; // x,y+1 - - index[count++] = i + size_s; // x,y+1 - index[count++] = i + 1; // x+1,y - index[count++] = i + size_s + 1; // x+1,y+1 - } - - // The other cut face - index[count++] = s + t*size_s; // x,y - index[count++] = 0 + t*size_s; // x+1,y - index[count++] = s + (t+1)*size_s; // x,y+1 - - index[count++] = s + (t+1)*size_s; // x,y+1 - index[count++] = 0 + t*size_s; // x+1,y - index[count++] = 0 + (t+1)*size_s; // x+1,y+1 - } - - // Do the top and bottom caps, if necessary - if (path_open) - { - // Top cap - S32 pt1 = 0; - S32 pt2 = size_s-1; - S32 i = (size_t - 1)*size_s; - - while (pt2 - pt1 > 1) - { - // Use the profile points instead of the mesh, since you want - // the un-transformed profile distances. - LLVector3 p1 = getProfile().mProfile[pt1]; - LLVector3 p2 = getProfile().mProfile[pt2]; - LLVector3 pa = getProfile().mProfile[pt1+1]; - LLVector3 pb = getProfile().mProfile[pt2-1]; - - p1.mV[VZ] = 0.f; - p2.mV[VZ] = 0.f; - pa.mV[VZ] = 0.f; - pb.mV[VZ] = 0.f; - - // Use area of triangle to determine backfacing - F32 area_1a2, area_1ba, area_21b, area_2ab; - area_1a2 = (p1.mV[0]*pa.mV[1] - pa.mV[0]*p1.mV[1]) + - (pa.mV[0]*p2.mV[1] - p2.mV[0]*pa.mV[1]) + - (p2.mV[0]*p1.mV[1] - p1.mV[0]*p2.mV[1]); - - area_1ba = (p1.mV[0]*pb.mV[1] - pb.mV[0]*p1.mV[1]) + - (pb.mV[0]*pa.mV[1] - pa.mV[0]*pb.mV[1]) + - (pa.mV[0]*p1.mV[1] - p1.mV[0]*pa.mV[1]); - - area_21b = (p2.mV[0]*p1.mV[1] - p1.mV[0]*p2.mV[1]) + - (p1.mV[0]*pb.mV[1] - pb.mV[0]*p1.mV[1]) + - (pb.mV[0]*p2.mV[1] - p2.mV[0]*pb.mV[1]); - - area_2ab = (p2.mV[0]*pa.mV[1] - pa.mV[0]*p2.mV[1]) + - (pa.mV[0]*pb.mV[1] - pb.mV[0]*pa.mV[1]) + - (pb.mV[0]*p2.mV[1] - p2.mV[0]*pb.mV[1]); - - BOOL use_tri1a2 = TRUE; - BOOL tri_1a2 = TRUE; - BOOL tri_21b = TRUE; - - if (area_1a2 < 0) - { - tri_1a2 = FALSE; - } - if (area_2ab < 0) - { - // Can't use, because it contains point b - tri_1a2 = FALSE; - } - if (area_21b < 0) - { - tri_21b = FALSE; - } - if (area_1ba < 0) - { - // Can't use, because it contains point b - tri_21b = FALSE; - } - - if (!tri_1a2) - { - use_tri1a2 = FALSE; - } - else if (!tri_21b) - { - use_tri1a2 = TRUE; - } - else - { - LLVector3 d1 = p1 - pa; - LLVector3 d2 = p2 - pb; - - if (d1.magVecSquared() < d2.magVecSquared()) - { - use_tri1a2 = TRUE; - } - else - { - use_tri1a2 = FALSE; - } - } - - if (use_tri1a2) - { - index[count++] = pt1 + i; - index[count++] = pt1 + 1 + i; - index[count++] = pt2 + i; - pt1++; - } - else - { - index[count++] = pt1 + i; - index[count++] = pt2 - 1 + i; - index[count++] = pt2 + i; - pt2--; - } - } - - // Bottom cap - pt1 = 0; - pt2 = size_s-1; - while (pt2 - pt1 > 1) - { - // Use the profile points instead of the mesh, since you want - // the un-transformed profile distances. - LLVector3 p1 = getProfile().mProfile[pt1]; - LLVector3 p2 = getProfile().mProfile[pt2]; - LLVector3 pa = getProfile().mProfile[pt1+1]; - LLVector3 pb = getProfile().mProfile[pt2-1]; - - p1.mV[VZ] = 0.f; - p2.mV[VZ] = 0.f; - pa.mV[VZ] = 0.f; - pb.mV[VZ] = 0.f; - - // Use area of triangle to determine backfacing - F32 area_1a2, area_1ba, area_21b, area_2ab; - area_1a2 = (p1.mV[0]*pa.mV[1] - pa.mV[0]*p1.mV[1]) + - (pa.mV[0]*p2.mV[1] - p2.mV[0]*pa.mV[1]) + - (p2.mV[0]*p1.mV[1] - p1.mV[0]*p2.mV[1]); - - area_1ba = (p1.mV[0]*pb.mV[1] - pb.mV[0]*p1.mV[1]) + - (pb.mV[0]*pa.mV[1] - pa.mV[0]*pb.mV[1]) + - (pa.mV[0]*p1.mV[1] - p1.mV[0]*pa.mV[1]); - - area_21b = (p2.mV[0]*p1.mV[1] - p1.mV[0]*p2.mV[1]) + - (p1.mV[0]*pb.mV[1] - pb.mV[0]*p1.mV[1]) + - (pb.mV[0]*p2.mV[1] - p2.mV[0]*pb.mV[1]); - - area_2ab = (p2.mV[0]*pa.mV[1] - pa.mV[0]*p2.mV[1]) + - (pa.mV[0]*pb.mV[1] - pb.mV[0]*pa.mV[1]) + - (pb.mV[0]*p2.mV[1] - p2.mV[0]*pb.mV[1]); - - BOOL use_tri1a2 = TRUE; - BOOL tri_1a2 = TRUE; - BOOL tri_21b = TRUE; - - if (area_1a2 < 0) - { - tri_1a2 = FALSE; - } - if (area_2ab < 0) - { - // Can't use, because it contains point b - tri_1a2 = FALSE; - } - if (area_21b < 0) - { - tri_21b = FALSE; - } - if (area_1ba < 0) - { - // Can't use, because it contains point b - tri_21b = FALSE; - } - - if (!tri_1a2) - { - use_tri1a2 = FALSE; - } - else if (!tri_21b) - { - use_tri1a2 = TRUE; - } - else - { - LLVector3 d1 = p1 - pa; - LLVector3 d2 = p2 - pb; - - if (d1.magVecSquared() < d2.magVecSquared()) - { - use_tri1a2 = TRUE; - } - else - { - use_tri1a2 = FALSE; - } - } - - if (use_tri1a2) - { - index[count++] = pt1; - index[count++] = pt2; - index[count++] = pt1 + 1; - pt1++; - } - else - { - index[count++] = pt1; - index[count++] = pt2; - index[count++] = pt2 - 1; - pt2--; - } - } - } - } - else - { - // Open solid - - for (t = 0; t < size_t - 1; t++) - { - // Outer face + 1 cut face - for (s = 0; s < size_s - 1; s++) - { - i = s + t*size_s; - - index[count++] = i; // x,y - index[count++] = i + 1; // x+1,y - index[count++] = i + size_s; // x,y+1 - - index[count++] = i + size_s; // x,y+1 - index[count++] = i + 1; // x+1,y - index[count++] = i + size_s + 1; // x+1,y+1 - } - - // The other cut face - index[count++] = (size_s - 1) + (t*size_s); // x,y - index[count++] = 0 + t*size_s; // x+1,y - index[count++] = (size_s - 1) + (t+1)*size_s; // x,y+1 - - index[count++] = (size_s - 1) + (t+1)*size_s; // x,y+1 - index[count++] = 0 + (t*size_s); // x+1,y - index[count++] = 0 + (t+1)*size_s; // x+1,y+1 - } - - // Do the top and bottom caps, if necessary - if (path_open) - { - for (s = 0; s < size_s - 2; s++) - { - index[count++] = s+1; - index[count++] = s; - index[count++] = size_s - 1; - } - - // We've got a top cap - S32 offset = (size_t - 1)*size_s; - for (s = 0; s < size_s - 2; s++) - { - // Inverted ordering from bottom cap. - index[count++] = offset + size_s - 1; - index[count++] = offset + s; - index[count++] = offset + s + 1; - } - } - } - } - else if (hollow) - { - // Closed hollow - // Outer face - - for (t = 0; t < size_t - 1; t++) - { - for (s = 0; s < size_s_out - 1; s++) - { - i = s + t*size_s; - - index[count++] = i; // x,y - index[count++] = i + 1; // x+1,y - index[count++] = i + size_s; // x,y+1 - - index[count++] = i + size_s; // x,y+1 - index[count++] = i + 1; // x+1,y - index[count++] = i + 1 + size_s; // x+1,y+1 - } - } - - // Inner face - // Invert facing from outer face - for (t = 0; t < size_t - 1; t++) - { - for (s = size_s_out; s < size_s - 1; s++) - { - i = s + t*size_s; - - index[count++] = i; // x,y - index[count++] = i + 1; // x+1,y - index[count++] = i + size_s; // x,y+1 - - index[count++] = i + size_s; // x,y+1 - index[count++] = i + 1; // x+1,y - index[count++] = i + 1 + size_s; // x+1,y+1 - } - } - - // Do the top and bottom caps, if necessary - if (path_open) - { - // Top cap - S32 pt1 = 0; - S32 pt2 = size_s-1; - S32 i = (size_t - 1)*size_s; - - while (pt2 - pt1 > 1) - { - // Use the profile points instead of the mesh, since you want - // the un-transformed profile distances. - LLVector3 p1 = getProfile().mProfile[pt1]; - LLVector3 p2 = getProfile().mProfile[pt2]; - LLVector3 pa = getProfile().mProfile[pt1+1]; - LLVector3 pb = getProfile().mProfile[pt2-1]; - - p1.mV[VZ] = 0.f; - p2.mV[VZ] = 0.f; - pa.mV[VZ] = 0.f; - pb.mV[VZ] = 0.f; - - // Use area of triangle to determine backfacing - F32 area_1a2, area_1ba, area_21b, area_2ab; - area_1a2 = (p1.mV[0]*pa.mV[1] - pa.mV[0]*p1.mV[1]) + - (pa.mV[0]*p2.mV[1] - p2.mV[0]*pa.mV[1]) + - (p2.mV[0]*p1.mV[1] - p1.mV[0]*p2.mV[1]); - - area_1ba = (p1.mV[0]*pb.mV[1] - pb.mV[0]*p1.mV[1]) + - (pb.mV[0]*pa.mV[1] - pa.mV[0]*pb.mV[1]) + - (pa.mV[0]*p1.mV[1] - p1.mV[0]*pa.mV[1]); - - area_21b = (p2.mV[0]*p1.mV[1] - p1.mV[0]*p2.mV[1]) + - (p1.mV[0]*pb.mV[1] - pb.mV[0]*p1.mV[1]) + - (pb.mV[0]*p2.mV[1] - p2.mV[0]*pb.mV[1]); - - area_2ab = (p2.mV[0]*pa.mV[1] - pa.mV[0]*p2.mV[1]) + - (pa.mV[0]*pb.mV[1] - pb.mV[0]*pa.mV[1]) + - (pb.mV[0]*p2.mV[1] - p2.mV[0]*pb.mV[1]); - - BOOL use_tri1a2 = TRUE; - BOOL tri_1a2 = TRUE; - BOOL tri_21b = TRUE; - - if (area_1a2 < 0) - { - tri_1a2 = FALSE; - } - if (area_2ab < 0) - { - // Can't use, because it contains point b - tri_1a2 = FALSE; - } - if (area_21b < 0) - { - tri_21b = FALSE; - } - if (area_1ba < 0) - { - // Can't use, because it contains point b - tri_21b = FALSE; - } - - if (!tri_1a2) - { - use_tri1a2 = FALSE; - } - else if (!tri_21b) - { - use_tri1a2 = TRUE; - } - else - { - LLVector3 d1 = p1 - pa; - LLVector3 d2 = p2 - pb; - - if (d1.magVecSquared() < d2.magVecSquared()) - { - use_tri1a2 = TRUE; - } - else - { - use_tri1a2 = FALSE; - } - } - - if (use_tri1a2) - { - index[count++] = pt1 + i; - index[count++] = pt1 + 1 + i; - index[count++] = pt2 + i; - pt1++; - } - else - { - index[count++] = pt1 + i; - index[count++] = pt2 - 1 + i; - index[count++] = pt2 + i; - pt2--; - } - } - - // Bottom cap - pt1 = 0; - pt2 = size_s-1; - while (pt2 - pt1 > 1) - { - // Use the profile points instead of the mesh, since you want - // the un-transformed profile distances. - LLVector3 p1 = getProfile().mProfile[pt1]; - LLVector3 p2 = getProfile().mProfile[pt2]; - LLVector3 pa = getProfile().mProfile[pt1+1]; - LLVector3 pb = getProfile().mProfile[pt2-1]; - - p1.mV[VZ] = 0.f; - p2.mV[VZ] = 0.f; - pa.mV[VZ] = 0.f; - pb.mV[VZ] = 0.f; - - // Use area of triangle to determine backfacing - F32 area_1a2, area_1ba, area_21b, area_2ab; - area_1a2 = (p1.mV[0]*pa.mV[1] - pa.mV[0]*p1.mV[1]) + - (pa.mV[0]*p2.mV[1] - p2.mV[0]*pa.mV[1]) + - (p2.mV[0]*p1.mV[1] - p1.mV[0]*p2.mV[1]); - - area_1ba = (p1.mV[0]*pb.mV[1] - pb.mV[0]*p1.mV[1]) + - (pb.mV[0]*pa.mV[1] - pa.mV[0]*pb.mV[1]) + - (pa.mV[0]*p1.mV[1] - p1.mV[0]*pa.mV[1]); - - area_21b = (p2.mV[0]*p1.mV[1] - p1.mV[0]*p2.mV[1]) + - (p1.mV[0]*pb.mV[1] - pb.mV[0]*p1.mV[1]) + - (pb.mV[0]*p2.mV[1] - p2.mV[0]*pb.mV[1]); - - area_2ab = (p2.mV[0]*pa.mV[1] - pa.mV[0]*p2.mV[1]) + - (pa.mV[0]*pb.mV[1] - pb.mV[0]*pa.mV[1]) + - (pb.mV[0]*p2.mV[1] - p2.mV[0]*pb.mV[1]); - - BOOL use_tri1a2 = TRUE; - BOOL tri_1a2 = TRUE; - BOOL tri_21b = TRUE; - - if (area_1a2 < 0) - { - tri_1a2 = FALSE; - } - if (area_2ab < 0) - { - // Can't use, because it contains point b - tri_1a2 = FALSE; - } - if (area_21b < 0) - { - tri_21b = FALSE; - } - if (area_1ba < 0) - { - // Can't use, because it contains point b - tri_21b = FALSE; - } - - if (!tri_1a2) - { - use_tri1a2 = FALSE; - } - else if (!tri_21b) - { - use_tri1a2 = TRUE; - } - else - { - LLVector3 d1 = p1 - pa; - LLVector3 d2 = p2 - pb; - - if (d1.magVecSquared() < d2.magVecSquared()) - { - use_tri1a2 = TRUE; - } - else - { - use_tri1a2 = FALSE; - } - } - - if (use_tri1a2) - { - index[count++] = pt1; - index[count++] = pt2; - index[count++] = pt1 + 1; - pt1++; - } - else - { - index[count++] = pt1; - index[count++] = pt2; - index[count++] = pt2 - 1; - pt2--; - } - } - } - } - else - { - // Closed solid. Easy case. - for (t = 0; t < size_t - 1; t++) - { - for (s = 0; s < size_s - 1; s++) - { - // Should wrap properly, but for now... - i = s + t*size_s; - - index[count++] = i; // x,y - index[count++] = i + 1; // x+1,y - index[count++] = i + size_s; // x,y+1 - - index[count++] = i + size_s; // x,y+1 - index[count++] = i + 1; // x+1,y - index[count++] = i + size_s + 1; // x+1,y+1 - } - } - - // Do the top and bottom caps, if necessary - if (path_open) - { - // bottom cap - for (s = 1; s < size_s - 2; s++) - { - index[count++] = s+1; - index[count++] = s; - index[count++] = 0; - } - - // top cap - S32 offset = (size_t - 1)*size_s; - for (s = 1; s < size_s - 2; s++) - { - // Inverted ordering from bottom cap. - index[count++] = offset; - index[count++] = offset + s; - index[count++] = offset + s + 1; - } - } - } - -#ifdef LL_DEBUG - // assert that we computed the correct number of indices - if (count != expected_num_triangle_indices ) - { - llerrs << "bad index count prediciton:" - << " expected=" << expected_num_triangle_indices - << " actual=" << count << llendl; - } -#endif - -#if 0 - // verify that each index does not point beyond the size of the mesh - S32 num_vertices = mMesh.size(); - for (i = 0; i < count; i+=3) - { - llinfos << index[i] << ":" << index[i+1] << ":" << index[i+2] << llendl; - llassert(index[i] < num_vertices); - llassert(index[i+1] < num_vertices); - llassert(index[i+2] < num_vertices); - } -#endif - - num_indices = count; - return index; -} - -S32 LLVolume::getNumTriangleIndices() const -{ - BOOL profile_open = getProfile().isOpen(); - BOOL hollow = (mParams.getProfileParams().getHollow() > 0); - BOOL path_open = getPath().isOpen(); - - S32 size_s, size_s_out, size_t; - size_s = getProfile().getTotal(); - size_s_out = getProfile().getTotalOut(); - size_t = getPath().mPath.size(); - - S32 count = 0; - if (profile_open) /* Flawfinder: ignore */ - { - if (hollow) - { - // Open hollow -- much like the closed solid, except we - // we need to stitch up the gap between s=0 and s=size_s-1 - count = (size_t - 1) * (((size_s -1) * 6) + 6); - } - else - { - count = (size_t - 1) * (((size_s -1) * 6) + 6); - } - } - else if (hollow) - { - // Closed hollow - // Outer face - count = (size_t - 1) * (size_s_out - 1) * 6; - - // Inner face - count += (size_t - 1) * ((size_s - 1) - size_s_out) * 6; - } - else - { - // Closed solid. Easy case. - count = (size_t - 1) * (size_s - 1) * 6; - } - - if (path_open) - { - S32 cap_triangle_count = size_s - 3; - if ( profile_open - || hollow ) - { - cap_triangle_count = size_s - 2; - } - if ( cap_triangle_count > 0 ) - { - // top and bottom caps - count += cap_triangle_count * 2 * 3; - } - } - return count; -} - - -S32 LLVolume::getNumTriangles() const -{ - U32 triangle_count = 0; - - for (S32 i = 0; i < getNumVolumeFaces(); ++i) - { - triangle_count += getVolumeFace(i).mNumIndices/3; - } - - return triangle_count; -} - - -//----------------------------------------------------------------------------- -// generateSilhouetteVertices() -//----------------------------------------------------------------------------- -void LLVolume::generateSilhouetteVertices(std::vector<LLVector3> &vertices, - std::vector<LLVector3> &normals, - const LLVector3& obj_cam_vec_in, - const LLMatrix4& mat_in, - const LLMatrix3& norm_mat_in, - S32 face_mask) -{ - LLMemType m1(LLMemType::MTYPE_VOLUME); - - LLMatrix4a mat; - mat.loadu(mat_in); - - LLMatrix4a norm_mat; - norm_mat.loadu(norm_mat_in); - - LLVector4a obj_cam_vec; - obj_cam_vec.load3(obj_cam_vec_in.mV); - - vertices.clear(); - normals.clear(); - - if ((mParams.getSculptType() & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH) - { - return; - } - - S32 cur_index = 0; - //for each face - for (face_list_t::iterator iter = mVolumeFaces.begin(); - iter != mVolumeFaces.end(); ++iter) - { - LLVolumeFace& face = *iter; - - if (!(face_mask & (0x1 << cur_index++)) || - face.mNumIndices == 0 || face.mEdge.empty()) - { - continue; - } - - if (face.mTypeMask & (LLVolumeFace::CAP_MASK)) { - - } - else { - - //============================================== - //DEBUG draw edge map instead of silhouette edge - //============================================== - -#if DEBUG_SILHOUETTE_EDGE_MAP - - //for each triangle - U32 count = face.mNumIndices; - for (U32 j = 0; j < count/3; j++) { - //get vertices - S32 v1 = face.mIndices[j*3+0]; - S32 v2 = face.mIndices[j*3+1]; - S32 v3 = face.mIndices[j*3+2]; - - //get current face center - LLVector3 cCenter = (face.mVertices[v1].getPosition() + - face.mVertices[v2].getPosition() + - face.mVertices[v3].getPosition()) / 3.0f; - - //for each edge - for (S32 k = 0; k < 3; k++) { - S32 nIndex = face.mEdge[j*3+k]; - if (nIndex <= -1) { - continue; - } - - if (nIndex >= (S32) count/3) { - continue; - } - //get neighbor vertices - v1 = face.mIndices[nIndex*3+0]; - v2 = face.mIndices[nIndex*3+1]; - v3 = face.mIndices[nIndex*3+2]; - - //get neighbor face center - LLVector3 nCenter = (face.mVertices[v1].getPosition() + - face.mVertices[v2].getPosition() + - face.mVertices[v3].getPosition()) / 3.0f; - - //draw line - vertices.push_back(cCenter); - vertices.push_back(nCenter); - normals.push_back(LLVector3(1,1,1)); - normals.push_back(LLVector3(1,1,1)); - segments.push_back(vertices.size()); - } - } - - continue; - - //============================================== - //DEBUG - //============================================== - - //============================================== - //DEBUG draw normals instead of silhouette edge - //============================================== -#elif DEBUG_SILHOUETTE_NORMALS - - //for each vertex - for (U32 j = 0; j < face.mNumVertices; j++) { - vertices.push_back(face.mVertices[j].getPosition()); - vertices.push_back(face.mVertices[j].getPosition() + face.mVertices[j].getNormal()*0.1f); - normals.push_back(LLVector3(0,0,1)); - normals.push_back(LLVector3(0,0,1)); - segments.push_back(vertices.size()); -#if DEBUG_SILHOUETTE_BINORMALS - vertices.push_back(face.mVertices[j].getPosition()); - vertices.push_back(face.mVertices[j].getPosition() + face.mVertices[j].mBinormal*0.1f); - normals.push_back(LLVector3(0,0,1)); - normals.push_back(LLVector3(0,0,1)); - segments.push_back(vertices.size()); -#endif - } - - continue; -#else - //============================================== - //DEBUG - //============================================== - - static const U8 AWAY = 0x01, - TOWARDS = 0x02; - - //for each triangle - std::vector<U8> fFacing; - vector_append(fFacing, face.mNumIndices/3); - - LLVector4a* v = (LLVector4a*) face.mPositions; - LLVector4a* n = (LLVector4a*) face.mNormals; - - for (U32 j = 0; j < face.mNumIndices/3; j++) - { - //approximate normal - S32 v1 = face.mIndices[j*3+0]; - S32 v2 = face.mIndices[j*3+1]; - S32 v3 = face.mIndices[j*3+2]; - - LLVector4a c1,c2; - c1.setSub(v[v1], v[v2]); - c2.setSub(v[v2], v[v3]); - - LLVector4a norm; - - norm.setCross3(c1, c2); - - if (norm.dot3(norm) < 0.00000001f) - { - fFacing[j] = AWAY | TOWARDS; - } - else - { - //get view vector - LLVector4a view; - view.setSub(obj_cam_vec, v[v1]); - bool away = view.dot3(norm) > 0.0f; - if (away) - { - fFacing[j] = AWAY; - } - else - { - fFacing[j] = TOWARDS; - } - } - } - - //for each triangle - for (U32 j = 0; j < face.mNumIndices/3; j++) - { - if (fFacing[j] == (AWAY | TOWARDS)) - { //this is a degenerate triangle - //take neighbor facing (degenerate faces get facing of one of their neighbors) - // *FIX IF NEEDED: this does not deal with neighboring degenerate faces - for (S32 k = 0; k < 3; k++) - { - S32 index = face.mEdge[j*3+k]; - if (index != -1) - { - fFacing[j] = fFacing[index]; - break; - } - } - continue; //skip degenerate face - } - - //for each edge - for (S32 k = 0; k < 3; k++) { - S32 index = face.mEdge[j*3+k]; - if (index != -1 && fFacing[index] == (AWAY | TOWARDS)) { - //our neighbor is degenerate, make him face our direction - fFacing[face.mEdge[j*3+k]] = fFacing[j]; - continue; - } - - if (index == -1 || //edge has no neighbor, MUST be a silhouette edge - (fFacing[index] & fFacing[j]) == 0) { //we found a silhouette edge - - S32 v1 = face.mIndices[j*3+k]; - S32 v2 = face.mIndices[j*3+((k+1)%3)]; - - LLVector4a t; - mat.affineTransform(v[v1], t); - vertices.push_back(LLVector3(t[0], t[1], t[2])); - - norm_mat.rotate(n[v1], t); - - t.normalize3fast(); - normals.push_back(LLVector3(t[0], t[1], t[2])); - - mat.affineTransform(v[v2], t); - vertices.push_back(LLVector3(t[0], t[1], t[2])); - - norm_mat.rotate(n[v2], t); - t.normalize3fast(); - normals.push_back(LLVector3(t[0], t[1], t[2])); - } - } - } -#endif - } - } -} - -S32 LLVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& end, - S32 face, - LLVector3* intersection,LLVector2* tex_coord, LLVector3* normal, LLVector3* bi_normal) -{ - LLVector4a starta, enda; - starta.load3(start.mV); - enda.load3(end.mV); - - return lineSegmentIntersect(starta, enda, face, intersection, tex_coord, normal, bi_normal); - -} - - -S32 LLVolume::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end, - S32 face, - LLVector3* intersection,LLVector2* tex_coord, LLVector3* normal, LLVector3* bi_normal) -{ - S32 hit_face = -1; - - S32 start_face; - S32 end_face; - - if (face == -1) // ALL_SIDES - { - start_face = 0; - end_face = getNumVolumeFaces() - 1; - } - else - { - start_face = face; - end_face = face; - } - - LLVector4a dir; - dir.setSub(end, start); - - F32 closest_t = 2.f; // must be larger than 1 - - end_face = llmin(end_face, getNumVolumeFaces()-1); - - for (S32 i = start_face; i <= end_face; i++) - { - LLVolumeFace &face = mVolumeFaces[i]; - - LLVector4a box_center; - box_center.setAdd(face.mExtents[0], face.mExtents[1]); - box_center.mul(0.5f); - - LLVector4a box_size; - box_size.setSub(face.mExtents[1], face.mExtents[0]); - - if (LLLineSegmentBoxIntersect(start, end, box_center, box_size)) - { - if (bi_normal != NULL) // if the caller wants binormals, we may need to generate them - { - genBinormals(i); - } - - if (!face.mOctree) - { - face.createOctree(); - } - - //LLVector4a* p = (LLVector4a*) face.mPositions; - - LLOctreeTriangleRayIntersect intersect(start, dir, &face, &closest_t, intersection, tex_coord, normal, bi_normal); - intersect.traverse(face.mOctree); - if (intersect.mHitFace) - { - hit_face = i; - } - } - } - - - return hit_face; -} - -class LLVertexIndexPair -{ -public: - LLVertexIndexPair(const LLVector3 &vertex, const S32 index); - - LLVector3 mVertex; - S32 mIndex; -}; - -LLVertexIndexPair::LLVertexIndexPair(const LLVector3 &vertex, const S32 index) -{ - mVertex = vertex; - mIndex = index; -} - -const F32 VERTEX_SLOP = 0.00001f; -const F32 VERTEX_SLOP_SQRD = VERTEX_SLOP * VERTEX_SLOP; - -struct lessVertex -{ - bool operator()(const LLVertexIndexPair *a, const LLVertexIndexPair *b) - { - const F32 slop = VERTEX_SLOP; - - if (a->mVertex.mV[0] + slop < b->mVertex.mV[0]) - { - return TRUE; - } - else if (a->mVertex.mV[0] - slop > b->mVertex.mV[0]) - { - return FALSE; - } - - if (a->mVertex.mV[1] + slop < b->mVertex.mV[1]) - { - return TRUE; - } - else if (a->mVertex.mV[1] - slop > b->mVertex.mV[1]) - { - return FALSE; - } - - if (a->mVertex.mV[2] + slop < b->mVertex.mV[2]) - { - return TRUE; - } - else if (a->mVertex.mV[2] - slop > b->mVertex.mV[2]) - { - return FALSE; - } - - return FALSE; - } -}; - -struct lessTriangle -{ - bool operator()(const S32 *a, const S32 *b) - { - if (*a < *b) - { - return TRUE; - } - else if (*a > *b) - { - return FALSE; - } - - if (*(a+1) < *(b+1)) - { - return TRUE; - } - else if (*(a+1) > *(b+1)) - { - return FALSE; - } - - if (*(a+2) < *(b+2)) - { - return TRUE; - } - else if (*(a+2) > *(b+2)) - { - return FALSE; - } - - return FALSE; - } -}; - -BOOL equalTriangle(const S32 *a, const S32 *b) -{ - if ((*a == *b) && (*(a+1) == *(b+1)) && (*(a+2) == *(b+2))) - { - return TRUE; - } - return FALSE; -} - -BOOL LLVolume::cleanupTriangleData( const S32 num_input_vertices, - const std::vector<Point>& input_vertices, - const S32 num_input_triangles, - S32 *input_triangles, - S32 &num_output_vertices, - LLVector3 **output_vertices, - S32 &num_output_triangles, - S32 **output_triangles) -{ - LLMemType m1(LLMemType::MTYPE_VOLUME); - - /* Testing: avoid any cleanup - static BOOL skip_cleanup = TRUE; - if ( skip_cleanup ) - { - num_output_vertices = num_input_vertices; - num_output_triangles = num_input_triangles; - - *output_vertices = new LLVector3[num_input_vertices]; - for (S32 index = 0; index < num_input_vertices; index++) - { - (*output_vertices)[index] = input_vertices[index].mPos; - } - - *output_triangles = new S32[num_input_triangles*3]; - memcpy(*output_triangles, input_triangles, 3*num_input_triangles*sizeof(S32)); // Flawfinder: ignore - return TRUE; - } - */ - - // Here's how we do this: - // Create a structure which contains the original vertex index and the - // LLVector3 data. - // "Sort" the data by the vectors - // Create an array the size of the old vertex list, with a mapping of - // old indices to new indices. - // Go through triangles, shift so the lowest index is first - // Sort triangles by first index - // Remove duplicate triangles - // Allocate and pack new triangle data. - - //LLTimer cleanupTimer; - //llinfos << "In vertices: " << num_input_vertices << llendl; - //llinfos << "In triangles: " << num_input_triangles << llendl; - - S32 i; - typedef std::multiset<LLVertexIndexPair*, lessVertex> vertex_set_t; - vertex_set_t vertex_list; - - LLVertexIndexPair *pairp = NULL; - for (i = 0; i < num_input_vertices; i++) - { - LLVertexIndexPair *new_pairp = new LLVertexIndexPair(input_vertices[i].mPos, i); - vertex_list.insert(new_pairp); - } - - // Generate the vertex mapping and the list of vertices without - // duplicates. This will crash if there are no vertices. - llassert(num_input_vertices > 0); // check for no vertices! - S32 *vertex_mapping = new S32[num_input_vertices]; - LLVector3 *new_vertices = new LLVector3[num_input_vertices]; - LLVertexIndexPair *prev_pairp = NULL; - - S32 new_num_vertices; - - new_num_vertices = 0; - for (vertex_set_t::iterator iter = vertex_list.begin(), - end = vertex_list.end(); - iter != end; iter++) - { - pairp = *iter; - if (!prev_pairp || ((pairp->mVertex - prev_pairp->mVertex).magVecSquared() >= VERTEX_SLOP_SQRD)) - { - new_vertices[new_num_vertices] = pairp->mVertex; - //llinfos << "Added vertex " << new_num_vertices << " : " << pairp->mVertex << llendl; - new_num_vertices++; - // Update the previous - prev_pairp = pairp; - } - else - { - //llinfos << "Removed duplicate vertex " << pairp->mVertex << ", distance magVecSquared() is " << (pairp->mVertex - prev_pairp->mVertex).magVecSquared() << llendl; - } - vertex_mapping[pairp->mIndex] = new_num_vertices - 1; - } - - // Iterate through triangles and remove degenerates, re-ordering vertices - // along the way. - S32 *new_triangles = new S32[num_input_triangles * 3]; - S32 new_num_triangles = 0; - - for (i = 0; i < num_input_triangles; i++) - { - S32 v1 = i*3; - S32 v2 = v1 + 1; - S32 v3 = v1 + 2; - - //llinfos << "Checking triangle " << input_triangles[v1] << ":" << input_triangles[v2] << ":" << input_triangles[v3] << llendl; - input_triangles[v1] = vertex_mapping[input_triangles[v1]]; - input_triangles[v2] = vertex_mapping[input_triangles[v2]]; - input_triangles[v3] = vertex_mapping[input_triangles[v3]]; - - if ((input_triangles[v1] == input_triangles[v2]) - || (input_triangles[v1] == input_triangles[v3]) - || (input_triangles[v2] == input_triangles[v3])) - { - //llinfos << "Removing degenerate triangle " << input_triangles[v1] << ":" << input_triangles[v2] << ":" << input_triangles[v3] << llendl; - // Degenerate triangle, skip - continue; - } - - if (input_triangles[v1] < input_triangles[v2]) - { - if (input_triangles[v1] < input_triangles[v3]) - { - // (0 < 1) && (0 < 2) - new_triangles[new_num_triangles*3] = input_triangles[v1]; - new_triangles[new_num_triangles*3+1] = input_triangles[v2]; - new_triangles[new_num_triangles*3+2] = input_triangles[v3]; - } - else - { - // (0 < 1) && (2 < 0) - new_triangles[new_num_triangles*3] = input_triangles[v3]; - new_triangles[new_num_triangles*3+1] = input_triangles[v1]; - new_triangles[new_num_triangles*3+2] = input_triangles[v2]; - } - } - else if (input_triangles[v2] < input_triangles[v3]) - { - // (1 < 0) && (1 < 2) - new_triangles[new_num_triangles*3] = input_triangles[v2]; - new_triangles[new_num_triangles*3+1] = input_triangles[v3]; - new_triangles[new_num_triangles*3+2] = input_triangles[v1]; - } - else - { - // (1 < 0) && (2 < 1) - new_triangles[new_num_triangles*3] = input_triangles[v3]; - new_triangles[new_num_triangles*3+1] = input_triangles[v1]; - new_triangles[new_num_triangles*3+2] = input_triangles[v2]; - } - new_num_triangles++; - } - - if (new_num_triangles == 0) - { - llwarns << "Created volume object with 0 faces." << llendl; - delete[] new_triangles; - delete[] vertex_mapping; - delete[] new_vertices; - return FALSE; - } - - typedef std::set<S32*, lessTriangle> triangle_set_t; - triangle_set_t triangle_list; - - for (i = 0; i < new_num_triangles; i++) - { - triangle_list.insert(&new_triangles[i*3]); - } - - // Sort through the triangle list, and delete duplicates - - S32 *prevp = NULL; - S32 *curp = NULL; - - S32 *sorted_tris = new S32[new_num_triangles*3]; - S32 cur_tri = 0; - for (triangle_set_t::iterator iter = triangle_list.begin(), - end = triangle_list.end(); - iter != end; iter++) - { - curp = *iter; - if (!prevp || !equalTriangle(prevp, curp)) - { - //llinfos << "Added triangle " << *curp << ":" << *(curp+1) << ":" << *(curp+2) << llendl; - sorted_tris[cur_tri*3] = *curp; - sorted_tris[cur_tri*3+1] = *(curp+1); - sorted_tris[cur_tri*3+2] = *(curp+2); - cur_tri++; - prevp = curp; - } - else - { - //llinfos << "Skipped triangle " << *curp << ":" << *(curp+1) << ":" << *(curp+2) << llendl; - } - } - - *output_vertices = new LLVector3[new_num_vertices]; - num_output_vertices = new_num_vertices; - for (i = 0; i < new_num_vertices; i++) - { - (*output_vertices)[i] = new_vertices[i]; - } - - *output_triangles = new S32[cur_tri*3]; - num_output_triangles = cur_tri; - memcpy(*output_triangles, sorted_tris, 3*cur_tri*sizeof(S32)); /* Flawfinder: ignore */ - - /* - llinfos << "Out vertices: " << num_output_vertices << llendl; - llinfos << "Out triangles: " << num_output_triangles << llendl; - for (i = 0; i < num_output_vertices; i++) - { - llinfos << i << ":" << (*output_vertices)[i] << llendl; - } - for (i = 0; i < num_output_triangles; i++) - { - llinfos << i << ":" << (*output_triangles)[i*3] << ":" << (*output_triangles)[i*3+1] << ":" << (*output_triangles)[i*3+2] << llendl; - } - */ - - //llinfos << "Out vertices: " << num_output_vertices << llendl; - //llinfos << "Out triangles: " << num_output_triangles << llendl; - delete[] vertex_mapping; - vertex_mapping = NULL; - delete[] new_vertices; - new_vertices = NULL; - delete[] new_triangles; - new_triangles = NULL; - delete[] sorted_tris; - sorted_tris = NULL; - triangle_list.clear(); - std::for_each(vertex_list.begin(), vertex_list.end(), DeletePointer()); - vertex_list.clear(); - - return TRUE; -} - - -BOOL LLVolumeParams::importFile(LLFILE *fp) -{ - LLMemType m1(LLMemType::MTYPE_VOLUME); - - //llinfos << "importing volume" << llendl; - const S32 BUFSIZE = 16384; - char buffer[BUFSIZE]; /* Flawfinder: ignore */ - // *NOTE: changing the size or type of this buffer will require - // changing the sscanf below. - char keyword[256]; /* Flawfinder: ignore */ - keyword[0] = 0; - - while (!feof(fp)) - { - if (fgets(buffer, BUFSIZE, fp) == NULL) - { - buffer[0] = '\0'; - } - - sscanf(buffer, " %255s", keyword); /* Flawfinder: ignore */ - if (!strcmp("{", keyword)) - { - continue; - } - if (!strcmp("}",keyword)) - { - break; - } - else if (!strcmp("profile", keyword)) - { - mProfileParams.importFile(fp); - } - else if (!strcmp("path",keyword)) - { - mPathParams.importFile(fp); - } - else - { - llwarns << "unknown keyword " << keyword << " in volume import" << llendl; - } - } - - return TRUE; -} - -BOOL LLVolumeParams::exportFile(LLFILE *fp) const -{ - fprintf(fp,"\tshape 0\n"); - fprintf(fp,"\t{\n"); - mPathParams.exportFile(fp); - mProfileParams.exportFile(fp); - fprintf(fp, "\t}\n"); - return TRUE; -} - - -BOOL LLVolumeParams::importLegacyStream(std::istream& input_stream) -{ - LLMemType m1(LLMemType::MTYPE_VOLUME); - - //llinfos << "importing volume" << llendl; - const S32 BUFSIZE = 16384; - // *NOTE: changing the size or type of this buffer will require - // changing the sscanf below. - char buffer[BUFSIZE]; /* Flawfinder: ignore */ - char keyword[256]; /* Flawfinder: ignore */ - keyword[0] = 0; - - while (input_stream.good()) - { - input_stream.getline(buffer, BUFSIZE); - sscanf(buffer, " %255s", keyword); - if (!strcmp("{", keyword)) - { - continue; - } - if (!strcmp("}",keyword)) - { - break; - } - else if (!strcmp("profile", keyword)) - { - mProfileParams.importLegacyStream(input_stream); - } - else if (!strcmp("path",keyword)) - { - mPathParams.importLegacyStream(input_stream); - } - else - { - llwarns << "unknown keyword " << keyword << " in volume import" << llendl; - } - } - - return TRUE; -} - -BOOL LLVolumeParams::exportLegacyStream(std::ostream& output_stream) const -{ - LLMemType m1(LLMemType::MTYPE_VOLUME); - - output_stream <<"\tshape 0\n"; - output_stream <<"\t{\n"; - mPathParams.exportLegacyStream(output_stream); - mProfileParams.exportLegacyStream(output_stream); - output_stream << "\t}\n"; - return TRUE; -} - -LLSD LLVolumeParams::sculptAsLLSD() const -{ - LLSD sd = LLSD(); - sd["id"] = getSculptID(); - sd["type"] = getSculptType(); - - return sd; -} - -bool LLVolumeParams::sculptFromLLSD(LLSD& sd) -{ - setSculptID(sd["id"].asUUID(), (U8)sd["type"].asInteger()); - return true; -} - -LLSD LLVolumeParams::asLLSD() const -{ - LLSD sd = LLSD(); - sd["path"] = mPathParams; - sd["profile"] = mProfileParams; - sd["sculpt"] = sculptAsLLSD(); - - return sd; -} - -bool LLVolumeParams::fromLLSD(LLSD& sd) -{ - mPathParams.fromLLSD(sd["path"]); - mProfileParams.fromLLSD(sd["profile"]); - sculptFromLLSD(sd["sculpt"]); - - return true; -} - -void LLVolumeParams::reduceS(F32 begin, F32 end) -{ - begin = llclampf(begin); - end = llclampf(end); - if (begin > end) - { - F32 temp = begin; - begin = end; - end = temp; - } - F32 a = mProfileParams.getBegin(); - F32 b = mProfileParams.getEnd(); - mProfileParams.setBegin(a + begin * (b - a)); - mProfileParams.setEnd(a + end * (b - a)); -} - -void LLVolumeParams::reduceT(F32 begin, F32 end) -{ - begin = llclampf(begin); - end = llclampf(end); - if (begin > end) - { - F32 temp = begin; - begin = end; - end = temp; - } - F32 a = mPathParams.getBegin(); - F32 b = mPathParams.getEnd(); - mPathParams.setBegin(a + begin * (b - a)); - mPathParams.setEnd(a + end * (b - a)); -} - -const F32 MIN_CONCAVE_PROFILE_WEDGE = 0.125f; // 1/8 unity -const F32 MIN_CONCAVE_PATH_WEDGE = 0.111111f; // 1/9 unity - -// returns TRUE if the shape can be approximated with a convex shape -// for collison purposes -BOOL LLVolumeParams::isConvex() const -{ - if (!getSculptID().isNull()) - { - // can't determine, be safe and say no: - return FALSE; - } - - F32 path_length = mPathParams.getEnd() - mPathParams.getBegin(); - F32 hollow = mProfileParams.getHollow(); - - U8 path_type = mPathParams.getCurveType(); - if ( path_length > MIN_CONCAVE_PATH_WEDGE - && ( mPathParams.getTwist() != mPathParams.getTwistBegin() - || (hollow > 0.f - && LL_PCODE_PATH_LINE != path_type) ) ) - { - // twist along a "not too short" path is concave - return FALSE; - } - - F32 profile_length = mProfileParams.getEnd() - mProfileParams.getBegin(); - BOOL same_hole = hollow == 0.f - || (mProfileParams.getCurveType() & LL_PCODE_HOLE_MASK) == LL_PCODE_HOLE_SAME; - - F32 min_profile_wedge = MIN_CONCAVE_PROFILE_WEDGE; - U8 profile_type = mProfileParams.getCurveType() & LL_PCODE_PROFILE_MASK; - if ( LL_PCODE_PROFILE_CIRCLE_HALF == profile_type ) - { - // it is a sphere and spheres get twice the minimum profile wedge - min_profile_wedge = 2.f * MIN_CONCAVE_PROFILE_WEDGE; - } - - BOOL convex_profile = ( ( profile_length == 1.f - || profile_length <= 0.5f ) - && hollow == 0.f ) // trivially convex - || ( profile_length <= min_profile_wedge - && same_hole ); // effectvely convex (even when hollow) - - if (!convex_profile) - { - // profile is concave - return FALSE; - } - - if ( LL_PCODE_PATH_LINE == path_type ) - { - // straight paths with convex profile - return TRUE; - } - - BOOL concave_path = (path_length < 1.0f) && (path_length > 0.5f); - if (concave_path) - { - return FALSE; - } - - // we're left with spheres, toroids and tubes - if ( LL_PCODE_PROFILE_CIRCLE_HALF == profile_type ) - { - // at this stage all spheres must be convex - return TRUE; - } - - // it's a toroid or tube - if ( path_length <= MIN_CONCAVE_PATH_WEDGE ) - { - // effectively convex - return TRUE; - } - - return FALSE; -} - -// debug -void LLVolumeParams::setCube() -{ - mProfileParams.setCurveType(LL_PCODE_PROFILE_SQUARE); - mProfileParams.setBegin(0.f); - mProfileParams.setEnd(1.f); - mProfileParams.setHollow(0.f); - - mPathParams.setBegin(0.f); - mPathParams.setEnd(1.f); - mPathParams.setScale(1.f, 1.f); - mPathParams.setShear(0.f, 0.f); - mPathParams.setCurveType(LL_PCODE_PATH_LINE); - mPathParams.setTwistBegin(0.f); - mPathParams.setTwistEnd(0.f); - mPathParams.setRadiusOffset(0.f); - mPathParams.setTaper(0.f, 0.f); - mPathParams.setRevolutions(0.f); - mPathParams.setSkew(0.f); -} - -LLFaceID LLVolume::generateFaceMask() -{ - LLFaceID new_mask = 0x0000; - - switch(mParams.getProfileParams().getCurveType() & LL_PCODE_PROFILE_MASK) - { - case LL_PCODE_PROFILE_CIRCLE: - case LL_PCODE_PROFILE_CIRCLE_HALF: - new_mask |= LL_FACE_OUTER_SIDE_0; - break; - case LL_PCODE_PROFILE_SQUARE: - { - for(S32 side = (S32)(mParams.getProfileParams().getBegin() * 4.f); side < llceil(mParams.getProfileParams().getEnd() * 4.f); side++) - { - new_mask |= LL_FACE_OUTER_SIDE_0 << side; - } - } - break; - case LL_PCODE_PROFILE_ISOTRI: - case LL_PCODE_PROFILE_EQUALTRI: - case LL_PCODE_PROFILE_RIGHTTRI: - { - for(S32 side = (S32)(mParams.getProfileParams().getBegin() * 3.f); side < llceil(mParams.getProfileParams().getEnd() * 3.f); side++) - { - new_mask |= LL_FACE_OUTER_SIDE_0 << side; - } - } - break; - default: - llerrs << "Unknown profile!" << llendl; - break; - } - - // handle hollow objects - if (mParams.getProfileParams().getHollow() > 0) - { - new_mask |= LL_FACE_INNER_SIDE; - } - - // handle open profile curves - if (mProfilep->isOpen()) - { - new_mask |= LL_FACE_PROFILE_BEGIN | LL_FACE_PROFILE_END; - } - - // handle open path curves - if (mPathp->isOpen()) - { - new_mask |= LL_FACE_PATH_BEGIN | LL_FACE_PATH_END; - } - - return new_mask; -} - -BOOL LLVolume::isFaceMaskValid(LLFaceID face_mask) -{ - LLFaceID test_mask = 0; - for(S32 i = 0; i < getNumFaces(); i++) - { - test_mask |= mProfilep->mFaces[i].mFaceID; - } - - return test_mask == face_mask; -} - -BOOL LLVolume::isConvex() const -{ - // mParams.isConvex() may return FALSE even though the final - // geometry is actually convex due to LOD approximations. - // TODO -- provide LLPath and LLProfile with isConvex() methods - // that correctly determine convexity. -- Leviathan - return mParams.isConvex(); -} - - -std::ostream& operator<<(std::ostream &s, const LLProfileParams &profile_params) -{ - s << "{type=" << (U32) profile_params.mCurveType; - s << ", begin=" << profile_params.mBegin; - s << ", end=" << profile_params.mEnd; - s << ", hollow=" << profile_params.mHollow; - s << "}"; - return s; -} - - -std::ostream& operator<<(std::ostream &s, const LLPathParams &path_params) -{ - s << "{type=" << (U32) path_params.mCurveType; - s << ", begin=" << path_params.mBegin; - s << ", end=" << path_params.mEnd; - s << ", twist=" << path_params.mTwistEnd; - s << ", scale=" << path_params.mScale; - s << ", shear=" << path_params.mShear; - s << ", twist_begin=" << path_params.mTwistBegin; - s << ", radius_offset=" << path_params.mRadiusOffset; - s << ", taper=" << path_params.mTaper; - s << ", revolutions=" << path_params.mRevolutions; - s << ", skew=" << path_params.mSkew; - s << "}"; - return s; -} - - -std::ostream& operator<<(std::ostream &s, const LLVolumeParams &volume_params) -{ - s << "{profileparams = " << volume_params.mProfileParams; - s << ", pathparams = " << volume_params.mPathParams; - s << "}"; - return s; -} - - -std::ostream& operator<<(std::ostream &s, const LLProfile &profile) -{ - s << " {open=" << (U32) profile.mOpen; - s << ", dirty=" << profile.mDirty; - s << ", totalout=" << profile.mTotalOut; - s << ", total=" << profile.mTotal; - s << "}"; - return s; -} - - -std::ostream& operator<<(std::ostream &s, const LLPath &path) -{ - s << "{open=" << (U32) path.mOpen; - s << ", dirty=" << path.mDirty; - s << ", step=" << path.mStep; - s << ", total=" << path.mTotal; - s << "}"; - return s; -} - -std::ostream& operator<<(std::ostream &s, const LLVolume &volume) -{ - s << "{params = " << volume.getParams(); - s << ", path = " << *volume.mPathp; - s << ", profile = " << *volume.mProfilep; - s << "}"; - return s; -} - - -std::ostream& operator<<(std::ostream &s, const LLVolume *volumep) -{ - s << "{params = " << volumep->getParams(); - s << ", path = " << *(volumep->mPathp); - s << ", profile = " << *(volumep->mProfilep); - s << "}"; - return s; -} - -LLVolumeFace::LLVolumeFace() : - mID(0), - mTypeMask(0), - mBeginS(0), - mBeginT(0), - mNumS(0), - mNumT(0), - mNumVertices(0), - mNumIndices(0), - mPositions(NULL), - mNormals(NULL), - mBinormals(NULL), - mTexCoords(NULL), - mIndices(NULL), - mWeights(NULL), - mOctree(NULL) -{ - mExtents = (LLVector4a*) malloc(sizeof(LLVector4a)*3); - mCenter = mExtents+2; -} - -LLVolumeFace::LLVolumeFace(const LLVolumeFace& src) -: mID(0), - mTypeMask(0), - mBeginS(0), - mBeginT(0), - mNumS(0), - mNumT(0), - mNumVertices(0), - mNumIndices(0), - mPositions(NULL), - mNormals(NULL), - mBinormals(NULL), - mTexCoords(NULL), - mIndices(NULL), - mWeights(NULL), - mOctree(NULL) -{ - mExtents = (LLVector4a*) malloc(sizeof(LLVector4a)*3); - mCenter = mExtents+2; - *this = src; -} - -LLVolumeFace& LLVolumeFace::operator=(const LLVolumeFace& src) -{ - if (&src == this) - { //self assignment, do nothing - return *this; - } - - mID = src.mID; - mTypeMask = src.mTypeMask; - mBeginS = src.mBeginS; - mBeginT = src.mBeginT; - mNumS = src.mNumS; - mNumT = src.mNumT; - - mExtents[0] = src.mExtents[0]; - mExtents[1] = src.mExtents[1]; - *mCenter = *src.mCenter; - - mNumVertices = 0; - mNumIndices = 0; - - freeData(); - - LLVector4a::memcpyNonAliased16((F32*) mExtents, (F32*) src.mExtents, 3*sizeof(LLVector4a)); - - resizeVertices(src.mNumVertices); - resizeIndices(src.mNumIndices); - - if (mNumVertices) - { - S32 vert_size = mNumVertices*sizeof(LLVector4a); - S32 tc_size = (mNumVertices*sizeof(LLVector2)+0xF) & ~0xF; - - LLVector4a::memcpyNonAliased16((F32*) mPositions, (F32*) src.mPositions, vert_size); - LLVector4a::memcpyNonAliased16((F32*) mNormals, (F32*) src.mNormals, vert_size); - LLVector4a::memcpyNonAliased16((F32*) mTexCoords, (F32*) src.mTexCoords, tc_size); - - - if (src.mBinormals) - { - allocateBinormals(src.mNumVertices); - LLVector4a::memcpyNonAliased16((F32*) mBinormals, (F32*) src.mBinormals, vert_size); - } - else - { - free(mBinormals); - mBinormals = NULL; - } - - if (src.mWeights) - { - allocateWeights(src.mNumVertices); - LLVector4a::memcpyNonAliased16((F32*) mWeights, (F32*) src.mWeights, vert_size); - } - else - { - free(mWeights); - mWeights = NULL; - } - } - - if (mNumIndices) - { - S32 idx_size = (mNumIndices*sizeof(U16)+0xF) & ~0xF; - - LLVector4a::memcpyNonAliased16((F32*) mIndices, (F32*) src.mIndices, idx_size); - } - - //delete - return *this; -} - -LLVolumeFace::~LLVolumeFace() -{ - free(mExtents); - mExtents = NULL; - - freeData(); -} - -void LLVolumeFace::freeData() -{ - free(mPositions); - mPositions = NULL; - free( mNormals); - mNormals = NULL; - free(mTexCoords); - mTexCoords = NULL; - free(mIndices); - mIndices = NULL; - free(mBinormals); - mBinormals = NULL; - free(mWeights); - mWeights = NULL; - - delete mOctree; - mOctree = NULL; -} - -BOOL LLVolumeFace::create(LLVolume* volume, BOOL partial_build) -{ - //tree for this face is no longer valid - delete mOctree; - mOctree = NULL; - - BOOL ret = FALSE ; - if (mTypeMask & CAP_MASK) - { - ret = createCap(volume, partial_build); - } - else if ((mTypeMask & END_MASK) || (mTypeMask & SIDE_MASK)) - { - ret = createSide(volume, partial_build); - } - else - { - llerrs << "Unknown/uninitialized face type!" << llendl; - } - - //update the range of the texture coordinates - if(ret) - { - mTexCoordExtents[0].setVec(1.f, 1.f) ; - mTexCoordExtents[1].setVec(0.f, 0.f) ; - - for(U32 i = 0 ; i < mNumVertices ; i++) - { - if(mTexCoordExtents[0].mV[0] > mTexCoords[i].mV[0]) - { - mTexCoordExtents[0].mV[0] = mTexCoords[i].mV[0] ; - } - if(mTexCoordExtents[1].mV[0] < mTexCoords[i].mV[0]) - { - mTexCoordExtents[1].mV[0] = mTexCoords[i].mV[0] ; - } - - if(mTexCoordExtents[0].mV[1] > mTexCoords[i].mV[1]) - { - mTexCoordExtents[0].mV[1] = mTexCoords[i].mV[1] ; - } - if(mTexCoordExtents[1].mV[1] < mTexCoords[i].mV[1]) - { - mTexCoordExtents[1].mV[1] = mTexCoords[i].mV[1] ; - } - } - mTexCoordExtents[0].mV[0] = llmax(0.f, mTexCoordExtents[0].mV[0]) ; - mTexCoordExtents[0].mV[1] = llmax(0.f, mTexCoordExtents[0].mV[1]) ; - mTexCoordExtents[1].mV[0] = llmin(1.f, mTexCoordExtents[1].mV[0]) ; - mTexCoordExtents[1].mV[1] = llmin(1.f, mTexCoordExtents[1].mV[1]) ; - } - - return ret ; -} - -void LLVolumeFace::getVertexData(U16 index, LLVolumeFace::VertexData& cv) -{ - cv.setPosition(mPositions[index]); - cv.setNormal(mNormals[index]); - cv.mTexCoord = mTexCoords[index]; -} - -bool LLVolumeFace::VertexMapData::operator==(const LLVolumeFace::VertexData& rhs) const -{ - return getPosition().equals3(rhs.getPosition()) && - mTexCoord == rhs.mTexCoord && - getNormal().equals3(rhs.getNormal()); -} - -bool LLVolumeFace::VertexMapData::ComparePosition::operator()(const LLVector3& a, const LLVector3& b) const -{ - if (a.mV[0] != b.mV[0]) - { - return a.mV[0] < b.mV[0]; - } - - if (a.mV[1] != b.mV[1]) - { - return a.mV[1] < b.mV[1]; - } - - return a.mV[2] < b.mV[2]; -} - -void LLVolumeFace::optimize(F32 angle_cutoff) -{ - LLVolumeFace new_face; - - //map of points to vector of vertices at that point - VertexMapData::PointMap point_map; - - //remove redundant vertices - for (U32 i = 0; i < mNumIndices; ++i) - { - U16 index = mIndices[i]; - - LLVolumeFace::VertexData cv; - getVertexData(index, cv); - - BOOL found = FALSE; - VertexMapData::PointMap::iterator point_iter = point_map.find(LLVector3(cv.getPosition().getF32ptr())); - if (point_iter != point_map.end()) - { //duplicate point might exist - for (U32 j = 0; j < point_iter->second.size(); ++j) - { - LLVolumeFace::VertexData& tv = (point_iter->second)[j]; - if (tv.compareNormal(cv, angle_cutoff)) - { - found = TRUE; - new_face.pushIndex((point_iter->second)[j].mIndex); - break; - } - } - } - - if (!found) - { - new_face.pushVertex(cv); - U16 index = (U16) new_face.mNumVertices-1; - new_face.pushIndex(index); - - VertexMapData d; - d.setPosition(cv.getPosition()); - d.mTexCoord = cv.mTexCoord; - d.setNormal(cv.getNormal()); - d.mIndex = index; - if (point_iter != point_map.end()) - { - point_iter->second.push_back(d); - } - else - { - point_map[LLVector3(d.getPosition().getF32ptr())].push_back(d); - } - } - } - - swapData(new_face); -} - -class LLVCacheTriangleData; - -class LLVCacheVertexData -{ -public: - S32 mIdx; - S32 mCacheTag; - F32 mScore; - U32 mActiveTriangles; - std::vector<LLVCacheTriangleData*> mTriangles; - - LLVCacheVertexData() - { - mCacheTag = -1; - mScore = 0.f; - mActiveTriangles = 0; - mIdx = -1; - } -}; - -class LLVCacheTriangleData -{ -public: - bool mActive; - F32 mScore; - LLVCacheVertexData* mVertex[3]; - - LLVCacheTriangleData() - { - mActive = true; - mScore = 0.f; - mVertex[0] = mVertex[1] = mVertex[2] = NULL; - } - - void complete() - { - mActive = false; - for (S32 i = 0; i < 3; ++i) - { - if (mVertex[i]) - { - llassert_always(mVertex[i]->mActiveTriangles > 0); - mVertex[i]->mActiveTriangles--; - } - } - } - - bool operator<(const LLVCacheTriangleData& rhs) const - { //highest score first - return rhs.mScore < mScore; - } -}; - -const F32 FindVertexScore_CacheDecayPower = 1.5f; -const F32 FindVertexScore_LastTriScore = 0.75f; -const F32 FindVertexScore_ValenceBoostScale = 2.0f; -const F32 FindVertexScore_ValenceBoostPower = 0.5f; -const U32 MaxSizeVertexCache = 32; - -F32 find_vertex_score(LLVCacheVertexData& data) -{ - if (data.mActiveTriangles == 0) - { //no triangle references this vertex - return -1.f; - } - - F32 score = 0.f; - - S32 cache_idx = data.mCacheTag; - - if (cache_idx < 0) - { - //not in cache - } - else - { - if (cache_idx < 3) - { //vertex was in the last triangle - score = FindVertexScore_LastTriScore; - } - else - { //more points for being higher in the cache - F32 scaler = 1.f/(MaxSizeVertexCache-3); - score = 1.f-((cache_idx-3)*scaler); - score = powf(score, FindVertexScore_CacheDecayPower); - } - } - - //bonus points for having low valence - F32 valence_boost = powf(data.mActiveTriangles, -FindVertexScore_ValenceBoostPower); - score += FindVertexScore_ValenceBoostScale * valence_boost; - - return score; -} - -class LLVCacheFIFO -{ -public: - LLVCacheVertexData* mCache[MaxSizeVertexCache]; - U32 mMisses; - - LLVCacheFIFO() - { - mMisses = 0; - for (U32 i = 0; i < MaxSizeVertexCache; ++i) - { - mCache[i] = NULL; - } - } - - void addVertex(LLVCacheVertexData* data) - { - if (data->mCacheTag == -1) - { - mMisses++; - - S32 end = MaxSizeVertexCache-1; - - if (mCache[end]) - { - mCache[end]->mCacheTag = -1; - } - - for (S32 i = end; i > 0; --i) - { - mCache[i] = mCache[i-1]; - if (mCache[i]) - { - mCache[i]->mCacheTag = i; - } - } - - mCache[0] = data; - data->mCacheTag = 0; - } - } -}; - -class LLVCacheLRU -{ -public: - LLVCacheVertexData* mCache[MaxSizeVertexCache+3]; - - LLVCacheTriangleData* mBestTriangle; - - U32 mMisses; - - LLVCacheLRU() - { - for (U32 i = 0; i < MaxSizeVertexCache+3; ++i) - { - mCache[i] = NULL; - } - - mBestTriangle = NULL; - mMisses = 0; - } - - void addVertex(LLVCacheVertexData* data) - { - S32 end = MaxSizeVertexCache+2; - if (data->mCacheTag != -1) - { //just moving a vertex to the front of the cache - end = data->mCacheTag; - } - else - { - mMisses++; - if (mCache[end]) - { //adding a new vertex, vertex at end of cache falls off - mCache[end]->mCacheTag = -1; - } - } - - for (S32 i = end; i > 0; --i) - { //adjust cache pointers and tags - mCache[i] = mCache[i-1]; - - if (mCache[i]) - { - mCache[i]->mCacheTag = i; - } - } - - mCache[0] = data; - mCache[0]->mCacheTag = 0; - } - - void addTriangle(LLVCacheTriangleData* data) - { - addVertex(data->mVertex[0]); - addVertex(data->mVertex[1]); - addVertex(data->mVertex[2]); - } - - void updateScores() - { - for (U32 i = MaxSizeVertexCache; i < MaxSizeVertexCache+3; ++i) - { //trailing 3 vertices aren't actually in the cache for scoring purposes - if (mCache[i]) - { - mCache[i]->mCacheTag = -1; - } - } - - for (U32 i = 0; i < MaxSizeVertexCache; ++i) - { //update scores of vertices in cache - if (mCache[i]) - { - mCache[i]->mScore = find_vertex_score(*(mCache[i])); - llassert_always(mCache[i]->mCacheTag == i); - } - } - - mBestTriangle = NULL; - //update triangle scores - for (U32 i = 0; i < MaxSizeVertexCache+3; ++i) - { - if (mCache[i]) - { - for (U32 j = 0; j < mCache[i]->mTriangles.size(); ++j) - { - LLVCacheTriangleData* tri = mCache[i]->mTriangles[j]; - if (tri->mActive) - { - tri->mScore = tri->mVertex[0]->mScore; - tri->mScore += tri->mVertex[1]->mScore; - tri->mScore += tri->mVertex[2]->mScore; - - if (!mBestTriangle || mBestTriangle->mScore < tri->mScore) - { - mBestTriangle = tri; - } - } - } - } - } - - //knock trailing 3 vertices off the cache - for (U32 i = MaxSizeVertexCache; i < MaxSizeVertexCache+3; ++i) - { - if (mCache[i]) - { - llassert_always(mCache[i]->mCacheTag == -1); - mCache[i] = NULL; - } - } - } -}; - - -void LLVolumeFace::cacheOptimize() -{ //optimize for vertex cache according to Forsyth method: - // http://home.comcast.net/~tom_forsyth/papers/fast_vert_cache_opt.html - - LLVCacheLRU cache; - - //mapping of vertices to triangles and indices - std::vector<LLVCacheVertexData> vertex_data; - - //mapping of triangles do vertices - std::vector<LLVCacheTriangleData> triangle_data; - - triangle_data.resize(mNumIndices/3); - vertex_data.resize(mNumVertices); - - for (U32 i = 0; i < mNumIndices; i++) - { //populate vertex data and triangle data arrays - U16 idx = mIndices[i]; - U32 tri_idx = i/3; - - vertex_data[idx].mTriangles.push_back(&(triangle_data[tri_idx])); - vertex_data[idx].mIdx = idx; - triangle_data[tri_idx].mVertex[i%3] = &(vertex_data[idx]); - } - - /*F32 pre_acmr = 1.f; - //measure cache misses from before rebuild - { - LLVCacheFIFO test_cache; - for (U32 i = 0; i < mNumIndices; ++i) - { - test_cache.addVertex(&vertex_data[mIndices[i]]); - } - - for (U32 i = 0; i < mNumVertices; i++) - { - vertex_data[i].mCacheTag = -1; - } - - pre_acmr = (F32) test_cache.mMisses/(mNumIndices/3); - }*/ - - for (U32 i = 0; i < mNumVertices; i++) - { //initialize score values (no cache -- might try a fifo cache here) - vertex_data[i].mScore = find_vertex_score(vertex_data[i]); - vertex_data[i].mActiveTriangles = vertex_data[i].mTriangles.size(); - - for (U32 j = 0; j < vertex_data[i].mTriangles.size(); ++j) - { - vertex_data[i].mTriangles[j]->mScore += vertex_data[i].mScore; - } - } - - //sort triangle data by score - std::sort(triangle_data.begin(), triangle_data.end()); - - std::vector<U16> new_indices; - - LLVCacheTriangleData* tri; - - //prime pump by adding first triangle to cache; - tri = &(triangle_data[0]); - cache.addTriangle(tri); - new_indices.push_back(tri->mVertex[0]->mIdx); - new_indices.push_back(tri->mVertex[1]->mIdx); - new_indices.push_back(tri->mVertex[2]->mIdx); - tri->complete(); - - U32 breaks = 0; - for (U32 i = 1; i < mNumIndices/3; ++i) - { - cache.updateScores(); - tri = cache.mBestTriangle; - if (!tri) - { - breaks++; - for (U32 j = 0; j < triangle_data.size(); ++j) - { - if (triangle_data[j].mActive) - { - tri = &(triangle_data[j]); - break; - } - } - } - - cache.addTriangle(tri); - new_indices.push_back(tri->mVertex[0]->mIdx); - new_indices.push_back(tri->mVertex[1]->mIdx); - new_indices.push_back(tri->mVertex[2]->mIdx); - tri->complete(); - } - - for (U32 i = 0; i < mNumIndices; ++i) - { - mIndices[i] = new_indices[i]; - } - - /*F32 post_acmr = 1.f; - //measure cache misses from after rebuild - { - LLVCacheFIFO test_cache; - for (U32 i = 0; i < mNumVertices; i++) - { - vertex_data[i].mCacheTag = -1; - } - - for (U32 i = 0; i < mNumIndices; ++i) - { - test_cache.addVertex(&vertex_data[mIndices[i]]); - } - - post_acmr = (F32) test_cache.mMisses/(mNumIndices/3); - }*/ - - //optimize for pre-TnL cache - - //allocate space for new buffer - S32 num_verts = mNumVertices; - LLVector4a* pos = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts); - LLVector4a* norm = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts); - S32 size = ((num_verts*sizeof(LLVector2)) + 0xF) & ~0xF; - LLVector2* tc = (LLVector2*) malloc(size); - - LLVector4a* wght = NULL; - if (mWeights) - { - wght = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts); - } - - LLVector4a* binorm = NULL; - if (mBinormals) - { - binorm = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts); - } - - //allocate mapping of old indices to new indices - std::vector<S32> new_idx; - new_idx.resize(mNumVertices, -1); - - S32 cur_idx = 0; - for (U32 i = 0; i < mNumIndices; ++i) - { - U16 idx = mIndices[i]; - if (new_idx[idx] == -1) - { //this vertex hasn't been added yet - new_idx[idx] = cur_idx; - - //copy vertex data - pos[cur_idx] = mPositions[idx]; - norm[cur_idx] = mNormals[idx]; - tc[cur_idx] = mTexCoords[idx]; - if (mWeights) - { - wght[cur_idx] = mWeights[idx]; - } - if (mBinormals) - { - binorm[cur_idx] = mBinormals[idx]; - } - - cur_idx++; - } - } - - for (U32 i = 0; i < mNumIndices; ++i) - { - mIndices[i] = new_idx[mIndices[i]]; - } - - free(mPositions); - free(mNormals); - free(mTexCoords); - free(mWeights); - free(mBinormals); - - mPositions = pos; - mNormals = norm; - mTexCoords = tc; - mWeights = wght; - mBinormals = binorm; - - //std::string result = llformat("ACMR pre/post: %.3f/%.3f -- %d triangles %d breaks", pre_acmr, post_acmr, mNumIndices/3, breaks); - //llinfos << result << llendl; - -} - -void LLVolumeFace::createOctree(F32 scaler, const LLVector4a& center, const LLVector4a& size) -{ - if (mOctree) - { - return; - } - - mOctree = new LLOctreeRoot<LLVolumeTriangle>(center, size, NULL); - new LLVolumeOctreeListener(mOctree); - - for (U32 i = 0; i < mNumIndices; i+= 3) - { //for each triangle - LLPointer<LLVolumeTriangle> tri = new LLVolumeTriangle(); - - const LLVector4a& v0 = mPositions[mIndices[i]]; - const LLVector4a& v1 = mPositions[mIndices[i+1]]; - const LLVector4a& v2 = mPositions[mIndices[i+2]]; - - //store pointers to vertex data - tri->mV[0] = &v0; - tri->mV[1] = &v1; - tri->mV[2] = &v2; - - //store indices - tri->mIndex[0] = mIndices[i]; - tri->mIndex[1] = mIndices[i+1]; - tri->mIndex[2] = mIndices[i+2]; - - //get minimum point - LLVector4a min = v0; - min.setMin(min, v1); - min.setMin(min, v2); - - //get maximum point - LLVector4a max = v0; - max.setMax(max, v1); - max.setMax(max, v2); - - //compute center - LLVector4a center; - center.setAdd(min, max); - center.mul(0.5f); - - tri->mPositionGroup = center; - - //compute "radius" - LLVector4a size; - size.setSub(max,min); - - tri->mRadius = size.getLength3().getF32() * scaler; - - //insert - mOctree->insert(tri); - } - - //remove unneeded octree layers - while (!mOctree->balance()) { } - - //calculate AABB for each node - LLVolumeOctreeRebound rebound(this); - rebound.traverse(mOctree); - - if (gDebugGL) - { - LLVolumeOctreeValidate validate; - validate.traverse(mOctree); - } -} - - -void LLVolumeFace::swapData(LLVolumeFace& rhs) -{ - llswap(rhs.mPositions, mPositions); - llswap(rhs.mNormals, mNormals); - llswap(rhs.mBinormals, mBinormals); - llswap(rhs.mTexCoords, mTexCoords); - llswap(rhs.mIndices,mIndices); - llswap(rhs.mNumVertices, mNumVertices); - llswap(rhs.mNumIndices, mNumIndices); -} - -void LerpPlanarVertex(LLVolumeFace::VertexData& v0, - LLVolumeFace::VertexData& v1, - LLVolumeFace::VertexData& v2, - LLVolumeFace::VertexData& vout, - F32 coef01, - F32 coef02) -{ - - LLVector4a lhs; - lhs.setSub(v1.getPosition(), v0.getPosition()); - lhs.mul(coef01); - LLVector4a rhs; - rhs.setSub(v2.getPosition(), v0.getPosition()); - rhs.mul(coef02); - - rhs.add(lhs); - rhs.add(v0.getPosition()); - - vout.setPosition(rhs); - - vout.mTexCoord = v0.mTexCoord + ((v1.mTexCoord-v0.mTexCoord)*coef01)+((v2.mTexCoord-v0.mTexCoord)*coef02); - vout.setNormal(v0.getNormal()); -} - -BOOL LLVolumeFace::createUnCutCubeCap(LLVolume* volume, BOOL partial_build) -{ - LLMemType m1(LLMemType::MTYPE_VOLUME); - - const std::vector<LLVolume::Point>& mesh = volume->getMesh(); - const std::vector<LLVector3>& profile = volume->getProfile().mProfile; - S32 max_s = volume->getProfile().getTotal(); - S32 max_t = volume->getPath().mPath.size(); - - // S32 i; - S32 num_vertices = 0, num_indices = 0; - S32 grid_size = (profile.size()-1)/4; - S32 quad_count = (grid_size * grid_size); - - num_vertices = (grid_size+1)*(grid_size+1); - num_indices = quad_count * 4; - - LLVector4a& min = mExtents[0]; - LLVector4a& max = mExtents[1]; - - S32 offset = 0; - if (mTypeMask & TOP_MASK) - { - offset = (max_t-1) * max_s; - } - else - { - offset = mBeginS; - } - - { - VertexData corners[4]; - VertexData baseVert; - for(S32 t = 0; t < 4; t++) - { - corners[t].getPosition().load3( mesh[offset + (grid_size*t)].mPos.mV); - corners[t].mTexCoord.mV[0] = profile[grid_size*t].mV[0]+0.5f; - corners[t].mTexCoord.mV[1] = 0.5f - profile[grid_size*t].mV[1]; - } - - { - LLVector4a lhs; - lhs.setSub(corners[1].getPosition(), corners[0].getPosition()); - LLVector4a rhs; - rhs.setSub(corners[2].getPosition(), corners[1].getPosition()); - baseVert.getNormal().setCross3(lhs, rhs); - baseVert.getNormal().normalize3fast(); - } - - if(!(mTypeMask & TOP_MASK)) - { - baseVert.getNormal().mul(-1.0f); - } - else - { - //Swap the UVs on the U(X) axis for top face - LLVector2 swap; - swap = corners[0].mTexCoord; - corners[0].mTexCoord=corners[3].mTexCoord; - corners[3].mTexCoord=swap; - swap = corners[1].mTexCoord; - corners[1].mTexCoord=corners[2].mTexCoord; - corners[2].mTexCoord=swap; - } - - LLVector4a binormal; - - calc_binormal_from_triangle( binormal, - corners[0].getPosition(), corners[0].mTexCoord, - corners[1].getPosition(), corners[1].mTexCoord, - corners[2].getPosition(), corners[2].mTexCoord); - - binormal.normalize3fast(); - - S32 size = (grid_size+1)*(grid_size+1); - resizeVertices(size); - allocateBinormals(size); - - LLVector4a* pos = (LLVector4a*) mPositions; - LLVector4a* norm = (LLVector4a*) mNormals; - LLVector4a* binorm = (LLVector4a*) mBinormals; - LLVector2* tc = (LLVector2*) mTexCoords; - - for(int gx = 0;gx<grid_size+1;gx++) - { - for(int gy = 0;gy<grid_size+1;gy++) - { - VertexData newVert; - LerpPlanarVertex( - corners[0], - corners[1], - corners[3], - newVert, - (F32)gx/(F32)grid_size, - (F32)gy/(F32)grid_size); - - *pos++ = newVert.getPosition(); - *norm++ = baseVert.getNormal(); - *tc++ = newVert.mTexCoord; - *binorm++ = binormal; - - if (gx == 0 && gy == 0) - { - min = newVert.getPosition(); - max = min; - } - else - { - min.setMin(min, newVert.getPosition()); - max.setMax(max, newVert.getPosition()); - } - } - } - - mCenter->setAdd(min, max); - mCenter->mul(0.5f); - } - - if (!partial_build) - { - resizeIndices(grid_size*grid_size*6); - - U16* out = mIndices; - - S32 idxs[] = {0,1,(grid_size+1)+1,(grid_size+1)+1,(grid_size+1),0}; - for(S32 gx = 0;gx<grid_size;gx++) - { - - for(S32 gy = 0;gy<grid_size;gy++) - { - if (mTypeMask & TOP_MASK) - { - for(S32 i=5;i>=0;i--) - { - *out++ = ((gy*(grid_size+1))+gx+idxs[i]); - } - } - else - { - for(S32 i=0;i<6;i++) - { - *out++ = ((gy*(grid_size+1))+gx+idxs[i]); - } - } - } - } - } - - return TRUE; -} - - -BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build) -{ - LLMemType m1(LLMemType::MTYPE_VOLUME); - - if (!(mTypeMask & HOLLOW_MASK) && - !(mTypeMask & OPEN_MASK) && - ((volume->getParams().getPathParams().getBegin()==0.0f)&& - (volume->getParams().getPathParams().getEnd()==1.0f))&& - (volume->getParams().getProfileParams().getCurveType()==LL_PCODE_PROFILE_SQUARE && - volume->getParams().getPathParams().getCurveType()==LL_PCODE_PATH_LINE) - ){ - return createUnCutCubeCap(volume, partial_build); - } - - S32 num_vertices = 0, num_indices = 0; - - const std::vector<LLVolume::Point>& mesh = volume->getMesh(); - const std::vector<LLVector3>& profile = volume->getProfile().mProfile; - - // All types of caps have the same number of vertices and indices - num_vertices = profile.size(); - num_indices = (profile.size() - 2)*3; - - if (!(mTypeMask & HOLLOW_MASK) && !(mTypeMask & OPEN_MASK)) - { - resizeVertices(num_vertices+1); - allocateBinormals(num_vertices+1); - - if (!partial_build) - { - resizeIndices(num_indices+3); - } - } - else - { - resizeVertices(num_vertices); - allocateBinormals(num_vertices); - - if (!partial_build) - { - resizeIndices(num_indices); - } - } - - S32 max_s = volume->getProfile().getTotal(); - S32 max_t = volume->getPath().mPath.size(); - - mCenter->clear(); - - S32 offset = 0; - if (mTypeMask & TOP_MASK) - { - offset = (max_t-1) * max_s; - } - else - { - offset = mBeginS; - } - - // Figure out the normal, assume all caps are flat faces. - // Cross product to get normals. - - LLVector2 cuv; - LLVector2 min_uv, max_uv; - - LLVector4a& min = mExtents[0]; - LLVector4a& max = mExtents[1]; - - LLVector2* tc = (LLVector2*) mTexCoords; - LLVector4a* pos = (LLVector4a*) mPositions; - LLVector4a* norm = (LLVector4a*) mNormals; - LLVector4a* binorm = (LLVector4a*) mBinormals; - - // Copy the vertices into the array - for (S32 i = 0; i < num_vertices; i++) - { - if (mTypeMask & TOP_MASK) - { - tc[i].mV[0] = profile[i].mV[0]+0.5f; - tc[i].mV[1] = profile[i].mV[1]+0.5f; - } - else - { - // Mirror for underside. - tc[i].mV[0] = profile[i].mV[0]+0.5f; - tc[i].mV[1] = 0.5f - profile[i].mV[1]; - } - - pos[i].load3(mesh[i + offset].mPos.mV); - - if (i == 0) - { - max = pos[i]; - min = max; - min_uv = max_uv = tc[i]; - } - else - { - update_min_max(min,max,pos[i]); - update_min_max(min_uv, max_uv, tc[i]); - } - } - - mCenter->setAdd(min, max); - mCenter->mul(0.5f); - - cuv = (min_uv + max_uv)*0.5f; - - LLVector4a binormal; - calc_binormal_from_triangle(binormal, - *mCenter, cuv, - pos[0], tc[0], - pos[1], tc[1]); - binormal.normalize3fast(); - - LLVector4a normal; - LLVector4a d0, d1; - - - d0.setSub(*mCenter, pos[0]); - d1.setSub(*mCenter, pos[1]); - - if (mTypeMask & TOP_MASK) - { - normal.setCross3(d0, d1); - } - else - { - normal.setCross3(d1, d0); - } - - normal.normalize3fast(); - - VertexData vd; - vd.setPosition(*mCenter); - vd.mTexCoord = cuv; - - if (!(mTypeMask & HOLLOW_MASK) && !(mTypeMask & OPEN_MASK)) - { - pos[num_vertices] = *mCenter; - tc[num_vertices] = cuv; - num_vertices++; - } - - for (S32 i = 0; i < num_vertices; i++) - { - binorm[i].load4a(binormal.getF32ptr()); - norm[i].load4a(normal.getF32ptr()); - } - - if (partial_build) - { - return TRUE; - } - - if (mTypeMask & HOLLOW_MASK) - { - if (mTypeMask & TOP_MASK) - { - // HOLLOW TOP - // Does it matter if it's open or closed? - djs - - S32 pt1 = 0, pt2 = num_vertices - 1; - S32 i = 0; - while (pt2 - pt1 > 1) - { - // Use the profile points instead of the mesh, since you want - // the un-transformed profile distances. - LLVector3 p1 = profile[pt1]; - LLVector3 p2 = profile[pt2]; - LLVector3 pa = profile[pt1+1]; - LLVector3 pb = profile[pt2-1]; - - p1.mV[VZ] = 0.f; - p2.mV[VZ] = 0.f; - pa.mV[VZ] = 0.f; - pb.mV[VZ] = 0.f; - - // Use area of triangle to determine backfacing - F32 area_1a2, area_1ba, area_21b, area_2ab; - area_1a2 = (p1.mV[0]*pa.mV[1] - pa.mV[0]*p1.mV[1]) + - (pa.mV[0]*p2.mV[1] - p2.mV[0]*pa.mV[1]) + - (p2.mV[0]*p1.mV[1] - p1.mV[0]*p2.mV[1]); - - area_1ba = (p1.mV[0]*pb.mV[1] - pb.mV[0]*p1.mV[1]) + - (pb.mV[0]*pa.mV[1] - pa.mV[0]*pb.mV[1]) + - (pa.mV[0]*p1.mV[1] - p1.mV[0]*pa.mV[1]); - - area_21b = (p2.mV[0]*p1.mV[1] - p1.mV[0]*p2.mV[1]) + - (p1.mV[0]*pb.mV[1] - pb.mV[0]*p1.mV[1]) + - (pb.mV[0]*p2.mV[1] - p2.mV[0]*pb.mV[1]); - - area_2ab = (p2.mV[0]*pa.mV[1] - pa.mV[0]*p2.mV[1]) + - (pa.mV[0]*pb.mV[1] - pb.mV[0]*pa.mV[1]) + - (pb.mV[0]*p2.mV[1] - p2.mV[0]*pb.mV[1]); - - BOOL use_tri1a2 = TRUE; - BOOL tri_1a2 = TRUE; - BOOL tri_21b = TRUE; - - if (area_1a2 < 0) - { - tri_1a2 = FALSE; - } - if (area_2ab < 0) - { - // Can't use, because it contains point b - tri_1a2 = FALSE; - } - if (area_21b < 0) - { - tri_21b = FALSE; - } - if (area_1ba < 0) - { - // Can't use, because it contains point b - tri_21b = FALSE; - } - - if (!tri_1a2) - { - use_tri1a2 = FALSE; - } - else if (!tri_21b) - { - use_tri1a2 = TRUE; - } - else - { - LLVector3 d1 = p1 - pa; - LLVector3 d2 = p2 - pb; - - if (d1.magVecSquared() < d2.magVecSquared()) - { - use_tri1a2 = TRUE; - } - else - { - use_tri1a2 = FALSE; - } - } - - if (use_tri1a2) - { - mIndices[i++] = pt1; - mIndices[i++] = pt1 + 1; - mIndices[i++] = pt2; - pt1++; - } - else - { - mIndices[i++] = pt1; - mIndices[i++] = pt2 - 1; - mIndices[i++] = pt2; - pt2--; - } - } - } - else - { - // HOLLOW BOTTOM - // Does it matter if it's open or closed? - djs - - llassert(mTypeMask & BOTTOM_MASK); - S32 pt1 = 0, pt2 = num_vertices - 1; - - S32 i = 0; - while (pt2 - pt1 > 1) - { - // Use the profile points instead of the mesh, since you want - // the un-transformed profile distances. - LLVector3 p1 = profile[pt1]; - LLVector3 p2 = profile[pt2]; - LLVector3 pa = profile[pt1+1]; - LLVector3 pb = profile[pt2-1]; - - p1.mV[VZ] = 0.f; - p2.mV[VZ] = 0.f; - pa.mV[VZ] = 0.f; - pb.mV[VZ] = 0.f; - - // Use area of triangle to determine backfacing - F32 area_1a2, area_1ba, area_21b, area_2ab; - area_1a2 = (p1.mV[0]*pa.mV[1] - pa.mV[0]*p1.mV[1]) + - (pa.mV[0]*p2.mV[1] - p2.mV[0]*pa.mV[1]) + - (p2.mV[0]*p1.mV[1] - p1.mV[0]*p2.mV[1]); - - area_1ba = (p1.mV[0]*pb.mV[1] - pb.mV[0]*p1.mV[1]) + - (pb.mV[0]*pa.mV[1] - pa.mV[0]*pb.mV[1]) + - (pa.mV[0]*p1.mV[1] - p1.mV[0]*pa.mV[1]); - - area_21b = (p2.mV[0]*p1.mV[1] - p1.mV[0]*p2.mV[1]) + - (p1.mV[0]*pb.mV[1] - pb.mV[0]*p1.mV[1]) + - (pb.mV[0]*p2.mV[1] - p2.mV[0]*pb.mV[1]); - - area_2ab = (p2.mV[0]*pa.mV[1] - pa.mV[0]*p2.mV[1]) + - (pa.mV[0]*pb.mV[1] - pb.mV[0]*pa.mV[1]) + - (pb.mV[0]*p2.mV[1] - p2.mV[0]*pb.mV[1]); - - BOOL use_tri1a2 = TRUE; - BOOL tri_1a2 = TRUE; - BOOL tri_21b = TRUE; - - if (area_1a2 < 0) - { - tri_1a2 = FALSE; - } - if (area_2ab < 0) - { - // Can't use, because it contains point b - tri_1a2 = FALSE; - } - if (area_21b < 0) - { - tri_21b = FALSE; - } - if (area_1ba < 0) - { - // Can't use, because it contains point b - tri_21b = FALSE; - } - - if (!tri_1a2) - { - use_tri1a2 = FALSE; - } - else if (!tri_21b) - { - use_tri1a2 = TRUE; - } - else - { - LLVector3 d1 = p1 - pa; - LLVector3 d2 = p2 - pb; - - if (d1.magVecSquared() < d2.magVecSquared()) - { - use_tri1a2 = TRUE; - } - else - { - use_tri1a2 = FALSE; - } - } - - // Flipped backfacing from top - if (use_tri1a2) - { - mIndices[i++] = pt1; - mIndices[i++] = pt2; - mIndices[i++] = pt1 + 1; - pt1++; - } - else - { - mIndices[i++] = pt1; - mIndices[i++] = pt2; - mIndices[i++] = pt2 - 1; - pt2--; - } - } - } - } - else - { - // Not hollow, generate the triangle fan. - U16 v1 = 2; - U16 v2 = 1; - - if (mTypeMask & TOP_MASK) - { - v1 = 1; - v2 = 2; - } - - for (S32 i = 0; i < (num_vertices - 2); i++) - { - mIndices[3*i] = num_vertices - 1; - mIndices[3*i+v1] = i; - mIndices[3*i+v2] = i + 1; - } - - - } - - return TRUE; -} - -void LLVolumeFace::createBinormals() -{ - LLMemType m1(LLMemType::MTYPE_VOLUME); - - if (!mBinormals) - { - allocateBinormals(mNumVertices); - - //generate binormals - LLVector4a* pos = mPositions; - LLVector2* tc = (LLVector2*) mTexCoords; - LLVector4a* binorm = (LLVector4a*) mBinormals; - - LLVector4a* end = mBinormals+mNumVertices; - while (binorm < end) - { - (*binorm++).clear(); - } - - binorm = mBinormals; - - for (U32 i = 0; i < mNumIndices/3; i++) - { //for each triangle - const U16& i0 = mIndices[i*3+0]; - const U16& i1 = mIndices[i*3+1]; - const U16& i2 = mIndices[i*3+2]; - - //calculate binormal - LLVector4a binormal; - calc_binormal_from_triangle(binormal, - pos[i0], tc[i0], - pos[i1], tc[i1], - pos[i2], tc[i2]); - - - //add triangle normal to vertices - binorm[i0].add(binormal); - binorm[i1].add(binormal); - binorm[i2].add(binormal); - - //even out quad contributions - if (i % 2 == 0) - { - binorm[i2].add(binormal); - } - else - { - binorm[i1].add(binormal); - } - } - - //normalize binormals - for (U32 i = 0; i < mNumVertices; i++) - { - binorm[i].normalize3fast(); - //bump map/planar projection code requires normals to be normalized - mNormals[i].normalize3fast(); - } - } -} - -void LLVolumeFace::resizeVertices(S32 num_verts) -{ - free(mPositions); - free(mNormals); - free(mBinormals); - free(mTexCoords); - - mBinormals = NULL; - - if (num_verts) - { - mPositions = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts); - assert_aligned(mPositions, 16); - mNormals = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts); - assert_aligned(mNormals, 16); - - //pad texture coordinate block end to allow for QWORD reads - S32 size = ((num_verts*sizeof(LLVector2)) + 0xF) & ~0xF; - mTexCoords = (LLVector2*) malloc(size); - assert_aligned(mTexCoords, 16); - } - else - { - mPositions = NULL; - mNormals = NULL; - mTexCoords = NULL; - } - - mNumVertices = num_verts; -} - -void LLVolumeFace::pushVertex(const LLVolumeFace::VertexData& cv) -{ - pushVertex(cv.getPosition(), cv.getNormal(), cv.mTexCoord); -} - -void LLVolumeFace::pushVertex(const LLVector4a& pos, const LLVector4a& norm, const LLVector2& tc) -{ - S32 new_verts = mNumVertices+1; - S32 new_size = new_verts*16; -// S32 old_size = mNumVertices*16; - - //positions - mPositions = (LLVector4a*) realloc(mPositions, new_size); - - //normals - mNormals = (LLVector4a*) realloc(mNormals, new_size); - - //tex coords - new_size = ((new_verts*8)+0xF) & ~0xF; - mTexCoords = (LLVector2*) realloc(mTexCoords, new_size); - - - //just clear binormals - free(mBinormals); - mBinormals = NULL; - - mPositions[mNumVertices] = pos; - mNormals[mNumVertices] = norm; - mTexCoords[mNumVertices] = tc; - - mNumVertices++; -} - -void LLVolumeFace::allocateBinormals(S32 num_verts) -{ - free(mBinormals); - mBinormals = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts); -} - -void LLVolumeFace::allocateWeights(S32 num_verts) -{ - free(mWeights); - mWeights = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts); -} - -void LLVolumeFace::resizeIndices(S32 num_indices) -{ - free(mIndices); - - if (num_indices) - { - //pad index block end to allow for QWORD reads - S32 size = ((num_indices*sizeof(U16)) + 0xF) & ~0xF; - - mIndices = (U16*) malloc(size); - } - else - { - mIndices = NULL; - } - - mNumIndices = num_indices; -} - -void LLVolumeFace::pushIndex(const U16& idx) -{ - S32 new_count = mNumIndices + 1; - S32 new_size = ((new_count*2)+0xF) & ~0xF; - - S32 old_size = ((mNumIndices*2)+0xF) & ~0xF; - if (new_size != old_size) - { - mIndices = (U16*) realloc(mIndices, new_size); - } - - mIndices[mNumIndices++] = idx; -} - -void LLVolumeFace::fillFromLegacyData(std::vector<LLVolumeFace::VertexData>& v, std::vector<U16>& idx) -{ - resizeVertices(v.size()); - resizeIndices(idx.size()); - - for (U32 i = 0; i < v.size(); ++i) - { - mPositions[i] = v[i].getPosition(); - mNormals[i] = v[i].getNormal(); - mTexCoords[i] = v[i].mTexCoord; - } - - for (U32 i = 0; i < idx.size(); ++i) - { - mIndices[i] = idx[i]; - } -} - -void LLVolumeFace::appendFace(const LLVolumeFace& face, LLMatrix4& mat_in, LLMatrix4& norm_mat_in) -{ - U16 offset = mNumVertices; - - S32 new_count = face.mNumVertices + mNumVertices; - - if (new_count > 65536) - { - llerrs << "Cannot append face -- 16-bit overflow will occur." << llendl; - } - - if (face.mNumVertices == 0) - { - llerrs << "Cannot append empty face." << llendl; - } - - //allocate new buffer space - mPositions = (LLVector4a*) realloc(mPositions, new_count*sizeof(LLVector4a)); - assert_aligned(mPositions, 16); - mNormals = (LLVector4a*) realloc(mNormals, new_count*sizeof(LLVector4a)); - assert_aligned(mNormals, 16); - mTexCoords = (LLVector2*) realloc(mTexCoords, (new_count*sizeof(LLVector2)+0xF) & ~0xF); - assert_aligned(mTexCoords, 16); - - mNumVertices = new_count; - - //get destination address of appended face - LLVector4a* dst_pos = mPositions+offset; - LLVector2* dst_tc = mTexCoords+offset; - LLVector4a* dst_norm = mNormals+offset; - - //get source addresses of appended face - const LLVector4a* src_pos = face.mPositions; - const LLVector2* src_tc = face.mTexCoords; - const LLVector4a* src_norm = face.mNormals; - - //load aligned matrices - LLMatrix4a mat, norm_mat; - mat.loadu(mat_in); - norm_mat.loadu(norm_mat_in); - - for (U32 i = 0; i < face.mNumVertices; ++i) - { - //transform appended face position and store - mat.affineTransform(src_pos[i], dst_pos[i]); - - //transform appended face normal and store - norm_mat.rotate(src_norm[i], dst_norm[i]); - dst_norm[i].normalize3fast(); - - //copy appended face texture coordinate - dst_tc[i] = src_tc[i]; - - if (offset == 0 && i == 0) - { //initialize bounding box - mExtents[0] = mExtents[1] = dst_pos[i]; - } - else - { - //stretch bounding box - update_min_max(mExtents[0], mExtents[1], dst_pos[i]); - } - } - - - new_count = mNumIndices + face.mNumIndices; - - //allocate new index buffer - mIndices = (U16*) realloc(mIndices, (new_count*sizeof(U16)+0xF) & ~0xF); - - //get destination address into new index buffer - U16* dst_idx = mIndices+mNumIndices; - mNumIndices = new_count; - - for (U32 i = 0; i < face.mNumIndices; ++i) - { //copy indices, offsetting by old vertex count - dst_idx[i] = face.mIndices[i]+offset; - } -} - -BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build) -{ - LLMemType m1(LLMemType::MTYPE_VOLUME); - - BOOL flat = mTypeMask & FLAT_MASK; - - U8 sculpt_type = volume->getParams().getSculptType(); - U8 sculpt_stitching = sculpt_type & LL_SCULPT_TYPE_MASK; - BOOL sculpt_invert = sculpt_type & LL_SCULPT_FLAG_INVERT; - BOOL sculpt_mirror = sculpt_type & LL_SCULPT_FLAG_MIRROR; - BOOL sculpt_reverse_horizontal = (sculpt_invert ? !sculpt_mirror : sculpt_mirror); // XOR - - S32 num_vertices, num_indices; - - const std::vector<LLVolume::Point>& mesh = volume->getMesh(); - const std::vector<LLVector3>& profile = volume->getProfile().mProfile; - const std::vector<LLPath::PathPt>& path_data = volume->getPath().mPath; - - S32 max_s = volume->getProfile().getTotal(); - - S32 s, t, i; - F32 ss, tt; - - num_vertices = mNumS*mNumT; - num_indices = (mNumS-1)*(mNumT-1)*6; - - if (!partial_build) - { - resizeVertices(num_vertices); - resizeIndices(num_indices); - - if ((volume->getParams().getSculptType() & LL_SCULPT_TYPE_MASK) != LL_SCULPT_TYPE_MESH) - { - mEdge.resize(num_indices); - } - } - - LLVector4a* pos = (LLVector4a*) mPositions; - LLVector4a* norm = (LLVector4a*) mNormals; - LLVector2* tc = (LLVector2*) mTexCoords; - S32 begin_stex = llfloor( profile[mBeginS].mV[2] ); - S32 num_s = ((mTypeMask & INNER_MASK) && (mTypeMask & FLAT_MASK) && mNumS > 2) ? mNumS/2 : mNumS; - - S32 cur_vertex = 0; - // Copy the vertices into the array - for (t = mBeginT; t < mBeginT + mNumT; t++) - { - tt = path_data[t].mTexT; - for (s = 0; s < num_s; s++) - { - if (mTypeMask & END_MASK) - { - if (s) - { - ss = 1.f; - } - else - { - ss = 0.f; - } - } - else - { - // Get s value for tex-coord. - if (!flat) - { - ss = profile[mBeginS + s].mV[2]; - } - else - { - ss = profile[mBeginS + s].mV[2] - begin_stex; - } - } - - if (sculpt_reverse_horizontal) - { - ss = 1.f - ss; - } - - // Check to see if this triangle wraps around the array. - if (mBeginS + s >= max_s) - { - // We're wrapping - i = mBeginS + s + max_s*(t-1); - } - else - { - i = mBeginS + s + max_s*t; - } - - pos[cur_vertex].load3(mesh[i].mPos.mV); - tc[cur_vertex] = LLVector2(ss,tt); - - norm[cur_vertex].clear(); - cur_vertex++; - - if ((mTypeMask & INNER_MASK) && (mTypeMask & FLAT_MASK) && mNumS > 2 && s > 0) - { - - pos[cur_vertex].load3(mesh[i].mPos.mV); - tc[cur_vertex] = LLVector2(ss,tt); - - norm[cur_vertex].clear(); - - cur_vertex++; - } - } - - if ((mTypeMask & INNER_MASK) && (mTypeMask & FLAT_MASK) && mNumS > 2) - { - if (mTypeMask & OPEN_MASK) - { - s = num_s-1; - } - else - { - s = 0; - } - - i = mBeginS + s + max_s*t; - ss = profile[mBeginS + s].mV[2] - begin_stex; - pos[cur_vertex].load3(mesh[i].mPos.mV); - tc[cur_vertex] = LLVector2(ss,tt); - norm[cur_vertex].clear(); - - cur_vertex++; - } - } - - - //get bounding box for this side - LLVector4a& face_min = mExtents[0]; - LLVector4a& face_max = mExtents[1]; - mCenter->clear(); - - face_min = face_max = pos[0]; - - for (U32 i = 1; i < mNumVertices; ++i) - { - update_min_max(face_min, face_max, pos[i]); - } - - mCenter->setAdd(face_min, face_max); - mCenter->mul(0.5f); - - S32 cur_index = 0; - S32 cur_edge = 0; - BOOL flat_face = mTypeMask & FLAT_MASK; - - if (!partial_build) - { - // Now we generate the indices. - for (t = 0; t < (mNumT-1); t++) - { - for (s = 0; s < (mNumS-1); s++) - { - mIndices[cur_index++] = s + mNumS*t; //bottom left - mIndices[cur_index++] = s+1 + mNumS*(t+1); //top right - mIndices[cur_index++] = s + mNumS*(t+1); //top left - mIndices[cur_index++] = s + mNumS*t; //bottom left - mIndices[cur_index++] = s+1 + mNumS*t; //bottom right - mIndices[cur_index++] = s+1 + mNumS*(t+1); //top right - - mEdge[cur_edge++] = (mNumS-1)*2*t+s*2+1; //bottom left/top right neighbor face - if (t < mNumT-2) { //top right/top left neighbor face - mEdge[cur_edge++] = (mNumS-1)*2*(t+1)+s*2+1; - } - else if (mNumT <= 3 || volume->getPath().isOpen() == TRUE) { //no neighbor - mEdge[cur_edge++] = -1; - } - else { //wrap on T - mEdge[cur_edge++] = s*2+1; - } - if (s > 0) { //top left/bottom left neighbor face - mEdge[cur_edge++] = (mNumS-1)*2*t+s*2-1; - } - else if (flat_face || volume->getProfile().isOpen() == TRUE) { //no neighbor - mEdge[cur_edge++] = -1; - } - else { //wrap on S - mEdge[cur_edge++] = (mNumS-1)*2*t+(mNumS-2)*2+1; - } - - if (t > 0) { //bottom left/bottom right neighbor face - mEdge[cur_edge++] = (mNumS-1)*2*(t-1)+s*2; - } - else if (mNumT <= 3 || volume->getPath().isOpen() == TRUE) { //no neighbor - mEdge[cur_edge++] = -1; - } - else { //wrap on T - mEdge[cur_edge++] = (mNumS-1)*2*(mNumT-2)+s*2; - } - if (s < mNumS-2) { //bottom right/top right neighbor face - mEdge[cur_edge++] = (mNumS-1)*2*t+(s+1)*2; - } - else if (flat_face || volume->getProfile().isOpen() == TRUE) { //no neighbor - mEdge[cur_edge++] = -1; - } - else { //wrap on S - mEdge[cur_edge++] = (mNumS-1)*2*t; - } - mEdge[cur_edge++] = (mNumS-1)*2*t+s*2; //top right/bottom left neighbor face - } - } - } - - //clear normals - for (U32 i = 0; i < mNumVertices; i++) - { - mNormals[i].clear(); - } - - //generate normals - for (U32 i = 0; i < mNumIndices/3; i++) //for each triangle - { - const U16* idx = &(mIndices[i*3]); - - - LLVector4a* v[] = - { pos+idx[0], pos+idx[1], pos+idx[2] }; - - LLVector4a* n[] = - { norm+idx[0], norm+idx[1], norm+idx[2] }; - - //calculate triangle normal - LLVector4a a, b, c; - - a.setSub(*v[0], *v[1]); - b.setSub(*v[0], *v[2]); - c.setCross3(a,b); - - n[0]->add(c); - n[1]->add(c); - n[2]->add(c); - - //even out quad contributions - n[i%2+1]->add(c); - } - - // adjust normals based on wrapping and stitching - - LLVector4a top; - top.setSub(pos[0], pos[mNumS*(mNumT-2)]); - BOOL s_bottom_converges = (top.dot3(top) < 0.000001f); - - top.setSub(pos[mNumS-1], pos[mNumS*(mNumT-2)+mNumS-1]); - BOOL s_top_converges = (top.dot3(top) < 0.000001f); - - if (sculpt_stitching == LL_SCULPT_TYPE_NONE) // logic for non-sculpt volumes - { - if (volume->getPath().isOpen() == FALSE) - { //wrap normals on T - for (S32 i = 0; i < mNumS; i++) - { - LLVector4a n; - n.setAdd(norm[i], norm[mNumS*(mNumT-1)+i]); - norm[i] = n; - norm[mNumS*(mNumT-1)+i] = n; - } - } - - if ((volume->getProfile().isOpen() == FALSE) && !(s_bottom_converges)) - { //wrap normals on S - for (S32 i = 0; i < mNumT; i++) - { - LLVector4a n; - n.setAdd(norm[mNumS*i], norm[mNumS*i+mNumS-1]); - norm[mNumS * i] = n; - norm[mNumS * i+mNumS-1] = n; - } - } - - if (volume->getPathType() == LL_PCODE_PATH_CIRCLE && - ((volume->getProfileType() & LL_PCODE_PROFILE_MASK) == LL_PCODE_PROFILE_CIRCLE_HALF)) - { - if (s_bottom_converges) - { //all lower S have same normal - for (S32 i = 0; i < mNumT; i++) - { - norm[mNumS*i].set(1,0,0); - } - } - - if (s_top_converges) - { //all upper S have same normal - for (S32 i = 0; i < mNumT; i++) - { - norm[mNumS*i+mNumS-1].set(-1,0,0); - } - } - } - } - else // logic for sculpt volumes - { - BOOL average_poles = FALSE; - BOOL wrap_s = FALSE; - BOOL wrap_t = FALSE; - - if (sculpt_stitching == LL_SCULPT_TYPE_SPHERE) - average_poles = TRUE; - - if ((sculpt_stitching == LL_SCULPT_TYPE_SPHERE) || - (sculpt_stitching == LL_SCULPT_TYPE_TORUS) || - (sculpt_stitching == LL_SCULPT_TYPE_CYLINDER)) - wrap_s = TRUE; - - if (sculpt_stitching == LL_SCULPT_TYPE_TORUS) - wrap_t = TRUE; - - - if (average_poles) - { - // average normals for north pole - - LLVector4a average; - average.clear(); - - for (S32 i = 0; i < mNumS; i++) - { - average.add(norm[i]); - } - - // set average - for (S32 i = 0; i < mNumS; i++) - { - norm[i] = average; - } - - // average normals for south pole - - average.clear(); - - for (S32 i = 0; i < mNumS; i++) - { - average.add(norm[i + mNumS * (mNumT - 1)]); - } - - // set average - for (S32 i = 0; i < mNumS; i++) - { - norm[i + mNumS * (mNumT - 1)] = average; - } - - } - - - if (wrap_s) - { - for (S32 i = 0; i < mNumT; i++) - { - LLVector4a n; - n.setAdd(norm[mNumS*i], norm[mNumS*i+mNumS-1]); - norm[mNumS * i] = n; - norm[mNumS * i+mNumS-1] = n; - } - } - - if (wrap_t) - { - for (S32 i = 0; i < mNumS; i++) - { - LLVector4a n; - n.setAdd(norm[i], norm[mNumS*(mNumT-1)+i]); - norm[i] = n; - norm[mNumS*(mNumT-1)+i] = n; - } - } - - } - - return TRUE; -} - -// Finds binormal based on three vertices with texture coordinates. -// Fills in dummy values if the triangle has degenerate texture coordinates. -void calc_binormal_from_triangle(LLVector4a& binormal, - - const LLVector4a& pos0, - const LLVector2& tex0, - const LLVector4a& pos1, - const LLVector2& tex1, - const LLVector4a& pos2, - const LLVector2& tex2) -{ - LLVector4a rx0( pos0[VX], tex0.mV[VX], tex0.mV[VY] ); - LLVector4a rx1( pos1[VX], tex1.mV[VX], tex1.mV[VY] ); - LLVector4a rx2( pos2[VX], tex2.mV[VX], tex2.mV[VY] ); - - LLVector4a ry0( pos0[VY], tex0.mV[VX], tex0.mV[VY] ); - LLVector4a ry1( pos1[VY], tex1.mV[VX], tex1.mV[VY] ); - LLVector4a ry2( pos2[VY], tex2.mV[VX], tex2.mV[VY] ); - - LLVector4a rz0( pos0[VZ], tex0.mV[VX], tex0.mV[VY] ); - LLVector4a rz1( pos1[VZ], tex1.mV[VX], tex1.mV[VY] ); - LLVector4a rz2( pos2[VZ], tex2.mV[VX], tex2.mV[VY] ); - - LLVector4a lhs, rhs; - - LLVector4a r0; - lhs.setSub(rx0, rx1); rhs.setSub(rx0, rx2); - r0.setCross3(lhs, rhs); - - LLVector4a r1; - lhs.setSub(ry0, ry1); rhs.setSub(ry0, ry2); - r1.setCross3(lhs, rhs); - - LLVector4a r2; - lhs.setSub(rz0, rz1); rhs.setSub(rz0, rz2); - r2.setCross3(lhs, rhs); - - if( r0[VX] && r1[VX] && r2[VX] ) - { - binormal.set( - -r0[VZ] / r0[VX], - -r1[VZ] / r1[VX], - -r2[VZ] / r2[VX]); - // binormal.normVec(); - } - else - { - binormal.set( 0, 1 , 0 ); - } -} +/** + + * @file llvolume.cpp + * + * $LicenseInfo:firstyear=2002&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "linden_common.h" +#include "llmemory.h" +#include "llmath.h" + +#include <set> +#if !LL_WINDOWS +#include <stdint.h> +#endif + +#include "llerror.h" +#include "llmemtype.h" + +#include "llvolumemgr.h" +#include "v2math.h" +#include "v3math.h" +#include "v4math.h" +#include "m4math.h" +#include "m3math.h" +#include "llmatrix3a.h" +#include "lloctree.h" +#include "lldarray.h" +#include "llvolume.h" +#include "llvolumeoctree.h" +#include "llstl.h" +#include "llsdserialize.h" +#include "llvector4a.h" +#include "llmatrix4a.h" + +#define DEBUG_SILHOUETTE_BINORMALS 0 +#define DEBUG_SILHOUETTE_NORMALS 0 // TomY: Use this to display normals using the silhouette +#define DEBUG_SILHOUETTE_EDGE_MAP 0 // DaveP: Use this to display edge map using the silhouette + +const F32 CUT_MIN = 0.f; +const F32 CUT_MAX = 1.f; +const F32 MIN_CUT_DELTA = 0.02f; + +const F32 HOLLOW_MIN = 0.f; +const F32 HOLLOW_MAX = 0.95f; +const F32 HOLLOW_MAX_SQUARE = 0.7f; + +const F32 TWIST_MIN = -1.f; +const F32 TWIST_MAX = 1.f; + +const F32 RATIO_MIN = 0.f; +const F32 RATIO_MAX = 2.f; // Tom Y: Inverted sense here: 0 = top taper, 2 = bottom taper + +const F32 HOLE_X_MIN= 0.05f; +const F32 HOLE_X_MAX= 1.0f; + +const F32 HOLE_Y_MIN= 0.05f; +const F32 HOLE_Y_MAX= 0.5f; + +const F32 SHEAR_MIN = -0.5f; +const F32 SHEAR_MAX = 0.5f; + +const F32 REV_MIN = 1.f; +const F32 REV_MAX = 4.f; + +const F32 TAPER_MIN = -1.f; +const F32 TAPER_MAX = 1.f; + +const F32 SKEW_MIN = -0.95f; +const F32 SKEW_MAX = 0.95f; + +const F32 SCULPT_MIN_AREA = 0.002f; +const S32 SCULPT_MIN_AREA_DETAIL = 1; + +extern BOOL gDebugGL; + +void assert_aligned(void* ptr, uintptr_t alignment) +{ +#if 0 + uintptr_t t = (uintptr_t) ptr; + if (t%alignment != 0) + { + llerrs << "WTF?" << llendl; + } +#endif +} + +BOOL check_same_clock_dir( const LLVector3& pt1, const LLVector3& pt2, const LLVector3& pt3, const LLVector3& norm) +{ + LLVector3 test = (pt2-pt1)%(pt3-pt2); + + //answer + if(test * norm < 0) + { + return FALSE; + } + else + { + return TRUE; + } +} + +BOOL LLLineSegmentBoxIntersect(const LLVector3& start, const LLVector3& end, const LLVector3& center, const LLVector3& size) +{ + return LLLineSegmentBoxIntersect(start.mV, end.mV, center.mV, size.mV); +} + +BOOL LLLineSegmentBoxIntersect(const F32* start, const F32* end, const F32* center, const F32* size) +{ + F32 fAWdU[3]; + F32 dir[3]; + F32 diff[3]; + + for (U32 i = 0; i < 3; i++) + { + dir[i] = 0.5f * (end[i] - start[i]); + diff[i] = (0.5f * (end[i] + start[i])) - center[i]; + fAWdU[i] = fabsf(dir[i]); + if(fabsf(diff[i])>size[i] + fAWdU[i]) return false; + } + + float f; + f = dir[1] * diff[2] - dir[2] * diff[1]; if(fabsf(f)>size[1]*fAWdU[2] + size[2]*fAWdU[1]) return false; + f = dir[2] * diff[0] - dir[0] * diff[2]; if(fabsf(f)>size[0]*fAWdU[2] + size[2]*fAWdU[0]) return false; + f = dir[0] * diff[1] - dir[1] * diff[0]; if(fabsf(f)>size[0]*fAWdU[1] + size[1]*fAWdU[0]) return false; + + return true; +} + + + +// intersect test between triangle vert0, vert1, vert2 and a ray from orig in direction dir. +// returns TRUE if intersecting and returns barycentric coordinates in intersection_a, intersection_b, +// and returns the intersection point along dir in intersection_t. + +// Moller-Trumbore algorithm +BOOL LLTriangleRayIntersect(const LLVector4a& vert0, const LLVector4a& vert1, const LLVector4a& vert2, const LLVector4a& orig, const LLVector4a& dir, + F32& intersection_a, F32& intersection_b, F32& intersection_t) +{ + + /* find vectors for two edges sharing vert0 */ + LLVector4a edge1; + edge1.setSub(vert1, vert0); + + LLVector4a edge2; + edge2.setSub(vert2, vert0); + + /* begin calculating determinant - also used to calculate U parameter */ + LLVector4a pvec; + pvec.setCross3(dir, edge2); + + /* if determinant is near zero, ray lies in plane of triangle */ + LLVector4a det; + det.setAllDot3(edge1, pvec); + + if (det.greaterEqual(LLVector4a::getEpsilon()).getGatheredBits() & 0x7) + { + /* calculate distance from vert0 to ray origin */ + LLVector4a tvec; + tvec.setSub(orig, vert0); + + /* calculate U parameter and test bounds */ + LLVector4a u; + u.setAllDot3(tvec,pvec); + + if ((u.greaterEqual(LLVector4a::getZero()).getGatheredBits() & 0x7) && + (u.lessEqual(det).getGatheredBits() & 0x7)) + { + /* prepare to test V parameter */ + LLVector4a qvec; + qvec.setCross3(tvec, edge1); + + /* calculate V parameter and test bounds */ + LLVector4a v; + v.setAllDot3(dir, qvec); + + + //if (!(v < 0.f || u + v > det)) + + LLVector4a sum_uv; + sum_uv.setAdd(u, v); + + S32 v_gequal = v.greaterEqual(LLVector4a::getZero()).getGatheredBits() & 0x7; + S32 sum_lequal = sum_uv.lessEqual(det).getGatheredBits() & 0x7; + + if (v_gequal && sum_lequal) + { + /* calculate t, scale parameters, ray intersects triangle */ + LLVector4a t; + t.setAllDot3(edge2,qvec); + + t.div(det); + u.div(det); + v.div(det); + + intersection_a = u[0]; + intersection_b = v[0]; + intersection_t = t[0]; + return TRUE; + } + } + } + + return FALSE; +} + +BOOL LLTriangleRayIntersectTwoSided(const LLVector4a& vert0, const LLVector4a& vert1, const LLVector4a& vert2, const LLVector4a& orig, const LLVector4a& dir, + F32& intersection_a, F32& intersection_b, F32& intersection_t) +{ + F32 u, v, t; + + /* find vectors for two edges sharing vert0 */ + LLVector4a edge1; + edge1.setSub(vert1, vert0); + + + LLVector4a edge2; + edge2.setSub(vert2, vert0); + + /* begin calculating determinant - also used to calculate U parameter */ + LLVector4a pvec; + pvec.setCross3(dir, edge2); + + /* if determinant is near zero, ray lies in plane of triangle */ + F32 det = edge1.dot3(pvec).getF32(); + + + if (det > -F_APPROXIMATELY_ZERO && det < F_APPROXIMATELY_ZERO) + { + return FALSE; + } + + F32 inv_det = 1.f / det; + + /* calculate distance from vert0 to ray origin */ + LLVector4a tvec; + tvec.setSub(orig, vert0); + + /* calculate U parameter and test bounds */ + u = (tvec.dot3(pvec).getF32()) * inv_det; + if (u < 0.f || u > 1.f) + { + return FALSE; + } + + /* prepare to test V parameter */ + tvec.sub(edge1); + + /* calculate V parameter and test bounds */ + v = (dir.dot3(tvec).getF32()) * inv_det; + + if (v < 0.f || u + v > 1.f) + { + return FALSE; + } + + /* calculate t, ray intersects triangle */ + t = (edge2.dot3(tvec).getF32()) * inv_det; + + intersection_a = u; + intersection_b = v; + intersection_t = t; + + + return TRUE; +} + +//helper for non-aligned vectors +BOOL LLTriangleRayIntersect(const LLVector3& vert0, const LLVector3& vert1, const LLVector3& vert2, const LLVector3& orig, const LLVector3& dir, + F32& intersection_a, F32& intersection_b, F32& intersection_t, BOOL two_sided) +{ + LLVector4a vert0a, vert1a, vert2a, origa, dira; + vert0a.load3(vert0.mV); + vert1a.load3(vert1.mV); + vert2a.load3(vert2.mV); + origa.load3(orig.mV); + dira.load3(dir.mV); + + if (two_sided) + { + return LLTriangleRayIntersectTwoSided(vert0a, vert1a, vert2a, origa, dira, + intersection_a, intersection_b, intersection_t); + } + else + { + return LLTriangleRayIntersect(vert0a, vert1a, vert2a, origa, dira, + intersection_a, intersection_b, intersection_t); + } +} + +class LLVolumeOctreeRebound : public LLOctreeTravelerDepthFirst<LLVolumeTriangle> +{ +public: + const LLVolumeFace* mFace; + + LLVolumeOctreeRebound(const LLVolumeFace* face) + { + mFace = face; + } + + virtual void visit(const LLOctreeNode<LLVolumeTriangle>* branch) + { //this is a depth first traversal, so it's safe to assum all children have complete + //bounding data + + LLVolumeOctreeListener* node = (LLVolumeOctreeListener*) branch->getListener(0); + + LLVector4a& min = node->mExtents[0]; + LLVector4a& max = node->mExtents[1]; + + if (!branch->getData().empty()) + { //node has data, find AABB that binds data set + const LLVolumeTriangle* tri = *(branch->getData().begin()); + + //initialize min/max to first available vertex + min = *(tri->mV[0]); + max = *(tri->mV[0]); + + for (LLOctreeNode<LLVolumeTriangle>::const_element_iter iter = + branch->getData().begin(); iter != branch->getData().end(); ++iter) + { //for each triangle in node + + //stretch by triangles in node + tri = *iter; + + min.setMin(min, *tri->mV[0]); + min.setMin(min, *tri->mV[1]); + min.setMin(min, *tri->mV[2]); + + max.setMax(max, *tri->mV[0]); + max.setMax(max, *tri->mV[1]); + max.setMax(max, *tri->mV[2]); + } + } + else if (!branch->getChildren().empty()) + { //no data, but child nodes exist + LLVolumeOctreeListener* child = (LLVolumeOctreeListener*) branch->getChild(0)->getListener(0); + + //initialize min/max to extents of first child + min = child->mExtents[0]; + max = child->mExtents[1]; + } + else + { + llerrs << "WTF? Empty leaf" << llendl; + } + + for (S32 i = 0; i < branch->getChildCount(); ++i) + { //stretch by child extents + LLVolumeOctreeListener* child = (LLVolumeOctreeListener*) branch->getChild(i)->getListener(0); + min.setMin(min, child->mExtents[0]); + max.setMax(max, child->mExtents[1]); + } + + node->mBounds[0].setAdd(min, max); + node->mBounds[0].mul(0.5f); + + node->mBounds[1].setSub(max,min); + node->mBounds[1].mul(0.5f); + } +}; + +//------------------------------------------------------------------- +// statics +//------------------------------------------------------------------- + + +//---------------------------------------------------- + +LLProfile::Face* LLProfile::addCap(S16 faceID) +{ + LLMemType m1(LLMemType::MTYPE_VOLUME); + + Face *face = vector_append(mFaces, 1); + + face->mIndex = 0; + face->mCount = mTotal; + face->mScaleU= 1.0f; + face->mCap = TRUE; + face->mFaceID = faceID; + return face; +} + +LLProfile::Face* LLProfile::addFace(S32 i, S32 count, F32 scaleU, S16 faceID, BOOL flat) +{ + LLMemType m1(LLMemType::MTYPE_VOLUME); + + Face *face = vector_append(mFaces, 1); + + face->mIndex = i; + face->mCount = count; + face->mScaleU= scaleU; + + face->mFlat = flat; + face->mCap = FALSE; + face->mFaceID = faceID; + return face; +} + +// What is the bevel parameter used for? - DJS 04/05/02 +// Bevel parameter is currently unused but presumedly would support +// filleted and chamfered corners +void LLProfile::genNGon(const LLProfileParams& params, S32 sides, F32 offset, F32 bevel, F32 ang_scale, S32 split) +{ + LLMemType m1(LLMemType::MTYPE_VOLUME); + + // Generate an n-sided "circular" path. + // 0 is (1,0), and we go counter-clockwise along a circular path from there. + const F32 tableScale[] = { 1, 1, 1, 0.5f, 0.707107f, 0.53f, 0.525f, 0.5f }; + F32 scale = 0.5f; + F32 t, t_step, t_first, t_fraction, ang, ang_step; + LLVector3 pt1,pt2; + + F32 begin = params.getBegin(); + F32 end = params.getEnd(); + + t_step = 1.0f / sides; + ang_step = 2.0f*F_PI*t_step*ang_scale; + + // Scale to have size "match" scale. Compensates to get object to generally fill bounding box. + + S32 total_sides = llround(sides / ang_scale); // Total number of sides all around + + if (total_sides < 8) + { + scale = tableScale[total_sides]; + } + + t_first = floor(begin * sides) / (F32)sides; + + // pt1 is the first point on the fractional face. + // Starting t and ang values for the first face + t = t_first; + ang = 2.0f*F_PI*(t*ang_scale + offset); + pt1.setVec(cos(ang)*scale,sin(ang)*scale, t); + + // Increment to the next point. + // pt2 is the end point on the fractional face + t += t_step; + ang += ang_step; + pt2.setVec(cos(ang)*scale,sin(ang)*scale,t); + + t_fraction = (begin - t_first)*sides; + + // Only use if it's not almost exactly on an edge. + if (t_fraction < 0.9999f) + { + LLVector3 new_pt = lerp(pt1, pt2, t_fraction); + mProfile.push_back(new_pt); + } + + // There's lots of potential here for floating point error to generate unneeded extra points - DJS 04/05/02 + while (t < end) + { + // Iterate through all the integer steps of t. + pt1.setVec(cos(ang)*scale,sin(ang)*scale,t); + + if (mProfile.size() > 0) { + LLVector3 p = mProfile[mProfile.size()-1]; + for (S32 i = 0; i < split && mProfile.size() > 0; i++) { + mProfile.push_back(p+(pt1-p) * 1.0f/(float)(split+1) * (float)(i+1)); + } + } + mProfile.push_back(pt1); + + t += t_step; + ang += ang_step; + } + + t_fraction = (end - (t - t_step))*sides; + + // pt1 is the first point on the fractional face + // pt2 is the end point on the fractional face + pt2.setVec(cos(ang)*scale,sin(ang)*scale,t); + + // Find the fraction that we need to add to the end point. + t_fraction = (end - (t - t_step))*sides; + if (t_fraction > 0.0001f) + { + LLVector3 new_pt = lerp(pt1, pt2, t_fraction); + + if (mProfile.size() > 0) { + LLVector3 p = mProfile[mProfile.size()-1]; + for (S32 i = 0; i < split && mProfile.size() > 0; i++) { + mProfile.push_back(p+(new_pt-p) * 1.0f/(float)(split+1) * (float)(i+1)); + } + } + mProfile.push_back(new_pt); + } + + // If we're sliced, the profile is open. + if ((end - begin)*ang_scale < 0.99f) + { + if ((end - begin)*ang_scale > 0.5f) + { + mConcave = TRUE; + } + else + { + mConcave = FALSE; + } + mOpen = TRUE; + if (params.getHollow() <= 0) + { + // put center point if not hollow. + mProfile.push_back(LLVector3(0,0,0)); + } + } + else + { + // The profile isn't open. + mOpen = FALSE; + mConcave = FALSE; + } + + mTotal = mProfile.size(); +} + +void LLProfile::genNormals(const LLProfileParams& params) +{ + S32 count = mProfile.size(); + + S32 outer_count; + if (mTotalOut) + { + outer_count = mTotalOut; + } + else + { + outer_count = mTotal / 2; + } + + mEdgeNormals.resize(count * 2); + mEdgeCenters.resize(count * 2); + mNormals.resize(count); + + LLVector2 pt0,pt1; + + BOOL hollow = (params.getHollow() > 0); + + S32 i0, i1, i2, i3, i4; + + // Parametrically generate normal + for (i2 = 0; i2 < count; i2++) + { + mNormals[i2].mV[0] = mProfile[i2].mV[0]; + mNormals[i2].mV[1] = mProfile[i2].mV[1]; + if (hollow && (i2 >= outer_count)) + { + mNormals[i2] *= -1.f; + } + if (mNormals[i2].magVec() < 0.001) + { + // Special case for point at center, get adjacent points. + i1 = (i2 - 1) >= 0 ? i2 - 1 : count - 1; + i0 = (i1 - 1) >= 0 ? i1 - 1 : count - 1; + i3 = (i2 + 1) < count ? i2 + 1 : 0; + i4 = (i3 + 1) < count ? i3 + 1 : 0; + + pt0.setVec(mProfile[i1].mV[VX] + mProfile[i1].mV[VX] - mProfile[i0].mV[VX], + mProfile[i1].mV[VY] + mProfile[i1].mV[VY] - mProfile[i0].mV[VY]); + pt1.setVec(mProfile[i3].mV[VX] + mProfile[i3].mV[VX] - mProfile[i4].mV[VX], + mProfile[i3].mV[VY] + mProfile[i3].mV[VY] - mProfile[i4].mV[VY]); + + mNormals[i2] = pt0 + pt1; + mNormals[i2] *= 0.5f; + } + mNormals[i2].normVec(); + } + + S32 num_normal_sets = isConcave() ? 2 : 1; + for (S32 normal_set = 0; normal_set < num_normal_sets; normal_set++) + { + S32 point_num; + for (point_num = 0; point_num < mTotal; point_num++) + { + LLVector3 point_1 = mProfile[point_num]; + point_1.mV[VZ] = 0.f; + + LLVector3 point_2; + + if (isConcave() && normal_set == 0 && point_num == (mTotal - 1) / 2) + { + point_2 = mProfile[mTotal - 1]; + } + else if (isConcave() && normal_set == 1 && point_num == mTotal - 1) + { + point_2 = mProfile[(mTotal - 1) / 2]; + } + else + { + LLVector3 delta_pos; + S32 neighbor_point = (point_num + 1) % mTotal; + while(delta_pos.magVecSquared() < 0.01f * 0.01f) + { + point_2 = mProfile[neighbor_point]; + delta_pos = point_2 - point_1; + neighbor_point = (neighbor_point + 1) % mTotal; + if (neighbor_point == point_num) + { + break; + } + } + } + + point_2.mV[VZ] = 0.f; + LLVector3 face_normal = (point_2 - point_1) % LLVector3::z_axis; + face_normal.normVec(); + mEdgeNormals[normal_set * count + point_num] = face_normal; + mEdgeCenters[normal_set * count + point_num] = lerp(point_1, point_2, 0.5f); + } + } +} + + +// Hollow is percent of the original bounding box, not of this particular +// profile's geometry. Thus, a swept triangle needs lower hollow values than +// a swept square. +LLProfile::Face* LLProfile::addHole(const LLProfileParams& params, BOOL flat, F32 sides, F32 offset, F32 box_hollow, F32 ang_scale, S32 split) +{ + // Note that addHole will NOT work for non-"circular" profiles, if we ever decide to use them. + + // Total add has number of vertices on outside. + mTotalOut = mTotal; + + // Why is the "bevel" parameter -1? DJS 04/05/02 + genNGon(params, llfloor(sides),offset,-1, ang_scale, split); + + Face *face = addFace(mTotalOut, mTotal-mTotalOut,0,LL_FACE_INNER_SIDE, flat); + + std::vector<LLVector3> pt; + pt.resize(mTotal) ; + + for (S32 i=mTotalOut;i<mTotal;i++) + { + pt[i] = mProfile[i] * box_hollow; + } + + S32 j=mTotal-1; + for (S32 i=mTotalOut;i<mTotal;i++) + { + mProfile[i] = pt[j--]; + } + + for (S32 i=0;i<(S32)mFaces.size();i++) + { + if (mFaces[i].mCap) + { + mFaces[i].mCount *= 2; + } + } + + return face; +} + + + +BOOL LLProfile::generate(const LLProfileParams& params, BOOL path_open,F32 detail, S32 split, + BOOL is_sculpted, S32 sculpt_size) +{ + LLMemType m1(LLMemType::MTYPE_VOLUME); + + if ((!mDirty) && (!is_sculpted)) + { + return FALSE; + } + mDirty = FALSE; + + if (detail < MIN_LOD) + { + llinfos << "Generating profile with LOD < MIN_LOD. CLAMPING" << llendl; + detail = MIN_LOD; + } + + mProfile.clear(); + mFaces.clear(); + + // Generate the face data + S32 i; + F32 begin = params.getBegin(); + F32 end = params.getEnd(); + F32 hollow = params.getHollow(); + + // Quick validation to eliminate some server crashes. + if (begin > end - 0.01f) + { + llwarns << "LLProfile::generate() assertion failed (begin >= end)" << llendl; + return FALSE; + } + + S32 face_num = 0; + + switch (params.getCurveType() & LL_PCODE_PROFILE_MASK) + { + case LL_PCODE_PROFILE_SQUARE: + { + genNGon(params, 4,-0.375, 0, 1, split); + if (path_open) + { + addCap (LL_FACE_PATH_BEGIN); + } + + for (i = llfloor(begin * 4.f); i < llfloor(end * 4.f + .999f); i++) + { + addFace((face_num++) * (split +1), split+2, 1, LL_FACE_OUTER_SIDE_0 << i, TRUE); + } + + for (i = 0; i <(S32) mProfile.size(); i++) + { + // Scale by 4 to generate proper tex coords. + mProfile[i].mV[2] *= 4.f; + } + + if (hollow) + { + switch (params.getCurveType() & LL_PCODE_HOLE_MASK) + { + case LL_PCODE_HOLE_TRIANGLE: + // This offset is not correct, but we can't change it now... DK 11/17/04 + addHole(params, TRUE, 3, -0.375f, hollow, 1.f, split); + break; + case LL_PCODE_HOLE_CIRCLE: + // TODO: Compute actual detail levels for cubes + addHole(params, FALSE, MIN_DETAIL_FACES * detail, -0.375f, hollow, 1.f); + break; + case LL_PCODE_HOLE_SAME: + case LL_PCODE_HOLE_SQUARE: + default: + addHole(params, TRUE, 4, -0.375f, hollow, 1.f, split); + break; + } + } + + if (path_open) { + mFaces[0].mCount = mTotal; + } + } + break; + case LL_PCODE_PROFILE_ISOTRI: + case LL_PCODE_PROFILE_RIGHTTRI: + case LL_PCODE_PROFILE_EQUALTRI: + { + genNGon(params, 3,0, 0, 1, split); + for (i = 0; i <(S32) mProfile.size(); i++) + { + // Scale by 3 to generate proper tex coords. + mProfile[i].mV[2] *= 3.f; + } + + if (path_open) + { + addCap(LL_FACE_PATH_BEGIN); + } + + for (i = llfloor(begin * 3.f); i < llfloor(end * 3.f + .999f); i++) + { + addFace((face_num++) * (split +1), split+2, 1, LL_FACE_OUTER_SIDE_0 << i, TRUE); + } + if (hollow) + { + // Swept triangles need smaller hollowness values, + // because the triangle doesn't fill the bounding box. + F32 triangle_hollow = hollow / 2.f; + + switch (params.getCurveType() & LL_PCODE_HOLE_MASK) + { + case LL_PCODE_HOLE_CIRCLE: + // TODO: Actually generate level of detail for triangles + addHole(params, FALSE, MIN_DETAIL_FACES * detail, 0, triangle_hollow, 1.f); + break; + case LL_PCODE_HOLE_SQUARE: + addHole(params, TRUE, 4, 0, triangle_hollow, 1.f, split); + break; + case LL_PCODE_HOLE_SAME: + case LL_PCODE_HOLE_TRIANGLE: + default: + addHole(params, TRUE, 3, 0, triangle_hollow, 1.f, split); + break; + } + } + } + break; + case LL_PCODE_PROFILE_CIRCLE: + { + // If this has a square hollow, we should adjust the + // number of faces a bit so that the geometry lines up. + U8 hole_type=0; + F32 circle_detail = MIN_DETAIL_FACES * detail; + if (hollow) + { + hole_type = params.getCurveType() & LL_PCODE_HOLE_MASK; + if (hole_type == LL_PCODE_HOLE_SQUARE) + { + // Snap to the next multiple of four sides, + // so that corners line up. + circle_detail = llceil(circle_detail / 4.0f) * 4.0f; + } + } + + S32 sides = (S32)circle_detail; + + if (is_sculpted) + sides = sculpt_size; + + genNGon(params, sides); + + if (path_open) + { + addCap (LL_FACE_PATH_BEGIN); + } + + if (mOpen && !hollow) + { + addFace(0,mTotal-1,0,LL_FACE_OUTER_SIDE_0, FALSE); + } + else + { + addFace(0,mTotal,0,LL_FACE_OUTER_SIDE_0, FALSE); + } + + if (hollow) + { + switch (hole_type) + { + case LL_PCODE_HOLE_SQUARE: + addHole(params, TRUE, 4, 0, hollow, 1.f, split); + break; + case LL_PCODE_HOLE_TRIANGLE: + addHole(params, TRUE, 3, 0, hollow, 1.f, split); + break; + case LL_PCODE_HOLE_CIRCLE: + case LL_PCODE_HOLE_SAME: + default: + addHole(params, FALSE, circle_detail, 0, hollow, 1.f); + break; + } + } + } + break; + case LL_PCODE_PROFILE_CIRCLE_HALF: + { + // If this has a square hollow, we should adjust the + // number of faces a bit so that the geometry lines up. + U8 hole_type=0; + // Number of faces is cut in half because it's only a half-circle. + F32 circle_detail = MIN_DETAIL_FACES * detail * 0.5f; + if (hollow) + { + hole_type = params.getCurveType() & LL_PCODE_HOLE_MASK; + if (hole_type == LL_PCODE_HOLE_SQUARE) + { + // Snap to the next multiple of four sides (div 2), + // so that corners line up. + circle_detail = llceil(circle_detail / 2.0f) * 2.0f; + } + } + genNGon(params, llfloor(circle_detail), 0.5f, 0.f, 0.5f); + if (path_open) + { + addCap(LL_FACE_PATH_BEGIN); + } + if (mOpen && !params.getHollow()) + { + addFace(0,mTotal-1,0,LL_FACE_OUTER_SIDE_0, FALSE); + } + else + { + addFace(0,mTotal,0,LL_FACE_OUTER_SIDE_0, FALSE); + } + + if (hollow) + { + switch (hole_type) + { + case LL_PCODE_HOLE_SQUARE: + addHole(params, TRUE, 2, 0.5f, hollow, 0.5f, split); + break; + case LL_PCODE_HOLE_TRIANGLE: + addHole(params, TRUE, 3, 0.5f, hollow, 0.5f, split); + break; + case LL_PCODE_HOLE_CIRCLE: + case LL_PCODE_HOLE_SAME: + default: + addHole(params, FALSE, circle_detail, 0.5f, hollow, 0.5f); + break; + } + } + + // Special case for openness of sphere + if ((params.getEnd() - params.getBegin()) < 1.f) + { + mOpen = TRUE; + } + else if (!hollow) + { + mOpen = FALSE; + mProfile.push_back(mProfile[0]); + mTotal++; + } + } + break; + default: + llerrs << "Unknown profile: getCurveType()=" << params.getCurveType() << llendl; + break; + }; + + if (path_open) + { + addCap(LL_FACE_PATH_END); // bottom + } + + if ( mOpen) // interior edge caps + { + addFace(mTotal-1, 2,0.5,LL_FACE_PROFILE_BEGIN, TRUE); + + if (hollow) + { + addFace(mTotalOut-1, 2,0.5,LL_FACE_PROFILE_END, TRUE); + } + else + { + addFace(mTotal-2, 2,0.5,LL_FACE_PROFILE_END, TRUE); + } + } + + //genNormals(params); + + return TRUE; +} + + + +BOOL LLProfileParams::importFile(LLFILE *fp) +{ + LLMemType m1(LLMemType::MTYPE_VOLUME); + + const S32 BUFSIZE = 16384; + char buffer[BUFSIZE]; /* Flawfinder: ignore */ + // *NOTE: changing the size or type of these buffers will require + // changing the sscanf below. + char keyword[256]; /* Flawfinder: ignore */ + char valuestr[256]; /* Flawfinder: ignore */ + keyword[0] = 0; + valuestr[0] = 0; + F32 tempF32; + U32 tempU32; + + while (!feof(fp)) + { + if (fgets(buffer, BUFSIZE, fp) == NULL) + { + buffer[0] = '\0'; + } + + sscanf( /* Flawfinder: ignore */ + buffer, + " %255s %255s", + keyword, valuestr); + if (!strcmp("{", keyword)) + { + continue; + } + if (!strcmp("}",keyword)) + { + break; + } + else if (!strcmp("curve", keyword)) + { + sscanf(valuestr,"%d",&tempU32); + setCurveType((U8) tempU32); + } + else if (!strcmp("begin",keyword)) + { + sscanf(valuestr,"%g",&tempF32); + setBegin(tempF32); + } + else if (!strcmp("end",keyword)) + { + sscanf(valuestr,"%g",&tempF32); + setEnd(tempF32); + } + else if (!strcmp("hollow",keyword)) + { + sscanf(valuestr,"%g",&tempF32); + setHollow(tempF32); + } + else + { + llwarns << "unknown keyword " << keyword << " in profile import" << llendl; + } + } + + return TRUE; +} + + +BOOL LLProfileParams::exportFile(LLFILE *fp) const +{ + fprintf(fp,"\t\tprofile 0\n"); + fprintf(fp,"\t\t{\n"); + fprintf(fp,"\t\t\tcurve\t%d\n", getCurveType()); + fprintf(fp,"\t\t\tbegin\t%g\n", getBegin()); + fprintf(fp,"\t\t\tend\t%g\n", getEnd()); + fprintf(fp,"\t\t\thollow\t%g\n", getHollow()); + fprintf(fp, "\t\t}\n"); + return TRUE; +} + + +BOOL LLProfileParams::importLegacyStream(std::istream& input_stream) +{ + LLMemType m1(LLMemType::MTYPE_VOLUME); + + const S32 BUFSIZE = 16384; + char buffer[BUFSIZE]; /* Flawfinder: ignore */ + // *NOTE: changing the size or type of these buffers will require + // changing the sscanf below. + char keyword[256]; /* Flawfinder: ignore */ + char valuestr[256]; /* Flawfinder: ignore */ + keyword[0] = 0; + valuestr[0] = 0; + F32 tempF32; + U32 tempU32; + + while (input_stream.good()) + { + input_stream.getline(buffer, BUFSIZE); + sscanf( /* Flawfinder: ignore */ + buffer, + " %255s %255s", + keyword, + valuestr); + if (!strcmp("{", keyword)) + { + continue; + } + if (!strcmp("}",keyword)) + { + break; + } + else if (!strcmp("curve", keyword)) + { + sscanf(valuestr,"%d",&tempU32); + setCurveType((U8) tempU32); + } + else if (!strcmp("begin",keyword)) + { + sscanf(valuestr,"%g",&tempF32); + setBegin(tempF32); + } + else if (!strcmp("end",keyword)) + { + sscanf(valuestr,"%g",&tempF32); + setEnd(tempF32); + } + else if (!strcmp("hollow",keyword)) + { + sscanf(valuestr,"%g",&tempF32); + setHollow(tempF32); + } + else + { + llwarns << "unknown keyword " << keyword << " in profile import" << llendl; + } + } + + return TRUE; +} + + +BOOL LLProfileParams::exportLegacyStream(std::ostream& output_stream) const +{ + output_stream <<"\t\tprofile 0\n"; + output_stream <<"\t\t{\n"; + output_stream <<"\t\t\tcurve\t" << (S32) getCurveType() << "\n"; + output_stream <<"\t\t\tbegin\t" << getBegin() << "\n"; + output_stream <<"\t\t\tend\t" << getEnd() << "\n"; + output_stream <<"\t\t\thollow\t" << getHollow() << "\n"; + output_stream << "\t\t}\n"; + return TRUE; +} + +LLSD LLProfileParams::asLLSD() const +{ + LLSD sd; + + sd["curve"] = getCurveType(); + sd["begin"] = getBegin(); + sd["end"] = getEnd(); + sd["hollow"] = getHollow(); + return sd; +} + +bool LLProfileParams::fromLLSD(LLSD& sd) +{ + setCurveType(sd["curve"].asInteger()); + setBegin((F32)sd["begin"].asReal()); + setEnd((F32)sd["end"].asReal()); + setHollow((F32)sd["hollow"].asReal()); + return true; +} + +void LLProfileParams::copyParams(const LLProfileParams ¶ms) +{ + LLMemType m1(LLMemType::MTYPE_VOLUME); + setCurveType(params.getCurveType()); + setBegin(params.getBegin()); + setEnd(params.getEnd()); + setHollow(params.getHollow()); +} + + +LLPath::~LLPath() +{ +} + +void LLPath::genNGon(const LLPathParams& params, S32 sides, F32 startOff, F32 end_scale, F32 twist_scale) +{ + // Generates a circular path, starting at (1, 0, 0), counterclockwise along the xz plane. + const F32 tableScale[] = { 1, 1, 1, 0.5f, 0.707107f, 0.53f, 0.525f, 0.5f }; + + F32 revolutions = params.getRevolutions(); + F32 skew = params.getSkew(); + F32 skew_mag = fabs(skew); + F32 hole_x = params.getScaleX() * (1.0f - skew_mag); + F32 hole_y = params.getScaleY(); + + // Calculate taper begin/end for x,y (Negative means taper the beginning) + F32 taper_x_begin = 1.0f; + F32 taper_x_end = 1.0f - params.getTaperX(); + F32 taper_y_begin = 1.0f; + F32 taper_y_end = 1.0f - params.getTaperY(); + + if ( taper_x_end > 1.0f ) + { + // Flip tapering. + taper_x_begin = 2.0f - taper_x_end; + taper_x_end = 1.0f; + } + if ( taper_y_end > 1.0f ) + { + // Flip tapering. + taper_y_begin = 2.0f - taper_y_end; + taper_y_end = 1.0f; + } + + // For spheres, the radius is usually zero. + F32 radius_start = 0.5f; + if (sides < 8) + { + radius_start = tableScale[sides]; + } + + // Scale the radius to take the hole size into account. + radius_start *= 1.0f - hole_y; + + // Now check the radius offset to calculate the start,end radius. (Negative means + // decrease the start radius instead). + F32 radius_end = radius_start; + F32 radius_offset = params.getRadiusOffset(); + if (radius_offset < 0.f) + { + radius_start *= 1.f + radius_offset; + } + else + { + radius_end *= 1.f - radius_offset; + } + + // Is the path NOT a closed loop? + mOpen = ( (params.getEnd()*end_scale - params.getBegin() < 1.0f) || + (skew_mag > 0.001f) || + (fabs(taper_x_end - taper_x_begin) > 0.001f) || + (fabs(taper_y_end - taper_y_begin) > 0.001f) || + (fabs(radius_end - radius_start) > 0.001f) ); + + F32 ang, c, s; + LLQuaternion twist, qang; + PathPt *pt; + LLVector3 path_axis (1.f, 0.f, 0.f); + //LLVector3 twist_axis(0.f, 0.f, 1.f); + F32 twist_begin = params.getTwistBegin() * twist_scale; + F32 twist_end = params.getTwist() * twist_scale; + + // We run through this once before the main loop, to make sure + // the path begins at the correct cut. + F32 step= 1.0f / sides; + F32 t = params.getBegin(); + pt = vector_append(mPath, 1); + ang = 2.0f*F_PI*revolutions * t; + s = sin(ang)*lerp(radius_start, radius_end, t); + c = cos(ang)*lerp(radius_start, radius_end, t); + + + pt->mPos.setVec(0 + lerp(0,params.getShear().mV[0],s) + + lerp(-skew ,skew, t) * 0.5f, + c + lerp(0,params.getShear().mV[1],s), + s); + pt->mScale.mV[VX] = hole_x * lerp(taper_x_begin, taper_x_end, t); + pt->mScale.mV[VY] = hole_y * lerp(taper_y_begin, taper_y_end, t); + pt->mTexT = t; + + // Twist rotates the path along the x,y plane (I think) - DJS 04/05/02 + twist.setQuat (lerp(twist_begin,twist_end,t) * 2.f * F_PI - F_PI,0,0,1); + // Rotate the point around the circle's center. + qang.setQuat (ang,path_axis); + pt->mRot = twist * qang; + + t+=step; + + // Snap to a quantized parameter, so that cut does not + // affect most sample points. + t = ((S32)(t * sides)) / (F32)sides; + + // Run through the non-cut dependent points. + while (t < params.getEnd()) + { + pt = vector_append(mPath, 1); + + ang = 2.0f*F_PI*revolutions * t; + c = cos(ang)*lerp(radius_start, radius_end, t); + s = sin(ang)*lerp(radius_start, radius_end, t); + + pt->mPos.setVec(0 + lerp(0,params.getShear().mV[0],s) + + lerp(-skew ,skew, t) * 0.5f, + c + lerp(0,params.getShear().mV[1],s), + s); + + pt->mScale.mV[VX] = hole_x * lerp(taper_x_begin, taper_x_end, t); + pt->mScale.mV[VY] = hole_y * lerp(taper_y_begin, taper_y_end, t); + pt->mTexT = t; + + // Twist rotates the path along the x,y plane (I think) - DJS 04/05/02 + twist.setQuat (lerp(twist_begin,twist_end,t) * 2.f * F_PI - F_PI,0,0,1); + // Rotate the point around the circle's center. + qang.setQuat (ang,path_axis); + pt->mRot = twist * qang; + + t+=step; + } + + // Make one final pass for the end cut. + t = params.getEnd(); + pt = vector_append(mPath, 1); + ang = 2.0f*F_PI*revolutions * t; + c = cos(ang)*lerp(radius_start, radius_end, t); + s = sin(ang)*lerp(radius_start, radius_end, t); + + pt->mPos.setVec(0 + lerp(0,params.getShear().mV[0],s) + + lerp(-skew ,skew, t) * 0.5f, + c + lerp(0,params.getShear().mV[1],s), + s); + pt->mScale.mV[VX] = hole_x * lerp(taper_x_begin, taper_x_end, t); + pt->mScale.mV[VY] = hole_y * lerp(taper_y_begin, taper_y_end, t); + pt->mTexT = t; + + // Twist rotates the path along the x,y plane (I think) - DJS 04/05/02 + twist.setQuat (lerp(twist_begin,twist_end,t) * 2.f * F_PI - F_PI,0,0,1); + // Rotate the point around the circle's center. + qang.setQuat (ang,path_axis); + pt->mRot = twist * qang; + + mTotal = mPath.size(); +} + +const LLVector2 LLPathParams::getBeginScale() const +{ + LLVector2 begin_scale(1.f, 1.f); + if (getScaleX() > 1) + { + begin_scale.mV[0] = 2-getScaleX(); + } + if (getScaleY() > 1) + { + begin_scale.mV[1] = 2-getScaleY(); + } + return begin_scale; +} + +const LLVector2 LLPathParams::getEndScale() const +{ + LLVector2 end_scale(1.f, 1.f); + if (getScaleX() < 1) + { + end_scale.mV[0] = getScaleX(); + } + if (getScaleY() < 1) + { + end_scale.mV[1] = getScaleY(); + } + return end_scale; +} + +BOOL LLPath::generate(const LLPathParams& params, F32 detail, S32 split, + BOOL is_sculpted, S32 sculpt_size) +{ + LLMemType m1(LLMemType::MTYPE_VOLUME); + + if ((!mDirty) && (!is_sculpted)) + { + return FALSE; + } + + if (detail < MIN_LOD) + { + llinfos << "Generating path with LOD < MIN! Clamping to 1" << llendl; + detail = MIN_LOD; + } + + mDirty = FALSE; + S32 np = 2; // hardcode for line + + mPath.clear(); + mOpen = TRUE; + + // Is this 0xf0 mask really necessary? DK 03/02/05 + switch (params.getCurveType() & 0xf0) + { + default: + case LL_PCODE_PATH_LINE: + { + // Take the begin/end twist into account for detail. + np = llfloor(fabs(params.getTwistBegin() - params.getTwist()) * 3.5f * (detail-0.5f)) + 2; + if (np < split+2) + { + np = split+2; + } + + mStep = 1.0f / (np-1); + + mPath.resize(np); + + LLVector2 start_scale = params.getBeginScale(); + LLVector2 end_scale = params.getEndScale(); + + for (S32 i=0;i<np;i++) + { + F32 t = lerp(params.getBegin(),params.getEnd(),(F32)i * mStep); + mPath[i].mPos.setVec(lerp(0,params.getShear().mV[0],t), + lerp(0,params.getShear().mV[1],t), + t - 0.5f); + mPath[i].mRot.setQuat(lerp(F_PI * params.getTwistBegin(),F_PI * params.getTwist(),t),0,0,1); + mPath[i].mScale.mV[0] = lerp(start_scale.mV[0],end_scale.mV[0],t); + mPath[i].mScale.mV[1] = lerp(start_scale.mV[1],end_scale.mV[1],t); + mPath[i].mTexT = t; + } + } + break; + + case LL_PCODE_PATH_CIRCLE: + { + // Increase the detail as the revolutions and twist increase. + F32 twist_mag = fabs(params.getTwistBegin() - params.getTwist()); + + S32 sides = (S32)llfloor(llfloor((MIN_DETAIL_FACES * detail + twist_mag * 3.5f * (detail-0.5f))) * params.getRevolutions()); + + if (is_sculpted) + sides = sculpt_size; + + genNGon(params, sides); + } + break; + + case LL_PCODE_PATH_CIRCLE2: + { + if (params.getEnd() - params.getBegin() >= 0.99f && + params.getScaleX() >= .99f) + { + mOpen = FALSE; + } + + //genNGon(params, llfloor(MIN_DETAIL_FACES * detail), 4.f, 0.f); + genNGon(params, llfloor(MIN_DETAIL_FACES * detail)); + + F32 t = 0.f; + F32 tStep = 1.0f / mPath.size(); + + F32 toggle = 0.5f; + for (S32 i=0;i<(S32)mPath.size();i++) + { + mPath[i].mPos.mV[0] = toggle; + if (toggle == 0.5f) + toggle = -0.5f; + else + toggle = 0.5f; + t += tStep; + } + } + + break; + + case LL_PCODE_PATH_TEST: + + np = 5; + mStep = 1.0f / (np-1); + + mPath.resize(np); + + for (S32 i=0;i<np;i++) + { + F32 t = (F32)i * mStep; + mPath[i].mPos.setVec(0, + lerp(0, -sin(F_PI*params.getTwist()*t)*0.5f,t), + lerp(-0.5, cos(F_PI*params.getTwist()*t)*0.5f,t)); + mPath[i].mScale.mV[0] = lerp(1,params.getScale().mV[0],t); + mPath[i].mScale.mV[1] = lerp(1,params.getScale().mV[1],t); + mPath[i].mTexT = t; + mPath[i].mRot.setQuat(F_PI * params.getTwist() * t,1,0,0); + } + + break; + }; + + if (params.getTwist() != params.getTwistBegin()) mOpen = TRUE; + + //if ((int(fabsf(params.getTwist() - params.getTwistBegin())*100))%100 != 0) { + // mOpen = TRUE; + //} + + return TRUE; +} + +BOOL LLDynamicPath::generate(const LLPathParams& params, F32 detail, S32 split, + BOOL is_sculpted, S32 sculpt_size) +{ + LLMemType m1(LLMemType::MTYPE_VOLUME); + + mOpen = TRUE; // Draw end caps + if (getPathLength() == 0) + { + // Path hasn't been generated yet. + // Some algorithms later assume at least TWO path points. + resizePath(2); + for (U32 i = 0; i < 2; i++) + { + mPath[i].mPos.setVec(0, 0, 0); + mPath[i].mRot.setQuat(0, 0, 0); + mPath[i].mScale.setVec(1, 1); + mPath[i].mTexT = 0; + } + } + + return TRUE; +} + + +BOOL LLPathParams::importFile(LLFILE *fp) +{ + LLMemType m1(LLMemType::MTYPE_VOLUME); + + const S32 BUFSIZE = 16384; + char buffer[BUFSIZE]; /* Flawfinder: ignore */ + // *NOTE: changing the size or type of these buffers will require + // changing the sscanf below. + char keyword[256]; /* Flawfinder: ignore */ + char valuestr[256]; /* Flawfinder: ignore */ + keyword[0] = 0; + valuestr[0] = 0; + + F32 tempF32; + F32 x, y; + U32 tempU32; + + while (!feof(fp)) + { + if (fgets(buffer, BUFSIZE, fp) == NULL) + { + buffer[0] = '\0'; + } + + sscanf( /* Flawfinder: ignore */ + buffer, + " %255s %255s", + keyword, valuestr); + if (!strcmp("{", keyword)) + { + continue; + } + if (!strcmp("}",keyword)) + { + break; + } + else if (!strcmp("curve", keyword)) + { + sscanf(valuestr,"%d",&tempU32); + setCurveType((U8) tempU32); + } + else if (!strcmp("begin",keyword)) + { + sscanf(valuestr,"%g",&tempF32); + setBegin(tempF32); + } + else if (!strcmp("end",keyword)) + { + sscanf(valuestr,"%g",&tempF32); + setEnd(tempF32); + } + else if (!strcmp("scale",keyword)) + { + // Legacy for one dimensional scale per path + sscanf(valuestr,"%g",&tempF32); + setScale(tempF32, tempF32); + } + else if (!strcmp("scale_x", keyword)) + { + sscanf(valuestr, "%g", &x); + setScaleX(x); + } + else if (!strcmp("scale_y", keyword)) + { + sscanf(valuestr, "%g", &y); + setScaleY(y); + } + else if (!strcmp("shear_x", keyword)) + { + sscanf(valuestr, "%g", &x); + setShearX(x); + } + else if (!strcmp("shear_y", keyword)) + { + sscanf(valuestr, "%g", &y); + setShearY(y); + } + else if (!strcmp("twist",keyword)) + { + sscanf(valuestr,"%g",&tempF32); + setTwist(tempF32); + } + else if (!strcmp("twist_begin", keyword)) + { + sscanf(valuestr, "%g", &y); + setTwistBegin(y); + } + else if (!strcmp("radius_offset", keyword)) + { + sscanf(valuestr, "%g", &y); + setRadiusOffset(y); + } + else if (!strcmp("taper_x", keyword)) + { + sscanf(valuestr, "%g", &y); + setTaperX(y); + } + else if (!strcmp("taper_y", keyword)) + { + sscanf(valuestr, "%g", &y); + setTaperY(y); + } + else if (!strcmp("revolutions", keyword)) + { + sscanf(valuestr, "%g", &y); + setRevolutions(y); + } + else if (!strcmp("skew", keyword)) + { + sscanf(valuestr, "%g", &y); + setSkew(y); + } + else + { + llwarns << "unknown keyword " << " in path import" << llendl; + } + } + return TRUE; +} + + +BOOL LLPathParams::exportFile(LLFILE *fp) const +{ + fprintf(fp, "\t\tpath 0\n"); + fprintf(fp, "\t\t{\n"); + fprintf(fp, "\t\t\tcurve\t%d\n", getCurveType()); + fprintf(fp, "\t\t\tbegin\t%g\n", getBegin()); + fprintf(fp, "\t\t\tend\t%g\n", getEnd()); + fprintf(fp, "\t\t\tscale_x\t%g\n", getScaleX() ); + fprintf(fp, "\t\t\tscale_y\t%g\n", getScaleY() ); + fprintf(fp, "\t\t\tshear_x\t%g\n", getShearX() ); + fprintf(fp, "\t\t\tshear_y\t%g\n", getShearY() ); + fprintf(fp,"\t\t\ttwist\t%g\n", getTwist()); + + fprintf(fp,"\t\t\ttwist_begin\t%g\n", getTwistBegin()); + fprintf(fp,"\t\t\tradius_offset\t%g\n", getRadiusOffset()); + fprintf(fp,"\t\t\ttaper_x\t%g\n", getTaperX()); + fprintf(fp,"\t\t\ttaper_y\t%g\n", getTaperY()); + fprintf(fp,"\t\t\trevolutions\t%g\n", getRevolutions()); + fprintf(fp,"\t\t\tskew\t%g\n", getSkew()); + + fprintf(fp, "\t\t}\n"); + return TRUE; +} + + +BOOL LLPathParams::importLegacyStream(std::istream& input_stream) +{ + LLMemType m1(LLMemType::MTYPE_VOLUME); + + const S32 BUFSIZE = 16384; + char buffer[BUFSIZE]; /* Flawfinder: ignore */ + // *NOTE: changing the size or type of these buffers will require + // changing the sscanf below. + char keyword[256]; /* Flawfinder: ignore */ + char valuestr[256]; /* Flawfinder: ignore */ + keyword[0] = 0; + valuestr[0] = 0; + + F32 tempF32; + F32 x, y; + U32 tempU32; + + while (input_stream.good()) + { + input_stream.getline(buffer, BUFSIZE); + sscanf( /* Flawfinder: ignore */ + buffer, + " %255s %255s", + keyword, valuestr); + if (!strcmp("{", keyword)) + { + continue; + } + if (!strcmp("}",keyword)) + { + break; + } + else if (!strcmp("curve", keyword)) + { + sscanf(valuestr,"%d",&tempU32); + setCurveType((U8) tempU32); + } + else if (!strcmp("begin",keyword)) + { + sscanf(valuestr,"%g",&tempF32); + setBegin(tempF32); + } + else if (!strcmp("end",keyword)) + { + sscanf(valuestr,"%g",&tempF32); + setEnd(tempF32); + } + else if (!strcmp("scale",keyword)) + { + // Legacy for one dimensional scale per path + sscanf(valuestr,"%g",&tempF32); + setScale(tempF32, tempF32); + } + else if (!strcmp("scale_x", keyword)) + { + sscanf(valuestr, "%g", &x); + setScaleX(x); + } + else if (!strcmp("scale_y", keyword)) + { + sscanf(valuestr, "%g", &y); + setScaleY(y); + } + else if (!strcmp("shear_x", keyword)) + { + sscanf(valuestr, "%g", &x); + setShearX(x); + } + else if (!strcmp("shear_y", keyword)) + { + sscanf(valuestr, "%g", &y); + setShearY(y); + } + else if (!strcmp("twist",keyword)) + { + sscanf(valuestr,"%g",&tempF32); + setTwist(tempF32); + } + else if (!strcmp("twist_begin", keyword)) + { + sscanf(valuestr, "%g", &y); + setTwistBegin(y); + } + else if (!strcmp("radius_offset", keyword)) + { + sscanf(valuestr, "%g", &y); + setRadiusOffset(y); + } + else if (!strcmp("taper_x", keyword)) + { + sscanf(valuestr, "%g", &y); + setTaperX(y); + } + else if (!strcmp("taper_y", keyword)) + { + sscanf(valuestr, "%g", &y); + setTaperY(y); + } + else if (!strcmp("revolutions", keyword)) + { + sscanf(valuestr, "%g", &y); + setRevolutions(y); + } + else if (!strcmp("skew", keyword)) + { + sscanf(valuestr, "%g", &y); + setSkew(y); + } + else + { + llwarns << "unknown keyword " << " in path import" << llendl; + } + } + return TRUE; +} + + +BOOL LLPathParams::exportLegacyStream(std::ostream& output_stream) const +{ + output_stream << "\t\tpath 0\n"; + output_stream << "\t\t{\n"; + output_stream << "\t\t\tcurve\t" << (S32) getCurveType() << "\n"; + output_stream << "\t\t\tbegin\t" << getBegin() << "\n"; + output_stream << "\t\t\tend\t" << getEnd() << "\n"; + output_stream << "\t\t\tscale_x\t" << getScaleX() << "\n"; + output_stream << "\t\t\tscale_y\t" << getScaleY() << "\n"; + output_stream << "\t\t\tshear_x\t" << getShearX() << "\n"; + output_stream << "\t\t\tshear_y\t" << getShearY() << "\n"; + output_stream <<"\t\t\ttwist\t" << getTwist() << "\n"; + + output_stream <<"\t\t\ttwist_begin\t" << getTwistBegin() << "\n"; + output_stream <<"\t\t\tradius_offset\t" << getRadiusOffset() << "\n"; + output_stream <<"\t\t\ttaper_x\t" << getTaperX() << "\n"; + output_stream <<"\t\t\ttaper_y\t" << getTaperY() << "\n"; + output_stream <<"\t\t\trevolutions\t" << getRevolutions() << "\n"; + output_stream <<"\t\t\tskew\t" << getSkew() << "\n"; + + output_stream << "\t\t}\n"; + return TRUE; +} + +LLSD LLPathParams::asLLSD() const +{ + LLSD sd = LLSD(); + sd["curve"] = getCurveType(); + sd["begin"] = getBegin(); + sd["end"] = getEnd(); + sd["scale_x"] = getScaleX(); + sd["scale_y"] = getScaleY(); + sd["shear_x"] = getShearX(); + sd["shear_y"] = getShearY(); + sd["twist"] = getTwist(); + sd["twist_begin"] = getTwistBegin(); + sd["radius_offset"] = getRadiusOffset(); + sd["taper_x"] = getTaperX(); + sd["taper_y"] = getTaperY(); + sd["revolutions"] = getRevolutions(); + sd["skew"] = getSkew(); + + return sd; +} + +bool LLPathParams::fromLLSD(LLSD& sd) +{ + setCurveType(sd["curve"].asInteger()); + setBegin((F32)sd["begin"].asReal()); + setEnd((F32)sd["end"].asReal()); + setScaleX((F32)sd["scale_x"].asReal()); + setScaleY((F32)sd["scale_y"].asReal()); + setShearX((F32)sd["shear_x"].asReal()); + setShearY((F32)sd["shear_y"].asReal()); + setTwist((F32)sd["twist"].asReal()); + setTwistBegin((F32)sd["twist_begin"].asReal()); + setRadiusOffset((F32)sd["radius_offset"].asReal()); + setTaperX((F32)sd["taper_x"].asReal()); + setTaperY((F32)sd["taper_y"].asReal()); + setRevolutions((F32)sd["revolutions"].asReal()); + setSkew((F32)sd["skew"].asReal()); + return true; +} + +void LLPathParams::copyParams(const LLPathParams ¶ms) +{ + setCurveType(params.getCurveType()); + setBegin(params.getBegin()); + setEnd(params.getEnd()); + setScale(params.getScaleX(), params.getScaleY() ); + setShear(params.getShearX(), params.getShearY() ); + setTwist(params.getTwist()); + setTwistBegin(params.getTwistBegin()); + setRadiusOffset(params.getRadiusOffset()); + setTaper( params.getTaperX(), params.getTaperY() ); + setRevolutions(params.getRevolutions()); + setSkew(params.getSkew()); +} + +S32 profile_delete_lock = 1 ; +LLProfile::~LLProfile() +{ + if(profile_delete_lock) + { + llerrs << "LLProfile should not be deleted here!" << llendl ; + } +} + + +S32 LLVolume::sNumMeshPoints = 0; + +LLVolume::LLVolume(const LLVolumeParams ¶ms, const F32 detail, const BOOL generate_single_face, const BOOL is_unique) + : mParams(params) +{ + LLMemType m1(LLMemType::MTYPE_VOLUME); + + mUnique = is_unique; + mFaceMask = 0x0; + mDetail = detail; + mSculptLevel = -2; + mIsTetrahedron = FALSE; + mLODScaleBias.setVec(1,1,1); + mHullPoints = NULL; + mHullIndices = NULL; + mNumHullPoints = 0; + mNumHullIndices = 0; + + // set defaults + if (mParams.getPathParams().getCurveType() == LL_PCODE_PATH_FLEXIBLE) + { + mPathp = new LLDynamicPath(); + } + else + { + mPathp = new LLPath(); + } + mProfilep = new LLProfile(); + + mGenerateSingleFace = generate_single_face; + + generate(); + + if (mParams.getSculptID().isNull() && mParams.getSculptType() == LL_SCULPT_TYPE_NONE) + { + createVolumeFaces(); + } +} + +void LLVolume::resizePath(S32 length) +{ + mPathp->resizePath(length); + mVolumeFaces.clear(); +} + +void LLVolume::regen() +{ + generate(); + createVolumeFaces(); +} + +void LLVolume::genBinormals(S32 face) +{ + mVolumeFaces[face].createBinormals(); +} + +LLVolume::~LLVolume() +{ + sNumMeshPoints -= mMesh.size(); + delete mPathp; + + profile_delete_lock = 0 ; + delete mProfilep; + profile_delete_lock = 1 ; + + mPathp = NULL; + mProfilep = NULL; + mVolumeFaces.clear(); + + free(mHullPoints); + mHullPoints = NULL; + free(mHullIndices); + mHullIndices = NULL; +} + +BOOL LLVolume::generate() +{ + LLMemType m1(LLMemType::MTYPE_VOLUME); + llassert_always(mProfilep); + + //Added 10.03.05 Dave Parks + // Split is a parameter to LLProfile::generate that tesselates edges on the profile + // to prevent lighting and texture interpolation errors on triangles that are + // stretched due to twisting or scaling on the path. + S32 split = (S32) ((mDetail)*0.66f); + + if (mParams.getPathParams().getCurveType() == LL_PCODE_PATH_LINE && + (mParams.getPathParams().getScale().mV[0] != 1.0f || + mParams.getPathParams().getScale().mV[1] != 1.0f) && + (mParams.getProfileParams().getCurveType() == LL_PCODE_PROFILE_SQUARE || + mParams.getProfileParams().getCurveType() == LL_PCODE_PROFILE_ISOTRI || + mParams.getProfileParams().getCurveType() == LL_PCODE_PROFILE_EQUALTRI || + mParams.getProfileParams().getCurveType() == LL_PCODE_PROFILE_RIGHTTRI)) + { + split = 0; + } + + mLODScaleBias.setVec(0.5f, 0.5f, 0.5f); + + F32 profile_detail = mDetail; + F32 path_detail = mDetail; + + U8 path_type = mParams.getPathParams().getCurveType(); + U8 profile_type = mParams.getProfileParams().getCurveType(); + + if (path_type == LL_PCODE_PATH_LINE && profile_type == LL_PCODE_PROFILE_CIRCLE) + { //cylinders don't care about Z-Axis + mLODScaleBias.setVec(0.6f, 0.6f, 0.0f); + } + else if (path_type == LL_PCODE_PATH_CIRCLE) + { + mLODScaleBias.setVec(0.6f, 0.6f, 0.6f); + } + + //******************************************************************** + //debug info, to be removed + if((U32)(mPathp->mPath.size() * mProfilep->mProfile.size()) > (1u << 20)) + { + llinfos << "sizeS: " << mPathp->mPath.size() << " sizeT: " << mProfilep->mProfile.size() << llendl ; + llinfos << "path_detail : " << path_detail << " split: " << split << " profile_detail: " << profile_detail << llendl ; + llinfos << mParams << llendl ; + llinfos << "more info to check if mProfilep is deleted or not." << llendl ; + llinfos << mProfilep->mNormals.size() << " : " << mProfilep->mFaces.size() << " : " << mProfilep->mEdgeNormals.size() << " : " << mProfilep->mEdgeCenters.size() << llendl ; + + llerrs << "LLVolume corrupted!" << llendl ; + } + //******************************************************************** + + BOOL regenPath = mPathp->generate(mParams.getPathParams(), path_detail, split); + BOOL regenProf = mProfilep->generate(mParams.getProfileParams(), mPathp->isOpen(),profile_detail, split); + + if (regenPath || regenProf ) + { + S32 sizeS = mPathp->mPath.size(); + S32 sizeT = mProfilep->mProfile.size(); + + //******************************************************************** + //debug info, to be removed + if((U32)(sizeS * sizeT) > (1u << 20)) + { + llinfos << "regenPath: " << (S32)regenPath << " regenProf: " << (S32)regenProf << llendl ; + llinfos << "sizeS: " << sizeS << " sizeT: " << sizeT << llendl ; + llinfos << "path_detail : " << path_detail << " split: " << split << " profile_detail: " << profile_detail << llendl ; + llinfos << mParams << llendl ; + llinfos << "more info to check if mProfilep is deleted or not." << llendl ; + llinfos << mProfilep->mNormals.size() << " : " << mProfilep->mFaces.size() << " : " << mProfilep->mEdgeNormals.size() << " : " << mProfilep->mEdgeCenters.size() << llendl ; + + llerrs << "LLVolume corrupted!" << llendl ; + } + //******************************************************************** + + sNumMeshPoints -= mMesh.size(); + mMesh.resize(sizeT * sizeS); + sNumMeshPoints += mMesh.size(); + + //generate vertex positions + + // Run along the path. + for (S32 s = 0; s < sizeS; ++s) + { + LLVector2 scale = mPathp->mPath[s].mScale; + LLQuaternion rot = mPathp->mPath[s].mRot; + + // Run along the profile. + for (S32 t = 0; t < sizeT; ++t) + { + S32 m = s*sizeT + t; + Point& pt = mMesh[m]; + + pt.mPos.mV[0] = mProfilep->mProfile[t].mV[0] * scale.mV[0]; + pt.mPos.mV[1] = mProfilep->mProfile[t].mV[1] * scale.mV[1]; + pt.mPos.mV[2] = 0.0f; + pt.mPos = pt.mPos * rot; + pt.mPos += mPathp->mPath[s].mPos; + } + } + + for (std::vector<LLProfile::Face>::iterator iter = mProfilep->mFaces.begin(); + iter != mProfilep->mFaces.end(); ++iter) + { + LLFaceID id = iter->mFaceID; + mFaceMask |= id; + } + + return TRUE; + } + return FALSE; +} + +void LLVolumeFace::VertexData::init() +{ + if (!mData) + { + mData = (LLVector4a*) malloc(sizeof(LLVector4a)*2); + } +} + +LLVolumeFace::VertexData::VertexData() +{ + mData = NULL; + init(); +} + +LLVolumeFace::VertexData::VertexData(const VertexData& rhs) +{ + mData = NULL; + *this = rhs; +} + +const LLVolumeFace::VertexData& LLVolumeFace::VertexData::operator=(const LLVolumeFace::VertexData& rhs) +{ + if (this != &rhs) + { + init(); + LLVector4a::memcpyNonAliased16((F32*) mData, (F32*) rhs.mData, 2*sizeof(LLVector4a)); + mTexCoord = rhs.mTexCoord; + } + return *this; +} + +LLVolumeFace::VertexData::~VertexData() +{ + free(mData); + mData = NULL; +} + +LLVector4a& LLVolumeFace::VertexData::getPosition() +{ + return mData[POSITION]; +} + +LLVector4a& LLVolumeFace::VertexData::getNormal() +{ + return mData[NORMAL]; +} + +const LLVector4a& LLVolumeFace::VertexData::getPosition() const +{ + return mData[POSITION]; +} + +const LLVector4a& LLVolumeFace::VertexData::getNormal() const +{ + return mData[NORMAL]; +} + + +void LLVolumeFace::VertexData::setPosition(const LLVector4a& pos) +{ + mData[POSITION] = pos; +} + +void LLVolumeFace::VertexData::setNormal(const LLVector4a& norm) +{ + mData[NORMAL] = norm; +} + +bool LLVolumeFace::VertexData::operator<(const LLVolumeFace::VertexData& rhs)const +{ + const F32* lp = this->getPosition().getF32ptr(); + const F32* rp = rhs.getPosition().getF32ptr(); + + if (lp[0] != rp[0]) + { + return lp[0] < rp[0]; + } + + if (rp[1] != lp[1]) + { + return lp[1] < rp[1]; + } + + if (rp[2] != lp[2]) + { + return lp[2] < rp[2]; + } + + lp = getNormal().getF32ptr(); + rp = rhs.getNormal().getF32ptr(); + + if (lp[0] != rp[0]) + { + return lp[0] < rp[0]; + } + + if (rp[1] != lp[1]) + { + return lp[1] < rp[1]; + } + + if (rp[2] != lp[2]) + { + return lp[2] < rp[2]; + } + + if (mTexCoord.mV[0] != rhs.mTexCoord.mV[0]) + { + return mTexCoord.mV[0] < rhs.mTexCoord.mV[0]; + } + + return mTexCoord.mV[1] < rhs.mTexCoord.mV[1]; +} + +bool LLVolumeFace::VertexData::operator==(const LLVolumeFace::VertexData& rhs)const +{ + return mData[POSITION].equals3(rhs.getPosition()) && + mData[NORMAL].equals3(rhs.getNormal()) && + mTexCoord == rhs.mTexCoord; +} + +bool LLVolumeFace::VertexData::compareNormal(const LLVolumeFace::VertexData& rhs, F32 angle_cutoff) const +{ + bool retval = false; + if (rhs.mData[POSITION].equals3(mData[POSITION]) && rhs.mTexCoord == mTexCoord) + { + if (angle_cutoff > 1.f) + { + retval = (mData[NORMAL].equals3(rhs.mData[NORMAL])); + } + else + { + F32 cur_angle = rhs.mData[NORMAL].dot3(mData[NORMAL]).getF32(); + retval = cur_angle > angle_cutoff; + } + } + + return retval; +} + +bool LLVolume::unpackVolumeFaces(std::istream& is, S32 size) +{ + //input stream is now pointing at a zlib compressed block of LLSD + //decompress block + LLSD mdl; + if (!unzip_llsd(mdl, is, size)) + { + llwarns << "not a valid mesh asset!" << llendl; + return false; + } + + { + U32 face_count = mdl.size(); + + if (face_count == 0) + { + llerrs << "WTF?" << llendl; + } + + mVolumeFaces.resize(face_count); + + for (U32 i = 0; i < face_count; ++i) + { + LLSD::Binary pos = mdl[i]["Position"]; + LLSD::Binary norm = mdl[i]["Normal"]; + LLSD::Binary tc = mdl[i]["TexCoord0"]; + LLSD::Binary idx = mdl[i]["TriangleList"]; + + LLVolumeFace& face = mVolumeFaces[i]; + + //copy out indices + face.resizeIndices(idx.size()/2); + + if (idx.empty() || face.mNumIndices < 3) + { //why is there an empty index list? + llerrs <<"WTF?" << llendl; + continue; + } + + U16* indices = (U16*) &(idx[0]); + for (U32 j = 0; j < idx.size()/2; ++j) + { + face.mIndices[j] = indices[j]; + } + + //copy out vertices + U32 num_verts = pos.size()/(3*2); + face.resizeVertices(num_verts); + + if (mdl[i].has("Weights")) + { + face.allocateWeights(num_verts); + + LLSD::Binary weights = mdl[i]["Weights"]; + + U32 idx = 0; + + U32 cur_vertex = 0; + while (idx < weights.size() && cur_vertex < num_verts) + { + const U8 END_INFLUENCES = 0xFF; + U8 joint = weights[idx++]; + + U32 cur_influence = 0; + LLVector4 wght(0,0,0,0); + + while (joint != END_INFLUENCES && idx < weights.size()) + { + U16 influence = weights[idx++]; + influence |= ((U16) weights[idx++] << 8); + + F32 w = llclamp((F32) influence / 65535.f, 0.f, 0.99999f); + wght.mV[cur_influence++] = (F32) joint + w; + + if (cur_influence >= 4) + { + joint = END_INFLUENCES; + } + else + { + joint = weights[idx++]; + } + } + + face.mWeights[cur_vertex].loadua(wght.mV); + + cur_vertex++; + } + + if (cur_vertex != num_verts || idx != weights.size()) + { + llwarns << "Vertex weight count does not match vertex count!" << llendl; + } + + } + + LLVector3 minp; + LLVector3 maxp; + LLVector2 min_tc; + LLVector2 max_tc; + + minp.setValue(mdl[i]["PositionDomain"]["Min"]); + maxp.setValue(mdl[i]["PositionDomain"]["Max"]); + LLVector4a min_pos, max_pos; + min_pos.load3(minp.mV); + max_pos.load3(maxp.mV); + + min_tc.setValue(mdl[i]["TexCoord0Domain"]["Min"]); + max_tc.setValue(mdl[i]["TexCoord0Domain"]["Max"]); + + LLVector4a pos_range; + pos_range.setSub(max_pos, min_pos); + LLVector2 tc_range = max_tc - min_tc; + + LLVector4a* pos_out = face.mPositions; + LLVector4a* norm_out = face.mNormals; + LLVector2* tc_out = face.mTexCoords; + + for (U32 j = 0; j < num_verts; ++j) + { + U16* v = (U16*) &(pos[j*3*2]); + + pos_out->set((F32) v[0], (F32) v[1], (F32) v[2]); + pos_out->div(65535.f); + pos_out->mul(pos_range); + pos_out->add(min_pos); + + pos_out++; + + U16* n = (U16*) &(norm[j*3*2]); + + norm_out->set((F32) n[0], (F32) n[1], (F32) n[2]); + norm_out->div(65535.f); + norm_out->mul(2.f); + norm_out->sub(1.f); + norm_out++; + + U16* t = (U16*) &(tc[j*2*2]); + + tc_out->mV[0] = (F32) t[0] / 65535.f * tc_range.mV[0] + min_tc.mV[0]; + tc_out->mV[1] = (F32) t[1] / 65535.f * tc_range.mV[1] + min_tc.mV[1]; + + tc_out++; + } + + + // modifier flags? + bool do_mirror = (mParams.getSculptType() & LL_SCULPT_FLAG_MIRROR); + bool do_invert = (mParams.getSculptType() &LL_SCULPT_FLAG_INVERT); + + + // translate to actions: + bool do_reflect_x = false; + bool do_reverse_triangles = false; + bool do_invert_normals = false; + + if (do_mirror) + { + do_reflect_x = true; + do_reverse_triangles = !do_reverse_triangles; + } + + if (do_invert) + { + do_invert_normals = true; + do_reverse_triangles = !do_reverse_triangles; + } + + // now do the work + + if (do_reflect_x) + { + LLVector4a* p = (LLVector4a*) face.mPositions; + LLVector4a* n = (LLVector4a*) face.mNormals; + + for (S32 i = 0; i < face.mNumVertices; i++) + { + p[i].mul(-1.0f); + n[i].mul(-1.0f); + } + } + + if (do_invert_normals) + { + LLVector4a* n = (LLVector4a*) face.mNormals; + + for (S32 i = 0; i < face.mNumVertices; i++) + { + n[i].mul(-1.0f); + } + } + + if (do_reverse_triangles) + { + for (U32 j = 0; j < face.mNumIndices; j += 3) + { + // swap the 2nd and 3rd index + S32 swap = face.mIndices[j+1]; + face.mIndices[j+1] = face.mIndices[j+2]; + face.mIndices[j+2] = swap; + } + } + + //calculate bounding box + LLVector4a& min = face.mExtents[0]; + LLVector4a& max = face.mExtents[1]; + + min.clear(); + max.clear(); + min = max = face.mPositions[0]; + + for (S32 i = 1; i < face.mNumVertices; ++i) + { + min.setMin(min, face.mPositions[i]); + max.setMax(max, face.mPositions[i]); + } + } + } + + mSculptLevel = 0; // success! + + cacheOptimize(); + + return true; +} + +void tetrahedron_set_normal(LLVolumeFace::VertexData* cv) +{ + LLVector4a v0; + v0.setSub(cv[1].getPosition(), cv[0].getNormal()); + LLVector4a v1; + v1.setSub(cv[2].getNormal(), cv[0].getPosition()); + + cv[0].getNormal().setCross3(v0,v1); + cv[0].getNormal().normalize3fast(); + cv[1].setNormal(cv[0].getNormal()); + cv[2].setNormal(cv[1].getNormal()); +} + +BOOL LLVolume::isTetrahedron() +{ + return mIsTetrahedron; +} + +void LLVolume::makeTetrahedron() +{ + mVolumeFaces.clear(); + + LLVolumeFace face; + + F32 x = 0.25f; + LLVector4a p[] = + { //unit tetrahedron corners + LLVector4a(x,x,x), + LLVector4a(-x,-x,x), + LLVector4a(-x,x,-x), + LLVector4a(x,-x,-x) + }; + + face.mExtents[0].splat(-x); + face.mExtents[1].splat(x); + + LLVolumeFace::VertexData cv[3]; + + //set texture coordinates + cv[0].mTexCoord = LLVector2(0,0); + cv[1].mTexCoord = LLVector2(1,0); + cv[2].mTexCoord = LLVector2(0.5f, 0.5f*F_SQRT3); + + + //side 1 + cv[0].setPosition(p[1]); + cv[1].setPosition(p[0]); + cv[2].setPosition(p[2]); + + tetrahedron_set_normal(cv); + + face.resizeVertices(12); + face.resizeIndices(12); + + LLVector4a* v = (LLVector4a*) face.mPositions; + LLVector4a* n = (LLVector4a*) face.mNormals; + LLVector2* tc = (LLVector2*) face.mTexCoords; + + v[0] = cv[0].getPosition(); + v[1] = cv[1].getPosition(); + v[2] = cv[2].getPosition(); + v += 3; + + n[0] = cv[0].getNormal(); + n[1] = cv[1].getNormal(); + n[2] = cv[2].getNormal(); + n += 3; + + tc[0] = cv[0].mTexCoord; + tc[1] = cv[1].mTexCoord; + tc[2] = cv[2].mTexCoord; + tc += 3; + + + //side 2 + cv[0].setPosition(p[3]); + cv[1].setPosition(p[0]); + cv[2].setPosition(p[1]); + + tetrahedron_set_normal(cv); + + v[0] = cv[0].getPosition(); + v[1] = cv[1].getPosition(); + v[2] = cv[2].getPosition(); + v += 3; + + n[0] = cv[0].getNormal(); + n[1] = cv[1].getNormal(); + n[2] = cv[2].getNormal(); + n += 3; + + tc[0] = cv[0].mTexCoord; + tc[1] = cv[1].mTexCoord; + tc[2] = cv[2].mTexCoord; + tc += 3; + + //side 3 + cv[0].setPosition(p[3]); + cv[1].setPosition(p[1]); + cv[2].setPosition(p[2]); + + tetrahedron_set_normal(cv); + + v[0] = cv[0].getPosition(); + v[1] = cv[1].getPosition(); + v[2] = cv[2].getPosition(); + v += 3; + + n[0] = cv[0].getNormal(); + n[1] = cv[1].getNormal(); + n[2] = cv[2].getNormal(); + n += 3; + + tc[0] = cv[0].mTexCoord; + tc[1] = cv[1].mTexCoord; + tc[2] = cv[2].mTexCoord; + tc += 3; + + //side 4 + cv[0].setPosition(p[2]); + cv[1].setPosition(p[0]); + cv[2].setPosition(p[3]); + + tetrahedron_set_normal(cv); + + v[0] = cv[0].getPosition(); + v[1] = cv[1].getPosition(); + v[2] = cv[2].getPosition(); + v += 3; + + n[0] = cv[0].getNormal(); + n[1] = cv[1].getNormal(); + n[2] = cv[2].getNormal(); + n += 3; + + tc[0] = cv[0].mTexCoord; + tc[1] = cv[1].mTexCoord; + tc[2] = cv[2].mTexCoord; + tc += 3; + + //set index buffer + for (U16 i = 0; i < 12; i++) + { + face.mIndices[i] = i; + } + + mVolumeFaces.push_back(face); + mSculptLevel = 0; + mIsTetrahedron = TRUE; +} + +void LLVolume::copyVolumeFaces(const LLVolume* volume) +{ + mVolumeFaces = volume->mVolumeFaces; + mSculptLevel = 0; + mIsTetrahedron = FALSE; +} + +void LLVolume::cacheOptimize() +{ + for (S32 i = 0; i < mVolumeFaces.size(); ++i) + { + mVolumeFaces[i].cacheOptimize(); + } +} + + +S32 LLVolume::getNumFaces() const +{ + U8 sculpt_type = (mParams.getSculptType() & LL_SCULPT_TYPE_MASK); + + if (sculpt_type == LL_SCULPT_TYPE_MESH) + { + return LL_SCULPT_MESH_MAX_FACES; + } + + return (S32)mProfilep->mFaces.size(); +} + + +void LLVolume::createVolumeFaces() +{ + LLMemType m1(LLMemType::MTYPE_VOLUME); + + if (mGenerateSingleFace) + { + // do nothing + } + else + { + S32 num_faces = getNumFaces(); + BOOL partial_build = TRUE; + if (num_faces != mVolumeFaces.size()) + { + partial_build = FALSE; + mVolumeFaces.resize(num_faces); + } + // Initialize volume faces with parameter data + for (S32 i = 0; i < (S32)mVolumeFaces.size(); i++) + { + LLVolumeFace& vf = mVolumeFaces[i]; + LLProfile::Face& face = mProfilep->mFaces[i]; + vf.mBeginS = face.mIndex; + vf.mNumS = face.mCount; + if (vf.mNumS < 0) + { + llerrs << "Volume face corruption detected." << llendl; + } + + vf.mBeginT = 0; + vf.mNumT= getPath().mPath.size(); + vf.mID = i; + + // Set the type mask bits correctly + if (mParams.getProfileParams().getHollow() > 0) + { + vf.mTypeMask |= LLVolumeFace::HOLLOW_MASK; + } + if (mProfilep->isOpen()) + { + vf.mTypeMask |= LLVolumeFace::OPEN_MASK; + } + if (face.mCap) + { + vf.mTypeMask |= LLVolumeFace::CAP_MASK; + if (face.mFaceID == LL_FACE_PATH_BEGIN) + { + vf.mTypeMask |= LLVolumeFace::TOP_MASK; + } + else + { + llassert(face.mFaceID == LL_FACE_PATH_END); + vf.mTypeMask |= LLVolumeFace::BOTTOM_MASK; + } + } + else if (face.mFaceID & (LL_FACE_PROFILE_BEGIN | LL_FACE_PROFILE_END)) + { + vf.mTypeMask |= LLVolumeFace::FLAT_MASK | LLVolumeFace::END_MASK; + } + else + { + vf.mTypeMask |= LLVolumeFace::SIDE_MASK; + if (face.mFlat) + { + vf.mTypeMask |= LLVolumeFace::FLAT_MASK; + } + if (face.mFaceID & LL_FACE_INNER_SIDE) + { + vf.mTypeMask |= LLVolumeFace::INNER_MASK; + if (face.mFlat && vf.mNumS > 2) + { //flat inner faces have to copy vert normals + vf.mNumS = vf.mNumS*2; + if (vf.mNumS < 0) + { + llerrs << "Volume face corruption detected." << llendl; + } + } + } + else + { + vf.mTypeMask |= LLVolumeFace::OUTER_MASK; + } + } + } + + for (face_list_t::iterator iter = mVolumeFaces.begin(); + iter != mVolumeFaces.end(); ++iter) + { + (*iter).create(this, partial_build); + } + } +} + + +inline LLVector3 sculpt_rgb_to_vector(U8 r, U8 g, U8 b) +{ + // maps RGB values to vector values [0..255] -> [-0.5..0.5] + LLVector3 value; + value.mV[VX] = r / 255.f - 0.5f; + value.mV[VY] = g / 255.f - 0.5f; + value.mV[VZ] = b / 255.f - 0.5f; + + return value; +} + +inline U32 sculpt_xy_to_index(U32 x, U32 y, U16 sculpt_width, U16 sculpt_height, S8 sculpt_components) +{ + U32 index = (x + y * sculpt_width) * sculpt_components; + return index; +} + + +inline U32 sculpt_st_to_index(S32 s, S32 t, S32 size_s, S32 size_t, U16 sculpt_width, U16 sculpt_height, S8 sculpt_components) +{ + U32 x = (U32) ((F32)s/(size_s) * (F32) sculpt_width); + U32 y = (U32) ((F32)t/(size_t) * (F32) sculpt_height); + + return sculpt_xy_to_index(x, y, sculpt_width, sculpt_height, sculpt_components); +} + + +inline LLVector3 sculpt_index_to_vector(U32 index, const U8* sculpt_data) +{ + LLVector3 v = sculpt_rgb_to_vector(sculpt_data[index], sculpt_data[index+1], sculpt_data[index+2]); + + return v; +} + +inline LLVector3 sculpt_st_to_vector(S32 s, S32 t, S32 size_s, S32 size_t, U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data) +{ + U32 index = sculpt_st_to_index(s, t, size_s, size_t, sculpt_width, sculpt_height, sculpt_components); + + return sculpt_index_to_vector(index, sculpt_data); +} + +inline LLVector3 sculpt_xy_to_vector(U32 x, U32 y, U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data) +{ + U32 index = sculpt_xy_to_index(x, y, sculpt_width, sculpt_height, sculpt_components); + + return sculpt_index_to_vector(index, sculpt_data); +} + + +F32 LLVolume::sculptGetSurfaceArea() +{ + // test to see if image has enough variation to create non-degenerate geometry + + F32 area = 0; + + S32 sizeS = mPathp->mPath.size(); + S32 sizeT = mProfilep->mProfile.size(); + + for (S32 s = 0; s < sizeS-1; s++) + { + for (S32 t = 0; t < sizeT-1; t++) + { + // get four corners of quad + LLVector3 p1 = mMesh[(s )*sizeT + (t )].mPos; + LLVector3 p2 = mMesh[(s+1)*sizeT + (t )].mPos; + LLVector3 p3 = mMesh[(s )*sizeT + (t+1)].mPos; + LLVector3 p4 = mMesh[(s+1)*sizeT + (t+1)].mPos; + + // compute the area of the quad by taking the length of the cross product of the two triangles + LLVector3 cross1 = (p1 - p2) % (p1 - p3); + LLVector3 cross2 = (p4 - p2) % (p4 - p3); + area += (cross1.magVec() + cross2.magVec()) / 2.0; + } + } + + return area; +} + +// create placeholder shape +void LLVolume::sculptGeneratePlaceholder() +{ + LLMemType m1(LLMemType::MTYPE_VOLUME); + + S32 sizeS = mPathp->mPath.size(); + S32 sizeT = mProfilep->mProfile.size(); + + S32 line = 0; + + // for now, this is a sphere. + for (S32 s = 0; s < sizeS; s++) + { + for (S32 t = 0; t < sizeT; t++) + { + S32 i = t + line; + Point& pt = mMesh[i]; + + + F32 u = (F32)s/(sizeS-1); + F32 v = (F32)t/(sizeT-1); + + const F32 RADIUS = (F32) 0.3; + + pt.mPos.mV[0] = (F32)(sin(F_PI * v) * cos(2.0 * F_PI * u) * RADIUS); + pt.mPos.mV[1] = (F32)(sin(F_PI * v) * sin(2.0 * F_PI * u) * RADIUS); + pt.mPos.mV[2] = (F32)(cos(F_PI * v) * RADIUS); + + } + line += sizeT; + } +} + +// create the vertices from the map +void LLVolume::sculptGenerateMapVertices(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data, U8 sculpt_type) +{ + U8 sculpt_stitching = sculpt_type & LL_SCULPT_TYPE_MASK; + BOOL sculpt_invert = sculpt_type & LL_SCULPT_FLAG_INVERT; + BOOL sculpt_mirror = sculpt_type & LL_SCULPT_FLAG_MIRROR; + BOOL reverse_horizontal = (sculpt_invert ? !sculpt_mirror : sculpt_mirror); // XOR + + + LLMemType m1(LLMemType::MTYPE_VOLUME); + + S32 sizeS = mPathp->mPath.size(); + S32 sizeT = mProfilep->mProfile.size(); + + S32 line = 0; + for (S32 s = 0; s < sizeS; s++) + { + // Run along the profile. + for (S32 t = 0; t < sizeT; t++) + { + S32 i = t + line; + Point& pt = mMesh[i]; + + S32 reversed_t = t; + + if (reverse_horizontal) + { + reversed_t = sizeT - t - 1; + } + + U32 x = (U32) ((F32)reversed_t/(sizeT-1) * (F32) sculpt_width); + U32 y = (U32) ((F32)s/(sizeS-1) * (F32) sculpt_height); + + + if (y == 0) // top row stitching + { + // pinch? + if (sculpt_stitching == LL_SCULPT_TYPE_SPHERE) + { + x = sculpt_width / 2; + } + } + + if (y == sculpt_height) // bottom row stitching + { + // wrap? + if (sculpt_stitching == LL_SCULPT_TYPE_TORUS) + { + y = 0; + } + else + { + y = sculpt_height - 1; + } + + // pinch? + if (sculpt_stitching == LL_SCULPT_TYPE_SPHERE) + { + x = sculpt_width / 2; + } + } + + if (x == sculpt_width) // side stitching + { + // wrap? + if ((sculpt_stitching == LL_SCULPT_TYPE_SPHERE) || + (sculpt_stitching == LL_SCULPT_TYPE_TORUS) || + (sculpt_stitching == LL_SCULPT_TYPE_CYLINDER)) + { + x = 0; + } + + else + { + x = sculpt_width - 1; + } + } + + pt.mPos = sculpt_xy_to_vector(x, y, sculpt_width, sculpt_height, sculpt_components, sculpt_data); + + if (sculpt_mirror) + { + pt.mPos.mV[VX] *= -1.f; + } + } + + line += sizeT; + } +} + + +const S32 SCULPT_REZ_1 = 6; // changed from 4 to 6 - 6 looks round whereas 4 looks square +const S32 SCULPT_REZ_2 = 8; +const S32 SCULPT_REZ_3 = 16; +const S32 SCULPT_REZ_4 = 32; + +S32 sculpt_sides(F32 detail) +{ + + // detail is usually one of: 1, 1.5, 2.5, 4.0. + + if (detail <= 1.0) + { + return SCULPT_REZ_1; + } + if (detail <= 2.0) + { + return SCULPT_REZ_2; + } + if (detail <= 3.0) + { + return SCULPT_REZ_3; + } + else + { + return SCULPT_REZ_4; + } +} + + + +// determine the number of vertices in both s and t direction for this sculpt +void sculpt_calc_mesh_resolution(U16 width, U16 height, U8 type, F32 detail, S32& s, S32& t) +{ + // this code has the following properties: + // 1) the aspect ratio of the mesh is as close as possible to the ratio of the map + // while still using all available verts + // 2) the mesh cannot have more verts than is allowed by LOD + // 3) the mesh cannot have more verts than is allowed by the map + + S32 max_vertices_lod = (S32)pow((double)sculpt_sides(detail), 2.0); + S32 max_vertices_map = width * height / 4; + + S32 vertices; + if (max_vertices_map > 0) + vertices = llmin(max_vertices_lod, max_vertices_map); + else + vertices = max_vertices_lod; + + + F32 ratio; + if ((width == 0) || (height == 0)) + ratio = 1.f; + else + ratio = (F32) width / (F32) height; + + + s = (S32)(F32) sqrt(((F32)vertices / ratio)); + + s = llmax(s, 4); // no degenerate sizes, please + t = vertices / s; + + t = llmax(t, 4); // no degenerate sizes, please + s = vertices / t; +} + +// sculpt replaces generate() for sculpted surfaces +void LLVolume::sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data, S32 sculpt_level) +{ + LLMemType m1(LLMemType::MTYPE_VOLUME); + U8 sculpt_type = mParams.getSculptType(); + + BOOL data_is_empty = FALSE; + + if (sculpt_width == 0 || sculpt_height == 0 || sculpt_components < 3 || sculpt_data == NULL) + { + sculpt_level = -1; + data_is_empty = TRUE; + } + + S32 requested_sizeS = 0; + S32 requested_sizeT = 0; + + sculpt_calc_mesh_resolution(sculpt_width, sculpt_height, sculpt_type, mDetail, requested_sizeS, requested_sizeT); + + mPathp->generate(mParams.getPathParams(), mDetail, 0, TRUE, requested_sizeS); + mProfilep->generate(mParams.getProfileParams(), mPathp->isOpen(), mDetail, 0, TRUE, requested_sizeT); + + S32 sizeS = mPathp->mPath.size(); // we requested a specific size, now see what we really got + S32 sizeT = mProfilep->mProfile.size(); // we requested a specific size, now see what we really got + + // weird crash bug - DEV-11158 - trying to collect more data: + if ((sizeS == 0) || (sizeT == 0)) + { + llwarns << "sculpt bad mesh size " << sizeS << " " << sizeT << llendl; + } + + sNumMeshPoints -= mMesh.size(); + mMesh.resize(sizeS * sizeT); + sNumMeshPoints += mMesh.size(); + + //generate vertex positions + if (!data_is_empty) + { + sculptGenerateMapVertices(sculpt_width, sculpt_height, sculpt_components, sculpt_data, sculpt_type); + + // don't test lowest LOD to support legacy content DEV-33670 + if (mDetail > SCULPT_MIN_AREA_DETAIL) + { + if (sculptGetSurfaceArea() < SCULPT_MIN_AREA) + { + data_is_empty = TRUE; + } + } + } + + if (data_is_empty) + { + sculptGeneratePlaceholder(); + } + + + + for (S32 i = 0; i < (S32)mProfilep->mFaces.size(); i++) + { + mFaceMask |= mProfilep->mFaces[i].mFaceID; + } + + mSculptLevel = sculpt_level; + + // Delete any existing faces so that they get regenerated + mVolumeFaces.clear(); + + createVolumeFaces(); +} + + + + +BOOL LLVolume::isCap(S32 face) +{ + return mProfilep->mFaces[face].mCap; +} + +BOOL LLVolume::isFlat(S32 face) +{ + return mProfilep->mFaces[face].mFlat; +} + + +bool LLVolumeParams::isSculpt() const +{ + return mSculptID.notNull(); +} + +bool LLVolumeParams::isMeshSculpt() const +{ + return isSculpt() && ((mSculptType & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH); +} + +bool LLVolumeParams::operator==(const LLVolumeParams ¶ms) const +{ + return ( (getPathParams() == params.getPathParams()) && + (getProfileParams() == params.getProfileParams()) && + (mSculptID == params.mSculptID) && + (mSculptType == params.mSculptType) ); +} + +bool LLVolumeParams::operator!=(const LLVolumeParams ¶ms) const +{ + return ( (getPathParams() != params.getPathParams()) || + (getProfileParams() != params.getProfileParams()) || + (mSculptID != params.mSculptID) || + (mSculptType != params.mSculptType) ); +} + +bool LLVolumeParams::operator<(const LLVolumeParams ¶ms) const +{ + if( getPathParams() != params.getPathParams() ) + { + return getPathParams() < params.getPathParams(); + } + + if (getProfileParams() != params.getProfileParams()) + { + return getProfileParams() < params.getProfileParams(); + } + + if (mSculptID != params.mSculptID) + { + return mSculptID < params.mSculptID; + } + + return mSculptType < params.mSculptType; + + +} + +void LLVolumeParams::copyParams(const LLVolumeParams ¶ms) +{ + LLMemType m1(LLMemType::MTYPE_VOLUME); + mProfileParams.copyParams(params.mProfileParams); + mPathParams.copyParams(params.mPathParams); + mSculptID = params.getSculptID(); + mSculptType = params.getSculptType(); +} + +// Less restricitve approx 0 for volumes +const F32 APPROXIMATELY_ZERO = 0.001f; +bool approx_zero( F32 f, F32 tolerance = APPROXIMATELY_ZERO) +{ + return (f >= -tolerance) && (f <= tolerance); +} + +// return true if in range (or nearly so) +static bool limit_range(F32& v, F32 min, F32 max, F32 tolerance = APPROXIMATELY_ZERO) +{ + F32 min_delta = v - min; + if (min_delta < 0.f) + { + v = min; + if (!approx_zero(min_delta, tolerance)) + return false; + } + F32 max_delta = max - v; + if (max_delta < 0.f) + { + v = max; + if (!approx_zero(max_delta, tolerance)) + return false; + } + return true; +} + +bool LLVolumeParams::setBeginAndEndS(const F32 b, const F32 e) +{ + bool valid = true; + + // First, clamp to valid ranges. + F32 begin = b; + valid &= limit_range(begin, 0.f, 1.f - MIN_CUT_DELTA); + + F32 end = e; + if (end >= .0149f && end < MIN_CUT_DELTA) end = MIN_CUT_DELTA; // eliminate warning for common rounding error + valid &= limit_range(end, MIN_CUT_DELTA, 1.f); + + valid &= limit_range(begin, 0.f, end - MIN_CUT_DELTA, .01f); + + // Now set them. + mProfileParams.setBegin(begin); + mProfileParams.setEnd(end); + + return valid; +} + +bool LLVolumeParams::setBeginAndEndT(const F32 b, const F32 e) +{ + bool valid = true; + + // First, clamp to valid ranges. + F32 begin = b; + valid &= limit_range(begin, 0.f, 1.f - MIN_CUT_DELTA); + + F32 end = e; + valid &= limit_range(end, MIN_CUT_DELTA, 1.f); + + valid &= limit_range(begin, 0.f, end - MIN_CUT_DELTA, .01f); + + // Now set them. + mPathParams.setBegin(begin); + mPathParams.setEnd(end); + + return valid; +} + +bool LLVolumeParams::setHollow(const F32 h) +{ + // Validate the hollow based on path and profile. + U8 profile = mProfileParams.getCurveType() & LL_PCODE_PROFILE_MASK; + U8 hole_type = mProfileParams.getCurveType() & LL_PCODE_HOLE_MASK; + + F32 max_hollow = HOLLOW_MAX; + + // Only square holes have trouble. + if (LL_PCODE_HOLE_SQUARE == hole_type) + { + switch(profile) + { + case LL_PCODE_PROFILE_CIRCLE: + case LL_PCODE_PROFILE_CIRCLE_HALF: + case LL_PCODE_PROFILE_EQUALTRI: + max_hollow = HOLLOW_MAX_SQUARE; + } + } + + F32 hollow = h; + bool valid = limit_range(hollow, HOLLOW_MIN, max_hollow); + mProfileParams.setHollow(hollow); + + return valid; +} + +bool LLVolumeParams::setTwistBegin(const F32 b) +{ + F32 twist_begin = b; + bool valid = limit_range(twist_begin, TWIST_MIN, TWIST_MAX); + mPathParams.setTwistBegin(twist_begin); + return valid; +} + +bool LLVolumeParams::setTwistEnd(const F32 e) +{ + F32 twist_end = e; + bool valid = limit_range(twist_end, TWIST_MIN, TWIST_MAX); + mPathParams.setTwistEnd(twist_end); + return valid; +} + +bool LLVolumeParams::setRatio(const F32 x, const F32 y) +{ + F32 min_x = RATIO_MIN; + F32 max_x = RATIO_MAX; + F32 min_y = RATIO_MIN; + F32 max_y = RATIO_MAX; + // If this is a circular path (and not a sphere) then 'ratio' is actually hole size. + U8 path_type = mPathParams.getCurveType(); + U8 profile_type = mProfileParams.getCurveType() & LL_PCODE_PROFILE_MASK; + if ( LL_PCODE_PATH_CIRCLE == path_type && + LL_PCODE_PROFILE_CIRCLE_HALF != profile_type) + { + // Holes are more restricted... + min_x = HOLE_X_MIN; + max_x = HOLE_X_MAX; + min_y = HOLE_Y_MIN; + max_y = HOLE_Y_MAX; + } + + F32 ratio_x = x; + bool valid = limit_range(ratio_x, min_x, max_x); + F32 ratio_y = y; + valid &= limit_range(ratio_y, min_y, max_y); + + mPathParams.setScale(ratio_x, ratio_y); + + return valid; +} + +bool LLVolumeParams::setShear(const F32 x, const F32 y) +{ + F32 shear_x = x; + bool valid = limit_range(shear_x, SHEAR_MIN, SHEAR_MAX); + F32 shear_y = y; + valid &= limit_range(shear_y, SHEAR_MIN, SHEAR_MAX); + mPathParams.setShear(shear_x, shear_y); + return valid; +} + +bool LLVolumeParams::setTaperX(const F32 v) +{ + F32 taper = v; + bool valid = limit_range(taper, TAPER_MIN, TAPER_MAX); + mPathParams.setTaperX(taper); + return valid; +} + +bool LLVolumeParams::setTaperY(const F32 v) +{ + F32 taper = v; + bool valid = limit_range(taper, TAPER_MIN, TAPER_MAX); + mPathParams.setTaperY(taper); + return valid; +} + +bool LLVolumeParams::setRevolutions(const F32 r) +{ + F32 revolutions = r; + bool valid = limit_range(revolutions, REV_MIN, REV_MAX); + mPathParams.setRevolutions(revolutions); + return valid; +} + +bool LLVolumeParams::setRadiusOffset(const F32 offset) +{ + bool valid = true; + + // If this is a sphere, just set it to 0 and get out. + U8 path_type = mPathParams.getCurveType(); + U8 profile_type = mProfileParams.getCurveType() & LL_PCODE_PROFILE_MASK; + if ( LL_PCODE_PROFILE_CIRCLE_HALF == profile_type || + LL_PCODE_PATH_CIRCLE != path_type ) + { + mPathParams.setRadiusOffset(0.f); + return true; + } + + // Limit radius offset, based on taper and hole size y. + F32 radius_offset = offset; + F32 taper_y = getTaperY(); + F32 radius_mag = fabs(radius_offset); + F32 hole_y_mag = fabs(getRatioY()); + F32 taper_y_mag = fabs(taper_y); + // Check to see if the taper effects us. + if ( (radius_offset > 0.f && taper_y < 0.f) || + (radius_offset < 0.f && taper_y > 0.f) ) + { + // The taper does not help increase the radius offset range. + taper_y_mag = 0.f; + } + F32 max_radius_mag = 1.f - hole_y_mag * (1.f - taper_y_mag) / (1.f - hole_y_mag); + + // Enforce the maximum magnitude. + F32 delta = max_radius_mag - radius_mag; + if (delta < 0.f) + { + // Check radius offset sign. + if (radius_offset < 0.f) + { + radius_offset = -max_radius_mag; + } + else + { + radius_offset = max_radius_mag; + } + valid = approx_zero(delta, .1f); + } + + mPathParams.setRadiusOffset(radius_offset); + return valid; +} + +bool LLVolumeParams::setSkew(const F32 skew_value) +{ + bool valid = true; + + // Check the skew value against the revolutions. + F32 skew = llclamp(skew_value, SKEW_MIN, SKEW_MAX); + F32 skew_mag = fabs(skew); + F32 revolutions = getRevolutions(); + F32 scale_x = getRatioX(); + F32 min_skew_mag = 1.0f - 1.0f / (revolutions * scale_x + 1.0f); + // Discontinuity; A revolution of 1 allows skews below 0.5. + if ( fabs(revolutions - 1.0f) < 0.001) + min_skew_mag = 0.0f; + + // Clip skew. + F32 delta = skew_mag - min_skew_mag; + if (delta < 0.f) + { + // Check skew sign. + if (skew < 0.0f) + { + skew = -min_skew_mag; + } + else + { + skew = min_skew_mag; + } + valid = approx_zero(delta, .01f); + } + + mPathParams.setSkew(skew); + return valid; +} + +bool LLVolumeParams::setSculptID(const LLUUID sculpt_id, U8 sculpt_type) +{ + mSculptID = sculpt_id; + mSculptType = sculpt_type; + return true; +} + +bool LLVolumeParams::setType(U8 profile, U8 path) +{ + bool result = true; + // First, check profile and path for validity. + U8 profile_type = profile & LL_PCODE_PROFILE_MASK; + U8 hole_type = (profile & LL_PCODE_HOLE_MASK) >> 4; + U8 path_type = path >> 4; + + if (profile_type > LL_PCODE_PROFILE_MAX) + { + // Bad profile. Make it square. + profile = LL_PCODE_PROFILE_SQUARE; + result = false; + llwarns << "LLVolumeParams::setType changing bad profile type (" << profile_type + << ") to be LL_PCODE_PROFILE_SQUARE" << llendl; + } + else if (hole_type > LL_PCODE_HOLE_MAX) + { + // Bad hole. Make it the same. + profile = profile_type; + result = false; + llwarns << "LLVolumeParams::setType changing bad hole type (" << hole_type + << ") to be LL_PCODE_HOLE_SAME" << llendl; + } + + if (path_type < LL_PCODE_PATH_MIN || + path_type > LL_PCODE_PATH_MAX) + { + // Bad path. Make it linear. + result = false; + llwarns << "LLVolumeParams::setType changing bad path (" << path + << ") to be LL_PCODE_PATH_LINE" << llendl; + path = LL_PCODE_PATH_LINE; + } + + mProfileParams.setCurveType(profile); + mPathParams.setCurveType(path); + return result; +} + +// static +bool LLVolumeParams::validate(U8 prof_curve, F32 prof_begin, F32 prof_end, F32 hollow, + U8 path_curve, F32 path_begin, F32 path_end, + F32 scx, F32 scy, F32 shx, F32 shy, + F32 twistend, F32 twistbegin, F32 radiusoffset, + F32 tx, F32 ty, F32 revolutions, F32 skew) +{ + LLVolumeParams test_params; + if (!test_params.setType (prof_curve, path_curve)) + { + return false; + } + if (!test_params.setBeginAndEndS (prof_begin, prof_end)) + { + return false; + } + if (!test_params.setBeginAndEndT (path_begin, path_end)) + { + return false; + } + if (!test_params.setHollow (hollow)) + { + return false; + } + if (!test_params.setTwistBegin (twistbegin)) + { + return false; + } + if (!test_params.setTwistEnd (twistend)) + { + return false; + } + if (!test_params.setRatio (scx, scy)) + { + return false; + } + if (!test_params.setShear (shx, shy)) + { + return false; + } + if (!test_params.setTaper (tx, ty)) + { + return false; + } + if (!test_params.setRevolutions (revolutions)) + { + return false; + } + if (!test_params.setRadiusOffset (radiusoffset)) + { + return false; + } + if (!test_params.setSkew (skew)) + { + return false; + } + return true; +} + +S32 *LLVolume::getTriangleIndices(U32 &num_indices) const +{ + LLMemType m1(LLMemType::MTYPE_VOLUME); + + S32 expected_num_triangle_indices = getNumTriangleIndices(); + if (expected_num_triangle_indices > MAX_VOLUME_TRIANGLE_INDICES) + { + // we don't allow LLVolumes with this many vertices + llwarns << "Couldn't allocate triangle indices" << llendl; + num_indices = 0; + return NULL; + } + + S32* index = new S32[expected_num_triangle_indices]; + S32 count = 0; + + // Let's do this totally diffently, as we don't care about faces... + // Counter-clockwise triangles are forward facing... + + BOOL open = getProfile().isOpen(); + BOOL hollow = (mParams.getProfileParams().getHollow() > 0); + BOOL path_open = getPath().isOpen(); + S32 size_s, size_s_out, size_t; + S32 s, t, i; + size_s = getProfile().getTotal(); + size_s_out = getProfile().getTotalOut(); + size_t = getPath().mPath.size(); + + // NOTE -- if the construction of the triangles below ever changes + // then getNumTriangleIndices() method may also have to be updated. + + if (open) /* Flawfinder: ignore */ + { + if (hollow) + { + // Open hollow -- much like the closed solid, except we + // we need to stitch up the gap between s=0 and s=size_s-1 + + for (t = 0; t < size_t - 1; t++) + { + // The outer face, first cut, and inner face + for (s = 0; s < size_s - 1; s++) + { + i = s + t*size_s; + index[count++] = i; // x,y + index[count++] = i + 1; // x+1,y + index[count++] = i + size_s; // x,y+1 + + index[count++] = i + size_s; // x,y+1 + index[count++] = i + 1; // x+1,y + index[count++] = i + size_s + 1; // x+1,y+1 + } + + // The other cut face + index[count++] = s + t*size_s; // x,y + index[count++] = 0 + t*size_s; // x+1,y + index[count++] = s + (t+1)*size_s; // x,y+1 + + index[count++] = s + (t+1)*size_s; // x,y+1 + index[count++] = 0 + t*size_s; // x+1,y + index[count++] = 0 + (t+1)*size_s; // x+1,y+1 + } + + // Do the top and bottom caps, if necessary + if (path_open) + { + // Top cap + S32 pt1 = 0; + S32 pt2 = size_s-1; + S32 i = (size_t - 1)*size_s; + + while (pt2 - pt1 > 1) + { + // Use the profile points instead of the mesh, since you want + // the un-transformed profile distances. + LLVector3 p1 = getProfile().mProfile[pt1]; + LLVector3 p2 = getProfile().mProfile[pt2]; + LLVector3 pa = getProfile().mProfile[pt1+1]; + LLVector3 pb = getProfile().mProfile[pt2-1]; + + p1.mV[VZ] = 0.f; + p2.mV[VZ] = 0.f; + pa.mV[VZ] = 0.f; + pb.mV[VZ] = 0.f; + + // Use area of triangle to determine backfacing + F32 area_1a2, area_1ba, area_21b, area_2ab; + area_1a2 = (p1.mV[0]*pa.mV[1] - pa.mV[0]*p1.mV[1]) + + (pa.mV[0]*p2.mV[1] - p2.mV[0]*pa.mV[1]) + + (p2.mV[0]*p1.mV[1] - p1.mV[0]*p2.mV[1]); + + area_1ba = (p1.mV[0]*pb.mV[1] - pb.mV[0]*p1.mV[1]) + + (pb.mV[0]*pa.mV[1] - pa.mV[0]*pb.mV[1]) + + (pa.mV[0]*p1.mV[1] - p1.mV[0]*pa.mV[1]); + + area_21b = (p2.mV[0]*p1.mV[1] - p1.mV[0]*p2.mV[1]) + + (p1.mV[0]*pb.mV[1] - pb.mV[0]*p1.mV[1]) + + (pb.mV[0]*p2.mV[1] - p2.mV[0]*pb.mV[1]); + + area_2ab = (p2.mV[0]*pa.mV[1] - pa.mV[0]*p2.mV[1]) + + (pa.mV[0]*pb.mV[1] - pb.mV[0]*pa.mV[1]) + + (pb.mV[0]*p2.mV[1] - p2.mV[0]*pb.mV[1]); + + BOOL use_tri1a2 = TRUE; + BOOL tri_1a2 = TRUE; + BOOL tri_21b = TRUE; + + if (area_1a2 < 0) + { + tri_1a2 = FALSE; + } + if (area_2ab < 0) + { + // Can't use, because it contains point b + tri_1a2 = FALSE; + } + if (area_21b < 0) + { + tri_21b = FALSE; + } + if (area_1ba < 0) + { + // Can't use, because it contains point b + tri_21b = FALSE; + } + + if (!tri_1a2) + { + use_tri1a2 = FALSE; + } + else if (!tri_21b) + { + use_tri1a2 = TRUE; + } + else + { + LLVector3 d1 = p1 - pa; + LLVector3 d2 = p2 - pb; + + if (d1.magVecSquared() < d2.magVecSquared()) + { + use_tri1a2 = TRUE; + } + else + { + use_tri1a2 = FALSE; + } + } + + if (use_tri1a2) + { + index[count++] = pt1 + i; + index[count++] = pt1 + 1 + i; + index[count++] = pt2 + i; + pt1++; + } + else + { + index[count++] = pt1 + i; + index[count++] = pt2 - 1 + i; + index[count++] = pt2 + i; + pt2--; + } + } + + // Bottom cap + pt1 = 0; + pt2 = size_s-1; + while (pt2 - pt1 > 1) + { + // Use the profile points instead of the mesh, since you want + // the un-transformed profile distances. + LLVector3 p1 = getProfile().mProfile[pt1]; + LLVector3 p2 = getProfile().mProfile[pt2]; + LLVector3 pa = getProfile().mProfile[pt1+1]; + LLVector3 pb = getProfile().mProfile[pt2-1]; + + p1.mV[VZ] = 0.f; + p2.mV[VZ] = 0.f; + pa.mV[VZ] = 0.f; + pb.mV[VZ] = 0.f; + + // Use area of triangle to determine backfacing + F32 area_1a2, area_1ba, area_21b, area_2ab; + area_1a2 = (p1.mV[0]*pa.mV[1] - pa.mV[0]*p1.mV[1]) + + (pa.mV[0]*p2.mV[1] - p2.mV[0]*pa.mV[1]) + + (p2.mV[0]*p1.mV[1] - p1.mV[0]*p2.mV[1]); + + area_1ba = (p1.mV[0]*pb.mV[1] - pb.mV[0]*p1.mV[1]) + + (pb.mV[0]*pa.mV[1] - pa.mV[0]*pb.mV[1]) + + (pa.mV[0]*p1.mV[1] - p1.mV[0]*pa.mV[1]); + + area_21b = (p2.mV[0]*p1.mV[1] - p1.mV[0]*p2.mV[1]) + + (p1.mV[0]*pb.mV[1] - pb.mV[0]*p1.mV[1]) + + (pb.mV[0]*p2.mV[1] - p2.mV[0]*pb.mV[1]); + + area_2ab = (p2.mV[0]*pa.mV[1] - pa.mV[0]*p2.mV[1]) + + (pa.mV[0]*pb.mV[1] - pb.mV[0]*pa.mV[1]) + + (pb.mV[0]*p2.mV[1] - p2.mV[0]*pb.mV[1]); + + BOOL use_tri1a2 = TRUE; + BOOL tri_1a2 = TRUE; + BOOL tri_21b = TRUE; + + if (area_1a2 < 0) + { + tri_1a2 = FALSE; + } + if (area_2ab < 0) + { + // Can't use, because it contains point b + tri_1a2 = FALSE; + } + if (area_21b < 0) + { + tri_21b = FALSE; + } + if (area_1ba < 0) + { + // Can't use, because it contains point b + tri_21b = FALSE; + } + + if (!tri_1a2) + { + use_tri1a2 = FALSE; + } + else if (!tri_21b) + { + use_tri1a2 = TRUE; + } + else + { + LLVector3 d1 = p1 - pa; + LLVector3 d2 = p2 - pb; + + if (d1.magVecSquared() < d2.magVecSquared()) + { + use_tri1a2 = TRUE; + } + else + { + use_tri1a2 = FALSE; + } + } + + if (use_tri1a2) + { + index[count++] = pt1; + index[count++] = pt2; + index[count++] = pt1 + 1; + pt1++; + } + else + { + index[count++] = pt1; + index[count++] = pt2; + index[count++] = pt2 - 1; + pt2--; + } + } + } + } + else + { + // Open solid + + for (t = 0; t < size_t - 1; t++) + { + // Outer face + 1 cut face + for (s = 0; s < size_s - 1; s++) + { + i = s + t*size_s; + + index[count++] = i; // x,y + index[count++] = i + 1; // x+1,y + index[count++] = i + size_s; // x,y+1 + + index[count++] = i + size_s; // x,y+1 + index[count++] = i + 1; // x+1,y + index[count++] = i + size_s + 1; // x+1,y+1 + } + + // The other cut face + index[count++] = (size_s - 1) + (t*size_s); // x,y + index[count++] = 0 + t*size_s; // x+1,y + index[count++] = (size_s - 1) + (t+1)*size_s; // x,y+1 + + index[count++] = (size_s - 1) + (t+1)*size_s; // x,y+1 + index[count++] = 0 + (t*size_s); // x+1,y + index[count++] = 0 + (t+1)*size_s; // x+1,y+1 + } + + // Do the top and bottom caps, if necessary + if (path_open) + { + for (s = 0; s < size_s - 2; s++) + { + index[count++] = s+1; + index[count++] = s; + index[count++] = size_s - 1; + } + + // We've got a top cap + S32 offset = (size_t - 1)*size_s; + for (s = 0; s < size_s - 2; s++) + { + // Inverted ordering from bottom cap. + index[count++] = offset + size_s - 1; + index[count++] = offset + s; + index[count++] = offset + s + 1; + } + } + } + } + else if (hollow) + { + // Closed hollow + // Outer face + + for (t = 0; t < size_t - 1; t++) + { + for (s = 0; s < size_s_out - 1; s++) + { + i = s + t*size_s; + + index[count++] = i; // x,y + index[count++] = i + 1; // x+1,y + index[count++] = i + size_s; // x,y+1 + + index[count++] = i + size_s; // x,y+1 + index[count++] = i + 1; // x+1,y + index[count++] = i + 1 + size_s; // x+1,y+1 + } + } + + // Inner face + // Invert facing from outer face + for (t = 0; t < size_t - 1; t++) + { + for (s = size_s_out; s < size_s - 1; s++) + { + i = s + t*size_s; + + index[count++] = i; // x,y + index[count++] = i + 1; // x+1,y + index[count++] = i + size_s; // x,y+1 + + index[count++] = i + size_s; // x,y+1 + index[count++] = i + 1; // x+1,y + index[count++] = i + 1 + size_s; // x+1,y+1 + } + } + + // Do the top and bottom caps, if necessary + if (path_open) + { + // Top cap + S32 pt1 = 0; + S32 pt2 = size_s-1; + S32 i = (size_t - 1)*size_s; + + while (pt2 - pt1 > 1) + { + // Use the profile points instead of the mesh, since you want + // the un-transformed profile distances. + LLVector3 p1 = getProfile().mProfile[pt1]; + LLVector3 p2 = getProfile().mProfile[pt2]; + LLVector3 pa = getProfile().mProfile[pt1+1]; + LLVector3 pb = getProfile().mProfile[pt2-1]; + + p1.mV[VZ] = 0.f; + p2.mV[VZ] = 0.f; + pa.mV[VZ] = 0.f; + pb.mV[VZ] = 0.f; + + // Use area of triangle to determine backfacing + F32 area_1a2, area_1ba, area_21b, area_2ab; + area_1a2 = (p1.mV[0]*pa.mV[1] - pa.mV[0]*p1.mV[1]) + + (pa.mV[0]*p2.mV[1] - p2.mV[0]*pa.mV[1]) + + (p2.mV[0]*p1.mV[1] - p1.mV[0]*p2.mV[1]); + + area_1ba = (p1.mV[0]*pb.mV[1] - pb.mV[0]*p1.mV[1]) + + (pb.mV[0]*pa.mV[1] - pa.mV[0]*pb.mV[1]) + + (pa.mV[0]*p1.mV[1] - p1.mV[0]*pa.mV[1]); + + area_21b = (p2.mV[0]*p1.mV[1] - p1.mV[0]*p2.mV[1]) + + (p1.mV[0]*pb.mV[1] - pb.mV[0]*p1.mV[1]) + + (pb.mV[0]*p2.mV[1] - p2.mV[0]*pb.mV[1]); + + area_2ab = (p2.mV[0]*pa.mV[1] - pa.mV[0]*p2.mV[1]) + + (pa.mV[0]*pb.mV[1] - pb.mV[0]*pa.mV[1]) + + (pb.mV[0]*p2.mV[1] - p2.mV[0]*pb.mV[1]); + + BOOL use_tri1a2 = TRUE; + BOOL tri_1a2 = TRUE; + BOOL tri_21b = TRUE; + + if (area_1a2 < 0) + { + tri_1a2 = FALSE; + } + if (area_2ab < 0) + { + // Can't use, because it contains point b + tri_1a2 = FALSE; + } + if (area_21b < 0) + { + tri_21b = FALSE; + } + if (area_1ba < 0) + { + // Can't use, because it contains point b + tri_21b = FALSE; + } + + if (!tri_1a2) + { + use_tri1a2 = FALSE; + } + else if (!tri_21b) + { + use_tri1a2 = TRUE; + } + else + { + LLVector3 d1 = p1 - pa; + LLVector3 d2 = p2 - pb; + + if (d1.magVecSquared() < d2.magVecSquared()) + { + use_tri1a2 = TRUE; + } + else + { + use_tri1a2 = FALSE; + } + } + + if (use_tri1a2) + { + index[count++] = pt1 + i; + index[count++] = pt1 + 1 + i; + index[count++] = pt2 + i; + pt1++; + } + else + { + index[count++] = pt1 + i; + index[count++] = pt2 - 1 + i; + index[count++] = pt2 + i; + pt2--; + } + } + + // Bottom cap + pt1 = 0; + pt2 = size_s-1; + while (pt2 - pt1 > 1) + { + // Use the profile points instead of the mesh, since you want + // the un-transformed profile distances. + LLVector3 p1 = getProfile().mProfile[pt1]; + LLVector3 p2 = getProfile().mProfile[pt2]; + LLVector3 pa = getProfile().mProfile[pt1+1]; + LLVector3 pb = getProfile().mProfile[pt2-1]; + + p1.mV[VZ] = 0.f; + p2.mV[VZ] = 0.f; + pa.mV[VZ] = 0.f; + pb.mV[VZ] = 0.f; + + // Use area of triangle to determine backfacing + F32 area_1a2, area_1ba, area_21b, area_2ab; + area_1a2 = (p1.mV[0]*pa.mV[1] - pa.mV[0]*p1.mV[1]) + + (pa.mV[0]*p2.mV[1] - p2.mV[0]*pa.mV[1]) + + (p2.mV[0]*p1.mV[1] - p1.mV[0]*p2.mV[1]); + + area_1ba = (p1.mV[0]*pb.mV[1] - pb.mV[0]*p1.mV[1]) + + (pb.mV[0]*pa.mV[1] - pa.mV[0]*pb.mV[1]) + + (pa.mV[0]*p1.mV[1] - p1.mV[0]*pa.mV[1]); + + area_21b = (p2.mV[0]*p1.mV[1] - p1.mV[0]*p2.mV[1]) + + (p1.mV[0]*pb.mV[1] - pb.mV[0]*p1.mV[1]) + + (pb.mV[0]*p2.mV[1] - p2.mV[0]*pb.mV[1]); + + area_2ab = (p2.mV[0]*pa.mV[1] - pa.mV[0]*p2.mV[1]) + + (pa.mV[0]*pb.mV[1] - pb.mV[0]*pa.mV[1]) + + (pb.mV[0]*p2.mV[1] - p2.mV[0]*pb.mV[1]); + + BOOL use_tri1a2 = TRUE; + BOOL tri_1a2 = TRUE; + BOOL tri_21b = TRUE; + + if (area_1a2 < 0) + { + tri_1a2 = FALSE; + } + if (area_2ab < 0) + { + // Can't use, because it contains point b + tri_1a2 = FALSE; + } + if (area_21b < 0) + { + tri_21b = FALSE; + } + if (area_1ba < 0) + { + // Can't use, because it contains point b + tri_21b = FALSE; + } + + if (!tri_1a2) + { + use_tri1a2 = FALSE; + } + else if (!tri_21b) + { + use_tri1a2 = TRUE; + } + else + { + LLVector3 d1 = p1 - pa; + LLVector3 d2 = p2 - pb; + + if (d1.magVecSquared() < d2.magVecSquared()) + { + use_tri1a2 = TRUE; + } + else + { + use_tri1a2 = FALSE; + } + } + + if (use_tri1a2) + { + index[count++] = pt1; + index[count++] = pt2; + index[count++] = pt1 + 1; + pt1++; + } + else + { + index[count++] = pt1; + index[count++] = pt2; + index[count++] = pt2 - 1; + pt2--; + } + } + } + } + else + { + // Closed solid. Easy case. + for (t = 0; t < size_t - 1; t++) + { + for (s = 0; s < size_s - 1; s++) + { + // Should wrap properly, but for now... + i = s + t*size_s; + + index[count++] = i; // x,y + index[count++] = i + 1; // x+1,y + index[count++] = i + size_s; // x,y+1 + + index[count++] = i + size_s; // x,y+1 + index[count++] = i + 1; // x+1,y + index[count++] = i + size_s + 1; // x+1,y+1 + } + } + + // Do the top and bottom caps, if necessary + if (path_open) + { + // bottom cap + for (s = 1; s < size_s - 2; s++) + { + index[count++] = s+1; + index[count++] = s; + index[count++] = 0; + } + + // top cap + S32 offset = (size_t - 1)*size_s; + for (s = 1; s < size_s - 2; s++) + { + // Inverted ordering from bottom cap. + index[count++] = offset; + index[count++] = offset + s; + index[count++] = offset + s + 1; + } + } + } + +#ifdef LL_DEBUG + // assert that we computed the correct number of indices + if (count != expected_num_triangle_indices ) + { + llerrs << "bad index count prediciton:" + << " expected=" << expected_num_triangle_indices + << " actual=" << count << llendl; + } +#endif + +#if 0 + // verify that each index does not point beyond the size of the mesh + S32 num_vertices = mMesh.size(); + for (i = 0; i < count; i+=3) + { + llinfos << index[i] << ":" << index[i+1] << ":" << index[i+2] << llendl; + llassert(index[i] < num_vertices); + llassert(index[i+1] < num_vertices); + llassert(index[i+2] < num_vertices); + } +#endif + + num_indices = count; + return index; +} + +S32 LLVolume::getNumTriangleIndices() const +{ + BOOL profile_open = getProfile().isOpen(); + BOOL hollow = (mParams.getProfileParams().getHollow() > 0); + BOOL path_open = getPath().isOpen(); + + S32 size_s, size_s_out, size_t; + size_s = getProfile().getTotal(); + size_s_out = getProfile().getTotalOut(); + size_t = getPath().mPath.size(); + + S32 count = 0; + if (profile_open) /* Flawfinder: ignore */ + { + if (hollow) + { + // Open hollow -- much like the closed solid, except we + // we need to stitch up the gap between s=0 and s=size_s-1 + count = (size_t - 1) * (((size_s -1) * 6) + 6); + } + else + { + count = (size_t - 1) * (((size_s -1) * 6) + 6); + } + } + else if (hollow) + { + // Closed hollow + // Outer face + count = (size_t - 1) * (size_s_out - 1) * 6; + + // Inner face + count += (size_t - 1) * ((size_s - 1) - size_s_out) * 6; + } + else + { + // Closed solid. Easy case. + count = (size_t - 1) * (size_s - 1) * 6; + } + + if (path_open) + { + S32 cap_triangle_count = size_s - 3; + if ( profile_open + || hollow ) + { + cap_triangle_count = size_s - 2; + } + if ( cap_triangle_count > 0 ) + { + // top and bottom caps + count += cap_triangle_count * 2 * 3; + } + } + return count; +} + + +S32 LLVolume::getNumTriangles() const +{ + U32 triangle_count = 0; + + for (S32 i = 0; i < getNumVolumeFaces(); ++i) + { + triangle_count += getVolumeFace(i).mNumIndices/3; + } + + return triangle_count; +} + + +//----------------------------------------------------------------------------- +// generateSilhouetteVertices() +//----------------------------------------------------------------------------- +void LLVolume::generateSilhouetteVertices(std::vector<LLVector3> &vertices, + std::vector<LLVector3> &normals, + const LLVector3& obj_cam_vec_in, + const LLMatrix4& mat_in, + const LLMatrix3& norm_mat_in, + S32 face_mask) +{ + LLMemType m1(LLMemType::MTYPE_VOLUME); + + LLMatrix4a mat; + mat.loadu(mat_in); + + LLMatrix4a norm_mat; + norm_mat.loadu(norm_mat_in); + + LLVector4a obj_cam_vec; + obj_cam_vec.load3(obj_cam_vec_in.mV); + + vertices.clear(); + normals.clear(); + + if ((mParams.getSculptType() & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH) + { + return; + } + + S32 cur_index = 0; + //for each face + for (face_list_t::iterator iter = mVolumeFaces.begin(); + iter != mVolumeFaces.end(); ++iter) + { + LLVolumeFace& face = *iter; + + if (!(face_mask & (0x1 << cur_index++)) || + face.mNumIndices == 0 || face.mEdge.empty()) + { + continue; + } + + if (face.mTypeMask & (LLVolumeFace::CAP_MASK)) { + + } + else { + + //============================================== + //DEBUG draw edge map instead of silhouette edge + //============================================== + +#if DEBUG_SILHOUETTE_EDGE_MAP + + //for each triangle + U32 count = face.mNumIndices; + for (U32 j = 0; j < count/3; j++) { + //get vertices + S32 v1 = face.mIndices[j*3+0]; + S32 v2 = face.mIndices[j*3+1]; + S32 v3 = face.mIndices[j*3+2]; + + //get current face center + LLVector3 cCenter = (face.mVertices[v1].getPosition() + + face.mVertices[v2].getPosition() + + face.mVertices[v3].getPosition()) / 3.0f; + + //for each edge + for (S32 k = 0; k < 3; k++) { + S32 nIndex = face.mEdge[j*3+k]; + if (nIndex <= -1) { + continue; + } + + if (nIndex >= (S32) count/3) { + continue; + } + //get neighbor vertices + v1 = face.mIndices[nIndex*3+0]; + v2 = face.mIndices[nIndex*3+1]; + v3 = face.mIndices[nIndex*3+2]; + + //get neighbor face center + LLVector3 nCenter = (face.mVertices[v1].getPosition() + + face.mVertices[v2].getPosition() + + face.mVertices[v3].getPosition()) / 3.0f; + + //draw line + vertices.push_back(cCenter); + vertices.push_back(nCenter); + normals.push_back(LLVector3(1,1,1)); + normals.push_back(LLVector3(1,1,1)); + segments.push_back(vertices.size()); + } + } + + continue; + + //============================================== + //DEBUG + //============================================== + + //============================================== + //DEBUG draw normals instead of silhouette edge + //============================================== +#elif DEBUG_SILHOUETTE_NORMALS + + //for each vertex + for (U32 j = 0; j < face.mNumVertices; j++) { + vertices.push_back(face.mVertices[j].getPosition()); + vertices.push_back(face.mVertices[j].getPosition() + face.mVertices[j].getNormal()*0.1f); + normals.push_back(LLVector3(0,0,1)); + normals.push_back(LLVector3(0,0,1)); + segments.push_back(vertices.size()); +#if DEBUG_SILHOUETTE_BINORMALS + vertices.push_back(face.mVertices[j].getPosition()); + vertices.push_back(face.mVertices[j].getPosition() + face.mVertices[j].mBinormal*0.1f); + normals.push_back(LLVector3(0,0,1)); + normals.push_back(LLVector3(0,0,1)); + segments.push_back(vertices.size()); +#endif + } + + continue; +#else + //============================================== + //DEBUG + //============================================== + + static const U8 AWAY = 0x01, + TOWARDS = 0x02; + + //for each triangle + std::vector<U8> fFacing; + vector_append(fFacing, face.mNumIndices/3); + + LLVector4a* v = (LLVector4a*) face.mPositions; + LLVector4a* n = (LLVector4a*) face.mNormals; + + for (U32 j = 0; j < face.mNumIndices/3; j++) + { + //approximate normal + S32 v1 = face.mIndices[j*3+0]; + S32 v2 = face.mIndices[j*3+1]; + S32 v3 = face.mIndices[j*3+2]; + + LLVector4a c1,c2; + c1.setSub(v[v1], v[v2]); + c2.setSub(v[v2], v[v3]); + + LLVector4a norm; + + norm.setCross3(c1, c2); + + if (norm.dot3(norm) < 0.00000001f) + { + fFacing[j] = AWAY | TOWARDS; + } + else + { + //get view vector + LLVector4a view; + view.setSub(obj_cam_vec, v[v1]); + bool away = view.dot3(norm) > 0.0f; + if (away) + { + fFacing[j] = AWAY; + } + else + { + fFacing[j] = TOWARDS; + } + } + } + + //for each triangle + for (U32 j = 0; j < face.mNumIndices/3; j++) + { + if (fFacing[j] == (AWAY | TOWARDS)) + { //this is a degenerate triangle + //take neighbor facing (degenerate faces get facing of one of their neighbors) + // *FIX IF NEEDED: this does not deal with neighboring degenerate faces + for (S32 k = 0; k < 3; k++) + { + S32 index = face.mEdge[j*3+k]; + if (index != -1) + { + fFacing[j] = fFacing[index]; + break; + } + } + continue; //skip degenerate face + } + + //for each edge + for (S32 k = 0; k < 3; k++) { + S32 index = face.mEdge[j*3+k]; + if (index != -1 && fFacing[index] == (AWAY | TOWARDS)) { + //our neighbor is degenerate, make him face our direction + fFacing[face.mEdge[j*3+k]] = fFacing[j]; + continue; + } + + if (index == -1 || //edge has no neighbor, MUST be a silhouette edge + (fFacing[index] & fFacing[j]) == 0) { //we found a silhouette edge + + S32 v1 = face.mIndices[j*3+k]; + S32 v2 = face.mIndices[j*3+((k+1)%3)]; + + LLVector4a t; + mat.affineTransform(v[v1], t); + vertices.push_back(LLVector3(t[0], t[1], t[2])); + + norm_mat.rotate(n[v1], t); + + t.normalize3fast(); + normals.push_back(LLVector3(t[0], t[1], t[2])); + + mat.affineTransform(v[v2], t); + vertices.push_back(LLVector3(t[0], t[1], t[2])); + + norm_mat.rotate(n[v2], t); + t.normalize3fast(); + normals.push_back(LLVector3(t[0], t[1], t[2])); + } + } + } +#endif + } + } +} + +S32 LLVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& end, + S32 face, + LLVector3* intersection,LLVector2* tex_coord, LLVector3* normal, LLVector3* bi_normal) +{ + LLVector4a starta, enda; + starta.load3(start.mV); + enda.load3(end.mV); + + return lineSegmentIntersect(starta, enda, face, intersection, tex_coord, normal, bi_normal); + +} + + +S32 LLVolume::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end, + S32 face, + LLVector3* intersection,LLVector2* tex_coord, LLVector3* normal, LLVector3* bi_normal) +{ + S32 hit_face = -1; + + S32 start_face; + S32 end_face; + + if (face == -1) // ALL_SIDES + { + start_face = 0; + end_face = getNumVolumeFaces() - 1; + } + else + { + start_face = face; + end_face = face; + } + + LLVector4a dir; + dir.setSub(end, start); + + F32 closest_t = 2.f; // must be larger than 1 + + end_face = llmin(end_face, getNumVolumeFaces()-1); + + for (S32 i = start_face; i <= end_face; i++) + { + LLVolumeFace &face = mVolumeFaces[i]; + + LLVector4a box_center; + box_center.setAdd(face.mExtents[0], face.mExtents[1]); + box_center.mul(0.5f); + + LLVector4a box_size; + box_size.setSub(face.mExtents[1], face.mExtents[0]); + + if (LLLineSegmentBoxIntersect(start, end, box_center, box_size)) + { + if (bi_normal != NULL) // if the caller wants binormals, we may need to generate them + { + genBinormals(i); + } + + if (!face.mOctree) + { + face.createOctree(); + } + + //LLVector4a* p = (LLVector4a*) face.mPositions; + + LLOctreeTriangleRayIntersect intersect(start, dir, &face, &closest_t, intersection, tex_coord, normal, bi_normal); + intersect.traverse(face.mOctree); + if (intersect.mHitFace) + { + hit_face = i; + } + } + } + + + return hit_face; +} + +class LLVertexIndexPair +{ +public: + LLVertexIndexPair(const LLVector3 &vertex, const S32 index); + + LLVector3 mVertex; + S32 mIndex; +}; + +LLVertexIndexPair::LLVertexIndexPair(const LLVector3 &vertex, const S32 index) +{ + mVertex = vertex; + mIndex = index; +} + +const F32 VERTEX_SLOP = 0.00001f; +const F32 VERTEX_SLOP_SQRD = VERTEX_SLOP * VERTEX_SLOP; + +struct lessVertex +{ + bool operator()(const LLVertexIndexPair *a, const LLVertexIndexPair *b) + { + const F32 slop = VERTEX_SLOP; + + if (a->mVertex.mV[0] + slop < b->mVertex.mV[0]) + { + return TRUE; + } + else if (a->mVertex.mV[0] - slop > b->mVertex.mV[0]) + { + return FALSE; + } + + if (a->mVertex.mV[1] + slop < b->mVertex.mV[1]) + { + return TRUE; + } + else if (a->mVertex.mV[1] - slop > b->mVertex.mV[1]) + { + return FALSE; + } + + if (a->mVertex.mV[2] + slop < b->mVertex.mV[2]) + { + return TRUE; + } + else if (a->mVertex.mV[2] - slop > b->mVertex.mV[2]) + { + return FALSE; + } + + return FALSE; + } +}; + +struct lessTriangle +{ + bool operator()(const S32 *a, const S32 *b) + { + if (*a < *b) + { + return TRUE; + } + else if (*a > *b) + { + return FALSE; + } + + if (*(a+1) < *(b+1)) + { + return TRUE; + } + else if (*(a+1) > *(b+1)) + { + return FALSE; + } + + if (*(a+2) < *(b+2)) + { + return TRUE; + } + else if (*(a+2) > *(b+2)) + { + return FALSE; + } + + return FALSE; + } +}; + +BOOL equalTriangle(const S32 *a, const S32 *b) +{ + if ((*a == *b) && (*(a+1) == *(b+1)) && (*(a+2) == *(b+2))) + { + return TRUE; + } + return FALSE; +} + +BOOL LLVolume::cleanupTriangleData( const S32 num_input_vertices, + const std::vector<Point>& input_vertices, + const S32 num_input_triangles, + S32 *input_triangles, + S32 &num_output_vertices, + LLVector3 **output_vertices, + S32 &num_output_triangles, + S32 **output_triangles) +{ + LLMemType m1(LLMemType::MTYPE_VOLUME); + + /* Testing: avoid any cleanup + static BOOL skip_cleanup = TRUE; + if ( skip_cleanup ) + { + num_output_vertices = num_input_vertices; + num_output_triangles = num_input_triangles; + + *output_vertices = new LLVector3[num_input_vertices]; + for (S32 index = 0; index < num_input_vertices; index++) + { + (*output_vertices)[index] = input_vertices[index].mPos; + } + + *output_triangles = new S32[num_input_triangles*3]; + memcpy(*output_triangles, input_triangles, 3*num_input_triangles*sizeof(S32)); // Flawfinder: ignore + return TRUE; + } + */ + + // Here's how we do this: + // Create a structure which contains the original vertex index and the + // LLVector3 data. + // "Sort" the data by the vectors + // Create an array the size of the old vertex list, with a mapping of + // old indices to new indices. + // Go through triangles, shift so the lowest index is first + // Sort triangles by first index + // Remove duplicate triangles + // Allocate and pack new triangle data. + + //LLTimer cleanupTimer; + //llinfos << "In vertices: " << num_input_vertices << llendl; + //llinfos << "In triangles: " << num_input_triangles << llendl; + + S32 i; + typedef std::multiset<LLVertexIndexPair*, lessVertex> vertex_set_t; + vertex_set_t vertex_list; + + LLVertexIndexPair *pairp = NULL; + for (i = 0; i < num_input_vertices; i++) + { + LLVertexIndexPair *new_pairp = new LLVertexIndexPair(input_vertices[i].mPos, i); + vertex_list.insert(new_pairp); + } + + // Generate the vertex mapping and the list of vertices without + // duplicates. This will crash if there are no vertices. + llassert(num_input_vertices > 0); // check for no vertices! + S32 *vertex_mapping = new S32[num_input_vertices]; + LLVector3 *new_vertices = new LLVector3[num_input_vertices]; + LLVertexIndexPair *prev_pairp = NULL; + + S32 new_num_vertices; + + new_num_vertices = 0; + for (vertex_set_t::iterator iter = vertex_list.begin(), + end = vertex_list.end(); + iter != end; iter++) + { + pairp = *iter; + if (!prev_pairp || ((pairp->mVertex - prev_pairp->mVertex).magVecSquared() >= VERTEX_SLOP_SQRD)) + { + new_vertices[new_num_vertices] = pairp->mVertex; + //llinfos << "Added vertex " << new_num_vertices << " : " << pairp->mVertex << llendl; + new_num_vertices++; + // Update the previous + prev_pairp = pairp; + } + else + { + //llinfos << "Removed duplicate vertex " << pairp->mVertex << ", distance magVecSquared() is " << (pairp->mVertex - prev_pairp->mVertex).magVecSquared() << llendl; + } + vertex_mapping[pairp->mIndex] = new_num_vertices - 1; + } + + // Iterate through triangles and remove degenerates, re-ordering vertices + // along the way. + S32 *new_triangles = new S32[num_input_triangles * 3]; + S32 new_num_triangles = 0; + + for (i = 0; i < num_input_triangles; i++) + { + S32 v1 = i*3; + S32 v2 = v1 + 1; + S32 v3 = v1 + 2; + + //llinfos << "Checking triangle " << input_triangles[v1] << ":" << input_triangles[v2] << ":" << input_triangles[v3] << llendl; + input_triangles[v1] = vertex_mapping[input_triangles[v1]]; + input_triangles[v2] = vertex_mapping[input_triangles[v2]]; + input_triangles[v3] = vertex_mapping[input_triangles[v3]]; + + if ((input_triangles[v1] == input_triangles[v2]) + || (input_triangles[v1] == input_triangles[v3]) + || (input_triangles[v2] == input_triangles[v3])) + { + //llinfos << "Removing degenerate triangle " << input_triangles[v1] << ":" << input_triangles[v2] << ":" << input_triangles[v3] << llendl; + // Degenerate triangle, skip + continue; + } + + if (input_triangles[v1] < input_triangles[v2]) + { + if (input_triangles[v1] < input_triangles[v3]) + { + // (0 < 1) && (0 < 2) + new_triangles[new_num_triangles*3] = input_triangles[v1]; + new_triangles[new_num_triangles*3+1] = input_triangles[v2]; + new_triangles[new_num_triangles*3+2] = input_triangles[v3]; + } + else + { + // (0 < 1) && (2 < 0) + new_triangles[new_num_triangles*3] = input_triangles[v3]; + new_triangles[new_num_triangles*3+1] = input_triangles[v1]; + new_triangles[new_num_triangles*3+2] = input_triangles[v2]; + } + } + else if (input_triangles[v2] < input_triangles[v3]) + { + // (1 < 0) && (1 < 2) + new_triangles[new_num_triangles*3] = input_triangles[v2]; + new_triangles[new_num_triangles*3+1] = input_triangles[v3]; + new_triangles[new_num_triangles*3+2] = input_triangles[v1]; + } + else + { + // (1 < 0) && (2 < 1) + new_triangles[new_num_triangles*3] = input_triangles[v3]; + new_triangles[new_num_triangles*3+1] = input_triangles[v1]; + new_triangles[new_num_triangles*3+2] = input_triangles[v2]; + } + new_num_triangles++; + } + + if (new_num_triangles == 0) + { + llwarns << "Created volume object with 0 faces." << llendl; + delete[] new_triangles; + delete[] vertex_mapping; + delete[] new_vertices; + return FALSE; + } + + typedef std::set<S32*, lessTriangle> triangle_set_t; + triangle_set_t triangle_list; + + for (i = 0; i < new_num_triangles; i++) + { + triangle_list.insert(&new_triangles[i*3]); + } + + // Sort through the triangle list, and delete duplicates + + S32 *prevp = NULL; + S32 *curp = NULL; + + S32 *sorted_tris = new S32[new_num_triangles*3]; + S32 cur_tri = 0; + for (triangle_set_t::iterator iter = triangle_list.begin(), + end = triangle_list.end(); + iter != end; iter++) + { + curp = *iter; + if (!prevp || !equalTriangle(prevp, curp)) + { + //llinfos << "Added triangle " << *curp << ":" << *(curp+1) << ":" << *(curp+2) << llendl; + sorted_tris[cur_tri*3] = *curp; + sorted_tris[cur_tri*3+1] = *(curp+1); + sorted_tris[cur_tri*3+2] = *(curp+2); + cur_tri++; + prevp = curp; + } + else + { + //llinfos << "Skipped triangle " << *curp << ":" << *(curp+1) << ":" << *(curp+2) << llendl; + } + } + + *output_vertices = new LLVector3[new_num_vertices]; + num_output_vertices = new_num_vertices; + for (i = 0; i < new_num_vertices; i++) + { + (*output_vertices)[i] = new_vertices[i]; + } + + *output_triangles = new S32[cur_tri*3]; + num_output_triangles = cur_tri; + memcpy(*output_triangles, sorted_tris, 3*cur_tri*sizeof(S32)); /* Flawfinder: ignore */ + + /* + llinfos << "Out vertices: " << num_output_vertices << llendl; + llinfos << "Out triangles: " << num_output_triangles << llendl; + for (i = 0; i < num_output_vertices; i++) + { + llinfos << i << ":" << (*output_vertices)[i] << llendl; + } + for (i = 0; i < num_output_triangles; i++) + { + llinfos << i << ":" << (*output_triangles)[i*3] << ":" << (*output_triangles)[i*3+1] << ":" << (*output_triangles)[i*3+2] << llendl; + } + */ + + //llinfos << "Out vertices: " << num_output_vertices << llendl; + //llinfos << "Out triangles: " << num_output_triangles << llendl; + delete[] vertex_mapping; + vertex_mapping = NULL; + delete[] new_vertices; + new_vertices = NULL; + delete[] new_triangles; + new_triangles = NULL; + delete[] sorted_tris; + sorted_tris = NULL; + triangle_list.clear(); + std::for_each(vertex_list.begin(), vertex_list.end(), DeletePointer()); + vertex_list.clear(); + + return TRUE; +} + + +BOOL LLVolumeParams::importFile(LLFILE *fp) +{ + LLMemType m1(LLMemType::MTYPE_VOLUME); + + //llinfos << "importing volume" << llendl; + const S32 BUFSIZE = 16384; + char buffer[BUFSIZE]; /* Flawfinder: ignore */ + // *NOTE: changing the size or type of this buffer will require + // changing the sscanf below. + char keyword[256]; /* Flawfinder: ignore */ + keyword[0] = 0; + + while (!feof(fp)) + { + if (fgets(buffer, BUFSIZE, fp) == NULL) + { + buffer[0] = '\0'; + } + + sscanf(buffer, " %255s", keyword); /* Flawfinder: ignore */ + if (!strcmp("{", keyword)) + { + continue; + } + if (!strcmp("}",keyword)) + { + break; + } + else if (!strcmp("profile", keyword)) + { + mProfileParams.importFile(fp); + } + else if (!strcmp("path",keyword)) + { + mPathParams.importFile(fp); + } + else + { + llwarns << "unknown keyword " << keyword << " in volume import" << llendl; + } + } + + return TRUE; +} + +BOOL LLVolumeParams::exportFile(LLFILE *fp) const +{ + fprintf(fp,"\tshape 0\n"); + fprintf(fp,"\t{\n"); + mPathParams.exportFile(fp); + mProfileParams.exportFile(fp); + fprintf(fp, "\t}\n"); + return TRUE; +} + + +BOOL LLVolumeParams::importLegacyStream(std::istream& input_stream) +{ + LLMemType m1(LLMemType::MTYPE_VOLUME); + + //llinfos << "importing volume" << llendl; + const S32 BUFSIZE = 16384; + // *NOTE: changing the size or type of this buffer will require + // changing the sscanf below. + char buffer[BUFSIZE]; /* Flawfinder: ignore */ + char keyword[256]; /* Flawfinder: ignore */ + keyword[0] = 0; + + while (input_stream.good()) + { + input_stream.getline(buffer, BUFSIZE); + sscanf(buffer, " %255s", keyword); + if (!strcmp("{", keyword)) + { + continue; + } + if (!strcmp("}",keyword)) + { + break; + } + else if (!strcmp("profile", keyword)) + { + mProfileParams.importLegacyStream(input_stream); + } + else if (!strcmp("path",keyword)) + { + mPathParams.importLegacyStream(input_stream); + } + else + { + llwarns << "unknown keyword " << keyword << " in volume import" << llendl; + } + } + + return TRUE; +} + +BOOL LLVolumeParams::exportLegacyStream(std::ostream& output_stream) const +{ + LLMemType m1(LLMemType::MTYPE_VOLUME); + + output_stream <<"\tshape 0\n"; + output_stream <<"\t{\n"; + mPathParams.exportLegacyStream(output_stream); + mProfileParams.exportLegacyStream(output_stream); + output_stream << "\t}\n"; + return TRUE; +} + +LLSD LLVolumeParams::sculptAsLLSD() const +{ + LLSD sd = LLSD(); + sd["id"] = getSculptID(); + sd["type"] = getSculptType(); + + return sd; +} + +bool LLVolumeParams::sculptFromLLSD(LLSD& sd) +{ + setSculptID(sd["id"].asUUID(), (U8)sd["type"].asInteger()); + return true; +} + +LLSD LLVolumeParams::asLLSD() const +{ + LLSD sd = LLSD(); + sd["path"] = mPathParams; + sd["profile"] = mProfileParams; + sd["sculpt"] = sculptAsLLSD(); + + return sd; +} + +bool LLVolumeParams::fromLLSD(LLSD& sd) +{ + mPathParams.fromLLSD(sd["path"]); + mProfileParams.fromLLSD(sd["profile"]); + sculptFromLLSD(sd["sculpt"]); + + return true; +} + +void LLVolumeParams::reduceS(F32 begin, F32 end) +{ + begin = llclampf(begin); + end = llclampf(end); + if (begin > end) + { + F32 temp = begin; + begin = end; + end = temp; + } + F32 a = mProfileParams.getBegin(); + F32 b = mProfileParams.getEnd(); + mProfileParams.setBegin(a + begin * (b - a)); + mProfileParams.setEnd(a + end * (b - a)); +} + +void LLVolumeParams::reduceT(F32 begin, F32 end) +{ + begin = llclampf(begin); + end = llclampf(end); + if (begin > end) + { + F32 temp = begin; + begin = end; + end = temp; + } + F32 a = mPathParams.getBegin(); + F32 b = mPathParams.getEnd(); + mPathParams.setBegin(a + begin * (b - a)); + mPathParams.setEnd(a + end * (b - a)); +} + +const F32 MIN_CONCAVE_PROFILE_WEDGE = 0.125f; // 1/8 unity +const F32 MIN_CONCAVE_PATH_WEDGE = 0.111111f; // 1/9 unity + +// returns TRUE if the shape can be approximated with a convex shape +// for collison purposes +BOOL LLVolumeParams::isConvex() const +{ + if (!getSculptID().isNull()) + { + // can't determine, be safe and say no: + return FALSE; + } + + F32 path_length = mPathParams.getEnd() - mPathParams.getBegin(); + F32 hollow = mProfileParams.getHollow(); + + U8 path_type = mPathParams.getCurveType(); + if ( path_length > MIN_CONCAVE_PATH_WEDGE + && ( mPathParams.getTwist() != mPathParams.getTwistBegin() + || (hollow > 0.f + && LL_PCODE_PATH_LINE != path_type) ) ) + { + // twist along a "not too short" path is concave + return FALSE; + } + + F32 profile_length = mProfileParams.getEnd() - mProfileParams.getBegin(); + BOOL same_hole = hollow == 0.f + || (mProfileParams.getCurveType() & LL_PCODE_HOLE_MASK) == LL_PCODE_HOLE_SAME; + + F32 min_profile_wedge = MIN_CONCAVE_PROFILE_WEDGE; + U8 profile_type = mProfileParams.getCurveType() & LL_PCODE_PROFILE_MASK; + if ( LL_PCODE_PROFILE_CIRCLE_HALF == profile_type ) + { + // it is a sphere and spheres get twice the minimum profile wedge + min_profile_wedge = 2.f * MIN_CONCAVE_PROFILE_WEDGE; + } + + BOOL convex_profile = ( ( profile_length == 1.f + || profile_length <= 0.5f ) + && hollow == 0.f ) // trivially convex + || ( profile_length <= min_profile_wedge + && same_hole ); // effectvely convex (even when hollow) + + if (!convex_profile) + { + // profile is concave + return FALSE; + } + + if ( LL_PCODE_PATH_LINE == path_type ) + { + // straight paths with convex profile + return TRUE; + } + + BOOL concave_path = (path_length < 1.0f) && (path_length > 0.5f); + if (concave_path) + { + return FALSE; + } + + // we're left with spheres, toroids and tubes + if ( LL_PCODE_PROFILE_CIRCLE_HALF == profile_type ) + { + // at this stage all spheres must be convex + return TRUE; + } + + // it's a toroid or tube + if ( path_length <= MIN_CONCAVE_PATH_WEDGE ) + { + // effectively convex + return TRUE; + } + + return FALSE; +} + +// debug +void LLVolumeParams::setCube() +{ + mProfileParams.setCurveType(LL_PCODE_PROFILE_SQUARE); + mProfileParams.setBegin(0.f); + mProfileParams.setEnd(1.f); + mProfileParams.setHollow(0.f); + + mPathParams.setBegin(0.f); + mPathParams.setEnd(1.f); + mPathParams.setScale(1.f, 1.f); + mPathParams.setShear(0.f, 0.f); + mPathParams.setCurveType(LL_PCODE_PATH_LINE); + mPathParams.setTwistBegin(0.f); + mPathParams.setTwistEnd(0.f); + mPathParams.setRadiusOffset(0.f); + mPathParams.setTaper(0.f, 0.f); + mPathParams.setRevolutions(0.f); + mPathParams.setSkew(0.f); +} + +LLFaceID LLVolume::generateFaceMask() +{ + LLFaceID new_mask = 0x0000; + + switch(mParams.getProfileParams().getCurveType() & LL_PCODE_PROFILE_MASK) + { + case LL_PCODE_PROFILE_CIRCLE: + case LL_PCODE_PROFILE_CIRCLE_HALF: + new_mask |= LL_FACE_OUTER_SIDE_0; + break; + case LL_PCODE_PROFILE_SQUARE: + { + for(S32 side = (S32)(mParams.getProfileParams().getBegin() * 4.f); side < llceil(mParams.getProfileParams().getEnd() * 4.f); side++) + { + new_mask |= LL_FACE_OUTER_SIDE_0 << side; + } + } + break; + case LL_PCODE_PROFILE_ISOTRI: + case LL_PCODE_PROFILE_EQUALTRI: + case LL_PCODE_PROFILE_RIGHTTRI: + { + for(S32 side = (S32)(mParams.getProfileParams().getBegin() * 3.f); side < llceil(mParams.getProfileParams().getEnd() * 3.f); side++) + { + new_mask |= LL_FACE_OUTER_SIDE_0 << side; + } + } + break; + default: + llerrs << "Unknown profile!" << llendl; + break; + } + + // handle hollow objects + if (mParams.getProfileParams().getHollow() > 0) + { + new_mask |= LL_FACE_INNER_SIDE; + } + + // handle open profile curves + if (mProfilep->isOpen()) + { + new_mask |= LL_FACE_PROFILE_BEGIN | LL_FACE_PROFILE_END; + } + + // handle open path curves + if (mPathp->isOpen()) + { + new_mask |= LL_FACE_PATH_BEGIN | LL_FACE_PATH_END; + } + + return new_mask; +} + +BOOL LLVolume::isFaceMaskValid(LLFaceID face_mask) +{ + LLFaceID test_mask = 0; + for(S32 i = 0; i < getNumFaces(); i++) + { + test_mask |= mProfilep->mFaces[i].mFaceID; + } + + return test_mask == face_mask; +} + +BOOL LLVolume::isConvex() const +{ + // mParams.isConvex() may return FALSE even though the final + // geometry is actually convex due to LOD approximations. + // TODO -- provide LLPath and LLProfile with isConvex() methods + // that correctly determine convexity. -- Leviathan + return mParams.isConvex(); +} + + +std::ostream& operator<<(std::ostream &s, const LLProfileParams &profile_params) +{ + s << "{type=" << (U32) profile_params.mCurveType; + s << ", begin=" << profile_params.mBegin; + s << ", end=" << profile_params.mEnd; + s << ", hollow=" << profile_params.mHollow; + s << "}"; + return s; +} + + +std::ostream& operator<<(std::ostream &s, const LLPathParams &path_params) +{ + s << "{type=" << (U32) path_params.mCurveType; + s << ", begin=" << path_params.mBegin; + s << ", end=" << path_params.mEnd; + s << ", twist=" << path_params.mTwistEnd; + s << ", scale=" << path_params.mScale; + s << ", shear=" << path_params.mShear; + s << ", twist_begin=" << path_params.mTwistBegin; + s << ", radius_offset=" << path_params.mRadiusOffset; + s << ", taper=" << path_params.mTaper; + s << ", revolutions=" << path_params.mRevolutions; + s << ", skew=" << path_params.mSkew; + s << "}"; + return s; +} + + +std::ostream& operator<<(std::ostream &s, const LLVolumeParams &volume_params) +{ + s << "{profileparams = " << volume_params.mProfileParams; + s << ", pathparams = " << volume_params.mPathParams; + s << "}"; + return s; +} + + +std::ostream& operator<<(std::ostream &s, const LLProfile &profile) +{ + s << " {open=" << (U32) profile.mOpen; + s << ", dirty=" << profile.mDirty; + s << ", totalout=" << profile.mTotalOut; + s << ", total=" << profile.mTotal; + s << "}"; + return s; +} + + +std::ostream& operator<<(std::ostream &s, const LLPath &path) +{ + s << "{open=" << (U32) path.mOpen; + s << ", dirty=" << path.mDirty; + s << ", step=" << path.mStep; + s << ", total=" << path.mTotal; + s << "}"; + return s; +} + +std::ostream& operator<<(std::ostream &s, const LLVolume &volume) +{ + s << "{params = " << volume.getParams(); + s << ", path = " << *volume.mPathp; + s << ", profile = " << *volume.mProfilep; + s << "}"; + return s; +} + + +std::ostream& operator<<(std::ostream &s, const LLVolume *volumep) +{ + s << "{params = " << volumep->getParams(); + s << ", path = " << *(volumep->mPathp); + s << ", profile = " << *(volumep->mProfilep); + s << "}"; + return s; +} + +LLVolumeFace::LLVolumeFace() : + mID(0), + mTypeMask(0), + mBeginS(0), + mBeginT(0), + mNumS(0), + mNumT(0), + mNumVertices(0), + mNumIndices(0), + mPositions(NULL), + mNormals(NULL), + mBinormals(NULL), + mTexCoords(NULL), + mIndices(NULL), + mWeights(NULL), + mOctree(NULL) +{ + mExtents = (LLVector4a*) malloc(sizeof(LLVector4a)*3); + mCenter = mExtents+2; +} + +LLVolumeFace::LLVolumeFace(const LLVolumeFace& src) +: mID(0), + mTypeMask(0), + mBeginS(0), + mBeginT(0), + mNumS(0), + mNumT(0), + mNumVertices(0), + mNumIndices(0), + mPositions(NULL), + mNormals(NULL), + mBinormals(NULL), + mTexCoords(NULL), + mIndices(NULL), + mWeights(NULL), + mOctree(NULL) +{ + mExtents = (LLVector4a*) malloc(sizeof(LLVector4a)*3); + mCenter = mExtents+2; + *this = src; +} + +LLVolumeFace& LLVolumeFace::operator=(const LLVolumeFace& src) +{ + if (&src == this) + { //self assignment, do nothing + return *this; + } + + mID = src.mID; + mTypeMask = src.mTypeMask; + mBeginS = src.mBeginS; + mBeginT = src.mBeginT; + mNumS = src.mNumS; + mNumT = src.mNumT; + + mExtents[0] = src.mExtents[0]; + mExtents[1] = src.mExtents[1]; + *mCenter = *src.mCenter; + + mNumVertices = 0; + mNumIndices = 0; + + freeData(); + + LLVector4a::memcpyNonAliased16((F32*) mExtents, (F32*) src.mExtents, 3*sizeof(LLVector4a)); + + resizeVertices(src.mNumVertices); + resizeIndices(src.mNumIndices); + + if (mNumVertices) + { + S32 vert_size = mNumVertices*sizeof(LLVector4a); + S32 tc_size = (mNumVertices*sizeof(LLVector2)+0xF) & ~0xF; + + LLVector4a::memcpyNonAliased16((F32*) mPositions, (F32*) src.mPositions, vert_size); + LLVector4a::memcpyNonAliased16((F32*) mNormals, (F32*) src.mNormals, vert_size); + LLVector4a::memcpyNonAliased16((F32*) mTexCoords, (F32*) src.mTexCoords, tc_size); + + + if (src.mBinormals) + { + allocateBinormals(src.mNumVertices); + LLVector4a::memcpyNonAliased16((F32*) mBinormals, (F32*) src.mBinormals, vert_size); + } + else + { + free(mBinormals); + mBinormals = NULL; + } + + if (src.mWeights) + { + allocateWeights(src.mNumVertices); + LLVector4a::memcpyNonAliased16((F32*) mWeights, (F32*) src.mWeights, vert_size); + } + else + { + free(mWeights); + mWeights = NULL; + } + } + + if (mNumIndices) + { + S32 idx_size = (mNumIndices*sizeof(U16)+0xF) & ~0xF; + + LLVector4a::memcpyNonAliased16((F32*) mIndices, (F32*) src.mIndices, idx_size); + } + + //delete + return *this; +} + +LLVolumeFace::~LLVolumeFace() +{ + free(mExtents); + mExtents = NULL; + + freeData(); +} + +void LLVolumeFace::freeData() +{ + free(mPositions); + mPositions = NULL; + free( mNormals); + mNormals = NULL; + free(mTexCoords); + mTexCoords = NULL; + free(mIndices); + mIndices = NULL; + free(mBinormals); + mBinormals = NULL; + free(mWeights); + mWeights = NULL; + + delete mOctree; + mOctree = NULL; +} + +BOOL LLVolumeFace::create(LLVolume* volume, BOOL partial_build) +{ + //tree for this face is no longer valid + delete mOctree; + mOctree = NULL; + + BOOL ret = FALSE ; + if (mTypeMask & CAP_MASK) + { + ret = createCap(volume, partial_build); + } + else if ((mTypeMask & END_MASK) || (mTypeMask & SIDE_MASK)) + { + ret = createSide(volume, partial_build); + } + else + { + llerrs << "Unknown/uninitialized face type!" << llendl; + } + + //update the range of the texture coordinates + if(ret) + { + mTexCoordExtents[0].setVec(1.f, 1.f) ; + mTexCoordExtents[1].setVec(0.f, 0.f) ; + + for(U32 i = 0 ; i < mNumVertices ; i++) + { + if(mTexCoordExtents[0].mV[0] > mTexCoords[i].mV[0]) + { + mTexCoordExtents[0].mV[0] = mTexCoords[i].mV[0] ; + } + if(mTexCoordExtents[1].mV[0] < mTexCoords[i].mV[0]) + { + mTexCoordExtents[1].mV[0] = mTexCoords[i].mV[0] ; + } + + if(mTexCoordExtents[0].mV[1] > mTexCoords[i].mV[1]) + { + mTexCoordExtents[0].mV[1] = mTexCoords[i].mV[1] ; + } + if(mTexCoordExtents[1].mV[1] < mTexCoords[i].mV[1]) + { + mTexCoordExtents[1].mV[1] = mTexCoords[i].mV[1] ; + } + } + mTexCoordExtents[0].mV[0] = llmax(0.f, mTexCoordExtents[0].mV[0]) ; + mTexCoordExtents[0].mV[1] = llmax(0.f, mTexCoordExtents[0].mV[1]) ; + mTexCoordExtents[1].mV[0] = llmin(1.f, mTexCoordExtents[1].mV[0]) ; + mTexCoordExtents[1].mV[1] = llmin(1.f, mTexCoordExtents[1].mV[1]) ; + } + + return ret ; +} + +void LLVolumeFace::getVertexData(U16 index, LLVolumeFace::VertexData& cv) +{ + cv.setPosition(mPositions[index]); + cv.setNormal(mNormals[index]); + cv.mTexCoord = mTexCoords[index]; +} + +bool LLVolumeFace::VertexMapData::operator==(const LLVolumeFace::VertexData& rhs) const +{ + return getPosition().equals3(rhs.getPosition()) && + mTexCoord == rhs.mTexCoord && + getNormal().equals3(rhs.getNormal()); +} + +bool LLVolumeFace::VertexMapData::ComparePosition::operator()(const LLVector3& a, const LLVector3& b) const +{ + if (a.mV[0] != b.mV[0]) + { + return a.mV[0] < b.mV[0]; + } + + if (a.mV[1] != b.mV[1]) + { + return a.mV[1] < b.mV[1]; + } + + return a.mV[2] < b.mV[2]; +} + +void LLVolumeFace::optimize(F32 angle_cutoff) +{ + LLVolumeFace new_face; + + //map of points to vector of vertices at that point + VertexMapData::PointMap point_map; + + //remove redundant vertices + for (U32 i = 0; i < mNumIndices; ++i) + { + U16 index = mIndices[i]; + + LLVolumeFace::VertexData cv; + getVertexData(index, cv); + + BOOL found = FALSE; + VertexMapData::PointMap::iterator point_iter = point_map.find(LLVector3(cv.getPosition().getF32ptr())); + if (point_iter != point_map.end()) + { //duplicate point might exist + for (U32 j = 0; j < point_iter->second.size(); ++j) + { + LLVolumeFace::VertexData& tv = (point_iter->second)[j]; + if (tv.compareNormal(cv, angle_cutoff)) + { + found = TRUE; + new_face.pushIndex((point_iter->second)[j].mIndex); + break; + } + } + } + + if (!found) + { + new_face.pushVertex(cv); + U16 index = (U16) new_face.mNumVertices-1; + new_face.pushIndex(index); + + VertexMapData d; + d.setPosition(cv.getPosition()); + d.mTexCoord = cv.mTexCoord; + d.setNormal(cv.getNormal()); + d.mIndex = index; + if (point_iter != point_map.end()) + { + point_iter->second.push_back(d); + } + else + { + point_map[LLVector3(d.getPosition().getF32ptr())].push_back(d); + } + } + } + + swapData(new_face); +} + +class LLVCacheTriangleData; + +class LLVCacheVertexData +{ +public: + S32 mIdx; + S32 mCacheTag; + F32 mScore; + U32 mActiveTriangles; + std::vector<LLVCacheTriangleData*> mTriangles; + + LLVCacheVertexData() + { + mCacheTag = -1; + mScore = 0.f; + mActiveTriangles = 0; + mIdx = -1; + } +}; + +class LLVCacheTriangleData +{ +public: + bool mActive; + F32 mScore; + LLVCacheVertexData* mVertex[3]; + + LLVCacheTriangleData() + { + mActive = true; + mScore = 0.f; + mVertex[0] = mVertex[1] = mVertex[2] = NULL; + } + + void complete() + { + mActive = false; + for (S32 i = 0; i < 3; ++i) + { + if (mVertex[i]) + { + llassert_always(mVertex[i]->mActiveTriangles > 0); + mVertex[i]->mActiveTriangles--; + } + } + } + + bool operator<(const LLVCacheTriangleData& rhs) const + { //highest score first + return rhs.mScore < mScore; + } +}; + +const F32 FindVertexScore_CacheDecayPower = 1.5f; +const F32 FindVertexScore_LastTriScore = 0.75f; +const F32 FindVertexScore_ValenceBoostScale = 2.0f; +const F32 FindVertexScore_ValenceBoostPower = 0.5f; +const U32 MaxSizeVertexCache = 32; + +F32 find_vertex_score(LLVCacheVertexData& data) +{ + if (data.mActiveTriangles == 0) + { //no triangle references this vertex + return -1.f; + } + + F32 score = 0.f; + + S32 cache_idx = data.mCacheTag; + + if (cache_idx < 0) + { + //not in cache + } + else + { + if (cache_idx < 3) + { //vertex was in the last triangle + score = FindVertexScore_LastTriScore; + } + else + { //more points for being higher in the cache + F32 scaler = 1.f/(MaxSizeVertexCache-3); + score = 1.f-((cache_idx-3)*scaler); + score = powf(score, FindVertexScore_CacheDecayPower); + } + } + + //bonus points for having low valence + F32 valence_boost = powf(data.mActiveTriangles, -FindVertexScore_ValenceBoostPower); + score += FindVertexScore_ValenceBoostScale * valence_boost; + + return score; +} + +class LLVCacheFIFO +{ +public: + LLVCacheVertexData* mCache[MaxSizeVertexCache]; + U32 mMisses; + + LLVCacheFIFO() + { + mMisses = 0; + for (U32 i = 0; i < MaxSizeVertexCache; ++i) + { + mCache[i] = NULL; + } + } + + void addVertex(LLVCacheVertexData* data) + { + if (data->mCacheTag == -1) + { + mMisses++; + + S32 end = MaxSizeVertexCache-1; + + if (mCache[end]) + { + mCache[end]->mCacheTag = -1; + } + + for (S32 i = end; i > 0; --i) + { + mCache[i] = mCache[i-1]; + if (mCache[i]) + { + mCache[i]->mCacheTag = i; + } + } + + mCache[0] = data; + data->mCacheTag = 0; + } + } +}; + +class LLVCacheLRU +{ +public: + LLVCacheVertexData* mCache[MaxSizeVertexCache+3]; + + LLVCacheTriangleData* mBestTriangle; + + U32 mMisses; + + LLVCacheLRU() + { + for (U32 i = 0; i < MaxSizeVertexCache+3; ++i) + { + mCache[i] = NULL; + } + + mBestTriangle = NULL; + mMisses = 0; + } + + void addVertex(LLVCacheVertexData* data) + { + S32 end = MaxSizeVertexCache+2; + if (data->mCacheTag != -1) + { //just moving a vertex to the front of the cache + end = data->mCacheTag; + } + else + { + mMisses++; + if (mCache[end]) + { //adding a new vertex, vertex at end of cache falls off + mCache[end]->mCacheTag = -1; + } + } + + for (S32 i = end; i > 0; --i) + { //adjust cache pointers and tags + mCache[i] = mCache[i-1]; + + if (mCache[i]) + { + mCache[i]->mCacheTag = i; + } + } + + mCache[0] = data; + mCache[0]->mCacheTag = 0; + } + + void addTriangle(LLVCacheTriangleData* data) + { + addVertex(data->mVertex[0]); + addVertex(data->mVertex[1]); + addVertex(data->mVertex[2]); + } + + void updateScores() + { + for (U32 i = MaxSizeVertexCache; i < MaxSizeVertexCache+3; ++i) + { //trailing 3 vertices aren't actually in the cache for scoring purposes + if (mCache[i]) + { + mCache[i]->mCacheTag = -1; + } + } + + for (U32 i = 0; i < MaxSizeVertexCache; ++i) + { //update scores of vertices in cache + if (mCache[i]) + { + mCache[i]->mScore = find_vertex_score(*(mCache[i])); + llassert_always(mCache[i]->mCacheTag == i); + } + } + + mBestTriangle = NULL; + //update triangle scores + for (U32 i = 0; i < MaxSizeVertexCache+3; ++i) + { + if (mCache[i]) + { + for (U32 j = 0; j < mCache[i]->mTriangles.size(); ++j) + { + LLVCacheTriangleData* tri = mCache[i]->mTriangles[j]; + if (tri->mActive) + { + tri->mScore = tri->mVertex[0]->mScore; + tri->mScore += tri->mVertex[1]->mScore; + tri->mScore += tri->mVertex[2]->mScore; + + if (!mBestTriangle || mBestTriangle->mScore < tri->mScore) + { + mBestTriangle = tri; + } + } + } + } + } + + //knock trailing 3 vertices off the cache + for (U32 i = MaxSizeVertexCache; i < MaxSizeVertexCache+3; ++i) + { + if (mCache[i]) + { + llassert_always(mCache[i]->mCacheTag == -1); + mCache[i] = NULL; + } + } + } +}; + + +void LLVolumeFace::cacheOptimize() +{ //optimize for vertex cache according to Forsyth method: + // http://home.comcast.net/~tom_forsyth/papers/fast_vert_cache_opt.html + + LLVCacheLRU cache; + + //mapping of vertices to triangles and indices + std::vector<LLVCacheVertexData> vertex_data; + + //mapping of triangles do vertices + std::vector<LLVCacheTriangleData> triangle_data; + + triangle_data.resize(mNumIndices/3); + vertex_data.resize(mNumVertices); + + for (U32 i = 0; i < mNumIndices; i++) + { //populate vertex data and triangle data arrays + U16 idx = mIndices[i]; + U32 tri_idx = i/3; + + vertex_data[idx].mTriangles.push_back(&(triangle_data[tri_idx])); + vertex_data[idx].mIdx = idx; + triangle_data[tri_idx].mVertex[i%3] = &(vertex_data[idx]); + } + + /*F32 pre_acmr = 1.f; + //measure cache misses from before rebuild + { + LLVCacheFIFO test_cache; + for (U32 i = 0; i < mNumIndices; ++i) + { + test_cache.addVertex(&vertex_data[mIndices[i]]); + } + + for (U32 i = 0; i < mNumVertices; i++) + { + vertex_data[i].mCacheTag = -1; + } + + pre_acmr = (F32) test_cache.mMisses/(mNumIndices/3); + }*/ + + for (U32 i = 0; i < mNumVertices; i++) + { //initialize score values (no cache -- might try a fifo cache here) + vertex_data[i].mScore = find_vertex_score(vertex_data[i]); + vertex_data[i].mActiveTriangles = vertex_data[i].mTriangles.size(); + + for (U32 j = 0; j < vertex_data[i].mTriangles.size(); ++j) + { + vertex_data[i].mTriangles[j]->mScore += vertex_data[i].mScore; + } + } + + //sort triangle data by score + std::sort(triangle_data.begin(), triangle_data.end()); + + std::vector<U16> new_indices; + + LLVCacheTriangleData* tri; + + //prime pump by adding first triangle to cache; + tri = &(triangle_data[0]); + cache.addTriangle(tri); + new_indices.push_back(tri->mVertex[0]->mIdx); + new_indices.push_back(tri->mVertex[1]->mIdx); + new_indices.push_back(tri->mVertex[2]->mIdx); + tri->complete(); + + U32 breaks = 0; + for (U32 i = 1; i < mNumIndices/3; ++i) + { + cache.updateScores(); + tri = cache.mBestTriangle; + if (!tri) + { + breaks++; + for (U32 j = 0; j < triangle_data.size(); ++j) + { + if (triangle_data[j].mActive) + { + tri = &(triangle_data[j]); + break; + } + } + } + + cache.addTriangle(tri); + new_indices.push_back(tri->mVertex[0]->mIdx); + new_indices.push_back(tri->mVertex[1]->mIdx); + new_indices.push_back(tri->mVertex[2]->mIdx); + tri->complete(); + } + + for (U32 i = 0; i < mNumIndices; ++i) + { + mIndices[i] = new_indices[i]; + } + + /*F32 post_acmr = 1.f; + //measure cache misses from after rebuild + { + LLVCacheFIFO test_cache; + for (U32 i = 0; i < mNumVertices; i++) + { + vertex_data[i].mCacheTag = -1; + } + + for (U32 i = 0; i < mNumIndices; ++i) + { + test_cache.addVertex(&vertex_data[mIndices[i]]); + } + + post_acmr = (F32) test_cache.mMisses/(mNumIndices/3); + }*/ + + //optimize for pre-TnL cache + + //allocate space for new buffer + S32 num_verts = mNumVertices; + LLVector4a* pos = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts); + LLVector4a* norm = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts); + S32 size = ((num_verts*sizeof(LLVector2)) + 0xF) & ~0xF; + LLVector2* tc = (LLVector2*) malloc(size); + + LLVector4a* wght = NULL; + if (mWeights) + { + wght = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts); + } + + LLVector4a* binorm = NULL; + if (mBinormals) + { + binorm = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts); + } + + //allocate mapping of old indices to new indices + std::vector<S32> new_idx; + new_idx.resize(mNumVertices, -1); + + S32 cur_idx = 0; + for (U32 i = 0; i < mNumIndices; ++i) + { + U16 idx = mIndices[i]; + if (new_idx[idx] == -1) + { //this vertex hasn't been added yet + new_idx[idx] = cur_idx; + + //copy vertex data + pos[cur_idx] = mPositions[idx]; + norm[cur_idx] = mNormals[idx]; + tc[cur_idx] = mTexCoords[idx]; + if (mWeights) + { + wght[cur_idx] = mWeights[idx]; + } + if (mBinormals) + { + binorm[cur_idx] = mBinormals[idx]; + } + + cur_idx++; + } + } + + for (U32 i = 0; i < mNumIndices; ++i) + { + mIndices[i] = new_idx[mIndices[i]]; + } + + free(mPositions); + free(mNormals); + free(mTexCoords); + free(mWeights); + free(mBinormals); + + mPositions = pos; + mNormals = norm; + mTexCoords = tc; + mWeights = wght; + mBinormals = binorm; + + //std::string result = llformat("ACMR pre/post: %.3f/%.3f -- %d triangles %d breaks", pre_acmr, post_acmr, mNumIndices/3, breaks); + //llinfos << result << llendl; + +} + +void LLVolumeFace::createOctree(F32 scaler, const LLVector4a& center, const LLVector4a& size) +{ + if (mOctree) + { + return; + } + + mOctree = new LLOctreeRoot<LLVolumeTriangle>(center, size, NULL); + new LLVolumeOctreeListener(mOctree); + + for (U32 i = 0; i < mNumIndices; i+= 3) + { //for each triangle + LLPointer<LLVolumeTriangle> tri = new LLVolumeTriangle(); + + const LLVector4a& v0 = mPositions[mIndices[i]]; + const LLVector4a& v1 = mPositions[mIndices[i+1]]; + const LLVector4a& v2 = mPositions[mIndices[i+2]]; + + //store pointers to vertex data + tri->mV[0] = &v0; + tri->mV[1] = &v1; + tri->mV[2] = &v2; + + //store indices + tri->mIndex[0] = mIndices[i]; + tri->mIndex[1] = mIndices[i+1]; + tri->mIndex[2] = mIndices[i+2]; + + //get minimum point + LLVector4a min = v0; + min.setMin(min, v1); + min.setMin(min, v2); + + //get maximum point + LLVector4a max = v0; + max.setMax(max, v1); + max.setMax(max, v2); + + //compute center + LLVector4a center; + center.setAdd(min, max); + center.mul(0.5f); + + tri->mPositionGroup = center; + + //compute "radius" + LLVector4a size; + size.setSub(max,min); + + tri->mRadius = size.getLength3().getF32() * scaler; + + //insert + mOctree->insert(tri); + } + + //remove unneeded octree layers + while (!mOctree->balance()) { } + + //calculate AABB for each node + LLVolumeOctreeRebound rebound(this); + rebound.traverse(mOctree); + + if (gDebugGL) + { + LLVolumeOctreeValidate validate; + validate.traverse(mOctree); + } +} + + +void LLVolumeFace::swapData(LLVolumeFace& rhs) +{ + llswap(rhs.mPositions, mPositions); + llswap(rhs.mNormals, mNormals); + llswap(rhs.mBinormals, mBinormals); + llswap(rhs.mTexCoords, mTexCoords); + llswap(rhs.mIndices,mIndices); + llswap(rhs.mNumVertices, mNumVertices); + llswap(rhs.mNumIndices, mNumIndices); +} + +void LerpPlanarVertex(LLVolumeFace::VertexData& v0, + LLVolumeFace::VertexData& v1, + LLVolumeFace::VertexData& v2, + LLVolumeFace::VertexData& vout, + F32 coef01, + F32 coef02) +{ + + LLVector4a lhs; + lhs.setSub(v1.getPosition(), v0.getPosition()); + lhs.mul(coef01); + LLVector4a rhs; + rhs.setSub(v2.getPosition(), v0.getPosition()); + rhs.mul(coef02); + + rhs.add(lhs); + rhs.add(v0.getPosition()); + + vout.setPosition(rhs); + + vout.mTexCoord = v0.mTexCoord + ((v1.mTexCoord-v0.mTexCoord)*coef01)+((v2.mTexCoord-v0.mTexCoord)*coef02); + vout.setNormal(v0.getNormal()); +} + +BOOL LLVolumeFace::createUnCutCubeCap(LLVolume* volume, BOOL partial_build) +{ + LLMemType m1(LLMemType::MTYPE_VOLUME); + + const std::vector<LLVolume::Point>& mesh = volume->getMesh(); + const std::vector<LLVector3>& profile = volume->getProfile().mProfile; + S32 max_s = volume->getProfile().getTotal(); + S32 max_t = volume->getPath().mPath.size(); + + // S32 i; + S32 num_vertices = 0, num_indices = 0; + S32 grid_size = (profile.size()-1)/4; + S32 quad_count = (grid_size * grid_size); + + num_vertices = (grid_size+1)*(grid_size+1); + num_indices = quad_count * 4; + + LLVector4a& min = mExtents[0]; + LLVector4a& max = mExtents[1]; + + S32 offset = 0; + if (mTypeMask & TOP_MASK) + { + offset = (max_t-1) * max_s; + } + else + { + offset = mBeginS; + } + + { + VertexData corners[4]; + VertexData baseVert; + for(S32 t = 0; t < 4; t++) + { + corners[t].getPosition().load3( mesh[offset + (grid_size*t)].mPos.mV); + corners[t].mTexCoord.mV[0] = profile[grid_size*t].mV[0]+0.5f; + corners[t].mTexCoord.mV[1] = 0.5f - profile[grid_size*t].mV[1]; + } + + { + LLVector4a lhs; + lhs.setSub(corners[1].getPosition(), corners[0].getPosition()); + LLVector4a rhs; + rhs.setSub(corners[2].getPosition(), corners[1].getPosition()); + baseVert.getNormal().setCross3(lhs, rhs); + baseVert.getNormal().normalize3fast(); + } + + if(!(mTypeMask & TOP_MASK)) + { + baseVert.getNormal().mul(-1.0f); + } + else + { + //Swap the UVs on the U(X) axis for top face + LLVector2 swap; + swap = corners[0].mTexCoord; + corners[0].mTexCoord=corners[3].mTexCoord; + corners[3].mTexCoord=swap; + swap = corners[1].mTexCoord; + corners[1].mTexCoord=corners[2].mTexCoord; + corners[2].mTexCoord=swap; + } + + LLVector4a binormal; + + calc_binormal_from_triangle( binormal, + corners[0].getPosition(), corners[0].mTexCoord, + corners[1].getPosition(), corners[1].mTexCoord, + corners[2].getPosition(), corners[2].mTexCoord); + + binormal.normalize3fast(); + + S32 size = (grid_size+1)*(grid_size+1); + resizeVertices(size); + allocateBinormals(size); + + LLVector4a* pos = (LLVector4a*) mPositions; + LLVector4a* norm = (LLVector4a*) mNormals; + LLVector4a* binorm = (LLVector4a*) mBinormals; + LLVector2* tc = (LLVector2*) mTexCoords; + + for(int gx = 0;gx<grid_size+1;gx++) + { + for(int gy = 0;gy<grid_size+1;gy++) + { + VertexData newVert; + LerpPlanarVertex( + corners[0], + corners[1], + corners[3], + newVert, + (F32)gx/(F32)grid_size, + (F32)gy/(F32)grid_size); + + *pos++ = newVert.getPosition(); + *norm++ = baseVert.getNormal(); + *tc++ = newVert.mTexCoord; + *binorm++ = binormal; + + if (gx == 0 && gy == 0) + { + min = newVert.getPosition(); + max = min; + } + else + { + min.setMin(min, newVert.getPosition()); + max.setMax(max, newVert.getPosition()); + } + } + } + + mCenter->setAdd(min, max); + mCenter->mul(0.5f); + } + + if (!partial_build) + { + resizeIndices(grid_size*grid_size*6); + + U16* out = mIndices; + + S32 idxs[] = {0,1,(grid_size+1)+1,(grid_size+1)+1,(grid_size+1),0}; + for(S32 gx = 0;gx<grid_size;gx++) + { + + for(S32 gy = 0;gy<grid_size;gy++) + { + if (mTypeMask & TOP_MASK) + { + for(S32 i=5;i>=0;i--) + { + *out++ = ((gy*(grid_size+1))+gx+idxs[i]); + } + } + else + { + for(S32 i=0;i<6;i++) + { + *out++ = ((gy*(grid_size+1))+gx+idxs[i]); + } + } + } + } + } + + return TRUE; +} + + +BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build) +{ + LLMemType m1(LLMemType::MTYPE_VOLUME); + + if (!(mTypeMask & HOLLOW_MASK) && + !(mTypeMask & OPEN_MASK) && + ((volume->getParams().getPathParams().getBegin()==0.0f)&& + (volume->getParams().getPathParams().getEnd()==1.0f))&& + (volume->getParams().getProfileParams().getCurveType()==LL_PCODE_PROFILE_SQUARE && + volume->getParams().getPathParams().getCurveType()==LL_PCODE_PATH_LINE) + ){ + return createUnCutCubeCap(volume, partial_build); + } + + S32 num_vertices = 0, num_indices = 0; + + const std::vector<LLVolume::Point>& mesh = volume->getMesh(); + const std::vector<LLVector3>& profile = volume->getProfile().mProfile; + + // All types of caps have the same number of vertices and indices + num_vertices = profile.size(); + num_indices = (profile.size() - 2)*3; + + if (!(mTypeMask & HOLLOW_MASK) && !(mTypeMask & OPEN_MASK)) + { + resizeVertices(num_vertices+1); + allocateBinormals(num_vertices+1); + + if (!partial_build) + { + resizeIndices(num_indices+3); + } + } + else + { + resizeVertices(num_vertices); + allocateBinormals(num_vertices); + + if (!partial_build) + { + resizeIndices(num_indices); + } + } + + S32 max_s = volume->getProfile().getTotal(); + S32 max_t = volume->getPath().mPath.size(); + + mCenter->clear(); + + S32 offset = 0; + if (mTypeMask & TOP_MASK) + { + offset = (max_t-1) * max_s; + } + else + { + offset = mBeginS; + } + + // Figure out the normal, assume all caps are flat faces. + // Cross product to get normals. + + LLVector2 cuv; + LLVector2 min_uv, max_uv; + + LLVector4a& min = mExtents[0]; + LLVector4a& max = mExtents[1]; + + LLVector2* tc = (LLVector2*) mTexCoords; + LLVector4a* pos = (LLVector4a*) mPositions; + LLVector4a* norm = (LLVector4a*) mNormals; + LLVector4a* binorm = (LLVector4a*) mBinormals; + + // Copy the vertices into the array + for (S32 i = 0; i < num_vertices; i++) + { + if (mTypeMask & TOP_MASK) + { + tc[i].mV[0] = profile[i].mV[0]+0.5f; + tc[i].mV[1] = profile[i].mV[1]+0.5f; + } + else + { + // Mirror for underside. + tc[i].mV[0] = profile[i].mV[0]+0.5f; + tc[i].mV[1] = 0.5f - profile[i].mV[1]; + } + + pos[i].load3(mesh[i + offset].mPos.mV); + + if (i == 0) + { + max = pos[i]; + min = max; + min_uv = max_uv = tc[i]; + } + else + { + update_min_max(min,max,pos[i]); + update_min_max(min_uv, max_uv, tc[i]); + } + } + + mCenter->setAdd(min, max); + mCenter->mul(0.5f); + + cuv = (min_uv + max_uv)*0.5f; + + LLVector4a binormal; + calc_binormal_from_triangle(binormal, + *mCenter, cuv, + pos[0], tc[0], + pos[1], tc[1]); + binormal.normalize3fast(); + + LLVector4a normal; + LLVector4a d0, d1; + + + d0.setSub(*mCenter, pos[0]); + d1.setSub(*mCenter, pos[1]); + + if (mTypeMask & TOP_MASK) + { + normal.setCross3(d0, d1); + } + else + { + normal.setCross3(d1, d0); + } + + normal.normalize3fast(); + + VertexData vd; + vd.setPosition(*mCenter); + vd.mTexCoord = cuv; + + if (!(mTypeMask & HOLLOW_MASK) && !(mTypeMask & OPEN_MASK)) + { + pos[num_vertices] = *mCenter; + tc[num_vertices] = cuv; + num_vertices++; + } + + for (S32 i = 0; i < num_vertices; i++) + { + binorm[i].load4a(binormal.getF32ptr()); + norm[i].load4a(normal.getF32ptr()); + } + + if (partial_build) + { + return TRUE; + } + + if (mTypeMask & HOLLOW_MASK) + { + if (mTypeMask & TOP_MASK) + { + // HOLLOW TOP + // Does it matter if it's open or closed? - djs + + S32 pt1 = 0, pt2 = num_vertices - 1; + S32 i = 0; + while (pt2 - pt1 > 1) + { + // Use the profile points instead of the mesh, since you want + // the un-transformed profile distances. + LLVector3 p1 = profile[pt1]; + LLVector3 p2 = profile[pt2]; + LLVector3 pa = profile[pt1+1]; + LLVector3 pb = profile[pt2-1]; + + p1.mV[VZ] = 0.f; + p2.mV[VZ] = 0.f; + pa.mV[VZ] = 0.f; + pb.mV[VZ] = 0.f; + + // Use area of triangle to determine backfacing + F32 area_1a2, area_1ba, area_21b, area_2ab; + area_1a2 = (p1.mV[0]*pa.mV[1] - pa.mV[0]*p1.mV[1]) + + (pa.mV[0]*p2.mV[1] - p2.mV[0]*pa.mV[1]) + + (p2.mV[0]*p1.mV[1] - p1.mV[0]*p2.mV[1]); + + area_1ba = (p1.mV[0]*pb.mV[1] - pb.mV[0]*p1.mV[1]) + + (pb.mV[0]*pa.mV[1] - pa.mV[0]*pb.mV[1]) + + (pa.mV[0]*p1.mV[1] - p1.mV[0]*pa.mV[1]); + + area_21b = (p2.mV[0]*p1.mV[1] - p1.mV[0]*p2.mV[1]) + + (p1.mV[0]*pb.mV[1] - pb.mV[0]*p1.mV[1]) + + (pb.mV[0]*p2.mV[1] - p2.mV[0]*pb.mV[1]); + + area_2ab = (p2.mV[0]*pa.mV[1] - pa.mV[0]*p2.mV[1]) + + (pa.mV[0]*pb.mV[1] - pb.mV[0]*pa.mV[1]) + + (pb.mV[0]*p2.mV[1] - p2.mV[0]*pb.mV[1]); + + BOOL use_tri1a2 = TRUE; + BOOL tri_1a2 = TRUE; + BOOL tri_21b = TRUE; + + if (area_1a2 < 0) + { + tri_1a2 = FALSE; + } + if (area_2ab < 0) + { + // Can't use, because it contains point b + tri_1a2 = FALSE; + } + if (area_21b < 0) + { + tri_21b = FALSE; + } + if (area_1ba < 0) + { + // Can't use, because it contains point b + tri_21b = FALSE; + } + + if (!tri_1a2) + { + use_tri1a2 = FALSE; + } + else if (!tri_21b) + { + use_tri1a2 = TRUE; + } + else + { + LLVector3 d1 = p1 - pa; + LLVector3 d2 = p2 - pb; + + if (d1.magVecSquared() < d2.magVecSquared()) + { + use_tri1a2 = TRUE; + } + else + { + use_tri1a2 = FALSE; + } + } + + if (use_tri1a2) + { + mIndices[i++] = pt1; + mIndices[i++] = pt1 + 1; + mIndices[i++] = pt2; + pt1++; + } + else + { + mIndices[i++] = pt1; + mIndices[i++] = pt2 - 1; + mIndices[i++] = pt2; + pt2--; + } + } + } + else + { + // HOLLOW BOTTOM + // Does it matter if it's open or closed? - djs + + llassert(mTypeMask & BOTTOM_MASK); + S32 pt1 = 0, pt2 = num_vertices - 1; + + S32 i = 0; + while (pt2 - pt1 > 1) + { + // Use the profile points instead of the mesh, since you want + // the un-transformed profile distances. + LLVector3 p1 = profile[pt1]; + LLVector3 p2 = profile[pt2]; + LLVector3 pa = profile[pt1+1]; + LLVector3 pb = profile[pt2-1]; + + p1.mV[VZ] = 0.f; + p2.mV[VZ] = 0.f; + pa.mV[VZ] = 0.f; + pb.mV[VZ] = 0.f; + + // Use area of triangle to determine backfacing + F32 area_1a2, area_1ba, area_21b, area_2ab; + area_1a2 = (p1.mV[0]*pa.mV[1] - pa.mV[0]*p1.mV[1]) + + (pa.mV[0]*p2.mV[1] - p2.mV[0]*pa.mV[1]) + + (p2.mV[0]*p1.mV[1] - p1.mV[0]*p2.mV[1]); + + area_1ba = (p1.mV[0]*pb.mV[1] - pb.mV[0]*p1.mV[1]) + + (pb.mV[0]*pa.mV[1] - pa.mV[0]*pb.mV[1]) + + (pa.mV[0]*p1.mV[1] - p1.mV[0]*pa.mV[1]); + + area_21b = (p2.mV[0]*p1.mV[1] - p1.mV[0]*p2.mV[1]) + + (p1.mV[0]*pb.mV[1] - pb.mV[0]*p1.mV[1]) + + (pb.mV[0]*p2.mV[1] - p2.mV[0]*pb.mV[1]); + + area_2ab = (p2.mV[0]*pa.mV[1] - pa.mV[0]*p2.mV[1]) + + (pa.mV[0]*pb.mV[1] - pb.mV[0]*pa.mV[1]) + + (pb.mV[0]*p2.mV[1] - p2.mV[0]*pb.mV[1]); + + BOOL use_tri1a2 = TRUE; + BOOL tri_1a2 = TRUE; + BOOL tri_21b = TRUE; + + if (area_1a2 < 0) + { + tri_1a2 = FALSE; + } + if (area_2ab < 0) + { + // Can't use, because it contains point b + tri_1a2 = FALSE; + } + if (area_21b < 0) + { + tri_21b = FALSE; + } + if (area_1ba < 0) + { + // Can't use, because it contains point b + tri_21b = FALSE; + } + + if (!tri_1a2) + { + use_tri1a2 = FALSE; + } + else if (!tri_21b) + { + use_tri1a2 = TRUE; + } + else + { + LLVector3 d1 = p1 - pa; + LLVector3 d2 = p2 - pb; + + if (d1.magVecSquared() < d2.magVecSquared()) + { + use_tri1a2 = TRUE; + } + else + { + use_tri1a2 = FALSE; + } + } + + // Flipped backfacing from top + if (use_tri1a2) + { + mIndices[i++] = pt1; + mIndices[i++] = pt2; + mIndices[i++] = pt1 + 1; + pt1++; + } + else + { + mIndices[i++] = pt1; + mIndices[i++] = pt2; + mIndices[i++] = pt2 - 1; + pt2--; + } + } + } + } + else + { + // Not hollow, generate the triangle fan. + U16 v1 = 2; + U16 v2 = 1; + + if (mTypeMask & TOP_MASK) + { + v1 = 1; + v2 = 2; + } + + for (S32 i = 0; i < (num_vertices - 2); i++) + { + mIndices[3*i] = num_vertices - 1; + mIndices[3*i+v1] = i; + mIndices[3*i+v2] = i + 1; + } + + + } + + return TRUE; +} + +void LLVolumeFace::createBinormals() +{ + LLMemType m1(LLMemType::MTYPE_VOLUME); + + if (!mBinormals) + { + allocateBinormals(mNumVertices); + + //generate binormals + LLVector4a* pos = mPositions; + LLVector2* tc = (LLVector2*) mTexCoords; + LLVector4a* binorm = (LLVector4a*) mBinormals; + + LLVector4a* end = mBinormals+mNumVertices; + while (binorm < end) + { + (*binorm++).clear(); + } + + binorm = mBinormals; + + for (U32 i = 0; i < mNumIndices/3; i++) + { //for each triangle + const U16& i0 = mIndices[i*3+0]; + const U16& i1 = mIndices[i*3+1]; + const U16& i2 = mIndices[i*3+2]; + + //calculate binormal + LLVector4a binormal; + calc_binormal_from_triangle(binormal, + pos[i0], tc[i0], + pos[i1], tc[i1], + pos[i2], tc[i2]); + + + //add triangle normal to vertices + binorm[i0].add(binormal); + binorm[i1].add(binormal); + binorm[i2].add(binormal); + + //even out quad contributions + if (i % 2 == 0) + { + binorm[i2].add(binormal); + } + else + { + binorm[i1].add(binormal); + } + } + + //normalize binormals + for (U32 i = 0; i < mNumVertices; i++) + { + binorm[i].normalize3fast(); + //bump map/planar projection code requires normals to be normalized + mNormals[i].normalize3fast(); + } + } +} + +void LLVolumeFace::resizeVertices(S32 num_verts) +{ + free(mPositions); + free(mNormals); + free(mBinormals); + free(mTexCoords); + + mBinormals = NULL; + + if (num_verts) + { + mPositions = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts); + assert_aligned(mPositions, 16); + mNormals = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts); + assert_aligned(mNormals, 16); + + //pad texture coordinate block end to allow for QWORD reads + S32 size = ((num_verts*sizeof(LLVector2)) + 0xF) & ~0xF; + mTexCoords = (LLVector2*) malloc(size); + assert_aligned(mTexCoords, 16); + } + else + { + mPositions = NULL; + mNormals = NULL; + mTexCoords = NULL; + } + + mNumVertices = num_verts; +} + +void LLVolumeFace::pushVertex(const LLVolumeFace::VertexData& cv) +{ + pushVertex(cv.getPosition(), cv.getNormal(), cv.mTexCoord); +} + +void LLVolumeFace::pushVertex(const LLVector4a& pos, const LLVector4a& norm, const LLVector2& tc) +{ + S32 new_verts = mNumVertices+1; + S32 new_size = new_verts*16; +// S32 old_size = mNumVertices*16; + + //positions + mPositions = (LLVector4a*) realloc(mPositions, new_size); + + //normals + mNormals = (LLVector4a*) realloc(mNormals, new_size); + + //tex coords + new_size = ((new_verts*8)+0xF) & ~0xF; + mTexCoords = (LLVector2*) realloc(mTexCoords, new_size); + + + //just clear binormals + free(mBinormals); + mBinormals = NULL; + + mPositions[mNumVertices] = pos; + mNormals[mNumVertices] = norm; + mTexCoords[mNumVertices] = tc; + + mNumVertices++; +} + +void LLVolumeFace::allocateBinormals(S32 num_verts) +{ + free(mBinormals); + mBinormals = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts); +} + +void LLVolumeFace::allocateWeights(S32 num_verts) +{ + free(mWeights); + mWeights = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts); +} + +void LLVolumeFace::resizeIndices(S32 num_indices) +{ + free(mIndices); + + if (num_indices) + { + //pad index block end to allow for QWORD reads + S32 size = ((num_indices*sizeof(U16)) + 0xF) & ~0xF; + + mIndices = (U16*) malloc(size); + } + else + { + mIndices = NULL; + } + + mNumIndices = num_indices; +} + +void LLVolumeFace::pushIndex(const U16& idx) +{ + S32 new_count = mNumIndices + 1; + S32 new_size = ((new_count*2)+0xF) & ~0xF; + + S32 old_size = ((mNumIndices*2)+0xF) & ~0xF; + if (new_size != old_size) + { + mIndices = (U16*) realloc(mIndices, new_size); + } + + mIndices[mNumIndices++] = idx; +} + +void LLVolumeFace::fillFromLegacyData(std::vector<LLVolumeFace::VertexData>& v, std::vector<U16>& idx) +{ + resizeVertices(v.size()); + resizeIndices(idx.size()); + + for (U32 i = 0; i < v.size(); ++i) + { + mPositions[i] = v[i].getPosition(); + mNormals[i] = v[i].getNormal(); + mTexCoords[i] = v[i].mTexCoord; + } + + for (U32 i = 0; i < idx.size(); ++i) + { + mIndices[i] = idx[i]; + } +} + +void LLVolumeFace::appendFace(const LLVolumeFace& face, LLMatrix4& mat_in, LLMatrix4& norm_mat_in) +{ + U16 offset = mNumVertices; + + S32 new_count = face.mNumVertices + mNumVertices; + + if (new_count > 65536) + { + llerrs << "Cannot append face -- 16-bit overflow will occur." << llendl; + } + + if (face.mNumVertices == 0) + { + llerrs << "Cannot append empty face." << llendl; + } + + //allocate new buffer space + mPositions = (LLVector4a*) realloc(mPositions, new_count*sizeof(LLVector4a)); + assert_aligned(mPositions, 16); + mNormals = (LLVector4a*) realloc(mNormals, new_count*sizeof(LLVector4a)); + assert_aligned(mNormals, 16); + mTexCoords = (LLVector2*) realloc(mTexCoords, (new_count*sizeof(LLVector2)+0xF) & ~0xF); + assert_aligned(mTexCoords, 16); + + mNumVertices = new_count; + + //get destination address of appended face + LLVector4a* dst_pos = mPositions+offset; + LLVector2* dst_tc = mTexCoords+offset; + LLVector4a* dst_norm = mNormals+offset; + + //get source addresses of appended face + const LLVector4a* src_pos = face.mPositions; + const LLVector2* src_tc = face.mTexCoords; + const LLVector4a* src_norm = face.mNormals; + + //load aligned matrices + LLMatrix4a mat, norm_mat; + mat.loadu(mat_in); + norm_mat.loadu(norm_mat_in); + + for (U32 i = 0; i < face.mNumVertices; ++i) + { + //transform appended face position and store + mat.affineTransform(src_pos[i], dst_pos[i]); + + //transform appended face normal and store + norm_mat.rotate(src_norm[i], dst_norm[i]); + dst_norm[i].normalize3fast(); + + //copy appended face texture coordinate + dst_tc[i] = src_tc[i]; + + if (offset == 0 && i == 0) + { //initialize bounding box + mExtents[0] = mExtents[1] = dst_pos[i]; + } + else + { + //stretch bounding box + update_min_max(mExtents[0], mExtents[1], dst_pos[i]); + } + } + + + new_count = mNumIndices + face.mNumIndices; + + //allocate new index buffer + mIndices = (U16*) realloc(mIndices, (new_count*sizeof(U16)+0xF) & ~0xF); + + //get destination address into new index buffer + U16* dst_idx = mIndices+mNumIndices; + mNumIndices = new_count; + + for (U32 i = 0; i < face.mNumIndices; ++i) + { //copy indices, offsetting by old vertex count + dst_idx[i] = face.mIndices[i]+offset; + } +} + +BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build) +{ + LLMemType m1(LLMemType::MTYPE_VOLUME); + + BOOL flat = mTypeMask & FLAT_MASK; + + U8 sculpt_type = volume->getParams().getSculptType(); + U8 sculpt_stitching = sculpt_type & LL_SCULPT_TYPE_MASK; + BOOL sculpt_invert = sculpt_type & LL_SCULPT_FLAG_INVERT; + BOOL sculpt_mirror = sculpt_type & LL_SCULPT_FLAG_MIRROR; + BOOL sculpt_reverse_horizontal = (sculpt_invert ? !sculpt_mirror : sculpt_mirror); // XOR + + S32 num_vertices, num_indices; + + const std::vector<LLVolume::Point>& mesh = volume->getMesh(); + const std::vector<LLVector3>& profile = volume->getProfile().mProfile; + const std::vector<LLPath::PathPt>& path_data = volume->getPath().mPath; + + S32 max_s = volume->getProfile().getTotal(); + + S32 s, t, i; + F32 ss, tt; + + num_vertices = mNumS*mNumT; + num_indices = (mNumS-1)*(mNumT-1)*6; + + if (!partial_build) + { + resizeVertices(num_vertices); + resizeIndices(num_indices); + + if ((volume->getParams().getSculptType() & LL_SCULPT_TYPE_MASK) != LL_SCULPT_TYPE_MESH) + { + mEdge.resize(num_indices); + } + } + + LLVector4a* pos = (LLVector4a*) mPositions; + LLVector4a* norm = (LLVector4a*) mNormals; + LLVector2* tc = (LLVector2*) mTexCoords; + S32 begin_stex = llfloor( profile[mBeginS].mV[2] ); + S32 num_s = ((mTypeMask & INNER_MASK) && (mTypeMask & FLAT_MASK) && mNumS > 2) ? mNumS/2 : mNumS; + + S32 cur_vertex = 0; + // Copy the vertices into the array + for (t = mBeginT; t < mBeginT + mNumT; t++) + { + tt = path_data[t].mTexT; + for (s = 0; s < num_s; s++) + { + if (mTypeMask & END_MASK) + { + if (s) + { + ss = 1.f; + } + else + { + ss = 0.f; + } + } + else + { + // Get s value for tex-coord. + if (!flat) + { + ss = profile[mBeginS + s].mV[2]; + } + else + { + ss = profile[mBeginS + s].mV[2] - begin_stex; + } + } + + if (sculpt_reverse_horizontal) + { + ss = 1.f - ss; + } + + // Check to see if this triangle wraps around the array. + if (mBeginS + s >= max_s) + { + // We're wrapping + i = mBeginS + s + max_s*(t-1); + } + else + { + i = mBeginS + s + max_s*t; + } + + pos[cur_vertex].load3(mesh[i].mPos.mV); + tc[cur_vertex] = LLVector2(ss,tt); + + norm[cur_vertex].clear(); + cur_vertex++; + + if ((mTypeMask & INNER_MASK) && (mTypeMask & FLAT_MASK) && mNumS > 2 && s > 0) + { + + pos[cur_vertex].load3(mesh[i].mPos.mV); + tc[cur_vertex] = LLVector2(ss,tt); + + norm[cur_vertex].clear(); + + cur_vertex++; + } + } + + if ((mTypeMask & INNER_MASK) && (mTypeMask & FLAT_MASK) && mNumS > 2) + { + if (mTypeMask & OPEN_MASK) + { + s = num_s-1; + } + else + { + s = 0; + } + + i = mBeginS + s + max_s*t; + ss = profile[mBeginS + s].mV[2] - begin_stex; + pos[cur_vertex].load3(mesh[i].mPos.mV); + tc[cur_vertex] = LLVector2(ss,tt); + norm[cur_vertex].clear(); + + cur_vertex++; + } + } + + + //get bounding box for this side + LLVector4a& face_min = mExtents[0]; + LLVector4a& face_max = mExtents[1]; + mCenter->clear(); + + face_min = face_max = pos[0]; + + for (U32 i = 1; i < mNumVertices; ++i) + { + update_min_max(face_min, face_max, pos[i]); + } + + mCenter->setAdd(face_min, face_max); + mCenter->mul(0.5f); + + S32 cur_index = 0; + S32 cur_edge = 0; + BOOL flat_face = mTypeMask & FLAT_MASK; + + if (!partial_build) + { + // Now we generate the indices. + for (t = 0; t < (mNumT-1); t++) + { + for (s = 0; s < (mNumS-1); s++) + { + mIndices[cur_index++] = s + mNumS*t; //bottom left + mIndices[cur_index++] = s+1 + mNumS*(t+1); //top right + mIndices[cur_index++] = s + mNumS*(t+1); //top left + mIndices[cur_index++] = s + mNumS*t; //bottom left + mIndices[cur_index++] = s+1 + mNumS*t; //bottom right + mIndices[cur_index++] = s+1 + mNumS*(t+1); //top right + + mEdge[cur_edge++] = (mNumS-1)*2*t+s*2+1; //bottom left/top right neighbor face + if (t < mNumT-2) { //top right/top left neighbor face + mEdge[cur_edge++] = (mNumS-1)*2*(t+1)+s*2+1; + } + else if (mNumT <= 3 || volume->getPath().isOpen() == TRUE) { //no neighbor + mEdge[cur_edge++] = -1; + } + else { //wrap on T + mEdge[cur_edge++] = s*2+1; + } + if (s > 0) { //top left/bottom left neighbor face + mEdge[cur_edge++] = (mNumS-1)*2*t+s*2-1; + } + else if (flat_face || volume->getProfile().isOpen() == TRUE) { //no neighbor + mEdge[cur_edge++] = -1; + } + else { //wrap on S + mEdge[cur_edge++] = (mNumS-1)*2*t+(mNumS-2)*2+1; + } + + if (t > 0) { //bottom left/bottom right neighbor face + mEdge[cur_edge++] = (mNumS-1)*2*(t-1)+s*2; + } + else if (mNumT <= 3 || volume->getPath().isOpen() == TRUE) { //no neighbor + mEdge[cur_edge++] = -1; + } + else { //wrap on T + mEdge[cur_edge++] = (mNumS-1)*2*(mNumT-2)+s*2; + } + if (s < mNumS-2) { //bottom right/top right neighbor face + mEdge[cur_edge++] = (mNumS-1)*2*t+(s+1)*2; + } + else if (flat_face || volume->getProfile().isOpen() == TRUE) { //no neighbor + mEdge[cur_edge++] = -1; + } + else { //wrap on S + mEdge[cur_edge++] = (mNumS-1)*2*t; + } + mEdge[cur_edge++] = (mNumS-1)*2*t+s*2; //top right/bottom left neighbor face + } + } + } + + //clear normals + for (U32 i = 0; i < mNumVertices; i++) + { + mNormals[i].clear(); + } + + //generate normals + for (U32 i = 0; i < mNumIndices/3; i++) //for each triangle + { + const U16* idx = &(mIndices[i*3]); + + + LLVector4a* v[] = + { pos+idx[0], pos+idx[1], pos+idx[2] }; + + LLVector4a* n[] = + { norm+idx[0], norm+idx[1], norm+idx[2] }; + + //calculate triangle normal + LLVector4a a, b, c; + + a.setSub(*v[0], *v[1]); + b.setSub(*v[0], *v[2]); + c.setCross3(a,b); + + n[0]->add(c); + n[1]->add(c); + n[2]->add(c); + + //even out quad contributions + n[i%2+1]->add(c); + } + + // adjust normals based on wrapping and stitching + + LLVector4a top; + top.setSub(pos[0], pos[mNumS*(mNumT-2)]); + BOOL s_bottom_converges = (top.dot3(top) < 0.000001f); + + top.setSub(pos[mNumS-1], pos[mNumS*(mNumT-2)+mNumS-1]); + BOOL s_top_converges = (top.dot3(top) < 0.000001f); + + if (sculpt_stitching == LL_SCULPT_TYPE_NONE) // logic for non-sculpt volumes + { + if (volume->getPath().isOpen() == FALSE) + { //wrap normals on T + for (S32 i = 0; i < mNumS; i++) + { + LLVector4a n; + n.setAdd(norm[i], norm[mNumS*(mNumT-1)+i]); + norm[i] = n; + norm[mNumS*(mNumT-1)+i] = n; + } + } + + if ((volume->getProfile().isOpen() == FALSE) && !(s_bottom_converges)) + { //wrap normals on S + for (S32 i = 0; i < mNumT; i++) + { + LLVector4a n; + n.setAdd(norm[mNumS*i], norm[mNumS*i+mNumS-1]); + norm[mNumS * i] = n; + norm[mNumS * i+mNumS-1] = n; + } + } + + if (volume->getPathType() == LL_PCODE_PATH_CIRCLE && + ((volume->getProfileType() & LL_PCODE_PROFILE_MASK) == LL_PCODE_PROFILE_CIRCLE_HALF)) + { + if (s_bottom_converges) + { //all lower S have same normal + for (S32 i = 0; i < mNumT; i++) + { + norm[mNumS*i].set(1,0,0); + } + } + + if (s_top_converges) + { //all upper S have same normal + for (S32 i = 0; i < mNumT; i++) + { + norm[mNumS*i+mNumS-1].set(-1,0,0); + } + } + } + } + else // logic for sculpt volumes + { + BOOL average_poles = FALSE; + BOOL wrap_s = FALSE; + BOOL wrap_t = FALSE; + + if (sculpt_stitching == LL_SCULPT_TYPE_SPHERE) + average_poles = TRUE; + + if ((sculpt_stitching == LL_SCULPT_TYPE_SPHERE) || + (sculpt_stitching == LL_SCULPT_TYPE_TORUS) || + (sculpt_stitching == LL_SCULPT_TYPE_CYLINDER)) + wrap_s = TRUE; + + if (sculpt_stitching == LL_SCULPT_TYPE_TORUS) + wrap_t = TRUE; + + + if (average_poles) + { + // average normals for north pole + + LLVector4a average; + average.clear(); + + for (S32 i = 0; i < mNumS; i++) + { + average.add(norm[i]); + } + + // set average + for (S32 i = 0; i < mNumS; i++) + { + norm[i] = average; + } + + // average normals for south pole + + average.clear(); + + for (S32 i = 0; i < mNumS; i++) + { + average.add(norm[i + mNumS * (mNumT - 1)]); + } + + // set average + for (S32 i = 0; i < mNumS; i++) + { + norm[i + mNumS * (mNumT - 1)] = average; + } + + } + + + if (wrap_s) + { + for (S32 i = 0; i < mNumT; i++) + { + LLVector4a n; + n.setAdd(norm[mNumS*i], norm[mNumS*i+mNumS-1]); + norm[mNumS * i] = n; + norm[mNumS * i+mNumS-1] = n; + } + } + + if (wrap_t) + { + for (S32 i = 0; i < mNumS; i++) + { + LLVector4a n; + n.setAdd(norm[i], norm[mNumS*(mNumT-1)+i]); + norm[i] = n; + norm[mNumS*(mNumT-1)+i] = n; + } + } + + } + + return TRUE; +} + +// Finds binormal based on three vertices with texture coordinates. +// Fills in dummy values if the triangle has degenerate texture coordinates. +void calc_binormal_from_triangle(LLVector4a& binormal, + + const LLVector4a& pos0, + const LLVector2& tex0, + const LLVector4a& pos1, + const LLVector2& tex1, + const LLVector4a& pos2, + const LLVector2& tex2) +{ + LLVector4a rx0( pos0[VX], tex0.mV[VX], tex0.mV[VY] ); + LLVector4a rx1( pos1[VX], tex1.mV[VX], tex1.mV[VY] ); + LLVector4a rx2( pos2[VX], tex2.mV[VX], tex2.mV[VY] ); + + LLVector4a ry0( pos0[VY], tex0.mV[VX], tex0.mV[VY] ); + LLVector4a ry1( pos1[VY], tex1.mV[VX], tex1.mV[VY] ); + LLVector4a ry2( pos2[VY], tex2.mV[VX], tex2.mV[VY] ); + + LLVector4a rz0( pos0[VZ], tex0.mV[VX], tex0.mV[VY] ); + LLVector4a rz1( pos1[VZ], tex1.mV[VX], tex1.mV[VY] ); + LLVector4a rz2( pos2[VZ], tex2.mV[VX], tex2.mV[VY] ); + + LLVector4a lhs, rhs; + + LLVector4a r0; + lhs.setSub(rx0, rx1); rhs.setSub(rx0, rx2); + r0.setCross3(lhs, rhs); + + LLVector4a r1; + lhs.setSub(ry0, ry1); rhs.setSub(ry0, ry2); + r1.setCross3(lhs, rhs); + + LLVector4a r2; + lhs.setSub(rz0, rz1); rhs.setSub(rz0, rz2); + r2.setCross3(lhs, rhs); + + if( r0[VX] && r1[VX] && r2[VX] ) + { + binormal.set( + -r0[VZ] / r0[VX], + -r1[VZ] / r1[VX], + -r2[VZ] / r2[VX]); + // binormal.normVec(); + } + else + { + binormal.set( 0, 1 , 0 ); + } +} diff --git a/indra/llrender/llglheaders.h b/indra/llrender/llglheaders.h index c48e2bb5fa..d8140a124d 100644 --- a/indra/llrender/llglheaders.h +++ b/indra/llrender/llglheaders.h @@ -840,18 +840,18 @@ extern void glGetBufferPointervARB (GLenum, GLenum, GLvoid* *); //GL_NVX_gpu_memory_info constants #ifndef GL_NVX_gpu_memory_info #define GL_NVX_gpu_memory_info -#define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX 0x9047 -#define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX 0x9048 -#define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX 0x9049 -#define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX 0x904A +#define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX 0x9047 +#define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX 0x9048 +#define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX 0x9049 +#define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX 0x904A #define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX 0x904B #endif //GL_ATI_meminfo constants #ifndef GL_ATI_meminfo #define GL_ATI_meminfo -#define GL_VBO_FREE_MEMORY_ATI 0x87FB -#define GL_TEXTURE_FREE_MEMORY_ATI 0x87FC +#define GL_VBO_FREE_MEMORY_ATI 0x87FB +#define GL_TEXTURE_FREE_MEMORY_ATI 0x87FC #define GL_RENDERBUFFER_FREE_MEMORY_ATI 0x87FD #endif diff --git a/indra/newview/llphysicsshapebuilderutil.cpp b/indra/newview/llphysicsshapebuilderutil.cpp index 54d54bfcb9..5bfe5c9941 100644 --- a/indra/newview/llphysicsshapebuilderutil.cpp +++ b/indra/newview/llphysicsshapebuilderutil.cpp @@ -1,24 +1,28 @@ /** -* @file llphysicsshapebuilder.cpp -* @brief Generic system to convert LL(Physics)VolumeParams to physics shapes -* @author falcon@lindenlab.com -* -* $LicenseInfo:firstyear=2010&license=internal$ -* -* Copyright (c) 2010, Linden Research, Inc. -* -* The following source code is PROPRIETARY AND CONFIDENTIAL. Use of -* this source code is governed by the Linden Lab Source Code Disclosure -* Agreement ("Agreement") previously entered between you and Linden -* Lab. By accessing, using, copying, modifying or distributing this -* software, you acknowledge that you have been informed of your -* obligations under the Agreement and agree to abide by those obligations. -* -* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO -* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, -* COMPLETENESS OR PERFORMANCE. -* $/LicenseInfo$ -*/ + * @file llphysicsshapebuilder.cpp + * @brief Generic system to convert LL(Physics)VolumeParams to physics shapes + * + * $LicenseInfo:firstyear=2001&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ #include "llviewerprecompiledheaders.h" diff --git a/indra/newview/llphysicsshapebuilderutil.h b/indra/newview/llphysicsshapebuilderutil.h index 3de9afcb25..7dedfb05e2 100644 --- a/indra/newview/llphysicsshapebuilderutil.h +++ b/indra/newview/llphysicsshapebuilderutil.h @@ -1,22 +1,26 @@ /** * @file llphysicsshapebuilder.h - * @author falcon@lindenlab.com * @brief Generic system to convert LL(Physics)VolumeParams to physics shapes * - * $LicenseInfo:firstyear=2010&license=internal$ + * $LicenseInfo:firstyear=2001&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. * - * Copyright (c) 2010, Linden Research, Inc. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. * - * The following source code is PROPRIETARY AND CONFIDENTIAL. Use of - * this source code is governed by the Linden Lab Source Code Disclosure - * Agreement ("Agreement") previously entered between you and Linden - * Lab. By accessing, using, copying, modifying or distributing this - * software, you acknowledge that you have been informed of your - * obligations under the Agreement and agree to abide by those obligations. + * This library 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 + * Lesser General Public License for more details. * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ @@ -42,39 +46,39 @@ const F32 SHAPE_BUILDER_ENTRY_SNAP_PARAMETER_BIN_SIZE = 0.010f; const F32 SHAPE_BUILDER_CONVEXIFICATION_SIZE = 2.f * COLLISION_TOLERANCE; const F32 SHAPE_BUILDER_MIN_GEOMETRY_SIZE = 0.5f * COLLISION_TOLERANCE; -class LLPhysicsVolumeParams : public LLVolumeParams -{ -public: - - LLPhysicsVolumeParams( const LLVolumeParams& params, bool forceConvex ) : - LLVolumeParams( params ), - mForceConvex(forceConvex) {} - - bool operator==(const LLPhysicsVolumeParams ¶ms) const - { - return ( LLVolumeParams::operator==(params) && (mForceConvex == params.mForceConvex) ); - } - - bool operator!=(const LLPhysicsVolumeParams ¶ms) const - { - return !operator==(params); - } - - bool operator<(const LLPhysicsVolumeParams ¶ms) const - { - if ( LLVolumeParams::operator!=(params) ) - { - return LLVolumeParams::operator<(params); - } - return (params.mForceConvex == false) && (mForceConvex == true); - } - - bool shouldForceConvex() const { return mForceConvex; } - -private: - bool mForceConvex; -}; - +class LLPhysicsVolumeParams : public LLVolumeParams +{ +public: + + LLPhysicsVolumeParams( const LLVolumeParams& params, bool forceConvex ) : + LLVolumeParams( params ), + mForceConvex(forceConvex) {} + + bool operator==(const LLPhysicsVolumeParams ¶ms) const + { + return ( LLVolumeParams::operator==(params) && (mForceConvex == params.mForceConvex) ); + } + + bool operator!=(const LLPhysicsVolumeParams ¶ms) const + { + return !operator==(params); + } + + bool operator<(const LLPhysicsVolumeParams ¶ms) const + { + if ( LLVolumeParams::operator!=(params) ) + { + return LLVolumeParams::operator<(params); + } + return (params.mForceConvex == false) && (mForceConvex == true); + } + + bool shouldForceConvex() const { return mForceConvex; } + +private: + bool mForceConvex; +}; + class LLPhysicsShapeBuilderUtil { diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index fdf4f5bdaa..295799fd24 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -1,1090 +1,1090 @@ -/** - * @file llvoavatar.h - * @brief Declaration of LLVOAvatar class which is a derivation of - * LLViewerObject - * - * $LicenseInfo:firstyear=2001&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -#ifndef LL_LLVOAVATAR_H -#define LL_LLVOAVATAR_H - -#include <map> -#include <deque> -#include <string> -#include <vector> - -#include <boost/signals2.hpp> - -#include "imageids.h" // IMG_INVISIBLE -#include "llchat.h" -#include "lldrawpoolalpha.h" -#include "llviewerobject.h" -#include "llcharacter.h" -#include "llviewerjointmesh.h" -#include "llviewerjointattachment.h" -#include "llrendertarget.h" -#include "llvoavatardefines.h" -#include "lltexglobalcolor.h" -#include "lldriverparam.h" -#include "material_codes.h" // LL_MCODE_END - -extern const LLUUID ANIM_AGENT_BODY_NOISE; -extern const LLUUID ANIM_AGENT_BREATHE_ROT; -extern const LLUUID ANIM_AGENT_PHYSICS_MOTION; -extern const LLUUID ANIM_AGENT_EDITING; -extern const LLUUID ANIM_AGENT_EYE; -extern const LLUUID ANIM_AGENT_FLY_ADJUST; -extern const LLUUID ANIM_AGENT_HAND_MOTION; -extern const LLUUID ANIM_AGENT_HEAD_ROT; -extern const LLUUID ANIM_AGENT_PELVIS_FIX; -extern const LLUUID ANIM_AGENT_TARGET; -extern const LLUUID ANIM_AGENT_WALK_ADJUST; - -class LLTexLayerSet; -class LLVoiceVisualizer; -class LLHUDNameTag; -class LLHUDEffectSpiral; -class LLTexGlobalColor; -class LLVOAvatarBoneInfo; -class LLVOAvatarSkeletonInfo; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// LLVOAvatar -// -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLVOAvatar : - public LLViewerObject, - public LLCharacter, - public boost::signals2::trackable -{ -public: - friend class LLVOAvatarSelf; -protected: - struct LLVOAvatarXmlInfo; - struct LLMaskedMorph; - -/******************************************************************************** - ** ** - ** INITIALIZATION - **/ - -public: - LLVOAvatar(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp); - virtual void markDead(); - static void initClass(); // Initialize data that's only init'd once per class. - static void cleanupClass(); // Cleanup data that's only init'd once per class. - virtual void initInstance(); // Called after construction to initialize the class. -protected: - virtual ~LLVOAvatar(); - BOOL loadSkeletonNode(); - BOOL loadMeshNodes(); - virtual BOOL loadLayersets(); - -/** Initialization - ** ** - *******************************************************************************/ - -/******************************************************************************** - ** ** - ** INHERITED - **/ - - //-------------------------------------------------------------------- - // LLViewerObject interface and related - //-------------------------------------------------------------------- -public: - virtual void updateGL(); - virtual LLVOAvatar* asAvatar(); - virtual U32 processUpdateMessage(LLMessageSystem *mesgsys, - void **user_data, - U32 block_num, - const EObjectUpdateType update_type, - LLDataPacker *dp); - virtual BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); - virtual BOOL updateLOD(); - BOOL updateJointLODs(); - void updateLODRiggedAttachments( void ); - virtual BOOL isActive() const; // Whether this object needs to do an idleUpdate. - virtual void updateTextures(); - virtual S32 setTETexture(const U8 te, const LLUUID& uuid); // If setting a baked texture, need to request it from a non-local sim. - virtual void onShift(const LLVector4a& shift_vector); - virtual U32 getPartitionType() const; - virtual const LLVector3 getRenderPosition() const; - virtual void updateDrawable(BOOL force_damped); - virtual LLDrawable* createDrawable(LLPipeline *pipeline); - virtual BOOL updateGeometry(LLDrawable *drawable); - virtual void setPixelAreaAndAngle(LLAgent &agent); - virtual void updateRegion(LLViewerRegion *regionp); - virtual void updateSpatialExtents(LLVector4a& newMin, LLVector4a &newMax); - virtual void getSpatialExtents(LLVector4a& newMin, LLVector4a& newMax); - virtual BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end, - S32 face = -1, // which face to check, -1 = ALL_SIDES - BOOL pick_transparent = FALSE, - S32* face_hit = NULL, // which face was hit - LLVector3* intersection = NULL, // return the intersection point - LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point - LLVector3* normal = NULL, // return the surface normal at the intersection point - LLVector3* bi_normal = NULL); // return the surface bi-normal at the intersection point - - //-------------------------------------------------------------------- - // LLCharacter interface and related - //-------------------------------------------------------------------- -public: - virtual LLVector3 getCharacterPosition(); - virtual LLQuaternion getCharacterRotation(); - virtual LLVector3 getCharacterVelocity(); - virtual LLVector3 getCharacterAngularVelocity(); - virtual LLJoint* getCharacterJoint(U32 num); - virtual BOOL allocateCharacterJoints(U32 num); - - virtual LLUUID remapMotionID(const LLUUID& id); - virtual BOOL startMotion(const LLUUID& id, F32 time_offset = 0.f); - virtual BOOL stopMotion(const LLUUID& id, BOOL stop_immediate = FALSE); - virtual void stopMotionFromSource(const LLUUID& source_id); - virtual void requestStopMotion(LLMotion* motion); - LLMotion* findMotion(const LLUUID& id) const; - void startDefaultMotions(); - void dumpAnimationState(); - - virtual LLJoint* getJoint(const std::string &name); - virtual LLJoint* getRootJoint() { return &mRoot; } - - void resetJointPositions( void ); - void resetJointPositionsToDefault( void ); - void resetSpecificJointPosition( const std::string& name ); - - virtual const char* getAnimationPrefix() { return "avatar"; } - virtual const LLUUID& getID(); - virtual LLVector3 getVolumePos(S32 joint_index, LLVector3& volume_offset); - virtual LLJoint* findCollisionVolume(U32 volume_id); - virtual S32 getCollisionVolumeID(std::string &name); - virtual void addDebugText(const std::string& text); - virtual F32 getTimeDilation(); - virtual void getGround(const LLVector3 &inPos, LLVector3 &outPos, LLVector3 &outNorm); - virtual F32 getPixelArea() const; - virtual LLPolyMesh* getHeadMesh(); - virtual LLPolyMesh* getUpperBodyMesh(); - virtual LLVector3d getPosGlobalFromAgent(const LLVector3 &position); - virtual LLVector3 getPosAgentFromGlobal(const LLVector3d &position); - virtual void updateVisualParams(); - - -/** Inherited - ** ** - *******************************************************************************/ - -/******************************************************************************** - ** ** - ** STATE - **/ - -public: - virtual bool isSelf() const { return false; } // True if this avatar is for this viewer's agent - bool isBuilt() const { return mIsBuilt; } - -private: //aligned members - LLVector4a mImpostorExtents[2]; - -private: - BOOL mSupportsAlphaLayers; // For backwards compatibility, TRUE for 1.23+ clients - - //-------------------------------------------------------------------- - // Updates - //-------------------------------------------------------------------- -public: - virtual BOOL updateCharacter(LLAgent &agent); - void idleUpdateVoiceVisualizer(bool voice_enabled); - void idleUpdateMisc(bool detailed_update); - virtual void idleUpdateAppearanceAnimation(); - void idleUpdateLipSync(bool voice_enabled); - void idleUpdateLoadingEffect(); - void idleUpdateWindEffect(); - void idleUpdateNameTag(const LLVector3& root_pos_last); - void idleUpdateNameTagText(BOOL new_name); - LLVector3 idleUpdateNameTagPosition(const LLVector3& root_pos_last); - void idleUpdateNameTagAlpha(BOOL new_name, F32 alpha); - LLColor4 getNameTagColor(bool is_friend); - void clearNameTag(); - static void invalidateNameTag(const LLUUID& agent_id); - // force all name tags to rebuild, useful when display names turned on/off - static void invalidateNameTags(); - void addNameTagLine(const std::string& line, const LLColor4& color, S32 style, const LLFontGL* font); - void idleUpdateRenderCost(); - void idleUpdateBelowWater(); - - //-------------------------------------------------------------------- - // Static preferences (controlled by user settings/menus) - //-------------------------------------------------------------------- -public: - static S32 sRenderName; - static BOOL sRenderGroupTitles; - static U32 sMaxVisible; //(affected by control "RenderAvatarMaxVisible") - static F32 sRenderDistance; //distance at which avatars will render. - static BOOL sShowAnimationDebug; // show animation debug info - static BOOL sUseImpostors; //use impostors for far away avatars - static BOOL sShowFootPlane; // show foot collision plane reported by server - static BOOL sShowCollisionVolumes; // show skeletal collision volumes - static BOOL sVisibleInFirstPerson; - static S32 sNumLODChangesThisFrame; - static S32 sNumVisibleChatBubbles; - static BOOL sDebugInvisible; - static BOOL sShowAttachmentPoints; - static F32 sLODFactor; // user-settable LOD factor - static F32 sPhysicsLODFactor; // user-settable physics LOD factor - static BOOL sJointDebug; // output total number of joints being touched for each avatar - static BOOL sDebugAvatarRotation; - - //-------------------------------------------------------------------- - // Region state - //-------------------------------------------------------------------- -public: - LLHost getObjectHost() const; - - //-------------------------------------------------------------------- - // Loading state - //-------------------------------------------------------------------- -public: - BOOL isFullyLoaded() const; - bool visualParamWeightsAreDefault(); -protected: - virtual BOOL getIsCloud(); - BOOL updateIsFullyLoaded(); - BOOL processFullyLoadedChange(bool loading); - void updateRuthTimer(bool loading); - F32 calcMorphAmount(); -private: - BOOL mFullyLoaded; - BOOL mPreviousFullyLoaded; - BOOL mFullyLoadedInitialized; - S32 mFullyLoadedFrameCounter; - LLFrameTimer mFullyLoadedTimer; - LLFrameTimer mRuthTimer; -protected: - LLFrameTimer mInvisibleTimer; - -/** State - ** ** - *******************************************************************************/ - -/******************************************************************************** - ** ** - ** SKELETON - **/ - -public: - void updateHeadOffset(); - F32 getPelvisToFoot() const { return mPelvisToFoot; } - void setPelvisOffset( bool hasOffset, const LLVector3& translation, F32 offset ) ; - bool hasPelvisOffset( void ) { return mHasPelvisOffset; } - void postPelvisSetRecalc( void ); - void setPelvisOffset( F32 pelvixFixupAmount ); - - bool mHasPelvisOffset; - LLVector3 mPelvisOffset; - F32 mLastPelvisToFoot; - F32 mPelvisFixup; - F32 mLastPelvisFixup; - - LLVector3 mHeadOffset; // current head position - LLViewerJoint mRoot; -protected: - static BOOL parseSkeletonFile(const std::string& filename); - void buildCharacter(); - virtual BOOL loadAvatar(); - - BOOL setupBone(const LLVOAvatarBoneInfo* info, LLViewerJoint* parent, S32 ¤t_volume_num, S32 ¤t_joint_num); - BOOL buildSkeleton(const LLVOAvatarSkeletonInfo *info); -private: - BOOL mIsBuilt; // state of deferred character building - S32 mNumJoints; - LLViewerJoint* mSkeleton; - - //-------------------------------------------------------------------- - // Pelvis height adjustment members. - //-------------------------------------------------------------------- -public: - LLVector3 mBodySize; - S32 mLastSkeletonSerialNum; -private: - F32 mPelvisToFoot; - - //-------------------------------------------------------------------- - // Cached pointers to well known joints - //-------------------------------------------------------------------- -public: - LLViewerJoint* mPelvisp; - LLViewerJoint* mTorsop; - LLViewerJoint* mChestp; - LLViewerJoint* mNeckp; - LLViewerJoint* mHeadp; - LLViewerJoint* mSkullp; - LLViewerJoint* mEyeLeftp; - LLViewerJoint* mEyeRightp; - LLViewerJoint* mHipLeftp; - LLViewerJoint* mHipRightp; - LLViewerJoint* mKneeLeftp; - LLViewerJoint* mKneeRightp; - LLViewerJoint* mAnkleLeftp; - LLViewerJoint* mAnkleRightp; - LLViewerJoint* mFootLeftp; - LLViewerJoint* mFootRightp; - LLViewerJoint* mWristLeftp; - LLViewerJoint* mWristRightp; - - //-------------------------------------------------------------------- - // XML parse tree - //-------------------------------------------------------------------- -private: - static LLXmlTree sXMLTree; // avatar config file - static LLXmlTree sSkeletonXMLTree; // avatar skeleton file - -/** Skeleton - ** ** - *******************************************************************************/ - -/******************************************************************************** - ** ** - ** RENDERING - **/ - -public: - U32 renderImpostor(LLColor4U color = LLColor4U(255,255,255,255), S32 diffuse_channel = 0); - U32 renderRigid(); - U32 renderSkinned(EAvatarRenderPass pass); - F32 getLastSkinTime() { return mLastSkinTime; } - U32 renderSkinnedAttachments(); - U32 renderTransparent(BOOL first_pass); - void renderCollisionVolumes(); - static void deleteCachedImages(bool clearAll=true); - static void destroyGL(); - static void restoreGL(); - BOOL mIsDummy; // for special views - S32 mSpecialRenderMode; // special lighting -private: - bool shouldAlphaMask(); - - BOOL mNeedsSkin; // avatar has been animated and verts have not been updated - F32 mLastSkinTime; //value of gFrameTimeSeconds at last skin update - - S32 mUpdatePeriod; - S32 mNumInitFaces; //number of faces generated when creating the avatar drawable, does not inculde splitted faces due to long vertex buffer. - - //-------------------------------------------------------------------- - // Morph masks - //-------------------------------------------------------------------- -public: - BOOL morphMaskNeedsUpdate(LLVOAvatarDefines::EBakedTextureIndex index = LLVOAvatarDefines::BAKED_NUM_INDICES); - void addMaskedMorph(LLVOAvatarDefines::EBakedTextureIndex index, LLPolyMorphTarget* morph_target, BOOL invert, std::string layer); - void applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components, LLVOAvatarDefines::EBakedTextureIndex index = LLVOAvatarDefines::BAKED_NUM_INDICES); - - //-------------------------------------------------------------------- - // Visibility - //-------------------------------------------------------------------- -protected: - void updateVisibility(); -private: - U32 mVisibilityRank; - BOOL mVisible; - - //-------------------------------------------------------------------- - // Shadowing - //-------------------------------------------------------------------- -public: - void updateShadowFaces(); - LLDrawable* mShadow; -private: - LLFace* mShadow0Facep; - LLFace* mShadow1Facep; - LLPointer<LLViewerTexture> mShadowImagep; - - //-------------------------------------------------------------------- - // Impostors - //-------------------------------------------------------------------- -public: - BOOL isImpostor() const; - BOOL needsImpostorUpdate() const; - const LLVector3& getImpostorOffset() const; - const LLVector2& getImpostorDim() const; - void getImpostorValues(LLVector4a* extents, LLVector3& angle, F32& distance) const; - void cacheImpostorValues(); - void setImpostorDim(const LLVector2& dim); - static void resetImpostors(); - static void updateImpostors(); - LLRenderTarget mImpostor; - BOOL mNeedsImpostorUpdate; -private: - LLVector3 mImpostorOffset; - LLVector2 mImpostorDim; - BOOL mNeedsAnimUpdate; - LLVector3 mImpostorAngle; - F32 mImpostorDistance; - F32 mImpostorPixelArea; - LLVector3 mLastAnimExtents[2]; - - //-------------------------------------------------------------------- - // Wind rippling in clothes - //-------------------------------------------------------------------- -public: - LLVector4 mWindVec; - F32 mRipplePhase; - BOOL mBelowWater; -private: - F32 mWindFreq; - LLFrameTimer mRippleTimer; - F32 mRippleTimeLast; - LLVector3 mRippleAccel; - LLVector3 mLastVel; - - //-------------------------------------------------------------------- - // Culling - //-------------------------------------------------------------------- -public: - static void cullAvatarsByPixelArea(); - BOOL isCulled() const { return mCulled; } -private: - BOOL mCulled; - - //-------------------------------------------------------------------- - // Freeze counter - //-------------------------------------------------------------------- -public: - static void updateFreezeCounter(S32 counter = 0); -private: - static S32 sFreezeCounter; - - //-------------------------------------------------------------------- - // Constants - //-------------------------------------------------------------------- -public: - virtual LLViewerTexture::EBoostLevel getAvatarBoostLevel() const { return LLViewerTexture::BOOST_AVATAR; } - virtual LLViewerTexture::EBoostLevel getAvatarBakedBoostLevel() const { return LLViewerTexture::BOOST_AVATAR_BAKED; } - virtual S32 getTexImageSize() const; - virtual S32 getTexImageArea() const { return getTexImageSize()*getTexImageSize(); } - -/** Rendering - ** ** - *******************************************************************************/ - -/******************************************************************************** - ** ** - ** TEXTURES - **/ - - //-------------------------------------------------------------------- - // Loading status - //-------------------------------------------------------------------- -public: - virtual BOOL isTextureDefined(LLVOAvatarDefines::ETextureIndex type, U32 index = 0) const; - virtual BOOL isTextureVisible(LLVOAvatarDefines::ETextureIndex type, U32 index = 0) const; - virtual BOOL isTextureVisible(LLVOAvatarDefines::ETextureIndex type, LLWearable *wearable) const; - -protected: - BOOL isFullyBaked(); - static BOOL areAllNearbyInstancesBaked(S32& grey_avatars); - - //-------------------------------------------------------------------- - // Baked textures - //-------------------------------------------------------------------- -public: - void releaseComponentTextures(); // ! BACKWARDS COMPATIBILITY ! -protected: - static void onBakedTextureMasksLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata); - static void onInitialBakedTextureLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata); - static void onBakedTextureLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata); - virtual void removeMissingBakedTextures(); - void useBakedTexture(const LLUUID& id); - - typedef std::deque<LLMaskedMorph *> morph_list_t; - struct BakedTextureData - { - LLUUID mLastTextureIndex; - LLTexLayerSet* mTexLayerSet; // Only exists for self - bool mIsLoaded; - bool mIsUsed; - LLVOAvatarDefines::ETextureIndex mTextureIndex; - U32 mMaskTexName; - // Stores pointers to the joint meshes that this baked texture deals with - std::vector< LLViewerJointMesh * > mMeshes; // std::vector<LLViewerJointMesh> mJoints[i]->mMeshParts - morph_list_t mMaskedMorphs; - }; - typedef std::vector<BakedTextureData> bakedtexturedata_vec_t; - bakedtexturedata_vec_t mBakedTextureDatas; - LLLoadedCallbackEntry::source_callback_list_t mCallbackTextureList ; - BOOL mLoadedCallbacksPaused; - //-------------------------------------------------------------------- - // Local Textures - //-------------------------------------------------------------------- -protected: - virtual void setLocalTexture(LLVOAvatarDefines::ETextureIndex type, LLViewerTexture* tex, BOOL baked_version_exits, U32 index = 0); - virtual void addLocalTextureStats(LLVOAvatarDefines::ETextureIndex type, LLViewerFetchedTexture* imagep, F32 texel_area_ratio, BOOL rendered, BOOL covered_by_baked, U32 index = 0); - // MULTI-WEARABLE: make self-only? - virtual void setBakedReady(LLVOAvatarDefines::ETextureIndex type, BOOL baked_version_exists, U32 index = 0); - - //-------------------------------------------------------------------- - // Texture accessors - //-------------------------------------------------------------------- -private: - virtual void setImage(const U8 te, LLViewerTexture *imagep, const U32 index); - virtual LLViewerTexture* getImage(const U8 te, const U32 index) const; - - virtual const LLTextureEntry* getTexEntry(const U8 te_num) const; - virtual void setTexEntry(const U8 index, const LLTextureEntry &te); - - void checkTextureLoading() ; - //-------------------------------------------------------------------- - // Layers - //-------------------------------------------------------------------- -protected: - void deleteLayerSetCaches(bool clearAll = true); - void addBakedTextureStats(LLViewerFetchedTexture* imagep, F32 pixel_area, F32 texel_area_ratio, S32 boost_level); - - //-------------------------------------------------------------------- - // Composites - //-------------------------------------------------------------------- -public: - virtual void invalidateComposite(LLTexLayerSet* layerset, BOOL upload_result); - virtual void invalidateAll(); - virtual void setCompositeUpdatesEnabled(bool b) {} - virtual void setCompositeUpdatesEnabled(U32 index, bool b) {} - virtual bool isCompositeUpdateEnabled(U32 index) { return false; } - - //-------------------------------------------------------------------- - // Static texture/mesh/baked dictionary - //-------------------------------------------------------------------- -public: - static BOOL isIndexLocalTexture(LLVOAvatarDefines::ETextureIndex i); - static BOOL isIndexBakedTexture(LLVOAvatarDefines::ETextureIndex i); -private: - static const LLVOAvatarDefines::LLVOAvatarDictionary *getDictionary() { return sAvatarDictionary; } - static LLVOAvatarDefines::LLVOAvatarDictionary* sAvatarDictionary; - static LLVOAvatarSkeletonInfo* sAvatarSkeletonInfo; - static LLVOAvatarXmlInfo* sAvatarXmlInfo; - - //-------------------------------------------------------------------- - // Messaging - //-------------------------------------------------------------------- -public: - void onFirstTEMessageReceived(); -private: - BOOL mFirstTEMessageReceived; - BOOL mFirstAppearanceMessageReceived; - -/** Textures - ** ** - *******************************************************************************/ - -/******************************************************************************** - ** ** - ** MESHES - **/ - -public: - void updateMeshTextures(); - void updateSexDependentLayerSets(BOOL upload_bake); - void dirtyMesh(); // Dirty the avatar mesh - void updateMeshData(); -protected: - void releaseMeshData(); - virtual void restoreMeshData(); -private: - void dirtyMesh(S32 priority); // Dirty the avatar mesh, with priority - S32 mDirtyMesh; // 0 -- not dirty, 1 -- morphed, 2 -- LOD - BOOL mMeshTexturesDirty; - - typedef std::multimap<std::string, LLPolyMesh*> polymesh_map_t; - polymesh_map_t mMeshes; - std::vector<LLViewerJoint *> mMeshLOD; - - //-------------------------------------------------------------------- - // Destroy invisible mesh - //-------------------------------------------------------------------- -protected: - BOOL mMeshValid; - LLFrameTimer mMeshInvisibleTime; - -/** Meshes - ** ** - *******************************************************************************/ - -/******************************************************************************** - ** ** - ** APPEARANCE - **/ - -public: - void processAvatarAppearance(LLMessageSystem* mesgsys); - void hideSkirt(); - void startAppearanceAnimation(); - - //-------------------------------------------------------------------- - // Appearance morphing - //-------------------------------------------------------------------- -public: - BOOL getIsAppearanceAnimating() const { return mAppearanceAnimating; } -private: - BOOL mAppearanceAnimating; - LLFrameTimer mAppearanceMorphTimer; - F32 mLastAppearanceBlendTime; - - //-------------------------------------------------------------------- - // Clothing colors (convenience functions to access visual parameters) - //-------------------------------------------------------------------- -public: - void setClothesColor(LLVOAvatarDefines::ETextureIndex te, const LLColor4& new_color, BOOL upload_bake); - LLColor4 getClothesColor(LLVOAvatarDefines::ETextureIndex te); - static BOOL teToColorParams(LLVOAvatarDefines::ETextureIndex te, U32 *param_name); - - //-------------------------------------------------------------------- - // Global colors - //-------------------------------------------------------------------- -public: - LLColor4 getGlobalColor(const std::string& color_name ) const; - void onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL upload_bake); -private: - LLTexGlobalColor* mTexSkinColor; - LLTexGlobalColor* mTexHairColor; - LLTexGlobalColor* mTexEyeColor; - - //-------------------------------------------------------------------- - // Visibility - //-------------------------------------------------------------------- -public: - BOOL isVisible() const; - void setVisibilityRank(U32 rank); - U32 getVisibilityRank() const { return mVisibilityRank; } // unused - static S32 sNumVisibleAvatars; // Number of instances of this class - static LLColor4 getDummyColor(); -/** Appearance - ** ** - *******************************************************************************/ - -/******************************************************************************** - ** ** - ** WEARABLES - **/ - -public: - virtual BOOL isWearingWearableType(LLWearableType::EType type ) const; - - //-------------------------------------------------------------------- - // Attachments - //-------------------------------------------------------------------- -public: - void clampAttachmentPositions(); - virtual const LLViewerJointAttachment* attachObject(LLViewerObject *viewer_object); - virtual BOOL detachObject(LLViewerObject *viewer_object); - void cleanupAttachedMesh( LLViewerObject* pVO ); - static LLVOAvatar* findAvatarFromAttachment(LLViewerObject* obj); -protected: - LLViewerJointAttachment* getTargetAttachmentPoint(LLViewerObject* viewer_object); - void lazyAttach(); - void rebuildRiggedAttachments( void ); - - //-------------------------------------------------------------------- - // Map of attachment points, by ID - //-------------------------------------------------------------------- -public: - S32 getAttachmentCount(); // Warning: order(N) not order(1) // currently used only by -self - typedef std::map<S32, LLViewerJointAttachment*> attachment_map_t; - attachment_map_t mAttachmentPoints; - std::vector<LLPointer<LLViewerObject> > mPendingAttachment; - - //-------------------------------------------------------------------- - // HUD functions - //-------------------------------------------------------------------- -public: - BOOL hasHUDAttachment() const; - LLBBox getHUDBBox() const; - void rebuildHUD(); - void resetHUDAttachments(); - BOOL canAttachMoreObjects() const; - BOOL canAttachMoreObjects(U32 n) const; -protected: - U32 getNumAttachments() const; // O(N), not O(1) - -/** Wearables - ** ** - *******************************************************************************/ - -/******************************************************************************** - ** ** - ** ACTIONS - **/ - - //-------------------------------------------------------------------- - // Animations - //-------------------------------------------------------------------- -public: - BOOL isAnyAnimationSignaled(const LLUUID *anim_array, const S32 num_anims) const; - void processAnimationStateChanges(); -protected: - BOOL processSingleAnimationStateChange(const LLUUID &anim_id, BOOL start); - void resetAnimations(); -private: - LLTimer mAnimTimer; - F32 mTimeLast; - - //-------------------------------------------------------------------- - // Animation state data - //-------------------------------------------------------------------- -public: - typedef std::map<LLUUID, S32>::iterator AnimIterator; - std::map<LLUUID, S32> mSignaledAnimations; // requested state of Animation name/value - std::map<LLUUID, S32> mPlayingAnimations; // current state of Animation name/value - - typedef std::multimap<LLUUID, LLUUID> AnimationSourceMap; - typedef AnimationSourceMap::iterator AnimSourceIterator; - AnimationSourceMap mAnimationSources; // object ids that triggered anim ids - - //-------------------------------------------------------------------- - // Chat - //-------------------------------------------------------------------- -public: - void addChat(const LLChat& chat); - void clearChat(); - void startTyping() { mTyping = TRUE; mTypingTimer.reset(); } - void stopTyping() { mTyping = FALSE; } -private: - BOOL mVisibleChat; - - //-------------------------------------------------------------------- - // Lip synch morphs - //-------------------------------------------------------------------- -private: - bool mLipSyncActive; // we're morphing for lip sync - LLVisualParam* mOohMorph; // cached pointers morphs for lip sync - LLVisualParam* mAahMorph; // cached pointers morphs for lip sync - - //-------------------------------------------------------------------- - // Flight - //-------------------------------------------------------------------- -public: - BOOL mInAir; - LLFrameTimer mTimeInAir; - -/** Actions - ** ** - *******************************************************************************/ - -/******************************************************************************** - ** ** - ** PHYSICS - **/ - -private: - F32 mSpeedAccum; // measures speed (for diagnostics mostly). - BOOL mTurning; // controls hysteresis on avatar rotation - F32 mSpeed; // misc. animation repeated state - - //-------------------------------------------------------------------- - // Collision volumes - //-------------------------------------------------------------------- -public: - S32 mNumCollisionVolumes; - LLViewerJointCollisionVolume* mCollisionVolumes; -protected: - BOOL allocateCollisionVolumes(U32 num); - - //-------------------------------------------------------------------- - // Dimensions - //-------------------------------------------------------------------- -public: - void resolveHeightGlobal(const LLVector3d &inPos, LLVector3d &outPos, LLVector3 &outNorm); - bool distanceToGround( const LLVector3d &startPoint, LLVector3d &collisionPoint, F32 distToIntersectionAlongRay ); - void resolveHeightAgent(const LLVector3 &inPos, LLVector3 &outPos, LLVector3 &outNorm); - void resolveRayCollisionAgent(const LLVector3d start_pt, const LLVector3d end_pt, LLVector3d &out_pos, LLVector3 &out_norm); - void slamPosition(); // Slam position to transmitted position (for teleport); -protected: - void computeBodySize(); - - //-------------------------------------------------------------------- - // Material being stepped on - //-------------------------------------------------------------------- -private: - BOOL mStepOnLand; - U8 mStepMaterial; - LLVector3 mStepObjectVelocity; - -/** Physics - ** ** - *******************************************************************************/ - -/******************************************************************************** - ** ** - ** HIERARCHY - **/ - -public: - virtual BOOL setParent(LLViewerObject* parent); - virtual void addChild(LLViewerObject *childp); - virtual void removeChild(LLViewerObject *childp); - - //-------------------------------------------------------------------- - // Sitting - //-------------------------------------------------------------------- -public: - void sitDown(BOOL bSitting); - BOOL isSitting(){return mIsSitting;} - void sitOnObject(LLViewerObject *sit_object); - void getOffObject(); -private: - // set this property only with LLVOAvatar::sitDown method - BOOL mIsSitting; - -/** Hierarchy - ** ** - *******************************************************************************/ - -/******************************************************************************** - ** ** - ** NAME - **/ - -public: - std::string getFullname() const; // Returns "FirstName LastName" -protected: - static void getAnimLabels(LLDynamicArray<std::string>* labels); - static void getAnimNames(LLDynamicArray<std::string>* names); -private: - std::string mNameString; // UTF-8 title + name + status - std::string mTitle; - bool mNameAway; - bool mNameBusy; - bool mNameMute; - bool mNameAppearance; - bool mNameFriend; - bool mNameCloud; - F32 mNameAlpha; - BOOL mRenderGroupTitles; - - //-------------------------------------------------------------------- - // Display the name (then optionally fade it out) - //-------------------------------------------------------------------- -public: - LLFrameTimer mChatTimer; - LLPointer<LLHUDNameTag> mNameText; -private: - LLFrameTimer mTimeVisible; - std::deque<LLChat> mChats; - BOOL mTyping; - LLFrameTimer mTypingTimer; - -/** Name - ** ** - *******************************************************************************/ - -/******************************************************************************** - ** ** - ** SOUNDS - **/ - - //-------------------------------------------------------------------- - // Voice visualizer - //-------------------------------------------------------------------- -public: - // Responsible for detecting the user's voice signal (and when the - // user speaks, it puts a voice symbol over the avatar's head) and gesticulations - LLPointer<LLVoiceVisualizer> mVoiceVisualizer; - int mCurrentGesticulationLevel; - - //-------------------------------------------------------------------- - // Step sound - //-------------------------------------------------------------------- -protected: - const LLUUID& getStepSound() const; -private: - // Global table of sound ids per material, and the ground - const static LLUUID sStepSounds[LL_MCODE_END]; - const static LLUUID sStepSoundOnLand; - - //-------------------------------------------------------------------- - // Foot step state (for generating sounds) - //-------------------------------------------------------------------- -public: - void setFootPlane(const LLVector4 &plane) { mFootPlane = plane; } - LLVector4 mFootPlane; -private: - BOOL mWasOnGroundLeft; - BOOL mWasOnGroundRight; - -/** Sounds - ** ** - *******************************************************************************/ - -/******************************************************************************** - ** ** - ** DIAGNOSTICS - **/ - - //-------------------------------------------------------------------- - // General - //-------------------------------------------------------------------- -public: - static void dumpArchetypeXML(void*); - static void dumpBakedStatus(); - const std::string getBakedStatusForPrintout() const; - void dumpAvatarTEs(const std::string& context) const; - - static F32 sUnbakedTime; // Total seconds with >=1 unbaked avatars - static F32 sUnbakedUpdateTime; // Last time stats were updated (to prevent multiple updates per frame) - static F32 sGreyTime; // Total seconds with >=1 grey avatars - static F32 sGreyUpdateTime; // Last time stats were updated (to prevent multiple updates per frame) -protected: - S32 getUnbakedPixelAreaRank(); - BOOL mHasGrey; -private: - F32 mMinPixelArea; - F32 mMaxPixelArea; - F32 mAdjustedPixelArea; - std::string mDebugText; - - - //-------------------------------------------------------------------- - // Avatar Rez Metrics - //-------------------------------------------------------------------- -public: - F32 debugGetExistenceTimeElapsedF32() const { return mDebugExistenceTimer.getElapsedTimeF32(); } -protected: - LLFrameTimer mRuthDebugTimer; // For tracking how long it takes for av to rez - LLFrameTimer mDebugExistenceTimer; // Debugging for how long the avatar has been in memory. - -/** Diagnostics - ** ** - *******************************************************************************/ - -/******************************************************************************** - ** ** - ** SUPPORT CLASSES - **/ - -protected: // Shared with LLVOAvatarSelf - - struct LLVOAvatarXmlInfo - { - LLVOAvatarXmlInfo(); - ~LLVOAvatarXmlInfo(); - - BOOL parseXmlSkeletonNode(LLXmlTreeNode* root); - BOOL parseXmlMeshNodes(LLXmlTreeNode* root); - BOOL parseXmlColorNodes(LLXmlTreeNode* root); - BOOL parseXmlLayerNodes(LLXmlTreeNode* root); - BOOL parseXmlDriverNodes(LLXmlTreeNode* root); - BOOL parseXmlMorphNodes(LLXmlTreeNode* root); - - struct LLVOAvatarMeshInfo - { - typedef std::pair<LLPolyMorphTargetInfo*,BOOL> morph_info_pair_t; - typedef std::vector<morph_info_pair_t> morph_info_list_t; - - LLVOAvatarMeshInfo() : mLOD(0), mMinPixelArea(.1f) {} - ~LLVOAvatarMeshInfo() - { - morph_info_list_t::iterator iter; - for (iter = mPolyMorphTargetInfoList.begin(); iter != mPolyMorphTargetInfoList.end(); iter++) - { - delete iter->first; - } - mPolyMorphTargetInfoList.clear(); - } - - std::string mType; - S32 mLOD; - std::string mMeshFileName; - std::string mReferenceMeshName; - F32 mMinPixelArea; - morph_info_list_t mPolyMorphTargetInfoList; - }; - typedef std::vector<LLVOAvatarMeshInfo*> mesh_info_list_t; - mesh_info_list_t mMeshInfoList; - - typedef std::vector<LLPolySkeletalDistortionInfo*> skeletal_distortion_info_list_t; - skeletal_distortion_info_list_t mSkeletalDistortionInfoList; - - struct LLVOAvatarAttachmentInfo - { - LLVOAvatarAttachmentInfo() - : mGroup(-1), mAttachmentID(-1), mPieMenuSlice(-1), mVisibleFirstPerson(FALSE), - mIsHUDAttachment(FALSE), mHasPosition(FALSE), mHasRotation(FALSE) {} - std::string mName; - std::string mJointName; - LLVector3 mPosition; - LLVector3 mRotationEuler; - S32 mGroup; - S32 mAttachmentID; - S32 mPieMenuSlice; - BOOL mVisibleFirstPerson; - BOOL mIsHUDAttachment; - BOOL mHasPosition; - BOOL mHasRotation; - }; - typedef std::vector<LLVOAvatarAttachmentInfo*> attachment_info_list_t; - attachment_info_list_t mAttachmentInfoList; - - LLTexGlobalColorInfo *mTexSkinColorInfo; - LLTexGlobalColorInfo *mTexHairColorInfo; - LLTexGlobalColorInfo *mTexEyeColorInfo; - - typedef std::vector<LLTexLayerSetInfo*> layer_info_list_t; - layer_info_list_t mLayerInfoList; - - typedef std::vector<LLDriverParamInfo*> driver_info_list_t; - driver_info_list_t mDriverInfoList; - - struct LLVOAvatarMorphInfo - { - LLVOAvatarMorphInfo() - : mInvert(FALSE) {} - std::string mName; - std::string mRegion; - std::string mLayer; - BOOL mInvert; - }; - - typedef std::vector<LLVOAvatarMorphInfo*> morph_info_list_t; - morph_info_list_t mMorphMaskInfoList; - }; - - struct LLMaskedMorph - { - LLMaskedMorph(LLPolyMorphTarget *morph_target, BOOL invert, std::string layer) : - mMorphTarget(morph_target), - mInvert(invert), - mLayer(layer) - { - morph_target->addPendingMorphMask(); - } - - LLPolyMorphTarget *mMorphTarget; - BOOL mInvert; - std::string mLayer; - }; - -/** Support classes - ** ** - *******************************************************************************/ - -}; // LLVOAvatar -extern const F32 SELF_ADDITIONAL_PRI; -extern const S32 MAX_TEXTURE_VIRTURE_SIZE_RESET_INTERVAL; - -#endif // LL_VO_AVATAR_H +/** + * @file llvoavatar.h + * @brief Declaration of LLVOAvatar class which is a derivation of + * LLViewerObject + * + * $LicenseInfo:firstyear=2001&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#ifndef LL_LLVOAVATAR_H +#define LL_LLVOAVATAR_H + +#include <map> +#include <deque> +#include <string> +#include <vector> + +#include <boost/signals2.hpp> + +#include "imageids.h" // IMG_INVISIBLE +#include "llchat.h" +#include "lldrawpoolalpha.h" +#include "llviewerobject.h" +#include "llcharacter.h" +#include "llviewerjointmesh.h" +#include "llviewerjointattachment.h" +#include "llrendertarget.h" +#include "llvoavatardefines.h" +#include "lltexglobalcolor.h" +#include "lldriverparam.h" +#include "material_codes.h" // LL_MCODE_END + +extern const LLUUID ANIM_AGENT_BODY_NOISE; +extern const LLUUID ANIM_AGENT_BREATHE_ROT; +extern const LLUUID ANIM_AGENT_PHYSICS_MOTION; +extern const LLUUID ANIM_AGENT_EDITING; +extern const LLUUID ANIM_AGENT_EYE; +extern const LLUUID ANIM_AGENT_FLY_ADJUST; +extern const LLUUID ANIM_AGENT_HAND_MOTION; +extern const LLUUID ANIM_AGENT_HEAD_ROT; +extern const LLUUID ANIM_AGENT_PELVIS_FIX; +extern const LLUUID ANIM_AGENT_TARGET; +extern const LLUUID ANIM_AGENT_WALK_ADJUST; + +class LLTexLayerSet; +class LLVoiceVisualizer; +class LLHUDNameTag; +class LLHUDEffectSpiral; +class LLTexGlobalColor; +class LLVOAvatarBoneInfo; +class LLVOAvatarSkeletonInfo; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// LLVOAvatar +// +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLVOAvatar : + public LLViewerObject, + public LLCharacter, + public boost::signals2::trackable +{ +public: + friend class LLVOAvatarSelf; +protected: + struct LLVOAvatarXmlInfo; + struct LLMaskedMorph; + +/******************************************************************************** + ** ** + ** INITIALIZATION + **/ + +public: + LLVOAvatar(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp); + virtual void markDead(); + static void initClass(); // Initialize data that's only init'd once per class. + static void cleanupClass(); // Cleanup data that's only init'd once per class. + virtual void initInstance(); // Called after construction to initialize the class. +protected: + virtual ~LLVOAvatar(); + BOOL loadSkeletonNode(); + BOOL loadMeshNodes(); + virtual BOOL loadLayersets(); + +/** Initialization + ** ** + *******************************************************************************/ + +/******************************************************************************** + ** ** + ** INHERITED + **/ + + //-------------------------------------------------------------------- + // LLViewerObject interface and related + //-------------------------------------------------------------------- +public: + virtual void updateGL(); + virtual LLVOAvatar* asAvatar(); + virtual U32 processUpdateMessage(LLMessageSystem *mesgsys, + void **user_data, + U32 block_num, + const EObjectUpdateType update_type, + LLDataPacker *dp); + virtual BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); + virtual BOOL updateLOD(); + BOOL updateJointLODs(); + void updateLODRiggedAttachments( void ); + virtual BOOL isActive() const; // Whether this object needs to do an idleUpdate. + virtual void updateTextures(); + virtual S32 setTETexture(const U8 te, const LLUUID& uuid); // If setting a baked texture, need to request it from a non-local sim. + virtual void onShift(const LLVector4a& shift_vector); + virtual U32 getPartitionType() const; + virtual const LLVector3 getRenderPosition() const; + virtual void updateDrawable(BOOL force_damped); + virtual LLDrawable* createDrawable(LLPipeline *pipeline); + virtual BOOL updateGeometry(LLDrawable *drawable); + virtual void setPixelAreaAndAngle(LLAgent &agent); + virtual void updateRegion(LLViewerRegion *regionp); + virtual void updateSpatialExtents(LLVector4a& newMin, LLVector4a &newMax); + virtual void getSpatialExtents(LLVector4a& newMin, LLVector4a& newMax); + virtual BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end, + S32 face = -1, // which face to check, -1 = ALL_SIDES + BOOL pick_transparent = FALSE, + S32* face_hit = NULL, // which face was hit + LLVector3* intersection = NULL, // return the intersection point + LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point + LLVector3* normal = NULL, // return the surface normal at the intersection point + LLVector3* bi_normal = NULL); // return the surface bi-normal at the intersection point + + //-------------------------------------------------------------------- + // LLCharacter interface and related + //-------------------------------------------------------------------- +public: + virtual LLVector3 getCharacterPosition(); + virtual LLQuaternion getCharacterRotation(); + virtual LLVector3 getCharacterVelocity(); + virtual LLVector3 getCharacterAngularVelocity(); + virtual LLJoint* getCharacterJoint(U32 num); + virtual BOOL allocateCharacterJoints(U32 num); + + virtual LLUUID remapMotionID(const LLUUID& id); + virtual BOOL startMotion(const LLUUID& id, F32 time_offset = 0.f); + virtual BOOL stopMotion(const LLUUID& id, BOOL stop_immediate = FALSE); + virtual void stopMotionFromSource(const LLUUID& source_id); + virtual void requestStopMotion(LLMotion* motion); + LLMotion* findMotion(const LLUUID& id) const; + void startDefaultMotions(); + void dumpAnimationState(); + + virtual LLJoint* getJoint(const std::string &name); + virtual LLJoint* getRootJoint() { return &mRoot; } + + void resetJointPositions( void ); + void resetJointPositionsToDefault( void ); + void resetSpecificJointPosition( const std::string& name ); + + virtual const char* getAnimationPrefix() { return "avatar"; } + virtual const LLUUID& getID(); + virtual LLVector3 getVolumePos(S32 joint_index, LLVector3& volume_offset); + virtual LLJoint* findCollisionVolume(U32 volume_id); + virtual S32 getCollisionVolumeID(std::string &name); + virtual void addDebugText(const std::string& text); + virtual F32 getTimeDilation(); + virtual void getGround(const LLVector3 &inPos, LLVector3 &outPos, LLVector3 &outNorm); + virtual F32 getPixelArea() const; + virtual LLPolyMesh* getHeadMesh(); + virtual LLPolyMesh* getUpperBodyMesh(); + virtual LLVector3d getPosGlobalFromAgent(const LLVector3 &position); + virtual LLVector3 getPosAgentFromGlobal(const LLVector3d &position); + virtual void updateVisualParams(); + + +/** Inherited + ** ** + *******************************************************************************/ + +/******************************************************************************** + ** ** + ** STATE + **/ + +public: + virtual bool isSelf() const { return false; } // True if this avatar is for this viewer's agent + bool isBuilt() const { return mIsBuilt; } + +private: //aligned members + LLVector4a mImpostorExtents[2]; + +private: + BOOL mSupportsAlphaLayers; // For backwards compatibility, TRUE for 1.23+ clients + + //-------------------------------------------------------------------- + // Updates + //-------------------------------------------------------------------- +public: + virtual BOOL updateCharacter(LLAgent &agent); + void idleUpdateVoiceVisualizer(bool voice_enabled); + void idleUpdateMisc(bool detailed_update); + virtual void idleUpdateAppearanceAnimation(); + void idleUpdateLipSync(bool voice_enabled); + void idleUpdateLoadingEffect(); + void idleUpdateWindEffect(); + void idleUpdateNameTag(const LLVector3& root_pos_last); + void idleUpdateNameTagText(BOOL new_name); + LLVector3 idleUpdateNameTagPosition(const LLVector3& root_pos_last); + void idleUpdateNameTagAlpha(BOOL new_name, F32 alpha); + LLColor4 getNameTagColor(bool is_friend); + void clearNameTag(); + static void invalidateNameTag(const LLUUID& agent_id); + // force all name tags to rebuild, useful when display names turned on/off + static void invalidateNameTags(); + void addNameTagLine(const std::string& line, const LLColor4& color, S32 style, const LLFontGL* font); + void idleUpdateRenderCost(); + void idleUpdateBelowWater(); + + //-------------------------------------------------------------------- + // Static preferences (controlled by user settings/menus) + //-------------------------------------------------------------------- +public: + static S32 sRenderName; + static BOOL sRenderGroupTitles; + static U32 sMaxVisible; //(affected by control "RenderAvatarMaxVisible") + static F32 sRenderDistance; //distance at which avatars will render. + static BOOL sShowAnimationDebug; // show animation debug info + static BOOL sUseImpostors; //use impostors for far away avatars + static BOOL sShowFootPlane; // show foot collision plane reported by server + static BOOL sShowCollisionVolumes; // show skeletal collision volumes + static BOOL sVisibleInFirstPerson; + static S32 sNumLODChangesThisFrame; + static S32 sNumVisibleChatBubbles; + static BOOL sDebugInvisible; + static BOOL sShowAttachmentPoints; + static F32 sLODFactor; // user-settable LOD factor + static F32 sPhysicsLODFactor; // user-settable physics LOD factor + static BOOL sJointDebug; // output total number of joints being touched for each avatar + static BOOL sDebugAvatarRotation; + + //-------------------------------------------------------------------- + // Region state + //-------------------------------------------------------------------- +public: + LLHost getObjectHost() const; + + //-------------------------------------------------------------------- + // Loading state + //-------------------------------------------------------------------- +public: + BOOL isFullyLoaded() const; + bool visualParamWeightsAreDefault(); +protected: + virtual BOOL getIsCloud(); + BOOL updateIsFullyLoaded(); + BOOL processFullyLoadedChange(bool loading); + void updateRuthTimer(bool loading); + F32 calcMorphAmount(); +private: + BOOL mFullyLoaded; + BOOL mPreviousFullyLoaded; + BOOL mFullyLoadedInitialized; + S32 mFullyLoadedFrameCounter; + LLFrameTimer mFullyLoadedTimer; + LLFrameTimer mRuthTimer; +protected: + LLFrameTimer mInvisibleTimer; + +/** State + ** ** + *******************************************************************************/ + +/******************************************************************************** + ** ** + ** SKELETON + **/ + +public: + void updateHeadOffset(); + F32 getPelvisToFoot() const { return mPelvisToFoot; } + void setPelvisOffset( bool hasOffset, const LLVector3& translation, F32 offset ) ; + bool hasPelvisOffset( void ) { return mHasPelvisOffset; } + void postPelvisSetRecalc( void ); + void setPelvisOffset( F32 pelvixFixupAmount ); + + bool mHasPelvisOffset; + LLVector3 mPelvisOffset; + F32 mLastPelvisToFoot; + F32 mPelvisFixup; + F32 mLastPelvisFixup; + + LLVector3 mHeadOffset; // current head position + LLViewerJoint mRoot; +protected: + static BOOL parseSkeletonFile(const std::string& filename); + void buildCharacter(); + virtual BOOL loadAvatar(); + + BOOL setupBone(const LLVOAvatarBoneInfo* info, LLViewerJoint* parent, S32 ¤t_volume_num, S32 ¤t_joint_num); + BOOL buildSkeleton(const LLVOAvatarSkeletonInfo *info); +private: + BOOL mIsBuilt; // state of deferred character building + S32 mNumJoints; + LLViewerJoint* mSkeleton; + + //-------------------------------------------------------------------- + // Pelvis height adjustment members. + //-------------------------------------------------------------------- +public: + LLVector3 mBodySize; + S32 mLastSkeletonSerialNum; +private: + F32 mPelvisToFoot; + + //-------------------------------------------------------------------- + // Cached pointers to well known joints + //-------------------------------------------------------------------- +public: + LLViewerJoint* mPelvisp; + LLViewerJoint* mTorsop; + LLViewerJoint* mChestp; + LLViewerJoint* mNeckp; + LLViewerJoint* mHeadp; + LLViewerJoint* mSkullp; + LLViewerJoint* mEyeLeftp; + LLViewerJoint* mEyeRightp; + LLViewerJoint* mHipLeftp; + LLViewerJoint* mHipRightp; + LLViewerJoint* mKneeLeftp; + LLViewerJoint* mKneeRightp; + LLViewerJoint* mAnkleLeftp; + LLViewerJoint* mAnkleRightp; + LLViewerJoint* mFootLeftp; + LLViewerJoint* mFootRightp; + LLViewerJoint* mWristLeftp; + LLViewerJoint* mWristRightp; + + //-------------------------------------------------------------------- + // XML parse tree + //-------------------------------------------------------------------- +private: + static LLXmlTree sXMLTree; // avatar config file + static LLXmlTree sSkeletonXMLTree; // avatar skeleton file + +/** Skeleton + ** ** + *******************************************************************************/ + +/******************************************************************************** + ** ** + ** RENDERING + **/ + +public: + U32 renderImpostor(LLColor4U color = LLColor4U(255,255,255,255), S32 diffuse_channel = 0); + U32 renderRigid(); + U32 renderSkinned(EAvatarRenderPass pass); + F32 getLastSkinTime() { return mLastSkinTime; } + U32 renderSkinnedAttachments(); + U32 renderTransparent(BOOL first_pass); + void renderCollisionVolumes(); + static void deleteCachedImages(bool clearAll=true); + static void destroyGL(); + static void restoreGL(); + BOOL mIsDummy; // for special views + S32 mSpecialRenderMode; // special lighting +private: + bool shouldAlphaMask(); + + BOOL mNeedsSkin; // avatar has been animated and verts have not been updated + F32 mLastSkinTime; //value of gFrameTimeSeconds at last skin update + + S32 mUpdatePeriod; + S32 mNumInitFaces; //number of faces generated when creating the avatar drawable, does not inculde splitted faces due to long vertex buffer. + + //-------------------------------------------------------------------- + // Morph masks + //-------------------------------------------------------------------- +public: + BOOL morphMaskNeedsUpdate(LLVOAvatarDefines::EBakedTextureIndex index = LLVOAvatarDefines::BAKED_NUM_INDICES); + void addMaskedMorph(LLVOAvatarDefines::EBakedTextureIndex index, LLPolyMorphTarget* morph_target, BOOL invert, std::string layer); + void applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components, LLVOAvatarDefines::EBakedTextureIndex index = LLVOAvatarDefines::BAKED_NUM_INDICES); + + //-------------------------------------------------------------------- + // Visibility + //-------------------------------------------------------------------- +protected: + void updateVisibility(); +private: + U32 mVisibilityRank; + BOOL mVisible; + + //-------------------------------------------------------------------- + // Shadowing + //-------------------------------------------------------------------- +public: + void updateShadowFaces(); + LLDrawable* mShadow; +private: + LLFace* mShadow0Facep; + LLFace* mShadow1Facep; + LLPointer<LLViewerTexture> mShadowImagep; + + //-------------------------------------------------------------------- + // Impostors + //-------------------------------------------------------------------- +public: + BOOL isImpostor() const; + BOOL needsImpostorUpdate() const; + const LLVector3& getImpostorOffset() const; + const LLVector2& getImpostorDim() const; + void getImpostorValues(LLVector4a* extents, LLVector3& angle, F32& distance) const; + void cacheImpostorValues(); + void setImpostorDim(const LLVector2& dim); + static void resetImpostors(); + static void updateImpostors(); + LLRenderTarget mImpostor; + BOOL mNeedsImpostorUpdate; +private: + LLVector3 mImpostorOffset; + LLVector2 mImpostorDim; + BOOL mNeedsAnimUpdate; + LLVector3 mImpostorAngle; + F32 mImpostorDistance; + F32 mImpostorPixelArea; + LLVector3 mLastAnimExtents[2]; + + //-------------------------------------------------------------------- + // Wind rippling in clothes + //-------------------------------------------------------------------- +public: + LLVector4 mWindVec; + F32 mRipplePhase; + BOOL mBelowWater; +private: + F32 mWindFreq; + LLFrameTimer mRippleTimer; + F32 mRippleTimeLast; + LLVector3 mRippleAccel; + LLVector3 mLastVel; + + //-------------------------------------------------------------------- + // Culling + //-------------------------------------------------------------------- +public: + static void cullAvatarsByPixelArea(); + BOOL isCulled() const { return mCulled; } +private: + BOOL mCulled; + + //-------------------------------------------------------------------- + // Freeze counter + //-------------------------------------------------------------------- +public: + static void updateFreezeCounter(S32 counter = 0); +private: + static S32 sFreezeCounter; + + //-------------------------------------------------------------------- + // Constants + //-------------------------------------------------------------------- +public: + virtual LLViewerTexture::EBoostLevel getAvatarBoostLevel() const { return LLViewerTexture::BOOST_AVATAR; } + virtual LLViewerTexture::EBoostLevel getAvatarBakedBoostLevel() const { return LLViewerTexture::BOOST_AVATAR_BAKED; } + virtual S32 getTexImageSize() const; + virtual S32 getTexImageArea() const { return getTexImageSize()*getTexImageSize(); } + +/** Rendering + ** ** + *******************************************************************************/ + +/******************************************************************************** + ** ** + ** TEXTURES + **/ + + //-------------------------------------------------------------------- + // Loading status + //-------------------------------------------------------------------- +public: + virtual BOOL isTextureDefined(LLVOAvatarDefines::ETextureIndex type, U32 index = 0) const; + virtual BOOL isTextureVisible(LLVOAvatarDefines::ETextureIndex type, U32 index = 0) const; + virtual BOOL isTextureVisible(LLVOAvatarDefines::ETextureIndex type, LLWearable *wearable) const; + +protected: + BOOL isFullyBaked(); + static BOOL areAllNearbyInstancesBaked(S32& grey_avatars); + + //-------------------------------------------------------------------- + // Baked textures + //-------------------------------------------------------------------- +public: + void releaseComponentTextures(); // ! BACKWARDS COMPATIBILITY ! +protected: + static void onBakedTextureMasksLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata); + static void onInitialBakedTextureLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata); + static void onBakedTextureLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata); + virtual void removeMissingBakedTextures(); + void useBakedTexture(const LLUUID& id); + + typedef std::deque<LLMaskedMorph *> morph_list_t; + struct BakedTextureData + { + LLUUID mLastTextureIndex; + LLTexLayerSet* mTexLayerSet; // Only exists for self + bool mIsLoaded; + bool mIsUsed; + LLVOAvatarDefines::ETextureIndex mTextureIndex; + U32 mMaskTexName; + // Stores pointers to the joint meshes that this baked texture deals with + std::vector< LLViewerJointMesh * > mMeshes; // std::vector<LLViewerJointMesh> mJoints[i]->mMeshParts + morph_list_t mMaskedMorphs; + }; + typedef std::vector<BakedTextureData> bakedtexturedata_vec_t; + bakedtexturedata_vec_t mBakedTextureDatas; + LLLoadedCallbackEntry::source_callback_list_t mCallbackTextureList ; + BOOL mLoadedCallbacksPaused; + //-------------------------------------------------------------------- + // Local Textures + //-------------------------------------------------------------------- +protected: + virtual void setLocalTexture(LLVOAvatarDefines::ETextureIndex type, LLViewerTexture* tex, BOOL baked_version_exits, U32 index = 0); + virtual void addLocalTextureStats(LLVOAvatarDefines::ETextureIndex type, LLViewerFetchedTexture* imagep, F32 texel_area_ratio, BOOL rendered, BOOL covered_by_baked, U32 index = 0); + // MULTI-WEARABLE: make self-only? + virtual void setBakedReady(LLVOAvatarDefines::ETextureIndex type, BOOL baked_version_exists, U32 index = 0); + + //-------------------------------------------------------------------- + // Texture accessors + //-------------------------------------------------------------------- +private: + virtual void setImage(const U8 te, LLViewerTexture *imagep, const U32 index); + virtual LLViewerTexture* getImage(const U8 te, const U32 index) const; + + virtual const LLTextureEntry* getTexEntry(const U8 te_num) const; + virtual void setTexEntry(const U8 index, const LLTextureEntry &te); + + void checkTextureLoading() ; + //-------------------------------------------------------------------- + // Layers + //-------------------------------------------------------------------- +protected: + void deleteLayerSetCaches(bool clearAll = true); + void addBakedTextureStats(LLViewerFetchedTexture* imagep, F32 pixel_area, F32 texel_area_ratio, S32 boost_level); + + //-------------------------------------------------------------------- + // Composites + //-------------------------------------------------------------------- +public: + virtual void invalidateComposite(LLTexLayerSet* layerset, BOOL upload_result); + virtual void invalidateAll(); + virtual void setCompositeUpdatesEnabled(bool b) {} + virtual void setCompositeUpdatesEnabled(U32 index, bool b) {} + virtual bool isCompositeUpdateEnabled(U32 index) { return false; } + + //-------------------------------------------------------------------- + // Static texture/mesh/baked dictionary + //-------------------------------------------------------------------- +public: + static BOOL isIndexLocalTexture(LLVOAvatarDefines::ETextureIndex i); + static BOOL isIndexBakedTexture(LLVOAvatarDefines::ETextureIndex i); +private: + static const LLVOAvatarDefines::LLVOAvatarDictionary *getDictionary() { return sAvatarDictionary; } + static LLVOAvatarDefines::LLVOAvatarDictionary* sAvatarDictionary; + static LLVOAvatarSkeletonInfo* sAvatarSkeletonInfo; + static LLVOAvatarXmlInfo* sAvatarXmlInfo; + + //-------------------------------------------------------------------- + // Messaging + //-------------------------------------------------------------------- +public: + void onFirstTEMessageReceived(); +private: + BOOL mFirstTEMessageReceived; + BOOL mFirstAppearanceMessageReceived; + +/** Textures + ** ** + *******************************************************************************/ + +/******************************************************************************** + ** ** + ** MESHES + **/ + +public: + void updateMeshTextures(); + void updateSexDependentLayerSets(BOOL upload_bake); + void dirtyMesh(); // Dirty the avatar mesh + void updateMeshData(); +protected: + void releaseMeshData(); + virtual void restoreMeshData(); +private: + void dirtyMesh(S32 priority); // Dirty the avatar mesh, with priority + S32 mDirtyMesh; // 0 -- not dirty, 1 -- morphed, 2 -- LOD + BOOL mMeshTexturesDirty; + + typedef std::multimap<std::string, LLPolyMesh*> polymesh_map_t; + polymesh_map_t mMeshes; + std::vector<LLViewerJoint *> mMeshLOD; + + //-------------------------------------------------------------------- + // Destroy invisible mesh + //-------------------------------------------------------------------- +protected: + BOOL mMeshValid; + LLFrameTimer mMeshInvisibleTime; + +/** Meshes + ** ** + *******************************************************************************/ + +/******************************************************************************** + ** ** + ** APPEARANCE + **/ + +public: + void processAvatarAppearance(LLMessageSystem* mesgsys); + void hideSkirt(); + void startAppearanceAnimation(); + + //-------------------------------------------------------------------- + // Appearance morphing + //-------------------------------------------------------------------- +public: + BOOL getIsAppearanceAnimating() const { return mAppearanceAnimating; } +private: + BOOL mAppearanceAnimating; + LLFrameTimer mAppearanceMorphTimer; + F32 mLastAppearanceBlendTime; + + //-------------------------------------------------------------------- + // Clothing colors (convenience functions to access visual parameters) + //-------------------------------------------------------------------- +public: + void setClothesColor(LLVOAvatarDefines::ETextureIndex te, const LLColor4& new_color, BOOL upload_bake); + LLColor4 getClothesColor(LLVOAvatarDefines::ETextureIndex te); + static BOOL teToColorParams(LLVOAvatarDefines::ETextureIndex te, U32 *param_name); + + //-------------------------------------------------------------------- + // Global colors + //-------------------------------------------------------------------- +public: + LLColor4 getGlobalColor(const std::string& color_name ) const; + void onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL upload_bake); +private: + LLTexGlobalColor* mTexSkinColor; + LLTexGlobalColor* mTexHairColor; + LLTexGlobalColor* mTexEyeColor; + + //-------------------------------------------------------------------- + // Visibility + //-------------------------------------------------------------------- +public: + BOOL isVisible() const; + void setVisibilityRank(U32 rank); + U32 getVisibilityRank() const { return mVisibilityRank; } // unused + static S32 sNumVisibleAvatars; // Number of instances of this class + static LLColor4 getDummyColor(); +/** Appearance + ** ** + *******************************************************************************/ + +/******************************************************************************** + ** ** + ** WEARABLES + **/ + +public: + virtual BOOL isWearingWearableType(LLWearableType::EType type ) const; + + //-------------------------------------------------------------------- + // Attachments + //-------------------------------------------------------------------- +public: + void clampAttachmentPositions(); + virtual const LLViewerJointAttachment* attachObject(LLViewerObject *viewer_object); + virtual BOOL detachObject(LLViewerObject *viewer_object); + void cleanupAttachedMesh( LLViewerObject* pVO ); + static LLVOAvatar* findAvatarFromAttachment(LLViewerObject* obj); +protected: + LLViewerJointAttachment* getTargetAttachmentPoint(LLViewerObject* viewer_object); + void lazyAttach(); + void rebuildRiggedAttachments( void ); + + //-------------------------------------------------------------------- + // Map of attachment points, by ID + //-------------------------------------------------------------------- +public: + S32 getAttachmentCount(); // Warning: order(N) not order(1) // currently used only by -self + typedef std::map<S32, LLViewerJointAttachment*> attachment_map_t; + attachment_map_t mAttachmentPoints; + std::vector<LLPointer<LLViewerObject> > mPendingAttachment; + + //-------------------------------------------------------------------- + // HUD functions + //-------------------------------------------------------------------- +public: + BOOL hasHUDAttachment() const; + LLBBox getHUDBBox() const; + void rebuildHUD(); + void resetHUDAttachments(); + BOOL canAttachMoreObjects() const; + BOOL canAttachMoreObjects(U32 n) const; +protected: + U32 getNumAttachments() const; // O(N), not O(1) + +/** Wearables + ** ** + *******************************************************************************/ + +/******************************************************************************** + ** ** + ** ACTIONS + **/ + + //-------------------------------------------------------------------- + // Animations + //-------------------------------------------------------------------- +public: + BOOL isAnyAnimationSignaled(const LLUUID *anim_array, const S32 num_anims) const; + void processAnimationStateChanges(); +protected: + BOOL processSingleAnimationStateChange(const LLUUID &anim_id, BOOL start); + void resetAnimations(); +private: + LLTimer mAnimTimer; + F32 mTimeLast; + + //-------------------------------------------------------------------- + // Animation state data + //-------------------------------------------------------------------- +public: + typedef std::map<LLUUID, S32>::iterator AnimIterator; + std::map<LLUUID, S32> mSignaledAnimations; // requested state of Animation name/value + std::map<LLUUID, S32> mPlayingAnimations; // current state of Animation name/value + + typedef std::multimap<LLUUID, LLUUID> AnimationSourceMap; + typedef AnimationSourceMap::iterator AnimSourceIterator; + AnimationSourceMap mAnimationSources; // object ids that triggered anim ids + + //-------------------------------------------------------------------- + // Chat + //-------------------------------------------------------------------- +public: + void addChat(const LLChat& chat); + void clearChat(); + void startTyping() { mTyping = TRUE; mTypingTimer.reset(); } + void stopTyping() { mTyping = FALSE; } +private: + BOOL mVisibleChat; + + //-------------------------------------------------------------------- + // Lip synch morphs + //-------------------------------------------------------------------- +private: + bool mLipSyncActive; // we're morphing for lip sync + LLVisualParam* mOohMorph; // cached pointers morphs for lip sync + LLVisualParam* mAahMorph; // cached pointers morphs for lip sync + + //-------------------------------------------------------------------- + // Flight + //-------------------------------------------------------------------- +public: + BOOL mInAir; + LLFrameTimer mTimeInAir; + +/** Actions + ** ** + *******************************************************************************/ + +/******************************************************************************** + ** ** + ** PHYSICS + **/ + +private: + F32 mSpeedAccum; // measures speed (for diagnostics mostly). + BOOL mTurning; // controls hysteresis on avatar rotation + F32 mSpeed; // misc. animation repeated state + + //-------------------------------------------------------------------- + // Collision volumes + //-------------------------------------------------------------------- +public: + S32 mNumCollisionVolumes; + LLViewerJointCollisionVolume* mCollisionVolumes; +protected: + BOOL allocateCollisionVolumes(U32 num); + + //-------------------------------------------------------------------- + // Dimensions + //-------------------------------------------------------------------- +public: + void resolveHeightGlobal(const LLVector3d &inPos, LLVector3d &outPos, LLVector3 &outNorm); + bool distanceToGround( const LLVector3d &startPoint, LLVector3d &collisionPoint, F32 distToIntersectionAlongRay ); + void resolveHeightAgent(const LLVector3 &inPos, LLVector3 &outPos, LLVector3 &outNorm); + void resolveRayCollisionAgent(const LLVector3d start_pt, const LLVector3d end_pt, LLVector3d &out_pos, LLVector3 &out_norm); + void slamPosition(); // Slam position to transmitted position (for teleport); +protected: + void computeBodySize(); + + //-------------------------------------------------------------------- + // Material being stepped on + //-------------------------------------------------------------------- +private: + BOOL mStepOnLand; + U8 mStepMaterial; + LLVector3 mStepObjectVelocity; + +/** Physics + ** ** + *******************************************************************************/ + +/******************************************************************************** + ** ** + ** HIERARCHY + **/ + +public: + virtual BOOL setParent(LLViewerObject* parent); + virtual void addChild(LLViewerObject *childp); + virtual void removeChild(LLViewerObject *childp); + + //-------------------------------------------------------------------- + // Sitting + //-------------------------------------------------------------------- +public: + void sitDown(BOOL bSitting); + BOOL isSitting(){return mIsSitting;} + void sitOnObject(LLViewerObject *sit_object); + void getOffObject(); +private: + // set this property only with LLVOAvatar::sitDown method + BOOL mIsSitting; + +/** Hierarchy + ** ** + *******************************************************************************/ + +/******************************************************************************** + ** ** + ** NAME + **/ + +public: + std::string getFullname() const; // Returns "FirstName LastName" +protected: + static void getAnimLabels(LLDynamicArray<std::string>* labels); + static void getAnimNames(LLDynamicArray<std::string>* names); +private: + std::string mNameString; // UTF-8 title + name + status + std::string mTitle; + bool mNameAway; + bool mNameBusy; + bool mNameMute; + bool mNameAppearance; + bool mNameFriend; + bool mNameCloud; + F32 mNameAlpha; + BOOL mRenderGroupTitles; + + //-------------------------------------------------------------------- + // Display the name (then optionally fade it out) + //-------------------------------------------------------------------- +public: + LLFrameTimer mChatTimer; + LLPointer<LLHUDNameTag> mNameText; +private: + LLFrameTimer mTimeVisible; + std::deque<LLChat> mChats; + BOOL mTyping; + LLFrameTimer mTypingTimer; + +/** Name + ** ** + *******************************************************************************/ + +/******************************************************************************** + ** ** + ** SOUNDS + **/ + + //-------------------------------------------------------------------- + // Voice visualizer + //-------------------------------------------------------------------- +public: + // Responsible for detecting the user's voice signal (and when the + // user speaks, it puts a voice symbol over the avatar's head) and gesticulations + LLPointer<LLVoiceVisualizer> mVoiceVisualizer; + int mCurrentGesticulationLevel; + + //-------------------------------------------------------------------- + // Step sound + //-------------------------------------------------------------------- +protected: + const LLUUID& getStepSound() const; +private: + // Global table of sound ids per material, and the ground + const static LLUUID sStepSounds[LL_MCODE_END]; + const static LLUUID sStepSoundOnLand; + + //-------------------------------------------------------------------- + // Foot step state (for generating sounds) + //-------------------------------------------------------------------- +public: + void setFootPlane(const LLVector4 &plane) { mFootPlane = plane; } + LLVector4 mFootPlane; +private: + BOOL mWasOnGroundLeft; + BOOL mWasOnGroundRight; + +/** Sounds + ** ** + *******************************************************************************/ + +/******************************************************************************** + ** ** + ** DIAGNOSTICS + **/ + + //-------------------------------------------------------------------- + // General + //-------------------------------------------------------------------- +public: + static void dumpArchetypeXML(void*); + static void dumpBakedStatus(); + const std::string getBakedStatusForPrintout() const; + void dumpAvatarTEs(const std::string& context) const; + + static F32 sUnbakedTime; // Total seconds with >=1 unbaked avatars + static F32 sUnbakedUpdateTime; // Last time stats were updated (to prevent multiple updates per frame) + static F32 sGreyTime; // Total seconds with >=1 grey avatars + static F32 sGreyUpdateTime; // Last time stats were updated (to prevent multiple updates per frame) +protected: + S32 getUnbakedPixelAreaRank(); + BOOL mHasGrey; +private: + F32 mMinPixelArea; + F32 mMaxPixelArea; + F32 mAdjustedPixelArea; + std::string mDebugText; + + + //-------------------------------------------------------------------- + // Avatar Rez Metrics + //-------------------------------------------------------------------- +public: + F32 debugGetExistenceTimeElapsedF32() const { return mDebugExistenceTimer.getElapsedTimeF32(); } +protected: + LLFrameTimer mRuthDebugTimer; // For tracking how long it takes for av to rez + LLFrameTimer mDebugExistenceTimer; // Debugging for how long the avatar has been in memory. + +/** Diagnostics + ** ** + *******************************************************************************/ + +/******************************************************************************** + ** ** + ** SUPPORT CLASSES + **/ + +protected: // Shared with LLVOAvatarSelf + + struct LLVOAvatarXmlInfo + { + LLVOAvatarXmlInfo(); + ~LLVOAvatarXmlInfo(); + + BOOL parseXmlSkeletonNode(LLXmlTreeNode* root); + BOOL parseXmlMeshNodes(LLXmlTreeNode* root); + BOOL parseXmlColorNodes(LLXmlTreeNode* root); + BOOL parseXmlLayerNodes(LLXmlTreeNode* root); + BOOL parseXmlDriverNodes(LLXmlTreeNode* root); + BOOL parseXmlMorphNodes(LLXmlTreeNode* root); + + struct LLVOAvatarMeshInfo + { + typedef std::pair<LLPolyMorphTargetInfo*,BOOL> morph_info_pair_t; + typedef std::vector<morph_info_pair_t> morph_info_list_t; + + LLVOAvatarMeshInfo() : mLOD(0), mMinPixelArea(.1f) {} + ~LLVOAvatarMeshInfo() + { + morph_info_list_t::iterator iter; + for (iter = mPolyMorphTargetInfoList.begin(); iter != mPolyMorphTargetInfoList.end(); iter++) + { + delete iter->first; + } + mPolyMorphTargetInfoList.clear(); + } + + std::string mType; + S32 mLOD; + std::string mMeshFileName; + std::string mReferenceMeshName; + F32 mMinPixelArea; + morph_info_list_t mPolyMorphTargetInfoList; + }; + typedef std::vector<LLVOAvatarMeshInfo*> mesh_info_list_t; + mesh_info_list_t mMeshInfoList; + + typedef std::vector<LLPolySkeletalDistortionInfo*> skeletal_distortion_info_list_t; + skeletal_distortion_info_list_t mSkeletalDistortionInfoList; + + struct LLVOAvatarAttachmentInfo + { + LLVOAvatarAttachmentInfo() + : mGroup(-1), mAttachmentID(-1), mPieMenuSlice(-1), mVisibleFirstPerson(FALSE), + mIsHUDAttachment(FALSE), mHasPosition(FALSE), mHasRotation(FALSE) {} + std::string mName; + std::string mJointName; + LLVector3 mPosition; + LLVector3 mRotationEuler; + S32 mGroup; + S32 mAttachmentID; + S32 mPieMenuSlice; + BOOL mVisibleFirstPerson; + BOOL mIsHUDAttachment; + BOOL mHasPosition; + BOOL mHasRotation; + }; + typedef std::vector<LLVOAvatarAttachmentInfo*> attachment_info_list_t; + attachment_info_list_t mAttachmentInfoList; + + LLTexGlobalColorInfo *mTexSkinColorInfo; + LLTexGlobalColorInfo *mTexHairColorInfo; + LLTexGlobalColorInfo *mTexEyeColorInfo; + + typedef std::vector<LLTexLayerSetInfo*> layer_info_list_t; + layer_info_list_t mLayerInfoList; + + typedef std::vector<LLDriverParamInfo*> driver_info_list_t; + driver_info_list_t mDriverInfoList; + + struct LLVOAvatarMorphInfo + { + LLVOAvatarMorphInfo() + : mInvert(FALSE) {} + std::string mName; + std::string mRegion; + std::string mLayer; + BOOL mInvert; + }; + + typedef std::vector<LLVOAvatarMorphInfo*> morph_info_list_t; + morph_info_list_t mMorphMaskInfoList; + }; + + struct LLMaskedMorph + { + LLMaskedMorph(LLPolyMorphTarget *morph_target, BOOL invert, std::string layer) : + mMorphTarget(morph_target), + mInvert(invert), + mLayer(layer) + { + morph_target->addPendingMorphMask(); + } + + LLPolyMorphTarget *mMorphTarget; + BOOL mInvert; + std::string mLayer; + }; + +/** Support classes + ** ** + *******************************************************************************/ + +}; // LLVOAvatar +extern const F32 SELF_ADDITIONAL_PRI; +extern const S32 MAX_TEXTURE_VIRTURE_SIZE_RESET_INTERVAL; + +#endif // LL_VO_AVATAR_H diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp index 1f9be20c75..b888a263d0 100644 --- a/indra/newview/llvocache.cpp +++ b/indra/newview/llvocache.cpp @@ -1,756 +1,756 @@ -/** - * @file llvocache.cpp - * @brief Cache of objects on the viewer. - * - * $LicenseInfo:firstyear=2003&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -#include "llviewerprecompiledheaders.h" -#include "llvocache.h" -#include "llerror.h" -#include "llregionhandle.h" -#include "llviewercontrol.h" - -BOOL check_read(LLAPRFile* apr_file, void* src, S32 n_bytes) -{ - return apr_file->read(src, n_bytes) == n_bytes ; -} - -BOOL check_write(LLAPRFile* apr_file, void* src, S32 n_bytes) -{ - return apr_file->write(src, n_bytes) == n_bytes ; -} - - -//--------------------------------------------------------------------------- -// LLVOCacheEntry -//--------------------------------------------------------------------------- - -LLVOCacheEntry::LLVOCacheEntry(U32 local_id, U32 crc, LLDataPackerBinaryBuffer &dp) - : - mLocalID(local_id), - mCRC(crc), - mHitCount(0), - mDupeCount(0), - mCRCChangeCount(0) -{ - mBuffer = new U8[dp.getBufferSize()]; - mDP.assignBuffer(mBuffer, dp.getBufferSize()); - mDP = dp; -} - -LLVOCacheEntry::LLVOCacheEntry() - : - mLocalID(0), - mCRC(0), - mHitCount(0), - mDupeCount(0), - mCRCChangeCount(0), - mBuffer(NULL) -{ - mDP.assignBuffer(mBuffer, 0); -} - -LLVOCacheEntry::LLVOCacheEntry(LLAPRFile* apr_file) - : mBuffer(NULL) -{ - S32 size = -1; - BOOL success; - - success = check_read(apr_file, &mLocalID, sizeof(U32)); - if(success) - { - success = check_read(apr_file, &mCRC, sizeof(U32)); - } - if(success) - { - success = check_read(apr_file, &mHitCount, sizeof(S32)); - } - if(success) - { - success = check_read(apr_file, &mDupeCount, sizeof(S32)); - } - if(success) - { - success = check_read(apr_file, &mCRCChangeCount, sizeof(S32)); - } - if(success) - { - success = check_read(apr_file, &size, sizeof(S32)); - - // Corruption in the cache entries - if ((size > 10000) || (size < 1)) - { - // We've got a bogus size, skip reading it. - // We won't bother seeking, because the rest of this file - // is likely bogus, and will be tossed anyway. - llwarns << "Bogus cache entry, size " << size << ", aborting!" << llendl; - success = FALSE; - } - } - if(success && size > 0) - { - mBuffer = new U8[size]; - success = check_read(apr_file, mBuffer, size); - - if(success) - { - mDP.assignBuffer(mBuffer, size); - } - else - { - delete[] mBuffer ; - mBuffer = NULL ; - } - } - - if(!success) - { - mLocalID = 0; - mCRC = 0; - mHitCount = 0; - mDupeCount = 0; - mCRCChangeCount = 0; - mBuffer = NULL; - } -} - -LLVOCacheEntry::~LLVOCacheEntry() -{ - if(mBuffer) - { - delete[] mBuffer; - } -} - - -// New CRC means the object has changed. -void LLVOCacheEntry::assignCRC(U32 crc, LLDataPackerBinaryBuffer &dp) -{ - if ( (mCRC != crc) - ||(mDP.getBufferSize() == 0)) - { - mCRC = crc; - mHitCount = 0; - mCRCChangeCount++; - - mDP.freeBuffer(); - mBuffer = new U8[dp.getBufferSize()]; - mDP.assignBuffer(mBuffer, dp.getBufferSize()); - mDP = dp; - } -} - -LLDataPackerBinaryBuffer *LLVOCacheEntry::getDP(U32 crc) -{ - if ( (mCRC != crc) - ||(mDP.getBufferSize() == 0)) - { - //llinfos << "Not getting cache entry, invalid!" << llendl; - return NULL; - } - mHitCount++; - return &mDP; -} - - -void LLVOCacheEntry::recordHit() -{ - mHitCount++; -} - - -void LLVOCacheEntry::dump() const -{ - llinfos << "local " << mLocalID - << " crc " << mCRC - << " hits " << mHitCount - << " dupes " << mDupeCount - << " change " << mCRCChangeCount - << llendl; -} - -BOOL LLVOCacheEntry::writeToFile(LLAPRFile* apr_file) const -{ - BOOL success; - success = check_write(apr_file, (void*)&mLocalID, sizeof(U32)); - if(success) - { - success = check_write(apr_file, (void*)&mCRC, sizeof(U32)); - } - if(success) - { - success = check_write(apr_file, (void*)&mHitCount, sizeof(S32)); - } - if(success) - { - success = check_write(apr_file, (void*)&mDupeCount, sizeof(S32)); - } - if(success) - { - success = check_write(apr_file, (void*)&mCRCChangeCount, sizeof(S32)); - } - if(success) - { - S32 size = mDP.getBufferSize(); - success = check_write(apr_file, (void*)&size, sizeof(S32)); - - if(success) - { - success = check_write(apr_file, (void*)mBuffer, size); - } - } - - return success ; -} - -//------------------------------------------------------------------- -//LLVOCache -//------------------------------------------------------------------- -// Format string used to construct filename for the object cache -static const char OBJECT_CACHE_FILENAME[] = "objects_%d_%d.slc"; - -const U32 MAX_NUM_OBJECT_ENTRIES = 128 ; -const U32 MIN_ENTRIES_TO_PURGE = 16 ; -const U32 INVALID_TIME = 0 ; -const char* object_cache_dirname = "objectcache"; -const char* header_filename = "object.cache"; - -LLVOCache* LLVOCache::sInstance = NULL; - -//static -LLVOCache* LLVOCache::getInstance() -{ - if(!sInstance) - { - sInstance = new LLVOCache() ; - } - return sInstance ; -} - -//static -BOOL LLVOCache::hasInstance() -{ - return sInstance != NULL ; -} - -//static -void LLVOCache::destroyClass() -{ - if(sInstance) - { - delete sInstance ; - sInstance = NULL ; - } -} - -LLVOCache::LLVOCache(): - mInitialized(FALSE), - mReadOnly(TRUE), - mNumEntries(0), - mCacheSize(1) -{ - mEnabled = gSavedSettings.getBOOL("ObjectCacheEnabled"); - mLocalAPRFilePoolp = new LLVolatileAPRPool() ; -} - -LLVOCache::~LLVOCache() -{ - if(mEnabled) - { - writeCacheHeader(); - clearCacheInMemory(); - } - delete mLocalAPRFilePoolp; -} - -void LLVOCache::setDirNames(ELLPath location) -{ - std::string delem = gDirUtilp->getDirDelimiter(); - - mHeaderFileName = gDirUtilp->getExpandedFilename(location, object_cache_dirname, header_filename); - mObjectCacheDirName = gDirUtilp->getExpandedFilename(location, object_cache_dirname); -} - -void LLVOCache::initCache(ELLPath location, U32 size, U32 cache_version) -{ - if(!mEnabled) - { - llwarns << "Not initializing cache: Cache is currently disabled." << llendl; - return ; - } - - if(mInitialized) - { - llwarns << "Cache already initialized." << llendl; - return ; - } - mInitialized = TRUE ; - - setDirNames(location); - if (!mReadOnly) - { - LLFile::mkdir(mObjectCacheDirName); - } - mCacheSize = llclamp(size, MIN_ENTRIES_TO_PURGE, MAX_NUM_OBJECT_ENTRIES); - mMetaInfo.mVersion = cache_version; - readCacheHeader(); - - if(mMetaInfo.mVersion != cache_version) - { - mMetaInfo.mVersion = cache_version ; - if(mReadOnly) //disable cache - { - clearCacheInMemory(); - } - else //delete the current cache if the format does not match. - { - removeCache(); - } - } -} - -void LLVOCache::removeCache(ELLPath location) -{ - if(mReadOnly) - { - llwarns << "Not removing cache at " << location << ": Cache is currently in read-only mode." << llendl; - return ; - } - - llinfos << "about to remove the object cache due to settings." << llendl ; - - std::string delem = gDirUtilp->getDirDelimiter(); - std::string mask = delem + "*"; - std::string cache_dir = gDirUtilp->getExpandedFilename(location, object_cache_dirname); - llinfos << "Removing cache at " << cache_dir << llendl; - gDirUtilp->deleteFilesInDir(cache_dir, mask); //delete all files - LLFile::rmdir(cache_dir); - - clearCacheInMemory(); - mInitialized = FALSE ; -} - -void LLVOCache::removeCache() -{ - llassert_always(mInitialized) ; - if(mReadOnly) - { - llwarns << "Not clearing object cache: Cache is currently in read-only mode." << llendl; - return ; - } - - llinfos << "about to remove the object cache due to some error." << llendl ; - - std::string delem = gDirUtilp->getDirDelimiter(); - std::string mask = delem + "*"; - llinfos << "Removing cache at " << mObjectCacheDirName << llendl; - gDirUtilp->deleteFilesInDir(mObjectCacheDirName, mask); - - clearCacheInMemory() ; - writeCacheHeader(); -} - -void LLVOCache::removeEntry(HeaderEntryInfo* entry) -{ - llassert_always(mInitialized) ; - if(mReadOnly) - { - return ; - } - if(!entry) - { - return ; - } - - header_entry_queue_t::iterator iter = mHeaderEntryQueue.find(entry) ; - if(iter != mHeaderEntryQueue.end()) - { - mHandleEntryMap.erase(entry->mHandle) ; - mHeaderEntryQueue.erase(iter) ; - removeFromCache(entry) ; - delete entry ; - - mNumEntries = mHandleEntryMap.size() ; - } -} - -void LLVOCache::removeEntry(U64 handle) -{ - handle_entry_map_t::iterator iter = mHandleEntryMap.find(handle) ; - if(iter == mHandleEntryMap.end()) //no cache - { - return ; - } - HeaderEntryInfo* entry = iter->second ; - removeEntry(entry) ; -} - -void LLVOCache::clearCacheInMemory() -{ - if(!mHeaderEntryQueue.empty()) - { - for(header_entry_queue_t::iterator iter = mHeaderEntryQueue.begin(); iter != mHeaderEntryQueue.end(); ++iter) - { - delete *iter ; - } - mHeaderEntryQueue.clear(); - mHandleEntryMap.clear(); - mNumEntries = 0 ; - } - -} - -void LLVOCache::getObjectCacheFilename(U64 handle, std::string& filename) -{ - U32 region_x, region_y; - - grid_from_region_handle(handle, ®ion_x, ®ion_y); - filename = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, object_cache_dirname, - llformat(OBJECT_CACHE_FILENAME, region_x, region_y)); - - return ; -} - -void LLVOCache::removeFromCache(HeaderEntryInfo* entry) -{ - if(mReadOnly) - { - llwarns << "Not removing cache for handle " << entry->mHandle << ": Cache is currently in read-only mode." << llendl; - return ; - } - - std::string filename; - getObjectCacheFilename(entry->mHandle, filename); - LLAPRFile::remove(filename, mLocalAPRFilePoolp); - entry->mTime = INVALID_TIME ; - updateEntry(entry) ; //update the head file. -} - -void LLVOCache::readCacheHeader() -{ - if(!mEnabled) - { - llwarns << "Not reading cache header: Cache is currently disabled." << llendl; - return; - } - - //clear stale info. - clearCacheInMemory(); - - bool success = true ; - if (LLAPRFile::isExist(mHeaderFileName, mLocalAPRFilePoolp)) - { - LLAPRFile apr_file(mHeaderFileName, APR_READ|APR_BINARY, mLocalAPRFilePoolp); - - //read the meta element - success = check_read(&apr_file, &mMetaInfo, sizeof(HeaderMetaInfo)) ; - - if(success) - { - HeaderEntryInfo* entry = NULL ; - mNumEntries = 0 ; - U32 num_read = 0 ; - while(num_read++ < MAX_NUM_OBJECT_ENTRIES) - { - if(!entry) - { - entry = new HeaderEntryInfo() ; - } - success = check_read(&apr_file, entry, sizeof(HeaderEntryInfo)); - - if(!success) //failed - { - llwarns << "Error reading cache header entry. (entry_index=" << mNumEntries << ")" << llendl; - delete entry ; - entry = NULL ; - break ; - } - else if(entry->mTime == INVALID_TIME) - { - continue ; //an empty entry - } - - entry->mIndex = mNumEntries++ ; - mHeaderEntryQueue.insert(entry) ; - mHandleEntryMap[entry->mHandle] = entry ; - entry = NULL ; - } - if(entry) - { - delete entry ; - } - } - - //--------- - //debug code - //---------- - //std::string name ; - //for(header_entry_queue_t::iterator iter = mHeaderEntryQueue.begin() ; success && iter != mHeaderEntryQueue.end(); ++iter) - //{ - // getObjectCacheFilename((*iter)->mHandle, name) ; - // llinfos << name << llendl ; - //} - //----------- - } - else - { - writeCacheHeader() ; - } - - if(!success) - { - removeCache() ; //failed to read header, clear the cache - } - else if(mNumEntries >= mCacheSize) - { - purgeEntries(mCacheSize) ; - } - - return ; -} - -void LLVOCache::writeCacheHeader() -{ - if (!mEnabled) - { - llwarns << "Not writing cache header: Cache is currently disabled." << llendl; - return; - } - - if(mReadOnly) - { - llwarns << "Not writing cache header: Cache is currently in read-only mode." << llendl; - return; - } - - bool success = true ; - { - LLAPRFile apr_file(mHeaderFileName, APR_CREATE|APR_WRITE|APR_BINARY, mLocalAPRFilePoolp); - - //write the meta element - success = check_write(&apr_file, &mMetaInfo, sizeof(HeaderMetaInfo)) ; - - - mNumEntries = 0 ; - for(header_entry_queue_t::iterator iter = mHeaderEntryQueue.begin() ; success && iter != mHeaderEntryQueue.end(); ++iter) - { - (*iter)->mIndex = mNumEntries++ ; - success = check_write(&apr_file, (void*)*iter, sizeof(HeaderEntryInfo)); - } - - mNumEntries = mHeaderEntryQueue.size() ; - if(success && mNumEntries < MAX_NUM_OBJECT_ENTRIES) - { - HeaderEntryInfo* entry = new HeaderEntryInfo() ; - entry->mTime = INVALID_TIME ; - for(S32 i = mNumEntries ; success && i < MAX_NUM_OBJECT_ENTRIES ; i++) - { - //fill the cache with the default entry. - success = check_write(&apr_file, entry, sizeof(HeaderEntryInfo)) ; - - } - delete entry ; - } - } - - if(!success) - { - clearCacheInMemory() ; - mReadOnly = TRUE ; //disable the cache. - } - return ; -} - -BOOL LLVOCache::updateEntry(const HeaderEntryInfo* entry) -{ - LLAPRFile apr_file(mHeaderFileName, APR_WRITE|APR_BINARY, mLocalAPRFilePoolp); - apr_file.seek(APR_SET, entry->mIndex * sizeof(HeaderEntryInfo) + sizeof(HeaderMetaInfo)) ; - - return check_write(&apr_file, (void*)entry, sizeof(HeaderEntryInfo)) ; -} - -void LLVOCache::readFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::vocache_entry_map_t& cache_entry_map) -{ - if(!mEnabled) - { - llwarns << "Not reading cache for handle " << handle << "): Cache is currently disabled." << llendl; - return ; - } - llassert_always(mInitialized); - - handle_entry_map_t::iterator iter = mHandleEntryMap.find(handle) ; - if(iter == mHandleEntryMap.end()) //no cache - { - llwarns << "No handle map entry for " << handle << llendl; - return ; - } - - bool success = true ; - { - std::string filename; - getObjectCacheFilename(handle, filename); - LLAPRFile apr_file(filename, APR_READ|APR_BINARY, mLocalAPRFilePoolp); - - LLUUID cache_id ; - success = check_read(&apr_file, cache_id.mData, UUID_BYTES) ; - - if(success) - { - if(cache_id != id) - { - llinfos << "Cache ID doesn't match for this region, discarding"<< llendl; - success = false ; - } - - if(success) - { - S32 num_entries; - success = check_read(&apr_file, &num_entries, sizeof(S32)) ; - - for (S32 i = 0; success && i < num_entries; i++) - { - LLVOCacheEntry* entry = new LLVOCacheEntry(&apr_file); - if (!entry->getLocalID()) - { - llwarns << "Aborting cache file load for " << filename << ", cache file corruption!" << llendl; - delete entry ; - success = false ; - } - cache_entry_map[entry->getLocalID()] = entry; - } - } - } - } - - if(!success) - { - if(cache_entry_map.empty()) - { - removeEntry(iter->second) ; - } - } - - return ; -} - -void LLVOCache::purgeEntries(U32 size) -{ - while(mHeaderEntryQueue.size() > size) - { - header_entry_queue_t::iterator iter = mHeaderEntryQueue.begin() ; - HeaderEntryInfo* entry = *iter ; - mHandleEntryMap.erase(entry->mHandle); - mHeaderEntryQueue.erase(iter) ; - removeFromCache(entry) ; - delete entry; - } - mNumEntries = mHandleEntryMap.size() ; -} - -void LLVOCache::writeToCache(U64 handle, const LLUUID& id, const LLVOCacheEntry::vocache_entry_map_t& cache_entry_map, BOOL dirty_cache) -{ - if(!mEnabled) - { - llwarns << "Not writing cache for handle " << handle << "): Cache is currently disabled." << llendl; - return ; - } - llassert_always(mInitialized); - - if(mReadOnly) - { - llwarns << "Not writing cache for handle " << handle << "): Cache is currently in read-only mode." << llendl; - return ; - } - - HeaderEntryInfo* entry; - handle_entry_map_t::iterator iter = mHandleEntryMap.find(handle) ; - if(iter == mHandleEntryMap.end()) //new entry - { - if(mNumEntries >= mCacheSize - 1) - { - purgeEntries(mCacheSize - 1) ; - } - - entry = new HeaderEntryInfo(); - entry->mHandle = handle ; - entry->mTime = time(NULL) ; - entry->mIndex = mNumEntries++; - mHeaderEntryQueue.insert(entry) ; - mHandleEntryMap[handle] = entry ; - } - else - { - // Update access time. - entry = iter->second ; - - //resort - mHeaderEntryQueue.erase(entry) ; - - entry->mTime = time(NULL) ; - mHeaderEntryQueue.insert(entry) ; - } - - //update cache header - if(!updateEntry(entry)) - { - llwarns << "Failed to update cache header index " << entry->mIndex << ". handle = " << handle << llendl; - return ; //update failed. - } - - if(!dirty_cache) - { - llwarns << "Skipping write to cache for handle " << handle << ": cache not dirty" << llendl; - return ; //nothing changed, no need to update. - } - - //write to cache file - bool success = true ; - { - std::string filename; - getObjectCacheFilename(handle, filename); - LLAPRFile apr_file(filename, APR_CREATE|APR_WRITE|APR_BINARY, mLocalAPRFilePoolp); - - success = check_write(&apr_file, (void*)id.mData, UUID_BYTES) ; - - - if(success) - { - S32 num_entries = cache_entry_map.size() ; - success = check_write(&apr_file, &num_entries, sizeof(S32)); - - for (LLVOCacheEntry::vocache_entry_map_t::const_iterator iter = cache_entry_map.begin(); success && iter != cache_entry_map.end(); ++iter) - { - success = iter->second->writeToFile(&apr_file) ; - } - } - } - - if(!success) - { - removeEntry(entry) ; - - } - - return ; -} - +/** + * @file llvocache.cpp + * @brief Cache of objects on the viewer. + * + * $LicenseInfo:firstyear=2003&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" +#include "llvocache.h" +#include "llerror.h" +#include "llregionhandle.h" +#include "llviewercontrol.h" + +BOOL check_read(LLAPRFile* apr_file, void* src, S32 n_bytes) +{ + return apr_file->read(src, n_bytes) == n_bytes ; +} + +BOOL check_write(LLAPRFile* apr_file, void* src, S32 n_bytes) +{ + return apr_file->write(src, n_bytes) == n_bytes ; +} + + +//--------------------------------------------------------------------------- +// LLVOCacheEntry +//--------------------------------------------------------------------------- + +LLVOCacheEntry::LLVOCacheEntry(U32 local_id, U32 crc, LLDataPackerBinaryBuffer &dp) + : + mLocalID(local_id), + mCRC(crc), + mHitCount(0), + mDupeCount(0), + mCRCChangeCount(0) +{ + mBuffer = new U8[dp.getBufferSize()]; + mDP.assignBuffer(mBuffer, dp.getBufferSize()); + mDP = dp; +} + +LLVOCacheEntry::LLVOCacheEntry() + : + mLocalID(0), + mCRC(0), + mHitCount(0), + mDupeCount(0), + mCRCChangeCount(0), + mBuffer(NULL) +{ + mDP.assignBuffer(mBuffer, 0); +} + +LLVOCacheEntry::LLVOCacheEntry(LLAPRFile* apr_file) + : mBuffer(NULL) +{ + S32 size = -1; + BOOL success; + + success = check_read(apr_file, &mLocalID, sizeof(U32)); + if(success) + { + success = check_read(apr_file, &mCRC, sizeof(U32)); + } + if(success) + { + success = check_read(apr_file, &mHitCount, sizeof(S32)); + } + if(success) + { + success = check_read(apr_file, &mDupeCount, sizeof(S32)); + } + if(success) + { + success = check_read(apr_file, &mCRCChangeCount, sizeof(S32)); + } + if(success) + { + success = check_read(apr_file, &size, sizeof(S32)); + + // Corruption in the cache entries + if ((size > 10000) || (size < 1)) + { + // We've got a bogus size, skip reading it. + // We won't bother seeking, because the rest of this file + // is likely bogus, and will be tossed anyway. + llwarns << "Bogus cache entry, size " << size << ", aborting!" << llendl; + success = FALSE; + } + } + if(success && size > 0) + { + mBuffer = new U8[size]; + success = check_read(apr_file, mBuffer, size); + + if(success) + { + mDP.assignBuffer(mBuffer, size); + } + else + { + delete[] mBuffer ; + mBuffer = NULL ; + } + } + + if(!success) + { + mLocalID = 0; + mCRC = 0; + mHitCount = 0; + mDupeCount = 0; + mCRCChangeCount = 0; + mBuffer = NULL; + } +} + +LLVOCacheEntry::~LLVOCacheEntry() +{ + if(mBuffer) + { + delete[] mBuffer; + } +} + + +// New CRC means the object has changed. +void LLVOCacheEntry::assignCRC(U32 crc, LLDataPackerBinaryBuffer &dp) +{ + if ( (mCRC != crc) + ||(mDP.getBufferSize() == 0)) + { + mCRC = crc; + mHitCount = 0; + mCRCChangeCount++; + + mDP.freeBuffer(); + mBuffer = new U8[dp.getBufferSize()]; + mDP.assignBuffer(mBuffer, dp.getBufferSize()); + mDP = dp; + } +} + +LLDataPackerBinaryBuffer *LLVOCacheEntry::getDP(U32 crc) +{ + if ( (mCRC != crc) + ||(mDP.getBufferSize() == 0)) + { + //llinfos << "Not getting cache entry, invalid!" << llendl; + return NULL; + } + mHitCount++; + return &mDP; +} + + +void LLVOCacheEntry::recordHit() +{ + mHitCount++; +} + + +void LLVOCacheEntry::dump() const +{ + llinfos << "local " << mLocalID + << " crc " << mCRC + << " hits " << mHitCount + << " dupes " << mDupeCount + << " change " << mCRCChangeCount + << llendl; +} + +BOOL LLVOCacheEntry::writeToFile(LLAPRFile* apr_file) const +{ + BOOL success; + success = check_write(apr_file, (void*)&mLocalID, sizeof(U32)); + if(success) + { + success = check_write(apr_file, (void*)&mCRC, sizeof(U32)); + } + if(success) + { + success = check_write(apr_file, (void*)&mHitCount, sizeof(S32)); + } + if(success) + { + success = check_write(apr_file, (void*)&mDupeCount, sizeof(S32)); + } + if(success) + { + success = check_write(apr_file, (void*)&mCRCChangeCount, sizeof(S32)); + } + if(success) + { + S32 size = mDP.getBufferSize(); + success = check_write(apr_file, (void*)&size, sizeof(S32)); + + if(success) + { + success = check_write(apr_file, (void*)mBuffer, size); + } + } + + return success ; +} + +//------------------------------------------------------------------- +//LLVOCache +//------------------------------------------------------------------- +// Format string used to construct filename for the object cache +static const char OBJECT_CACHE_FILENAME[] = "objects_%d_%d.slc"; + +const U32 MAX_NUM_OBJECT_ENTRIES = 128 ; +const U32 MIN_ENTRIES_TO_PURGE = 16 ; +const U32 INVALID_TIME = 0 ; +const char* object_cache_dirname = "objectcache"; +const char* header_filename = "object.cache"; + +LLVOCache* LLVOCache::sInstance = NULL; + +//static +LLVOCache* LLVOCache::getInstance() +{ + if(!sInstance) + { + sInstance = new LLVOCache() ; + } + return sInstance ; +} + +//static +BOOL LLVOCache::hasInstance() +{ + return sInstance != NULL ; +} + +//static +void LLVOCache::destroyClass() +{ + if(sInstance) + { + delete sInstance ; + sInstance = NULL ; + } +} + +LLVOCache::LLVOCache(): + mInitialized(FALSE), + mReadOnly(TRUE), + mNumEntries(0), + mCacheSize(1) +{ + mEnabled = gSavedSettings.getBOOL("ObjectCacheEnabled"); + mLocalAPRFilePoolp = new LLVolatileAPRPool() ; +} + +LLVOCache::~LLVOCache() +{ + if(mEnabled) + { + writeCacheHeader(); + clearCacheInMemory(); + } + delete mLocalAPRFilePoolp; +} + +void LLVOCache::setDirNames(ELLPath location) +{ + std::string delem = gDirUtilp->getDirDelimiter(); + + mHeaderFileName = gDirUtilp->getExpandedFilename(location, object_cache_dirname, header_filename); + mObjectCacheDirName = gDirUtilp->getExpandedFilename(location, object_cache_dirname); +} + +void LLVOCache::initCache(ELLPath location, U32 size, U32 cache_version) +{ + if(!mEnabled) + { + llwarns << "Not initializing cache: Cache is currently disabled." << llendl; + return ; + } + + if(mInitialized) + { + llwarns << "Cache already initialized." << llendl; + return ; + } + mInitialized = TRUE ; + + setDirNames(location); + if (!mReadOnly) + { + LLFile::mkdir(mObjectCacheDirName); + } + mCacheSize = llclamp(size, MIN_ENTRIES_TO_PURGE, MAX_NUM_OBJECT_ENTRIES); + mMetaInfo.mVersion = cache_version; + readCacheHeader(); + + if(mMetaInfo.mVersion != cache_version) + { + mMetaInfo.mVersion = cache_version ; + if(mReadOnly) //disable cache + { + clearCacheInMemory(); + } + else //delete the current cache if the format does not match. + { + removeCache(); + } + } +} + +void LLVOCache::removeCache(ELLPath location) +{ + if(mReadOnly) + { + llwarns << "Not removing cache at " << location << ": Cache is currently in read-only mode." << llendl; + return ; + } + + llinfos << "about to remove the object cache due to settings." << llendl ; + + std::string delem = gDirUtilp->getDirDelimiter(); + std::string mask = delem + "*"; + std::string cache_dir = gDirUtilp->getExpandedFilename(location, object_cache_dirname); + llinfos << "Removing cache at " << cache_dir << llendl; + gDirUtilp->deleteFilesInDir(cache_dir, mask); //delete all files + LLFile::rmdir(cache_dir); + + clearCacheInMemory(); + mInitialized = FALSE ; +} + +void LLVOCache::removeCache() +{ + llassert_always(mInitialized) ; + if(mReadOnly) + { + llwarns << "Not clearing object cache: Cache is currently in read-only mode." << llendl; + return ; + } + + llinfos << "about to remove the object cache due to some error." << llendl ; + + std::string delem = gDirUtilp->getDirDelimiter(); + std::string mask = delem + "*"; + llinfos << "Removing cache at " << mObjectCacheDirName << llendl; + gDirUtilp->deleteFilesInDir(mObjectCacheDirName, mask); + + clearCacheInMemory() ; + writeCacheHeader(); +} + +void LLVOCache::removeEntry(HeaderEntryInfo* entry) +{ + llassert_always(mInitialized) ; + if(mReadOnly) + { + return ; + } + if(!entry) + { + return ; + } + + header_entry_queue_t::iterator iter = mHeaderEntryQueue.find(entry) ; + if(iter != mHeaderEntryQueue.end()) + { + mHandleEntryMap.erase(entry->mHandle) ; + mHeaderEntryQueue.erase(iter) ; + removeFromCache(entry) ; + delete entry ; + + mNumEntries = mHandleEntryMap.size() ; + } +} + +void LLVOCache::removeEntry(U64 handle) +{ + handle_entry_map_t::iterator iter = mHandleEntryMap.find(handle) ; + if(iter == mHandleEntryMap.end()) //no cache + { + return ; + } + HeaderEntryInfo* entry = iter->second ; + removeEntry(entry) ; +} + +void LLVOCache::clearCacheInMemory() +{ + if(!mHeaderEntryQueue.empty()) + { + for(header_entry_queue_t::iterator iter = mHeaderEntryQueue.begin(); iter != mHeaderEntryQueue.end(); ++iter) + { + delete *iter ; + } + mHeaderEntryQueue.clear(); + mHandleEntryMap.clear(); + mNumEntries = 0 ; + } + +} + +void LLVOCache::getObjectCacheFilename(U64 handle, std::string& filename) +{ + U32 region_x, region_y; + + grid_from_region_handle(handle, ®ion_x, ®ion_y); + filename = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, object_cache_dirname, + llformat(OBJECT_CACHE_FILENAME, region_x, region_y)); + + return ; +} + +void LLVOCache::removeFromCache(HeaderEntryInfo* entry) +{ + if(mReadOnly) + { + llwarns << "Not removing cache for handle " << entry->mHandle << ": Cache is currently in read-only mode." << llendl; + return ; + } + + std::string filename; + getObjectCacheFilename(entry->mHandle, filename); + LLAPRFile::remove(filename, mLocalAPRFilePoolp); + entry->mTime = INVALID_TIME ; + updateEntry(entry) ; //update the head file. +} + +void LLVOCache::readCacheHeader() +{ + if(!mEnabled) + { + llwarns << "Not reading cache header: Cache is currently disabled." << llendl; + return; + } + + //clear stale info. + clearCacheInMemory(); + + bool success = true ; + if (LLAPRFile::isExist(mHeaderFileName, mLocalAPRFilePoolp)) + { + LLAPRFile apr_file(mHeaderFileName, APR_READ|APR_BINARY, mLocalAPRFilePoolp); + + //read the meta element + success = check_read(&apr_file, &mMetaInfo, sizeof(HeaderMetaInfo)) ; + + if(success) + { + HeaderEntryInfo* entry = NULL ; + mNumEntries = 0 ; + U32 num_read = 0 ; + while(num_read++ < MAX_NUM_OBJECT_ENTRIES) + { + if(!entry) + { + entry = new HeaderEntryInfo() ; + } + success = check_read(&apr_file, entry, sizeof(HeaderEntryInfo)); + + if(!success) //failed + { + llwarns << "Error reading cache header entry. (entry_index=" << mNumEntries << ")" << llendl; + delete entry ; + entry = NULL ; + break ; + } + else if(entry->mTime == INVALID_TIME) + { + continue ; //an empty entry + } + + entry->mIndex = mNumEntries++ ; + mHeaderEntryQueue.insert(entry) ; + mHandleEntryMap[entry->mHandle] = entry ; + entry = NULL ; + } + if(entry) + { + delete entry ; + } + } + + //--------- + //debug code + //---------- + //std::string name ; + //for(header_entry_queue_t::iterator iter = mHeaderEntryQueue.begin() ; success && iter != mHeaderEntryQueue.end(); ++iter) + //{ + // getObjectCacheFilename((*iter)->mHandle, name) ; + // llinfos << name << llendl ; + //} + //----------- + } + else + { + writeCacheHeader() ; + } + + if(!success) + { + removeCache() ; //failed to read header, clear the cache + } + else if(mNumEntries >= mCacheSize) + { + purgeEntries(mCacheSize) ; + } + + return ; +} + +void LLVOCache::writeCacheHeader() +{ + if (!mEnabled) + { + llwarns << "Not writing cache header: Cache is currently disabled." << llendl; + return; + } + + if(mReadOnly) + { + llwarns << "Not writing cache header: Cache is currently in read-only mode." << llendl; + return; + } + + bool success = true ; + { + LLAPRFile apr_file(mHeaderFileName, APR_CREATE|APR_WRITE|APR_BINARY, mLocalAPRFilePoolp); + + //write the meta element + success = check_write(&apr_file, &mMetaInfo, sizeof(HeaderMetaInfo)) ; + + + mNumEntries = 0 ; + for(header_entry_queue_t::iterator iter = mHeaderEntryQueue.begin() ; success && iter != mHeaderEntryQueue.end(); ++iter) + { + (*iter)->mIndex = mNumEntries++ ; + success = check_write(&apr_file, (void*)*iter, sizeof(HeaderEntryInfo)); + } + + mNumEntries = mHeaderEntryQueue.size() ; + if(success && mNumEntries < MAX_NUM_OBJECT_ENTRIES) + { + HeaderEntryInfo* entry = new HeaderEntryInfo() ; + entry->mTime = INVALID_TIME ; + for(S32 i = mNumEntries ; success && i < MAX_NUM_OBJECT_ENTRIES ; i++) + { + //fill the cache with the default entry. + success = check_write(&apr_file, entry, sizeof(HeaderEntryInfo)) ; + + } + delete entry ; + } + } + + if(!success) + { + clearCacheInMemory() ; + mReadOnly = TRUE ; //disable the cache. + } + return ; +} + +BOOL LLVOCache::updateEntry(const HeaderEntryInfo* entry) +{ + LLAPRFile apr_file(mHeaderFileName, APR_WRITE|APR_BINARY, mLocalAPRFilePoolp); + apr_file.seek(APR_SET, entry->mIndex * sizeof(HeaderEntryInfo) + sizeof(HeaderMetaInfo)) ; + + return check_write(&apr_file, (void*)entry, sizeof(HeaderEntryInfo)) ; +} + +void LLVOCache::readFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::vocache_entry_map_t& cache_entry_map) +{ + if(!mEnabled) + { + llwarns << "Not reading cache for handle " << handle << "): Cache is currently disabled." << llendl; + return ; + } + llassert_always(mInitialized); + + handle_entry_map_t::iterator iter = mHandleEntryMap.find(handle) ; + if(iter == mHandleEntryMap.end()) //no cache + { + llwarns << "No handle map entry for " << handle << llendl; + return ; + } + + bool success = true ; + { + std::string filename; + getObjectCacheFilename(handle, filename); + LLAPRFile apr_file(filename, APR_READ|APR_BINARY, mLocalAPRFilePoolp); + + LLUUID cache_id ; + success = check_read(&apr_file, cache_id.mData, UUID_BYTES) ; + + if(success) + { + if(cache_id != id) + { + llinfos << "Cache ID doesn't match for this region, discarding"<< llendl; + success = false ; + } + + if(success) + { + S32 num_entries; + success = check_read(&apr_file, &num_entries, sizeof(S32)) ; + + for (S32 i = 0; success && i < num_entries; i++) + { + LLVOCacheEntry* entry = new LLVOCacheEntry(&apr_file); + if (!entry->getLocalID()) + { + llwarns << "Aborting cache file load for " << filename << ", cache file corruption!" << llendl; + delete entry ; + success = false ; + } + cache_entry_map[entry->getLocalID()] = entry; + } + } + } + } + + if(!success) + { + if(cache_entry_map.empty()) + { + removeEntry(iter->second) ; + } + } + + return ; +} + +void LLVOCache::purgeEntries(U32 size) +{ + while(mHeaderEntryQueue.size() > size) + { + header_entry_queue_t::iterator iter = mHeaderEntryQueue.begin() ; + HeaderEntryInfo* entry = *iter ; + mHandleEntryMap.erase(entry->mHandle); + mHeaderEntryQueue.erase(iter) ; + removeFromCache(entry) ; + delete entry; + } + mNumEntries = mHandleEntryMap.size() ; +} + +void LLVOCache::writeToCache(U64 handle, const LLUUID& id, const LLVOCacheEntry::vocache_entry_map_t& cache_entry_map, BOOL dirty_cache) +{ + if(!mEnabled) + { + llwarns << "Not writing cache for handle " << handle << "): Cache is currently disabled." << llendl; + return ; + } + llassert_always(mInitialized); + + if(mReadOnly) + { + llwarns << "Not writing cache for handle " << handle << "): Cache is currently in read-only mode." << llendl; + return ; + } + + HeaderEntryInfo* entry; + handle_entry_map_t::iterator iter = mHandleEntryMap.find(handle) ; + if(iter == mHandleEntryMap.end()) //new entry + { + if(mNumEntries >= mCacheSize - 1) + { + purgeEntries(mCacheSize - 1) ; + } + + entry = new HeaderEntryInfo(); + entry->mHandle = handle ; + entry->mTime = time(NULL) ; + entry->mIndex = mNumEntries++; + mHeaderEntryQueue.insert(entry) ; + mHandleEntryMap[handle] = entry ; + } + else + { + // Update access time. + entry = iter->second ; + + //resort + mHeaderEntryQueue.erase(entry) ; + + entry->mTime = time(NULL) ; + mHeaderEntryQueue.insert(entry) ; + } + + //update cache header + if(!updateEntry(entry)) + { + llwarns << "Failed to update cache header index " << entry->mIndex << ". handle = " << handle << llendl; + return ; //update failed. + } + + if(!dirty_cache) + { + llwarns << "Skipping write to cache for handle " << handle << ": cache not dirty" << llendl; + return ; //nothing changed, no need to update. + } + + //write to cache file + bool success = true ; + { + std::string filename; + getObjectCacheFilename(handle, filename); + LLAPRFile apr_file(filename, APR_CREATE|APR_WRITE|APR_BINARY, mLocalAPRFilePoolp); + + success = check_write(&apr_file, (void*)id.mData, UUID_BYTES) ; + + + if(success) + { + S32 num_entries = cache_entry_map.size() ; + success = check_write(&apr_file, &num_entries, sizeof(S32)); + + for (LLVOCacheEntry::vocache_entry_map_t::const_iterator iter = cache_entry_map.begin(); success && iter != cache_entry_map.end(); ++iter) + { + success = iter->second->writeToFile(&apr_file) ; + } + } + } + + if(!success) + { + removeEntry(entry) ; + + } + + return ; +} + -- cgit v1.2.3 From 64b192ed6274349a4b8844a9e0165e8b25f3a6ad Mon Sep 17 00:00:00 2001 From: Merov Linden <merov@lindenlab.com> Date: Tue, 3 May 2011 13:18:16 -0700 Subject: EXP-756 : Fix inventory folder ordering on launch --- indra/newview/llfolderview.cpp | 12 ------------ indra/newview/llfolderview.h | 1 - indra/newview/llfolderviewitem.cpp | 2 +- indra/newview/llinventoryfilter.h | 11 +++++++---- indra/newview/llpanelmaininventory.cpp | 10 ++++++++++ 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index b3b1ce5743..3884b94b60 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -301,18 +301,6 @@ BOOL LLFolderView::canFocusChildren() const return FALSE; } -void LLFolderView::checkTreeResortForModelChanged() -{ - if (mSortOrder & LLInventoryFilter::SO_DATE && !(mSortOrder & LLInventoryFilter::SO_FOLDERS_BY_NAME)) - { - // This is the case where something got added or removed. If we are date sorting - // everything including folders, then we need to rebuild the whole tree. - // Just set to something not SO_DATE to force the folder most resent date resort. - mSortOrder = mSortOrder & ~LLInventoryFilter::SO_DATE; - setSortOrder(mSortOrder | LLInventoryFilter::SO_DATE); - } -} - static LLFastTimer::DeclareTimer FTM_SORT("Sort Inventory"); void LLFolderView::setSortOrder(U32 order) diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h index 210ba9eb3c..1464a058d8 100644 --- a/indra/newview/llfolderview.h +++ b/indra/newview/llfolderview.h @@ -101,7 +101,6 @@ public: // FolderViews default to sort by name. This will change that, // and resort the items if necessary. void setSortOrder(U32 order); - void checkTreeResortForModelChanged(); void setFilterPermMask(PermissionMask filter_perm_mask); void setAllowMultiSelect(BOOL allow) { mAllowMultiSelect = allow; } diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp index 3c36248c1f..e9d1ad3a9e 100644 --- a/indra/newview/llfolderviewitem.cpp +++ b/indra/newview/llfolderviewitem.cpp @@ -1835,7 +1835,7 @@ void LLFolderViewFolder::sortBy(U32 order) return; } - // Propegate this change to sub folders + // Propagate this change to sub folders for (folders_t::iterator iter = mFolders.begin(); iter != mFolders.end();) { diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h index f488b2ed1b..39e6f797a2 100644 --- a/indra/newview/llinventoryfilter.h +++ b/indra/newview/llinventoryfilter.h @@ -66,10 +66,13 @@ public: FILTERLINK_ONLY_LINKS // only show links }; - // REFACTOR: Change this to an enum. - static const U32 SO_DATE = 1; - static const U32 SO_FOLDERS_BY_NAME = 2; - static const U32 SO_SYSTEM_FOLDERS_TO_TOP = 4; + enum ESortOrderType + { + SO_NAME = 0, // Sort inventory by name + SO_DATE = 0x1, // Sort inventory by date + SO_FOLDERS_BY_NAME = 0x1 << 1, // Force folder sort by name + SO_SYSTEM_FOLDERS_TO_TOP = 0x1 << 2 // Force system folders to be on top + }; LLInventoryFilter(const std::string& name); virtual ~LLInventoryFilter(); diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 90617b7dc7..b9a6938492 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -192,6 +192,16 @@ BOOL LLPanelMainInventory::postBuild() mMenuAdd->getChild<LLMenuItemGL>("Upload Animation")->setLabelArg("[COST]", upload_cost); mMenuAdd->getChild<LLMenuItemGL>("Bulk Upload")->setLabelArg("[COST]", upload_cost); + // EXP-756: Force resorting of the list: in the case of date sorting, one didn't have enough information at + // the beginning to correctly sort the folders. Later resort didn't do anything as the order value was + // set correctly. The workaround is to reset the order to alphabetical (or anything) then to the correct order. + if (mActivePanel) + { + U32 order = mActivePanel->getSortOrder(); + mActivePanel->setSortOrder(LLInventoryFilter::SO_NAME); + mActivePanel->setSortOrder(order); + } + return TRUE; } -- cgit v1.2.3 From 1b601fbdff008e32a0d9e0a85ad38518e7ab344e Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Tue, 3 May 2011 14:35:07 -0700 Subject: EXP-771 Enable call option in Basic Viewer UI --- .../skins/minimal/xui/en/menu_attachment_other.xml | 8 ++++++++ .../skins/minimal/xui/en/menu_avatar_other.xml | 8 ++++++++ .../minimal/xui/en/menu_inspect_avatar_gear.xml | 9 +++++++++ .../skins/minimal/xui/en/menu_people_nearby.xml | 10 ++++++++++ .../newview/skins/minimal/xui/en/panel_people.xml | 23 +++++++++++++++++++++- 5 files changed, 57 insertions(+), 1 deletion(-) diff --git a/indra/newview/skins/minimal/xui/en/menu_attachment_other.xml b/indra/newview/skins/minimal/xui/en/menu_attachment_other.xml index b55e677276..80cf365c46 100644 --- a/indra/newview/skins/minimal/xui/en/menu_attachment_other.xml +++ b/indra/newview/skins/minimal/xui/en/menu_attachment_other.xml @@ -25,6 +25,14 @@ <menu_item_call.on_click function="Avatar.SendIM" /> </menu_item_call> + <menu_item_call + label="Call" + name="Call"> + <menu_item_call.on_click + function="Avatar.Call" /> + <menu_item_call.on_enable + function="Avatar.EnableCall" /> + </menu_item_call> <menu_item_separator /> <menu_item_call enabled="false" diff --git a/indra/newview/skins/minimal/xui/en/menu_avatar_other.xml b/indra/newview/skins/minimal/xui/en/menu_avatar_other.xml index b76629f401..2c81b5a778 100644 --- a/indra/newview/skins/minimal/xui/en/menu_avatar_other.xml +++ b/indra/newview/skins/minimal/xui/en/menu_avatar_other.xml @@ -25,6 +25,14 @@ <menu_item_call.on_click function="Avatar.SendIM" /> </menu_item_call> + <menu_item_call + label="Call" + name="Call"> + <menu_item_call.on_click + function="Avatar.Call" /> + <menu_item_call.on_enable + function="Avatar.EnableCall" /> + </menu_item_call> <menu_item_separator /> <menu_item_call enabled="false" diff --git a/indra/newview/skins/minimal/xui/en/menu_inspect_avatar_gear.xml b/indra/newview/skins/minimal/xui/en/menu_inspect_avatar_gear.xml index 5a4a059781..a11e367d66 100644 --- a/indra/newview/skins/minimal/xui/en/menu_inspect_avatar_gear.xml +++ b/indra/newview/skins/minimal/xui/en/menu_inspect_avatar_gear.xml @@ -26,6 +26,15 @@ <menu_item_call.on_click function="InspectAvatar.IM"/> </menu_item_call> + <menu_item_call + label="Call" + enabled="true" + name="call"> + <menu_item_call.on_click + function="InspectAvatar.Call"/> + <menu_item_call.on_enable + function="InspectAvatar.Gear.EnableCall"/> + </menu_item_call> <menu_item_call label="Teleport" name="teleport"> diff --git a/indra/newview/skins/minimal/xui/en/menu_people_nearby.xml b/indra/newview/skins/minimal/xui/en/menu_people_nearby.xml index 3d64133f54..1840ebd491 100644 --- a/indra/newview/skins/minimal/xui/en/menu_people_nearby.xml +++ b/indra/newview/skins/minimal/xui/en/menu_people_nearby.xml @@ -36,6 +36,16 @@ <menu_item_call.on_click function="Avatar.IM" /> </menu_item_call> + <menu_item_call + label="Call" + layout="topleft" + name="Call"> + <menu_item_call.on_click + function="Avatar.Call" /> + <menu_item_call.on_enable + function="Avatar.EnableItem" + parameter="can_call" /> + </menu_item_call> <menu_item_check label="Block/Unblock" layout="topleft" diff --git a/indra/newview/skins/minimal/xui/en/panel_people.xml b/indra/newview/skins/minimal/xui/en/panel_people.xml index 4a72653d76..68e12cc444 100644 --- a/indra/newview/skins/minimal/xui/en/panel_people.xml +++ b/indra/newview/skins/minimal/xui/en/panel_people.xml @@ -443,7 +443,28 @@ Looking for people to hang out with? Try the Destinations button below. top="0" width="40" /> </layout_panel> - + + <layout_panel + follows="bottom|left|right" + height="23" + layout="bottomleft" + left_pad="3" + name="chat_btn_lp" + user_resize="false" + auto_resize="true" + width="52"> + <button + follows="bottom|left|right" + left="1" + height="23" + label="Call" + layout="topleft" + name="call_btn" + tool_tip="Call this Resident" + top="0" + width="51" /> + </layout_panel> + <layout_panel follows="bottom|left|right" height="23" -- cgit v1.2.3 From af6a5b1f40ff0f0a8f0d10f609fa27da7e40959d Mon Sep 17 00:00:00 2001 From: Eli Linden <eli@lindenlab.com> Date: Tue, 3 May 2011 16:37:12 -0700 Subject: FIX VWR-22337 translation (in utf-8) for "loading terms of service" string --- indra/newview/skins/default/xui/da/floater_tos.xml | 2 +- indra/newview/skins/default/xui/de/floater_tos.xml | 2 +- indra/newview/skins/default/xui/es/floater_tos.xml | 2 +- indra/newview/skins/default/xui/fr/floater_tos.xml | 2 +- indra/newview/skins/default/xui/pl/floater_tos.xml | 2 +- indra/newview/skins/default/xui/pt/floater_tos.xml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/indra/newview/skins/default/xui/da/floater_tos.xml b/indra/newview/skins/default/xui/da/floater_tos.xml index 760f60c996..af9ee0bd06 100644 --- a/indra/newview/skins/default/xui/da/floater_tos.xml +++ b/indra/newview/skins/default/xui/da/floater_tos.xml @@ -4,7 +4,7 @@ http://secondlife.com/app/tos/ </floater.string> <floater.string name="loading_url"> - data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E + data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Henter %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E </floater.string> <button label="Fortsæt" label_selected="Fortsæt" name="Continue"/> <button label="Annullér" label_selected="Annullér" name="Cancel"/> diff --git a/indra/newview/skins/default/xui/de/floater_tos.xml b/indra/newview/skins/default/xui/de/floater_tos.xml index 1f3ef2f0b4..ba329371f8 100644 --- a/indra/newview/skins/default/xui/de/floater_tos.xml +++ b/indra/newview/skins/default/xui/de/floater_tos.xml @@ -4,7 +4,7 @@ http://secondlife.com/app/tos/ </floater.string> <floater.string name="loading_url"> - data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E + data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Wird geladen %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3EServicebedingungen%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E </floater.string> <button label="Weiter" label_selected="Weiter" name="Continue"/> <button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/> diff --git a/indra/newview/skins/default/xui/es/floater_tos.xml b/indra/newview/skins/default/xui/es/floater_tos.xml index f4a0897d73..89092201d9 100644 --- a/indra/newview/skins/default/xui/es/floater_tos.xml +++ b/indra/newview/skins/default/xui/es/floater_tos.xml @@ -4,7 +4,7 @@ http://secondlife.com/app/tos/ </floater.string> <floater.string name="loading_url"> - data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E + data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Cargando %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3Elas%20Condiciones%20del%20servicio%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E </floater.string> <button label="Continuar" label_selected="Continuar" name="Continue"/> <button label="Cancelar" label_selected="Cancelar" name="Cancel"/> diff --git a/indra/newview/skins/default/xui/fr/floater_tos.xml b/indra/newview/skins/default/xui/fr/floater_tos.xml index 8a2a1e1d25..6d58cf77ca 100644 --- a/indra/newview/skins/default/xui/fr/floater_tos.xml +++ b/indra/newview/skins/default/xui/fr/floater_tos.xml @@ -4,7 +4,7 @@ http://secondlife.com/app/tos/ </floater.string> <floater.string name="loading_url"> - data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E + data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Chargement %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3Eles%20Conditions%20d%27utilisation%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E </floater.string> <button label="Continuer" label_selected="Continuer" name="Continue"/> <button label="Annuler" label_selected="Annuler" name="Cancel"/> diff --git a/indra/newview/skins/default/xui/pl/floater_tos.xml b/indra/newview/skins/default/xui/pl/floater_tos.xml index bb2de773f0..8cdf267f4b 100644 --- a/indra/newview/skins/default/xui/pl/floater_tos.xml +++ b/indra/newview/skins/default/xui/pl/floater_tos.xml @@ -4,7 +4,7 @@ http://secondlife.com/app/tos/ </floater.string> <floater.string name="loading_url"> - data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E + data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Ładowanie %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3EWarunki%20Serwisu%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E </floater.string> <button label="Kontynuuj" label_selected="Kontynuuj" name="Continue"/> <button label="Anuluj" label_selected="Anuluj" name="Cancel"/> diff --git a/indra/newview/skins/default/xui/pt/floater_tos.xml b/indra/newview/skins/default/xui/pt/floater_tos.xml index 2675979783..c4954cb61f 100644 --- a/indra/newview/skins/default/xui/pt/floater_tos.xml +++ b/indra/newview/skins/default/xui/pt/floater_tos.xml @@ -4,7 +4,7 @@ http://secondlife.com/app/tos/ </floater.string> <floater.string name="loading_url"> - data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Carregando %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E + data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Carregando %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETermos%20de%20Serviço%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E </floater.string> <button label="Continuar" label_selected="Continuar" name="Continue"/> <button label="Cancelar" label_selected="Cancelar" name="Cancel"/> -- cgit v1.2.3 From 8cc430f691fe65cd03cbac1c4246d836000babd1 Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Tue, 3 May 2011 17:11:58 -0700 Subject: EXP-624 Place profile floater may be opened by SLApp --- indra/newview/app_settings/settings.xml | 11 +++++++++++ indra/newview/app_settings/settings_minimal.xml | 11 +++++++++++ indra/newview/llpanelplaces.cpp | 9 ++++++++- indra/newview/skins/default/xui/en/notifications.xml | 16 +++++++++++++++- 4 files changed, 45 insertions(+), 2 deletions(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 6b56da5edd..a9eb45b14c 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -12546,6 +12546,17 @@ <string>Boolean</string> <key>Value</key> <integer>1</integer> + </map> + <key>EnablePlaceProfile</key> + <map> + <key>Comment</key> + <string>Enable viewing of place profile from web link</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> </map> <key>EnablePicks</key> <map> diff --git a/indra/newview/app_settings/settings_minimal.xml b/indra/newview/app_settings/settings_minimal.xml index 2180abdcee..1e9c3f54fd 100644 --- a/indra/newview/app_settings/settings_minimal.xml +++ b/indra/newview/app_settings/settings_minimal.xml @@ -248,6 +248,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>EnablePlaceProfile</key> + <map> + <key>Comment</key> + <string>Enable viewing of place profile from web link</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>EnablePicks</key> <map> <key>Comment</key> diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp index 00ac34efa5..46262832dc 100644 --- a/indra/newview/llpanelplaces.cpp +++ b/indra/newview/llpanelplaces.cpp @@ -91,11 +91,18 @@ public: LLParcelHandler() : LLCommandHandler("parcel", UNTRUSTED_THROTTLE) { } bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web) - { + { if (params.size() < 2) { return false; } + + if (!LLUI::sSettingGroups["config"]->getBOOL("EnablePlaceProfile")) + { + LLNotificationsUtil::add("NoPlaceInfo", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit")); + return true; + } + LLUUID parcel_id; if (!parcel_id.set(params[0], FALSE)) { diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 3fb3717e68..8c18d1233f 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -7144,7 +7144,21 @@ The site at '<nolink>[HOST_NAME]</nolink>' in realm ' yestext="Quit" notext="Don't Quit"/> </notification> - + + <notification + name="NoPlaceInfo" + label="" + type="alertmodal" + unique="true"> + <tag>fail</tag> + <tag>confirm</tag> + Viewing place profile is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen. + <usetemplate + name="okcancelbuttons" + yestext="Quit" + notext="Don't Quit"/> + </notification> + <notification name="NoPicks" label="" -- cgit v1.2.3 From 950b74c1705cc7d72c5f05fd707ba230b00027f0 Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Tue, 3 May 2011 17:12:43 -0700 Subject: EXP-778 Bring up corresponding IM window on connect to new voice call. --- indra/newview/app_settings/settings.xml | 11 +++++++++++ indra/newview/app_settings/settings_minimal.xml | 11 +++++++++++ indra/newview/llchiclet.cpp | 4 ++++ 3 files changed, 26 insertions(+) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index a9eb45b14c..f83aa20e10 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -12723,5 +12723,16 @@ <key>Value</key> <integer>0</integer> </map> + <key>OpenIMOnVoice</key> + <map> + <key>Comment</key> + <string>Open the corresponding IM window when connecting to a voice call.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> </map> </llsd> diff --git a/indra/newview/app_settings/settings_minimal.xml b/indra/newview/app_settings/settings_minimal.xml index 1e9c3f54fd..bb022b7b11 100644 --- a/indra/newview/app_settings/settings_minimal.xml +++ b/indra/newview/app_settings/settings_minimal.xml @@ -446,5 +446,16 @@ <key>Value</key> <integer>0</integer> </map> + <key>OpenIMOnVoice</key> + <map> + <key>Comment</key> + <string>Open the corresponding IM window when connecting to a voice call.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> </map> </llsd> diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index 277fc9d7b9..3000209aad 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -1184,6 +1184,10 @@ void LLChicletPanel::onCurrentVoiceChannelChanged(const LLUUID& session_id) if(chiclet) { chiclet->setShowSpeaker(true); + if (gSavedSettings.getBOOL("OpenIMOnVoice")) + { + LLIMFloater::show(chiclet->getSessionId()); + } } } -- cgit v1.2.3 From 45145fe7e2b6855b08b2ab94f07e852ef7ffffa3 Mon Sep 17 00:00:00 2001 From: Merov Linden <merov@lindenlab.com> Date: Tue, 3 May 2011 17:34:53 -0700 Subject: EXP-756 : Move the folder resort to first draw and do it only once --- indra/newview/llpanelmaininventory.cpp | 22 ++++++++++++---------- indra/newview/llpanelmaininventory.h | 1 + 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index b9a6938492..f79a1bb5ab 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -139,6 +139,7 @@ BOOL LLPanelMainInventory::postBuild() mActivePanel->getFilter()->markDefault(); mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState); mActivePanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mActivePanel, _1, _2)); + mResortActivePanel = true; } LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>("Recent Items"); if (recent_items_panel) @@ -192,16 +193,6 @@ BOOL LLPanelMainInventory::postBuild() mMenuAdd->getChild<LLMenuItemGL>("Upload Animation")->setLabelArg("[COST]", upload_cost); mMenuAdd->getChild<LLMenuItemGL>("Bulk Upload")->setLabelArg("[COST]", upload_cost); - // EXP-756: Force resorting of the list: in the case of date sorting, one didn't have enough information at - // the beginning to correctly sort the folders. Later resort didn't do anything as the order value was - // set correctly. The workaround is to reset the order to alphabetical (or anything) then to the correct order. - if (mActivePanel) - { - U32 order = mActivePanel->getSortOrder(); - mActivePanel->setSortOrder(LLInventoryFilter::SO_NAME); - mActivePanel->setSortOrder(order); - } - return TRUE; } @@ -538,6 +529,17 @@ void LLPanelMainInventory::draw() { mFilterEditor->setText(mFilterSubString); } + if (mActivePanel && mResortActivePanel) + { + // EXP-756: Force resorting of the list the first time we draw the list: + // In the case of date sorting, we don't have enough information at initialization time + // to correctly sort the folders. Later manual resort doesn't do anything as the order value is + // set correctly. The workaround is to reset the order to alphabetical (or anything) then to the correct order. + U32 order = mActivePanel->getSortOrder(); + mActivePanel->setSortOrder(LLInventoryFilter::SO_NAME); + mActivePanel->setSortOrder(order); + mResortActivePanel = false; + } LLPanel::draw(); updateItemcountText(); } diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h index c2b78ff9ea..2b2ee1c0c9 100644 --- a/indra/newview/llpanelmaininventory.h +++ b/indra/newview/llpanelmaininventory.h @@ -121,6 +121,7 @@ private: LLTabContainer* mFilterTabs; LLHandle<LLFloater> mFinderHandle; LLInventoryPanel* mActivePanel; + bool mResortActivePanel; LLSaveFolderState* mSavedFolderState; std::string mFilterText; std::string mFilterSubString; -- cgit v1.2.3 From a8ba89eb41b5b0eabecf1d78cf0d5ac9f1b11117 Mon Sep 17 00:00:00 2001 From: brad kittenbrink <brad@lindenlab.com> Date: Tue, 3 May 2011 18:15:00 -0700 Subject: Fix for CHOP-619. Found a general solution to our vs2010 precompiled headers problems and eliminated all our special cases for handling them. --- autobuild.xml | 3 --- build.sh | 1 - indra/cmake/00-Common.cmake | 7 +++++++ indra/cmake/Variables.cmake | 2 +- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 7686b48cf5..5ced928668 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -2125,7 +2125,6 @@ <string>-G</string> <string>"Visual Studio 10"</string> <string>-DUNATTENDED:BOOL=ON</string> - <string>-DUSE_PRECOMPILED_HEADERS=ON</string> <string>-DINSTALL_PROPRIETARY=TRUE</string> <string>-DUSE_KDU=FALSE</string> <string>-DFMOD=FALSE</string> @@ -2203,7 +2202,6 @@ <string>-G</string> <string>"Visual Studio 10"</string> <string>-DUNATTENDED:BOOL=ON</string> - <string>-DUSE_PRECOMPILED_HEADERS=ON</string> <string>-DINSTALL_PROPRIETARY=TRUE</string> <string>-DUSE_KDU=FALSE</string> <string>-DFMOD=FALSE</string> @@ -2280,7 +2278,6 @@ <string>-G</string> <string>"Visual Studio 10"</string> <string>-DUNATTENDED:BOOL=ON</string> - <string>-DUSE_PRECOMPILED_HEADERS=ON</string> <string>-DINSTALL_PROPRIETARY=TRUE</string> <string>-DUSE_KDU=FALSE</string> <string>-DFMOD=FALSE</string> diff --git a/build.sh b/build.sh index d112e5ea1c..b281814059 100755 --- a/build.sh +++ b/build.sh @@ -58,7 +58,6 @@ pre_build() "$AUTOBUILD" configure -c $variant -- \ -DPACKAGE:BOOL=ON \ -DRELEASE_CRASH_REPORTING:BOOL=ON \ - -DUSE_PRECOMPILED_HEADERS=FALSE \ -DVIEWER_CHANNEL:STRING="\"$viewer_channel\"" \ -DVIEWER_LOGIN_CHANNEL:STRING="\"$viewer_login_channel\"" \ -DGRID:STRING="\"$viewer_grid\"" \ diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake index 15b827b217..faffdc8ccd 100644 --- a/indra/cmake/00-Common.cmake +++ b/indra/cmake/00-Common.cmake @@ -36,6 +36,13 @@ if (WINDOWS) # Don't build DLLs. set(BUILD_SHARED_LIBS OFF) + # for "backwards compatibility", cmake sneaks in the Zm1000 option which royally + # screws incredibuild. this hack disables it. + # for details see: http://connect.microsoft.com/VisualStudio/feedback/details/368107/clxx-fatal-error-c1027-inconsistent-values-for-ym-between-creation-and-use-of-precompiled-headers + # http://www.ogre3d.org/forums/viewtopic.php?f=2&t=60015 + # http://www.cmake.org/pipermail/cmake/2009-September/032143.html + string(REPLACE "/Zm1000" " " CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od /Zi /MDd /MP -D_SCL_SECURE_NO_WARNINGS=1" CACHE STRING "C++ compiler debug options" FORCE) set(CMAKE_CXX_FLAGS_RELWITHDEBINFO diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake index 03428691cf..2f23e7c307 100644 --- a/indra/cmake/Variables.cmake +++ b/indra/cmake/Variables.cmake @@ -151,7 +151,7 @@ For more information, please see JIRA DEV-14943 - Cmake Linux cannot build both endif (LINUX AND SERVER AND VIEWER) -set(USE_PRECOMPILED_HEADERS OFF CACHE BOOL "Enable use of precompiled header directives where supported.") +set(USE_PRECOMPILED_HEADERS ON CACHE BOOL "Enable use of precompiled header directives where supported.") source_group("CMake Rules" FILES CMakeLists.txt) -- cgit v1.2.3 From 905fc03e5dd422e4d6b74859e22406ec4e12742c Mon Sep 17 00:00:00 2001 From: Xiaohong Bao <bao@lindenlab.com> Date: Wed, 4 May 2011 10:11:39 -0600 Subject: fix for SH-1185: uploading large mesh file sometimes fails and locks up viewer. --- indra/newview/llfloatermodelpreview.cpp | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index ae0e1b7d46..fe9de14747 100644 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -3645,21 +3645,19 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim glodGroupParameterf(mGroup, GLOD_OBJECT_SPACE_ERROR_THRESHOLD, lod_error_threshold); stop_gloderror(); - glodGroupParameteri(mGroup, GLOD_MAX_TRIANGLES, 0); - stop_gloderror(); - - glodAdaptGroup(mGroup); - stop_gloderror(); - - if (lod_mode == GLOD_TRIANGLE_BUDGET) - { //SH-632 Always adapt to 0 before adapting to actual desired amount, and always - //add 1 to desired amount to avoid decimating below desired amount + if (lod_mode != GLOD_TRIANGLE_BUDGET) + { + glodGroupParameteri(mGroup, GLOD_MAX_TRIANGLES, 0); + } + else + { + //SH-632: always add 1 to desired amount to avoid decimating below desired amount glodGroupParameteri(mGroup, GLOD_MAX_TRIANGLES, triangle_count+1); - stop_gloderror(); - - glodAdaptGroup(mGroup); - stop_gloderror(); } + + stop_gloderror(); + glodAdaptGroup(mGroup); + stop_gloderror(); for (U32 mdl_idx = 0; mdl_idx < mBaseModel.size(); ++mdl_idx) { -- cgit v1.2.3 From 36c671cf15e8889df4f173cf455896b7c9a115e1 Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Wed, 4 May 2011 12:12:42 -0500 Subject: STORM-1210 Update PCRE libs for mac and linux. --- autobuild.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 04f789ef01..e289af1205 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1510,9 +1510,9 @@ <key>archive</key> <map> <key>hash</key> - <string>cb04654cdfe93e3c8d16fef0c475e2bb</string> + <string>0566e5ea38e2ba2362fe8e0a695d67e4</string> <key>url</key> - <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-pcre/rev/226370/arch/Darwin/installer/pcre-7.6-darwin-20110411.tar.bz2</string> + <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-pcre/rev/228816/arch/Darwin/installer/pcre-7.6-darwin-20110504.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -1522,9 +1522,9 @@ <key>archive</key> <map> <key>hash</key> - <string>18854c815c6f960e22add25cf1ff93d4</string> + <string>6e390bc796ee2381b414e6d599b37690</string> <key>url</key> - <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-pcre/rev/226572/arch/Linux/installer/pcre-7.6-linux-20110413.tar.bz2</string> + <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-pcre/rev/228816/arch/Linux/installer/pcre-7.6-linux-20110504.tar.bz2</string> </map> <key>name</key> <string>linux</string> -- cgit v1.2.3 From 5eed546adfbd43d6814f7a0edeb32f00331a366a Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Wed, 4 May 2011 12:45:40 -0500 Subject: STORM-1210 Public URLs for pcre --- autobuild.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index e289af1205..24759dd71b 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1510,9 +1510,9 @@ <key>archive</key> <map> <key>hash</key> - <string>0566e5ea38e2ba2362fe8e0a695d67e4</string> + <string>a8e74694a0f4248228c13c845ed0a6f8</string> <key>url</key> - <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-pcre/rev/228816/arch/Darwin/installer/pcre-7.6-darwin-20110504.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-pcre/rev/228822/arch/Darwin/installer/pcre-7.6-darwin-20110504.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -1522,9 +1522,9 @@ <key>archive</key> <map> <key>hash</key> - <string>6e390bc796ee2381b414e6d599b37690</string> + <string>bb0abe962b3b8208ed2dab0424aab33d</string> <key>url</key> - <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-pcre/rev/228816/arch/Linux/installer/pcre-7.6-linux-20110504.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-pcre/rev/228822/arch/Linux/installer/pcre-7.6-linux-20110504.tar.bz2</string> </map> <key>name</key> <string>linux</string> -- cgit v1.2.3 From 8245e381cb1657cbfcf434659b4aaa6cd155a3ae Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Wed, 4 May 2011 12:54:07 -0500 Subject: STORM-1210 Make llconvexdecomposition private --- autobuild.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 24759dd71b..fb2562aabc 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1110,9 +1110,9 @@ <key>archive</key> <map> <key>hash</key> - <string>bfa0e1ce006302f6d90b712b20e2d96e</string> + <string>6e45ad68506cd1ba49fd35a3201f0478</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llconvexdecomposition/rev/226714/arch/Darwin/installer/llconvexdecomposition-0.1-darwin-20110415.tar.bz2</string> + <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-llconvexdecomposition/rev/228821/arch/Darwin/installer/llconvexdecomposition-0.1-darwin-20110504.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -1122,9 +1122,9 @@ <key>archive</key> <map> <key>hash</key> - <string>d6207290496f4b464996924b6319932e</string> + <string>00ff5144612c2e261a0811a4503ce3ba</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llconvexdecomposition/rev/226714/arch/Linux/installer/llconvexdecomposition-0.1-linux-20110415.tar.bz2</string> + <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-llconvexdecomposition/rev/228821/arch/Linux/installer/llconvexdecomposition-0.1-linux-20110504.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -1134,9 +1134,9 @@ <key>archive</key> <map> <key>hash</key> - <string>95a1d483f3d01f480b55801e841b2151</string> + <string>a4635dcbbe0915ce023dd41d3b848d4c</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llconvexdecomposition/rev/227989/arch/CYGWIN/installer/llconvexdecomposition-0.1-windows-20110428.tar.bz2</string> + <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-llconvexdecomposition/rev/228821/arch/CYGWIN/installer/llconvexdecomposition-0.1-windows-20110504.tar.bz2</string> </map> <key>name</key> <string>windows</string> -- cgit v1.2.3 From f3bb2e31dc6a1e8e02854a70db4ecd4cf586d4ba Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Wed, 4 May 2011 11:16:08 -0700 Subject: EXP-759 Opening the Voice preferences window from the up arrow on the speak button turns voice off for user without notice also causes calls to be ended --- indra/newview/llfloatersounddevices.cpp | 7 ++++++- indra/newview/llpanelvoicedevicesettings.cpp | 17 ++++++++++++----- indra/newview/llpanelvoicedevicesettings.h | 3 +++ .../skins/default/xui/en/floater_sound_devices.xml | 2 +- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/indra/newview/llfloatersounddevices.cpp b/indra/newview/llfloatersounddevices.cpp index 4f3945c95f..3903b9b015 100644 --- a/indra/newview/llfloatersounddevices.cpp +++ b/indra/newview/llfloatersounddevices.cpp @@ -63,7 +63,12 @@ BOOL LLFloaterSoundDevices::postBuild() if (mDragHandle) mDragHandle->setTitleVisible(TRUE); updateTransparency(TT_ACTIVE); // force using active floater transparency (STORM-730) - + + LLPanelVoiceDeviceSettings* panel = findChild<LLPanelVoiceDeviceSettings>("device_settings_panel"); + if (panel) + { + panel->setUseTuningMode(false); + } return TRUE; } diff --git a/indra/newview/llpanelvoicedevicesettings.cpp b/indra/newview/llpanelvoicedevicesettings.cpp index d13f57bd6a..71bb4a5584 100644 --- a/indra/newview/llpanelvoicedevicesettings.cpp +++ b/indra/newview/llpanelvoicedevicesettings.cpp @@ -51,6 +51,7 @@ LLPanelVoiceDeviceSettings::LLPanelVoiceDeviceSettings() mInputDevice = gSavedSettings.getString("VoiceInputAudioDevice"); mOutputDevice = gSavedSettings.getString("VoiceOutputAudioDevice"); mDevicesUpdated = FALSE; + mUseTuningMode = true; // grab "live" mic volume level mMicVolume = gSavedSettings.getF32("AudioLevelMic"); @@ -96,7 +97,7 @@ void LLPanelVoiceDeviceSettings::draw() // let user know that volume indicator is not yet available bool is_in_tuning_mode = LLVoiceClient::getInstance()->inTuningMode(); - getChildView("wait_text")->setVisible( !is_in_tuning_mode); + getChildView("wait_text")->setVisible( !is_in_tuning_mode && mUseTuningMode); LLPanel::draw(); @@ -292,14 +293,20 @@ void LLPanelVoiceDeviceSettings::initialize() LLVoiceClient::getInstance()->refreshDeviceLists(); // put voice client in "tuning" mode - LLVoiceClient::getInstance()->tuningStart(); - LLVoiceChannel::suspend(); + if (mUseTuningMode) + { + LLVoiceClient::getInstance()->tuningStart(); + LLVoiceChannel::suspend(); + } } void LLPanelVoiceDeviceSettings::cleanup() { - LLVoiceClient::getInstance()->tuningStop(); - LLVoiceChannel::resume(); + if (mUseTuningMode) + { + LLVoiceClient::getInstance()->tuningStop(); + LLVoiceChannel::resume(); + } } void LLPanelVoiceDeviceSettings::onCommitInputDevice() diff --git a/indra/newview/llpanelvoicedevicesettings.h b/indra/newview/llpanelvoicedevicesettings.h index 636b8b9948..d09476d469 100644 --- a/indra/newview/llpanelvoicedevicesettings.h +++ b/indra/newview/llpanelvoicedevicesettings.h @@ -45,6 +45,8 @@ public: void cleanup(); /*virtual*/ void handleVisibilityChange ( BOOL new_visibility ); + + void setUseTuningMode(bool use) { mUseTuningMode = use; }; protected: void onCommitInputDevice(); @@ -56,6 +58,7 @@ protected: class LLComboBox *mCtrlInputDevices; class LLComboBox *mCtrlOutputDevices; BOOL mDevicesUpdated; + bool mUseTuningMode; }; #endif // LL_LLPANELVOICEDEVICESETTINGS_H diff --git a/indra/newview/skins/default/xui/en/floater_sound_devices.xml b/indra/newview/skins/default/xui/en/floater_sound_devices.xml index 584413c030..b5d95aeca4 100644 --- a/indra/newview/skins/default/xui/en/floater_sound_devices.xml +++ b/indra/newview/skins/default/xui/en/floater_sound_devices.xml @@ -21,7 +21,7 @@ follows="all" filename="panel_sound_devices.xml" name="device_settings_panel" - width="300" + width="400" left="2" top="26" class="panel_voice_device_settings"/> -- cgit v1.2.3 From f3b0b5f3f1654a1df30d4516aca328f3add31fa0 Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Wed, 4 May 2011 15:43:21 -0500 Subject: CTS-537 Apply tweak from Tofu Buzzard. --- .../app_settings/shaders/class1/deferred/postDeferredF.glsl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl index f377685045..77f1b2224c 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl @@ -57,11 +57,11 @@ void dofSampleNear(inout vec4 diff, inout float w, float cur_sc, vec2 tc) float sc = calc_cof(d); - float wg = 1.0; + float wg = 0.25; vec4 s = texture2DRect(diffuseRect, tc); // de-weight dull areas to make highlights 'pop' - wg *= s.r+s.g+s.b; + wg += s.r+s.g+s.b; diff += wg*s; @@ -77,11 +77,11 @@ void dofSample(inout vec4 diff, inout float w, float min_sc, float cur_depth, ve if (sc > min_sc //sampled pixel is more "out of focus" than current sample radius || d < cur_depth) //sampled pixel is further away than current pixel { - float wg = 1.0; + float wg = 0.25; vec4 s = texture2DRect(diffuseRect, tc); // de-weight dull areas to make highlights 'pop' - wg *= s.r+s.g+s.b; + wg += s.r+s.g+s.b; diff += wg*s; -- cgit v1.2.3 From 91980918f0341bec0145156875d22503e8beea4e Mon Sep 17 00:00:00 2001 From: prep linden <prep@lindenlab.com> Date: Wed, 4 May 2011 17:18:31 -0400 Subject: Fix for Sh-1481 --- indra/newview/llfloatermodelpreview.cpp | 16 +++++++--------- indra/newview/llfloatermodelpreview.h | 8 ++++++-- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index ae0e1b7d46..afe57ebb70 100644 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -1560,14 +1560,14 @@ bool LLModelLoader::doLoadModel() //(which means we have all the joints that are required for an avatar versus //a skinned asset attached to a node in a file that contains an entire skeleton, //but does not use the skeleton). - + buildJointToNodeMappingFromScene( root ); mPreview->critiqueRigForUploadApplicability( model->mSkinInfo.mJointNames ); if ( !missingSkeletonOrScene ) { //Set the joint translations on the avatar - if it's a full mapping //The joints are reset in the dtor - if ( mPreview->getResetJointFlag() ) + if ( mPreview->getRigWithSceneParity() ) { std::map<std::string, std::string> :: const_iterator masterJointIt = mJointMap.begin(); std::map<std::string, std::string> :: const_iterator masterJointItEnd = mJointMap.end(); @@ -1774,10 +1774,6 @@ bool LLModelLoader::doLoadModel() handlePivotPoint( root ); - buildJointToNodeMappingFromScene( root ); - - mPreview->critiqueJointToNodeMappingFromScene(); - return true; } @@ -2016,6 +2012,8 @@ void LLModelLoader::handlePivotPoint( daeElement* pRoot ) //----------------------------------------------------------------------------- void LLModelPreview::critiqueRigForUploadApplicability( const std::vector<std::string> &jointListFromAsset ) { + critiqueJointToNodeMappingFromScene(); + //Determines the following use cases for a rig: //1. It is suitable for upload with skin weights & joint positions, or //2. It is suitable for upload as standard av with just skin weights @@ -2034,7 +2032,7 @@ void LLModelPreview::critiqueRigForUploadApplicability( const std::vector<std::s setLegacyRigValid( true ); } - if ( isJointPositionUploadOK ) + if ( getRigWithSceneParity() && isJointPositionUploadOK ) { setResetJointFlag( true ); } @@ -2078,12 +2076,11 @@ void LLModelPreview::critiqueJointToNodeMappingFromScene( void ) if ( result ) { setResetJointFlag( true ); - //llinfos<<"Full"<<llendl; + setRigWithSceneParity( true ); } else { setResetJointFlag( false ); - //llinfos<<"Partial"<<llendl; } } //----------------------------------------------------------------------------- @@ -2650,6 +2647,7 @@ LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp) , mLegacyRigValid( false ) , mRigValidJointUpload( false ) , mResetJoints( false ) +, mRigParityWithScene( false ) , mLastJointUpdate( false ) { mNeedsUpdate = TRUE; diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h index 7927edcd36..92104c01f4 100644 --- a/indra/newview/llfloatermodelpreview.h +++ b/indra/newview/llfloatermodelpreview.h @@ -339,8 +339,10 @@ public: U32 getLoadState() { return mLoadState; } //setRestJointFlag: If an asset comes through that changes the joints, we want the reset to persist void setResetJointFlag( bool state ) { if ( !mResetJoints ) mResetJoints = state; } - bool getResetJointFlag( void ) { return mResetJoints; } - + const bool getResetJointFlag( void ) const { return mResetJoints; } + void setRigWithSceneParity( bool state ) { mRigParityWithScene = state; } + const bool getRigWithSceneParity( void ) const { return mRigParityWithScene; } + LLVector3 getTranslationForJointOffset( std::string joint ); protected: @@ -370,6 +372,8 @@ public: bool mLoading; U32 mLoadState; bool mResetJoints; + bool mRigParityWithScene; + std::map<std::string, bool> mViewOption; //GLOD object parameters (must rebuild object if these change) -- cgit v1.2.3 From 5d33a55c08be0a2bd1a5f6185039754ed46379d0 Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Wed, 4 May 2011 16:44:10 -0500 Subject: SH-1455 Faster, better, more reliable disabling of DoF effect when edit menu is open and when effect is opted out of. --- .../class1/deferred/postDeferredNoDoFF.glsl | 24 +++ indra/newview/lldrawpoolalpha.cpp | 6 +- indra/newview/llviewershadermgr.cpp | 11 ++ indra/newview/llviewershadermgr.h | 1 + indra/newview/pipeline.cpp | 181 +++++++++++---------- 5 files changed, 135 insertions(+), 88 deletions(-) create mode 100644 indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl new file mode 100644 index 0000000000..ab48d08bbb --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl @@ -0,0 +1,24 @@ +/** + * @file postDeferredF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ + +#version 120 + +#extension GL_ARB_texture_rectangle : enable + +uniform sampler2DRect diffuseRect; +uniform sampler2D bloomMap; + +uniform vec2 screen_res; +varying vec2 vary_fragcoord; + +void main() +{ + vec4 diff = texture2DRect(diffuseRect, vary_fragcoord.xy); + + vec4 bloom = texture2D(bloomMap, vary_fragcoord.xy/screen_res); + gl_FragColor = diff + bloom; +} diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp index 2cfd3b0a33..8b5a2ce781 100644 --- a/indra/newview/lldrawpoolalpha.cpp +++ b/indra/newview/lldrawpoolalpha.cpp @@ -107,10 +107,14 @@ S32 LLDrawPoolAlpha::getNumPostDeferredPasses() { //skip depth buffer filling pass when rendering impostors return 1; } - else + else if (gSavedSettings.getBOOL("RenderDepthOfField")) { return 2; } + else + { + return 1; + } } void LLDrawPoolAlpha::beginPostDeferredPass(S32 pass) diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 25cf63a367..e81ee72c05 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -137,6 +137,7 @@ LLGLSLShader gDeferredGIProgram; LLGLSLShader gDeferredGIFinalProgram; LLGLSLShader gDeferredPostGIProgram; LLGLSLShader gDeferredPostProgram; +LLGLSLShader gDeferredPostNoDoFProgram; LLGLSLShader gLuminanceGatherProgram; @@ -1246,6 +1247,16 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() success = gDeferredPostProgram.createShader(NULL, NULL); } + if (success) + { + gDeferredPostNoDoFProgram.mName = "Deferred Post Shader"; + gDeferredPostNoDoFProgram.mShaderFiles.clear(); + gDeferredPostNoDoFProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredV.glsl", GL_VERTEX_SHADER_ARB)); + gDeferredPostNoDoFProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoDoFF.glsl", GL_FRAGMENT_SHADER_ARB)); + gDeferredPostNoDoFProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; + success = gDeferredPostNoDoFProgram.createShader(NULL, NULL); + } + if (mVertexShaderLevel[SHADER_DEFERRED] > 1) { if (success) diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h index f31d2d1836..72ac5e02ee 100644 --- a/indra/newview/llviewershadermgr.h +++ b/indra/newview/llviewershadermgr.h @@ -368,6 +368,7 @@ extern LLGLSLShader gDeferredSoftenProgram; extern LLGLSLShader gDeferredShadowProgram; extern LLGLSLShader gDeferredPostGIProgram; extern LLGLSLShader gDeferredPostProgram; +extern LLGLSLShader gDeferredPostNoDoFProgram; extern LLGLSLShader gDeferredAvatarShadowProgram; extern LLGLSLShader gDeferredAttachmentShadowProgram; extern LLGLSLShader gDeferredAlphaProgram; diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 21fbe52ccd..02c17f9e78 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -6275,128 +6275,135 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield) if (LLPipeline::sRenderDeferred && !LLViewerCamera::getInstance()->cameraUnderWater()) { + bool dof_enabled = true; + LLGLSLShader* shader = &gDeferredPostProgram; if (LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_DEFERRED) > 2) { shader = &gDeferredGIFinalProgram; + dof_enabled = false; + } + else if (LLToolMgr::getInstance()->inBuildMode() || !gSavedSettings.getBOOL("RenderDepthOfField")) + { //squish focal length when in build mode (or if DoF is disabled) so DoF doesn't make editing objects difficult + shader = &gDeferredPostNoDoFProgram; + dof_enabled = false; } + LLGLDisable blend(GL_BLEND); bindDeferredShader(*shader); - //depth of field focal plane calculations + if (dof_enabled) + { + //depth of field focal plane calculations - static F32 current_distance = 16.f; - static F32 start_distance = 16.f; - static F32 transition_time = 1.f; + static F32 current_distance = 16.f; + static F32 start_distance = 16.f; + static F32 transition_time = 1.f; - LLVector3 focus_point; + LLVector3 focus_point; - LLViewerObject* obj = LLViewerMediaFocus::getInstance()->getFocusedObject(); - if (obj && obj->mDrawable && obj->isSelected()) - { - S32 face_idx = LLViewerMediaFocus::getInstance()->getFocusedFace(); - if (obj && obj->mDrawable) + LLViewerObject* obj = LLViewerMediaFocus::getInstance()->getFocusedObject(); + if (obj && obj->mDrawable && obj->isSelected()) { - LLFace* face = obj->mDrawable->getFace(face_idx); - if (face) + S32 face_idx = LLViewerMediaFocus::getInstance()->getFocusedFace(); + if (obj && obj->mDrawable) { - focus_point = face->getPositionAgent(); + LLFace* face = obj->mDrawable->getFace(face_idx); + if (face) + { + focus_point = face->getPositionAgent(); + } } } - } - if (focus_point.isExactlyZero()) - { - if (LLViewerJoystick::getInstance()->getOverrideCamera()) + if (focus_point.isExactlyZero()) { - focus_point = gDebugRaycastIntersection; - } - else if (gAgentCamera.cameraMouselook()) - { - gViewerWindow->cursorIntersect(-1, -1, 512.f, NULL, -1, FALSE, - NULL, - &focus_point); - } - else - { - LLViewerObject* obj = gAgentCamera.getFocusObject(); - if (obj) + if (LLViewerJoystick::getInstance()->getOverrideCamera()) { - focus_point = LLVector3(gAgentCamera.getFocusGlobal()-gAgent.getRegion()->getOriginGlobal()); + focus_point = gDebugRaycastIntersection; + } + else if (gAgentCamera.cameraMouselook()) + { + gViewerWindow->cursorIntersect(-1, -1, 512.f, NULL, -1, FALSE, + NULL, + &focus_point); } else { - focus_point = gDebugRaycastIntersection; + LLViewerObject* obj = gAgentCamera.getFocusObject(); + if (obj) + { + focus_point = LLVector3(gAgentCamera.getFocusGlobal()-gAgent.getRegion()->getOriginGlobal()); + } + else + { + focus_point = gDebugRaycastIntersection; + } } } - } - LLVector3 eye = LLViewerCamera::getInstance()->getOrigin(); - F32 target_distance = 16.f; - if (!focus_point.isExactlyZero()) - { - target_distance = LLViewerCamera::getInstance()->getAtAxis() * (focus_point-eye); - } - - if (transition_time >= 1.f && - fabsf(current_distance-target_distance)/current_distance > 0.01f) - { //large shift happened, interpolate smoothly to new target distance - transition_time = 0.f; - start_distance = current_distance; - } - else if (transition_time < 1.f) - { //currently in a transition, continue interpolating - transition_time += 1.f/gSavedSettings.getF32("CameraFocusTransitionTime")*gFrameIntervalSeconds; - transition_time = llmin(transition_time, 1.f); + LLVector3 eye = LLViewerCamera::getInstance()->getOrigin(); + F32 target_distance = 16.f; + if (!focus_point.isExactlyZero()) + { + target_distance = LLViewerCamera::getInstance()->getAtAxis() * (focus_point-eye); + } - F32 t = cosf(transition_time*F_PI+F_PI)*0.5f+0.5f; - current_distance = start_distance + (target_distance-start_distance)*t; - } - else - { //small or no change, just snap to target distance - current_distance = target_distance; - } + if (transition_time >= 1.f && + fabsf(current_distance-target_distance)/current_distance > 0.01f) + { //large shift happened, interpolate smoothly to new target distance + transition_time = 0.f; + start_distance = current_distance; + } + else if (transition_time < 1.f) + { //currently in a transition, continue interpolating + transition_time += 1.f/gSavedSettings.getF32("CameraFocusTransitionTime")*gFrameIntervalSeconds; + transition_time = llmin(transition_time, 1.f); - //convert to mm - F32 subject_distance = current_distance*1000.f; - F32 fnumber = gSavedSettings.getF32("CameraFNumber"); - F32 default_focal_length = gSavedSettings.getF32("CameraFocalLength"); + F32 t = cosf(transition_time*F_PI+F_PI)*0.5f+0.5f; + current_distance = start_distance + (target_distance-start_distance)*t; + } + else + { //small or no change, just snap to target distance + current_distance = target_distance; + } - if (LLToolMgr::getInstance()->inBuildMode() || !gSavedSettings.getBOOL("RenderDepthOfField")) - { //squish focal length when in build mode (or if DoF is disabled) so DoF doesn't make editing objects difficult - default_focal_length = 5.f; - } + //convert to mm + F32 subject_distance = current_distance*1000.f; + F32 fnumber = gSavedSettings.getF32("CameraFNumber"); + F32 default_focal_length = gSavedSettings.getF32("CameraFocalLength"); - F32 fov = LLViewerCamera::getInstance()->getView(); + F32 fov = LLViewerCamera::getInstance()->getView(); - const F32 default_fov = gSavedSettings.getF32("CameraFieldOfView") * F_PI/180.f; - //const F32 default_aspect_ratio = gSavedSettings.getF32("CameraAspectRatio"); + const F32 default_fov = gSavedSettings.getF32("CameraFieldOfView") * F_PI/180.f; + //const F32 default_aspect_ratio = gSavedSettings.getF32("CameraAspectRatio"); - //F32 aspect_ratio = (F32) mScreen.getWidth()/(F32)mScreen.getHeight(); + //F32 aspect_ratio = (F32) mScreen.getWidth()/(F32)mScreen.getHeight(); - F32 dv = 2.f*default_focal_length * tanf(default_fov/2.f); - //F32 dh = 2.f*default_focal_length * tanf(default_fov*default_aspect_ratio/2.f); + F32 dv = 2.f*default_focal_length * tanf(default_fov/2.f); + //F32 dh = 2.f*default_focal_length * tanf(default_fov*default_aspect_ratio/2.f); - F32 focal_length = dv/(2*tanf(fov/2.f)); + F32 focal_length = dv/(2*tanf(fov/2.f)); - //F32 tan_pixel_angle = tanf(LLDrawable::sCurPixelAngle); + //F32 tan_pixel_angle = tanf(LLDrawable::sCurPixelAngle); - // from wikipedia -- c = |s2-s1|/s2 * f^2/(N(S1-f)) - // where N = fnumber - // s2 = dot distance - // s1 = subject distance - // f = focal length - // - - F32 blur_constant = focal_length*focal_length/(fnumber*(subject_distance-focal_length)); - blur_constant /= 1000.f; //convert to meters for shader - F32 magnification = focal_length/(subject_distance-focal_length); - - shader->uniform1f("focal_distance", -subject_distance/1000.f); - shader->uniform1f("blur_constant", blur_constant); - shader->uniform1f("tan_pixel_angle", tanf(1.f/LLDrawable::sCurPixelAngle)); - shader->uniform1f("magnification", magnification); + // from wikipedia -- c = |s2-s1|/s2 * f^2/(N(S1-f)) + // where N = fnumber + // s2 = dot distance + // s1 = subject distance + // f = focal length + // + + F32 blur_constant = focal_length*focal_length/(fnumber*(subject_distance-focal_length)); + blur_constant /= 1000.f; //convert to meters for shader + F32 magnification = focal_length/(subject_distance-focal_length); + + shader->uniform1f("focal_distance", -subject_distance/1000.f); + shader->uniform1f("blur_constant", blur_constant); + shader->uniform1f("tan_pixel_angle", tanf(1.f/LLDrawable::sCurPixelAngle)); + shader->uniform1f("magnification", magnification); + } S32 channel = shader->enableTexture(LLViewerShaderMgr::DEFERRED_DIFFUSE, LLTexUnit::TT_RECT_TEXTURE); if (channel > -1) -- cgit v1.2.3 From 36938bd6e28b76a845b05d10231b4f9f9f8a1b96 Mon Sep 17 00:00:00 2001 From: Eli Linden <eli@lindenlab.com> Date: Wed, 4 May 2011 14:53:22 -0700 Subject: FIX VWR-19022 ES linguistic --- indra/newview/skins/default/xui/es/menu_favorites.xml | 2 +- indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml | 2 +- indra/newview/skins/default/xui/es/menu_teleport_history_item.xml | 2 +- indra/newview/skins/minimal/xui/es/menu_favorites.xml | 2 +- indra/newview/skins/minimal/xui/es/menu_inspect_avatar_gear.xml | 2 +- indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/indra/newview/skins/default/xui/es/menu_favorites.xml b/indra/newview/skins/default/xui/es/menu_favorites.xml index c8a7858ddb..85210d5c49 100644 --- a/indra/newview/skins/default/xui/es/menu_favorites.xml +++ b/indra/newview/skins/default/xui/es/menu_favorites.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="Popup"> - <menu_item_call label="Teleportarse" name="Teleport To Landmark"/> + <menu_item_call label="Teleportar" name="Teleport To Landmark"/> <menu_item_call label="Ver/Editar el hito" name="Landmark Open"/> <menu_item_call label="Copiar la SLurl" name="Copy slurl"/> <menu_item_call label="Mostrar en el mapa" name="Show On Map"/> diff --git a/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml index bee4c61da2..82fc8ddd39 100644 --- a/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml +++ b/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml @@ -4,7 +4,7 @@ <menu_item_call label="Añadir como amigo" name="add_friend"/> <menu_item_call label="MI" name="im"/> <menu_item_call label="Llamada" name="call"/> - <menu_item_call label="Teleportarse" name="teleport"/> + <menu_item_call label="Teleportar" name="teleport"/> <menu_item_call label="Invitar al grupo" name="invite_to_group"/> <menu_item_call label="Ignorar" name="block"/> <menu_item_call label="Designorar" name="unblock"/> diff --git a/indra/newview/skins/default/xui/es/menu_teleport_history_item.xml b/indra/newview/skins/default/xui/es/menu_teleport_history_item.xml index ed33c55aca..c482907812 100644 --- a/indra/newview/skins/default/xui/es/menu_teleport_history_item.xml +++ b/indra/newview/skins/default/xui/es/menu_teleport_history_item.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Teleport History Item Context Menu"> - <menu_item_call label="Teleportarse" name="Teleport"/> + <menu_item_call label="Teleportar" name="Teleport"/> <menu_item_call label="Más información" name="More Information"/> <menu_item_call label="Copiar al portapapeles" name="CopyToClipboard"/> </context_menu> diff --git a/indra/newview/skins/minimal/xui/es/menu_favorites.xml b/indra/newview/skins/minimal/xui/es/menu_favorites.xml index c8a7858ddb..85210d5c49 100644 --- a/indra/newview/skins/minimal/xui/es/menu_favorites.xml +++ b/indra/newview/skins/minimal/xui/es/menu_favorites.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="Popup"> - <menu_item_call label="Teleportarse" name="Teleport To Landmark"/> + <menu_item_call label="Teleportar" name="Teleport To Landmark"/> <menu_item_call label="Ver/Editar el hito" name="Landmark Open"/> <menu_item_call label="Copiar la SLurl" name="Copy slurl"/> <menu_item_call label="Mostrar en el mapa" name="Show On Map"/> diff --git a/indra/newview/skins/minimal/xui/es/menu_inspect_avatar_gear.xml b/indra/newview/skins/minimal/xui/es/menu_inspect_avatar_gear.xml index ebe33cea11..b4b964d096 100644 --- a/indra/newview/skins/minimal/xui/es/menu_inspect_avatar_gear.xml +++ b/indra/newview/skins/minimal/xui/es/menu_inspect_avatar_gear.xml @@ -3,7 +3,7 @@ <menu_item_call label="Ver el perfil" name="view_profile"/> <menu_item_call label="Añadir como amigo" name="add_friend"/> <menu_item_call label="MI" name="im"/> - <menu_item_call label="Teleportarse" name="teleport"/> + <menu_item_call label="Teleportar" name="teleport"/> <menu_item_call label="Ignorar" name="block"/> <menu_item_call label="Designorar" name="unblock"/> <menu_item_call label="Denunciar" name="report"/> diff --git a/indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml b/indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml index ed33c55aca..c482907812 100644 --- a/indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml +++ b/indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Teleport History Item Context Menu"> - <menu_item_call label="Teleportarse" name="Teleport"/> + <menu_item_call label="Teleportar" name="Teleport"/> <menu_item_call label="Más información" name="More Information"/> <menu_item_call label="Copiar al portapapeles" name="CopyToClipboard"/> </context_menu> -- cgit v1.2.3 From a81356f841860c0da1ff991393239f6c9221c9f1 Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Wed, 4 May 2011 17:10:40 -0500 Subject: SH-1456 Fix for bad DoF focal point when camera is at rest. --- indra/newview/pipeline.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 02c17f9e78..923c02b860 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -6305,7 +6305,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield) LLViewerObject* obj = LLViewerMediaFocus::getInstance()->getFocusedObject(); if (obj && obj->mDrawable && obj->isSelected()) - { + { //focus on selected media object S32 face_idx = LLViewerMediaFocus::getInstance()->getFocusedFace(); if (obj && obj->mDrawable) { @@ -6320,11 +6320,11 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield) if (focus_point.isExactlyZero()) { if (LLViewerJoystick::getInstance()->getOverrideCamera()) - { + { //focus on point under cursor focus_point = gDebugRaycastIntersection; } else if (gAgentCamera.cameraMouselook()) - { + { //focus on point under mouselook crosshairs gViewerWindow->cursorIntersect(-1, -1, 512.f, NULL, -1, FALSE, NULL, &focus_point); @@ -6333,12 +6333,12 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield) { LLViewerObject* obj = gAgentCamera.getFocusObject(); if (obj) - { + { //focus on alt-zoom target focus_point = LLVector3(gAgentCamera.getFocusGlobal()-gAgent.getRegion()->getOriginGlobal()); } else - { - focus_point = gDebugRaycastIntersection; + { //focus on your avatar + focus_point = gAgent.getPositionAgent(); } } } -- cgit v1.2.3 From c9f344d456392025d53b7a74c4012c3ef39d01ce Mon Sep 17 00:00:00 2001 From: Xiaohong Bao <bao@lindenlab.com> Date: Wed, 4 May 2011 16:27:30 -0600 Subject: fix for SH-1437: Crash in model wizard --- indra/newview/skins/default/xui/en/floater_model_wizard.xml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/indra/newview/skins/default/xui/en/floater_model_wizard.xml b/indra/newview/skins/default/xui/en/floater_model_wizard.xml index 03af348a8d..92d57b20be 100644 --- a/indra/newview/skins/default/xui/en/floater_model_wizard.xml +++ b/indra/newview/skins/default/xui/en/floater_model_wizard.xml @@ -449,12 +449,12 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se <slider follows="left|top" height="20" - increment="0.5" + increment="1" layout="topleft" left="204" - max_val="4" - initial_value="3" - min_val="2" + max_val="3" + initial_value="2" + min_val="0" name="accuracy_slider" show_text="false" top="130" @@ -464,7 +464,8 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se top_pad="0" width="300" left_delta="6" - height="4">' ' '</text> + height="4">' + </text> <icon -- cgit v1.2.3 From ebda8f883b742de82db74cab993612737f5dec9e Mon Sep 17 00:00:00 2001 From: brad kittenbrink <brad@lindenlab.com> Date: Wed, 4 May 2011 16:07:27 -0700 Subject: Work in progress on CHOP-609. Added checking in indra/cmake/Prebuilt.cmake to skip unnecessary unpacking of already installed packages. --- indra/CMakeLists.txt | 6 +++-- indra/cmake/Prebuilt.cmake | 56 +++++++++++++++++++++++++++++----------------- 2 files changed, 39 insertions(+), 23 deletions(-) diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt index 310e6cbdd4..d1042d6e86 100644 --- a/indra/CMakeLists.txt +++ b/indra/CMakeLists.txt @@ -35,8 +35,10 @@ endif (NOT CMAKE_BUILD_TYPE) # For the library installation process; # see cmake/Prebuild.cmake for the counterpart code. -file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/temp) -file(WRITE ${CMAKE_BINARY_DIR}/temp/sentinel_installed "0") +if ("${CMAKE_SOURCE_DIR}/../autobuild.xml" IS_NEWER_THAN "${CMAKE_BINARY_DIR}/temp/sentinel_installed") + file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/temp) + file(WRITE ${CMAKE_BINARY_DIR}/temp/sentinel_installed "0") +endif ("${CMAKE_SOURCE_DIR}/../autobuild.xml" IS_NEWER_THAN "${CMAKE_BINARY_DIR}/temp/sentinel_installed") add_subdirectory(cmake) add_subdirectory(${LIBS_OPEN_PREFIX}llaudio) diff --git a/indra/cmake/Prebuilt.cmake b/indra/cmake/Prebuilt.cmake index 1b60d176f1..dbb4dfc46c 100644 --- a/indra/cmake/Prebuilt.cmake +++ b/indra/cmake/Prebuilt.cmake @@ -1,35 +1,49 @@ # -*- cmake -*- include(FindAutobuild) +if(INSTALL_PROPRIETARY) + include(FindSCP) +endif(INSTALL_PROPRIETARY) +# The use_prebuilt_binary macro handles automated installation of package +# dependencies using autobuild. The goal is that 'autobuild install' should +# only be run when we know we need to install a new package. This should be +# the case in a clean checkout, or if autobuild.xml has been updated since the +# last run (encapsulated by the file ${CMAKE_BINARY_DIR}/temp/sentinel_installed), +# or if a previous attempt to install the package has failed (the exit status +# of previous attempts is serialized in the file +# ${CMAKE_BINARY_DIR}/temp/${_binary}_installed) macro (use_prebuilt_binary _binary) if (NOT DEFINED STANDALONE_${_binary}) set(STANDALONE_${_binary} ${STANDALONE}) endif (NOT DEFINED STANDALONE_${_binary}) if (NOT STANDALONE_${_binary}) - if(${CMAKE_BINARY_DIR}/temp/sentinel_installed IS_NEWER_THAN ${CMAKE_BINARY_DIR}/temp/${_binary}_installed) - if(INSTALL_PROPRIETARY) - include(FindSCP) - endif(INSTALL_PROPRIETARY) - if(DEBUG_PREBUILT) - message("cd ${CMAKE_SOURCE_DIR} && ${AUTOBUILD_EXECUTABLE} install - --install-dir=${AUTOBUILD_INSTALL_DIR} - --skip-license-check - ${_binary} ") - endif(DEBUG_PREBUILT) - execute_process(COMMAND "${AUTOBUILD_EXECUTABLE}" - install - --install-dir=${AUTOBUILD_INSTALL_DIR} - --skip-license-check - ${_binary} - WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" - RESULT_VARIABLE ${_binary}_installed - ) + if("${${_binary}_installed}" STREQUAL "" AND EXISTS "${CMAKE_BINARY_DIR}/temp/${_binary}_installed") + file(READ ${CMAKE_BINARY_DIR}/temp/${_binary}_installed "${_binary}_installed") + if(DEBUG_PREBUILT) + message(STATUS "${_binary}_installed: \"${${_binary}_installed}\"") + endif(DEBUG_PREBUILT) + endif("${${_binary}_installed}" STREQUAL "" AND EXISTS "${CMAKE_BINARY_DIR}/temp/${_binary}_installed") + + if(${CMAKE_BINARY_DIR}/temp/sentinel_installed IS_NEWER_THAN ${CMAKE_BINARY_DIR}/temp/${_binary}_installed OR NOT ${${_binary}_installed} EQUAL 0) + if(DEBUG_PREBUILT) + message("cd ${CMAKE_SOURCE_DIR} && ${AUTOBUILD_EXECUTABLE} install + --install-dir=${AUTOBUILD_INSTALL_DIR} + --skip-license-check + ${_binary} ") + endif(DEBUG_PREBUILT) + execute_process(COMMAND "${AUTOBUILD_EXECUTABLE}" + install + --install-dir=${AUTOBUILD_INSTALL_DIR} + --skip-license-check + ${_binary} + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + RESULT_VARIABLE ${_binary}_installed + ) file(WRITE ${CMAKE_BINARY_DIR}/temp/${_binary}_installed "${${_binary}_installed}") - else(${CMAKE_BINARY_DIR}/temp/sentinel_installed IS_NEWER_THAN ${CMAKE_BINARY_DIR}/temp/${_binary}_installed) - set(${_binary}_installed 0) - endif(${CMAKE_BINARY_DIR}/temp/sentinel_installed IS_NEWER_THAN ${CMAKE_BINARY_DIR}/temp/${_binary}_installed) + endif(${CMAKE_BINARY_DIR}/temp/sentinel_installed IS_NEWER_THAN ${CMAKE_BINARY_DIR}/temp/${_binary}_installed OR NOT ${${_binary}_installed} EQUAL 0) + if(NOT ${_binary}_installed EQUAL 0) message(FATAL_ERROR "Failed to download or unpack prebuilt '${_binary}'." -- cgit v1.2.3 From a34cad5f2a95bffa7fda2d67d9c7750de15a93d6 Mon Sep 17 00:00:00 2001 From: Leslie Linden <leslie@lindenlab.com> Date: Wed, 4 May 2011 16:13:26 -0700 Subject: EXP-779 FIX -- Help > About Second Life Reports Kernel Version Twice, Instead of OS Version Modified Mac OS_VERSION string to include OS X version number in addition to Kernel version info. DARWIN llcommon build now depends on Carbon in order to provide this functionality. Reviewed by Richard. --- indra/llcommon/CMakeLists.txt | 6 +++++ indra/llcommon/llsys.cpp | 62 ++++++++++++++++++++++++++++++++++++------- 2 files changed, 59 insertions(+), 9 deletions(-) diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index 22e0705036..d3dca73db4 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -287,6 +287,12 @@ target_link_libraries( ${GOOGLE_PERFTOOLS_LIBRARIES} ) +if (DARWIN) + include(CMakeFindFrameworks) + find_library(CARBON_LIBRARY Carbon) + target_link_libraries(llcommon ${CARBON_LIBRARY}) +endif (DARWIN) + add_dependencies(llcommon stage_third_party_libs) if (LL_TESTS) diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp index 10cdc7087b..ca2d3f9181 100644 --- a/indra/llcommon/llsys.cpp +++ b/indra/llcommon/llsys.cpp @@ -46,6 +46,7 @@ # include <sys/sysctl.h> # include <sys/utsname.h> # include <stdint.h> +# include <Carbon/Carbon.h> #elif LL_LINUX # include <errno.h> # include <sys/utsname.h> @@ -318,7 +319,58 @@ LLOSInfo::LLOSInfo() : } mOSString += compatibility_mode; +#elif LL_DARWIN + + // Initialize mOSStringSimple to something like: + // "Mac OS X 10.6.7" + { + const char * DARWIN_PRODUCT_NAME = "Mac OS X"; + + SInt32 major_version, minor_version, bugfix_version; + OSErr r1 = Gestalt(gestaltSystemVersionMajor, &major_version); + OSErr r2 = Gestalt(gestaltSystemVersionMinor, &minor_version); + OSErr r3 = Gestalt(gestaltSystemVersionBugFix, &bugfix_version); + + if((r1 == noErr) && (r2 == noErr) && (r3 == noErr)) + { + mMajorVer = major_version; + mMinorVer = minor_version; + mBuild = bugfix_version; + + std::stringstream os_version_string; + os_version_string << DARWIN_PRODUCT_NAME << " " << mMajorVer << "." << mMinorVer << "." << mBuild; + + // Put it in the OS string we are compiling + mOSStringSimple.append(os_version_string.str()); + } + else + { + mOSStringSimple.append("Unable to collect OS info"); + } + } + + // Initialize mOSString to something like: + // "Mac OS X 10.6.7 Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu-1504.9.37~1/RELEASE_I386 i386" + struct utsname un; + if(uname(&un) != -1) + { + mOSString = mOSStringSimple; + mOSString.append(" "); + mOSString.append(un.sysname); + mOSString.append(" "); + mOSString.append(un.release); + mOSString.append(" "); + mOSString.append(un.version); + mOSString.append(" "); + mOSString.append(un.machine); + } + else + { + mOSString = mOSStringSimple; + } + #else + struct utsname un; if(uname(&un) != -1) { @@ -334,15 +386,7 @@ LLOSInfo::LLOSInfo() : // Simplify 'Simple' std::string ostype = mOSStringSimple.substr(0, mOSStringSimple.find_first_of(" ", 0)); - if (ostype == "Darwin") - { - // Only care about major Darwin versions, truncate at first '.' - S32 idx1 = mOSStringSimple.find_first_of(".", 0); - std::string simple = mOSStringSimple.substr(0, idx1); - if (simple.length() > 0) - mOSStringSimple = simple; - } - else if (ostype == "Linux") + if (ostype == "Linux") { // Only care about major and minor Linux versions, truncate at second '.' std::string::size_type idx1 = mOSStringSimple.find_first_of(".", 0); -- cgit v1.2.3 From 3063c1be4105feab28e6d6abf745b5ab6043ba25 Mon Sep 17 00:00:00 2001 From: Leslie Linden <leslie@lindenlab.com> Date: Wed, 4 May 2011 16:27:59 -0700 Subject: EXP-772 -- Log in failure, keeps saying DNS cannot resolve hostname. No real progress on this Jira yet but Mac build was not properly reporting the CURL error string. This check-in fixes that. So far, I have backed out URL related changes between 2.6.2 and 2.6.3 without any change in behavior. Unsure how to proceed next although comparing libcares and libcurl builds between 2.6.2 and 2.6.3 seems like it could be the next logical step. Users experiencing the problem can go back to vewere 2.6.2 or adjust DNS settings to use the google free DNS servers 8.8.8.8 and 8.8.4.4 which should allow them to work around the problem. Reviewed by Richard. --- indra/llmessage/llcurl.cpp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/indra/llmessage/llcurl.cpp b/indra/llmessage/llcurl.cpp index a485fa0160..9b3b24c312 100644 --- a/indra/llmessage/llcurl.cpp +++ b/indra/llmessage/llcurl.cpp @@ -674,15 +674,7 @@ void LLCurl::Multi::removeEasy(Easy* easy) //static std::string LLCurl::strerror(CURLcode errorcode) { -#if LL_DARWIN - // curl_easy_strerror was added in libcurl 7.12.0. Unfortunately, the version in the Mac OS X 10.3.9 SDK is 7.10.2... - // There's a problem with the custom curl headers in our build that keeps me from #ifdefing this on the libcurl version number - // (the correct check would be #if LIBCURL_VERSION_NUM >= 0x070c00). We'll fix the header problem soon, but for now - // just punt and print the numeric error code on the Mac. - return llformat("%d", errorcode); -#else // LL_DARWIN return std::string(curl_easy_strerror(errorcode)); -#endif // LL_DARWIN } //////////////////////////////////////////////////////////////////////////// -- cgit v1.2.3 From efca808b0c95aa2406960cb60a25ab90b14bde90 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Wed, 4 May 2011 18:04:09 -0700 Subject: EXP-584 FIXED View button on bottom bar is hidden when launching Basic Viewer with Voice options added back in corrected order in which buttons are collapsed so that they collapse right to left --- indra/newview/llbottomtray.cpp | 16 ++++++++- indra/newview/llbottomtray.h | 42 +++++++++++++--------- .../skins/minimal/xui/en/panel_bottomtray.xml | 8 ++--- 3 files changed, 44 insertions(+), 22 deletions(-) diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index 0371b7be71..0c34261f74 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -218,7 +218,7 @@ LLBottomTray::LLBottomTray(const LLSD&) mLandingTab(NULL), mCheckForDrag(false) { - // Firstly add ourself to IMSession observers, so we catch session events + // Firstly add our self to IMSession observers, so we catch session events // before chiclets do that. LLIMMgr::getInstance()->addSessionObserver(this); @@ -1539,21 +1539,35 @@ void LLBottomTray::initResizeStateContainers() mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_GESTURES, getChild<LLPanel>("gesture_panel"))); mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_MOVEMENT, getChild<LLPanel>("movement_panel"))); mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_CAMERA, getChild<LLPanel>("cam_panel"))); + mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_DESTINATIONS, getChild<LLPanel>("destinations_panel"))); + mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_AVATARS, getChild<LLPanel>("avatar_panel"))); mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SNAPSHOT, getChild<LLPanel>("snapshot_panel"))); mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_BUILD, getChild<LLPanel>("build_btn_panel"))); mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SEARCH, getChild<LLPanel>("search_btn_panel"))); mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_WORLD_MAP, getChild<LLPanel>("world_map_btn_panel"))); mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_MINI_MAP, getChild<LLPanel>("mini_map_btn_panel"))); + mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SPLITTER_1, getChild<LLPanel>("splitter_panel_1"))); + mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_PEOPLE, getChild<LLPanel>("people_panel"))); + mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_PROFILE, getChild<LLPanel>("profile_panel"))); + mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SPLITTER_2, getChild<LLPanel>("splitter_panel_2"))); + mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_HOWTO, getChild<LLPanel>("howto_panel"))); // init an order of processed buttons mButtonsProcessOrder.push_back(RS_BUTTON_GESTURES); mButtonsProcessOrder.push_back(RS_BUTTON_MOVEMENT); mButtonsProcessOrder.push_back(RS_BUTTON_CAMERA); + mButtonsProcessOrder.push_back(RS_BUTTON_DESTINATIONS); + mButtonsProcessOrder.push_back(RS_BUTTON_AVATARS); mButtonsProcessOrder.push_back(RS_BUTTON_SNAPSHOT); mButtonsProcessOrder.push_back(RS_BUTTON_BUILD); mButtonsProcessOrder.push_back(RS_BUTTON_SEARCH); mButtonsProcessOrder.push_back(RS_BUTTON_WORLD_MAP); mButtonsProcessOrder.push_back(RS_BUTTON_MINI_MAP); + mButtonsProcessOrder.push_back(RS_BUTTON_SPLITTER_1); + mButtonsProcessOrder.push_back(RS_BUTTON_PEOPLE); + mButtonsProcessOrder.push_back(RS_BUTTON_PROFILE); + mButtonsProcessOrder.push_back(RS_BUTTON_SPLITTER_2); + mButtonsProcessOrder.push_back(RS_BUTTON_HOWTO); mButtonsOrder.push_back(RS_BUTTON_SPEAK); mButtonsOrder.insert(mButtonsOrder.end(), mButtonsProcessOrder.begin(), mButtonsProcessOrder.end()); diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h index 04e5f5e9e0..da7f0772a9 100644 --- a/indra/newview/llbottomtray.h +++ b/indra/newview/llbottomtray.h @@ -144,22 +144,29 @@ public: private: - typedef enum e_resize_status_type + typedef enum e_resize_state { - RS_NORESIZE = 0x0000 - , RS_CHICLET_PANEL = 0x0001 - , RS_CHATBAR_INPUT = 0x0002 - , RS_BUTTON_SNAPSHOT = 0x0004 - , RS_BUTTON_CAMERA = 0x0008 - , RS_BUTTON_MOVEMENT = 0x0010 - , RS_BUTTON_GESTURES = 0x0020 - , RS_BUTTON_SPEAK = 0x0040 - , RS_IM_WELL = 0x0080 - , RS_NOTIFICATION_WELL = 0x0100 - , RS_BUTTON_BUILD = 0x0200 - , RS_BUTTON_SEARCH = 0x0400 - , RS_BUTTON_WORLD_MAP = 0x0800 - , RS_BUTTON_MINI_MAP = 0x1000 + RS_NORESIZE = 0x0000, + RS_CHICLET_PANEL = 0x0001, + RS_CHATBAR_INPUT = 0x0002, + RS_BUTTON_SNAPSHOT = 0x0004, + RS_BUTTON_CAMERA = 0x0008, + RS_BUTTON_MOVEMENT = 0x0010, + RS_BUTTON_GESTURES = 0x0020, + RS_BUTTON_SPEAK = 0x0040, + RS_IM_WELL = 0x0080, + RS_NOTIFICATION_WELL = 0x0100, + RS_BUTTON_BUILD = 0x0200, + RS_BUTTON_SEARCH = 0x0400, + RS_BUTTON_WORLD_MAP = 0x0800, + RS_BUTTON_MINI_MAP = 0x1000, + RS_BUTTON_DESTINATIONS = 0x2000, + RS_BUTTON_AVATARS = 0x4000, + RS_BUTTON_PEOPLE = 0x8000, + RS_BUTTON_PROFILE = 0x10000, + RS_BUTTON_HOWTO = 0x20000, + RS_BUTTON_SPLITTER_1 = 0x40000, + RS_BUTTON_SPLITTER_2 = 0x80000, /* Once new button that can be hidden on resize is added don't forget to update related places: @@ -170,10 +177,11 @@ private: /** * Specifies buttons which can be hidden when bottom tray is shrunk. * They are: Gestures, Movement (Move), Camera (View), Snapshot - * new: Build, Search, Map, World Map, Mini-Map. + * new: Build, Search, Map, World Map, Mini-Map, destinations, avatars */ - , RS_BUTTONS_CAN_BE_HIDDEN = RS_BUTTON_SNAPSHOT | RS_BUTTON_CAMERA | RS_BUTTON_MOVEMENT | RS_BUTTON_GESTURES + RS_BUTTONS_CAN_BE_HIDDEN = RS_BUTTON_SNAPSHOT | RS_BUTTON_CAMERA | RS_BUTTON_MOVEMENT | RS_BUTTON_GESTURES | RS_BUTTON_BUILD | RS_BUTTON_SEARCH | RS_BUTTON_WORLD_MAP | RS_BUTTON_MINI_MAP + | RS_BUTTON_DESTINATIONS | RS_BUTTON_AVATARS }EResizeState; // Below are three methods that were introduced to handle drag'n'drop diff --git a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml index a250f95e4f..afd20187c6 100644 --- a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml @@ -129,7 +129,7 @@ height="28" layout="topleft" min_width="17" - name="splitter_panel" + name="splitter_panel_1" user_resize="false" width="17"> <icon @@ -149,7 +149,7 @@ min_height="28" min_width="83" mouse_opaque="false" - name="avatar_and_destinations_panel" + name="destinations_panel" user_resize="false" width="103"> <bottomtray_button @@ -180,7 +180,7 @@ min_height="28" min_width="73" mouse_opaque="false" - name="avatar_and_destinations_panel" + name="avatar_panel" user_resize="false" width="103"> <bottomtray_button @@ -208,7 +208,7 @@ height="28" layout="topleft" min_width="17" - name="splitter_panel" + name="splitter_panel_2" user_resize="false" width="17"> <icon -- cgit v1.2.3 From c6c1419faa6e4acef19b3ddfc6c89b4a10bca15f Mon Sep 17 00:00:00 2001 From: Merov Linden <merov@lindenlab.com> Date: Wed, 4 May 2011 22:43:51 -0700 Subject: EXP-664 : Make encoding parameters more resilient to bad entries, add levels as encoding parameters, update test applet to support this --- .../llimage_libtest/llimage_libtest.cpp | 31 ++++++++++++++---- indra/llimage/llimage.h | 13 ++++++++ indra/llimage/llimagej2c.cpp | 4 +-- indra/llimage/llimagej2c.h | 4 +-- indra/llimagej2coj/llimagej2coj.cpp | 2 +- indra/llimagej2coj/llimagej2coj.h | 2 +- indra/llkdu/llimagej2ckdu.cpp | 37 +++++++++++++++++++--- indra/llkdu/llimagej2ckdu.h | 3 +- indra/llkdu/tests/llimagej2ckdu_test.cpp | 1 + 9 files changed, 80 insertions(+), 17 deletions(-) diff --git a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp index 60ddf63b21..976aae08bb 100644 --- a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp +++ b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp @@ -70,6 +70,10 @@ static const char USAGE[] = "\n" " be used. Blocks must be smaller than precincts. Like precincts, this option adds\n" " PLT, tile markers and uses RPCL.\n" " Only valid for output j2c images. Default is 64.\n" +" -l, --levels <n>\n" +" Number of decomposition levels (aka discard levels) in the output image.\n" +" The maximum number of levels authorized is 32.\n" +" Only valid for output j2c images. Default is 5.\n" " -rev, --reversible\n" " Set the compression to be lossless (reversible in j2c parlance).\n" " Only valid for output j2c images.\n" @@ -147,7 +151,7 @@ LLPointer<LLImageRaw> load_image(const std::string &src_filename, int discard_le } // Save a raw image instance into a file -bool save_image(const std::string &dest_filename, LLPointer<LLImageRaw> raw_image, int blocks_size, int precincts_size, bool reversible, bool output_stats) +bool save_image(const std::string &dest_filename, LLPointer<LLImageRaw> raw_image, int blocks_size, int precincts_size, int levels, bool reversible, bool output_stats) { LLPointer<LLImageFormatted> image = create_image(dest_filename); @@ -156,9 +160,9 @@ bool save_image(const std::string &dest_filename, LLPointer<LLImageRaw> raw_imag { // That method doesn't exist (and likely, doesn't make sense) for any other image file format // hence the required cryptic cast. - if ((blocks_size != -1) || (precincts_size != -1)) + if ((blocks_size != -1) || (precincts_size != -1) || (levels != 0)) { - ((LLImageJ2C*)(image.get()))->initEncode(*raw_image, blocks_size, precincts_size); + ((LLImageJ2C*)(image.get()))->initEncode(*raw_image, blocks_size, precincts_size, levels); } ((LLImageJ2C*)(image.get()))->setReversible(reversible); } @@ -306,6 +310,7 @@ int main(int argc, char** argv) int discard_level = -1; int precincts_size = -1; int blocks_size = -1; + int levels = 0; bool reversible = false; // Init whatever is necessary @@ -403,7 +408,6 @@ int main(int argc, char** argv) else { precincts_size = atoi(value_str.c_str()); - // *TODO: make sure precincts_size is a power of 2 } } else if (!strcmp(argv[arg], "--blocks") || !strcmp(argv[arg], "-b")) @@ -420,7 +424,22 @@ int main(int argc, char** argv) else { blocks_size = atoi(value_str.c_str()); - // *TODO: make sure blocks_size is a power of 2 + } + } + else if (!strcmp(argv[arg], "--levels") || !strcmp(argv[arg], "-l")) + { + std::string value_str; + if ((arg + 1) < argc) + { + value_str = argv[arg+1]; + } + if (((arg + 1) >= argc) || (value_str[0] == '-')) + { + std::cout << "No valid --levels argument given, default (5) will be used" << std::endl; + } + else + { + levels = atoi(value_str.c_str()); } } else if (!strcmp(argv[arg], "--reversible") || !strcmp(argv[arg], "-rev")) @@ -499,7 +518,7 @@ int main(int argc, char** argv) // Save file if (out_file != out_end) { - if (!save_image(*out_file, raw_image, blocks_size, precincts_size, reversible, image_stats)) + if (!save_image(*out_file, raw_image, blocks_size, precincts_size, levels, reversible, image_stats)) { std::cout << "Error: Image " << *out_file << " could not be saved" << std::endl; } diff --git a/indra/llimage/llimage.h b/indra/llimage/llimage.h index 18444f3934..c464c3b2b6 100644 --- a/indra/llimage/llimage.h +++ b/indra/llimage/llimage.h @@ -35,8 +35,21 @@ const S32 MIN_IMAGE_MIP = 2; // 4x4, only used for expand/contract power of 2 const S32 MAX_IMAGE_MIP = 11; // 2048x2048 + +// *TODO : Use MAX_IMAGE_MIP as max discard level and modify j2c management so that the number +// of levels is read from the header's file, not inferred from its size. const S32 MAX_DISCARD_LEVEL = 5; +// JPEG2000 size constraints +// Those are declared here as they are germane to other image constraints used in the viewer +// and declared right here. Some come from the JPEG2000 spec, some conventions specific to SL. +const S32 MAX_DECOMPOSITION_LEVELS = 32; // Number of decomposition levels cannot exceed 32 according to jpeg2000 spec +const S32 MIN_DECOMPOSITION_LEVELS = 5; // the SL viewer will *crash* trying to decode images with fewer than 5 decomposition levels (unless image is small that is) +const S32 MAX_PRECINCT_SIZE = 2048; // No reason to be bigger than MAX_IMAGE_SIZE +const S32 MIN_PRECINCT_SIZE = 4; // Can't be smaller than MIN_BLOCK_SIZE +const S32 MAX_BLOCK_SIZE = 64; // Max total block size is 4096, hence 64x64 when using square blocks +const S32 MIN_BLOCK_SIZE = 4; // Min block dim is 4 according to jpeg2000 spec + const S32 MIN_IMAGE_SIZE = (1<<MIN_IMAGE_MIP); // 4, only used for expand/contract power of 2 const S32 MAX_IMAGE_SIZE = (1<<MAX_IMAGE_MIP); // 2048 const S32 MIN_IMAGE_AREA = MIN_IMAGE_SIZE * MIN_IMAGE_SIZE; diff --git a/indra/llimage/llimagej2c.cpp b/indra/llimage/llimagej2c.cpp index a90df0f1c1..44e6b89dd3 100644 --- a/indra/llimage/llimagej2c.cpp +++ b/indra/llimage/llimagej2c.cpp @@ -144,9 +144,9 @@ BOOL LLImageJ2C::initDecode(LLImageRaw &raw_image, int discard_level, int* regio return mImpl->initDecode(*this,raw_image,discard_level,region); } -BOOL LLImageJ2C::initEncode(LLImageRaw &raw_image, int blocks_size, int precincts_size) +BOOL LLImageJ2C::initEncode(LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels) { - return mImpl->initEncode(*this,raw_image,blocks_size,precincts_size); + return mImpl->initEncode(*this,raw_image,blocks_size,precincts_size,levels); } BOOL LLImageJ2C::decode(LLImageRaw *raw_imagep, F32 decode_time) diff --git a/indra/llimage/llimagej2c.h b/indra/llimage/llimagej2c.h index 6bba81aab5..914174fc57 100644 --- a/indra/llimage/llimagej2c.h +++ b/indra/llimage/llimagej2c.h @@ -57,7 +57,7 @@ public: /*virtual*/ void setLastError(const std::string& message, const std::string& filename = std::string()); BOOL initDecode(LLImageRaw &raw_image, int discard_level, int* region); - BOOL initEncode(LLImageRaw &raw_image, int blocks_size, int precincts_size); + BOOL initEncode(LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels); // Encode with comment text BOOL encode(const LLImageRaw *raw_imagep, const char* comment_text, F32 encode_time=0.0); @@ -120,7 +120,7 @@ protected: virtual BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0, BOOL reversible=FALSE) = 0; virtual BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL) = 0; - virtual BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1) = 0; + virtual BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1, int levels = 0) = 0; friend class LLImageJ2C; }; diff --git a/indra/llimagej2coj/llimagej2coj.cpp b/indra/llimagej2coj/llimagej2coj.cpp index 8288fa1f5c..d15824ce5a 100644 --- a/indra/llimagej2coj/llimagej2coj.cpp +++ b/indra/llimagej2coj/llimagej2coj.cpp @@ -113,7 +113,7 @@ BOOL LLImageJ2COJ::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int disca return FALSE; } -BOOL LLImageJ2COJ::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size, int precincts_size) +BOOL LLImageJ2COJ::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels) { // No specific implementation for this method in the OpenJpeg case return FALSE; diff --git a/indra/llimagej2coj/llimagej2coj.h b/indra/llimagej2coj/llimagej2coj.h index 9c7cc09fcb..40ad4edb00 100644 --- a/indra/llimagej2coj/llimagej2coj.h +++ b/indra/llimagej2coj/llimagej2coj.h @@ -40,7 +40,7 @@ protected: /*virtual*/ BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0, BOOL reversible = FALSE); /*virtual*/ BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL); - /*virtual*/ BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1); + /*virtual*/ BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1, int levels = 0); }; #endif diff --git a/indra/llkdu/llimagej2ckdu.cpp b/indra/llkdu/llimagej2ckdu.cpp index ae456a48be..f83accf356 100644 --- a/indra/llkdu/llimagej2ckdu.cpp +++ b/indra/llkdu/llimagej2ckdu.cpp @@ -29,6 +29,7 @@ #include "lltimer.h" #include "llpointer.h" +#include "llmath.h" #include "llkdumem.h" @@ -192,7 +193,8 @@ mTileIndicesp(NULL), mRawImagep(NULL), mDecodeState(NULL), mBlocksSize(-1), -mPrecinctsSize(-1) +mPrecinctsSize(-1), +mLevels(0) { } @@ -328,10 +330,30 @@ BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int disc return initDecode(base,raw_image,0.0f,MODE_FAST,0,4,discard_level,region); } -BOOL LLImageJ2CKDU::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size, int precincts_size) +BOOL LLImageJ2CKDU::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels) { - mBlocksSize = blocks_size; mPrecinctsSize = precincts_size; + if (mPrecinctsSize != -1) + { + mPrecinctsSize = get_lower_power_two(mPrecinctsSize,MAX_PRECINCT_SIZE); + mPrecinctsSize = llmax(mPrecinctsSize,MIN_PRECINCT_SIZE); + } + mBlocksSize = blocks_size; + if (mBlocksSize != -1) + { + mBlocksSize = get_lower_power_two(mBlocksSize,MAX_BLOCK_SIZE); + mBlocksSize = llmax(mBlocksSize,MIN_BLOCK_SIZE); + if (mPrecinctsSize != -1) + { + mBlocksSize = llmin(mBlocksSize,mPrecinctsSize); // blocks *must* be smaller than precincts + } + } + mLevels = levels; + if (mLevels != 0) + { + mLevels = llmin(mLevels,MAX_DECOMPOSITION_LEVELS); + mLevels = llmax(MIN_DECOMPOSITION_LEVELS,mLevels); + } return TRUE; } @@ -373,10 +395,12 @@ BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco // Resize raw_image according to the image to be decoded kdu_dims dims; mCodeStreamp->get_dims(0,dims); + // *TODO: Use the real number of levels read from the file throughout the code instead of relying on an infered value from dimensions + //S32 levels = mCodeStreamp->get_min_dwt_levels(); S32 channels = base.getComponents() - first_channel; channels = llmin(channels,max_channel_count); raw_image.resize(dims.size.x, dims.size.y, channels); - // llinfos << "Resizing raw_image to " << dims.size.x << ":" << dims.size.y << llendl; + //llinfos << "j2c image dimension: width = " << dims.size.x << ", height = " << dims.size.y << ", channels = " << channels << ", levels = " << levels << llendl; if (!mTileIndicesp) { @@ -653,6 +677,11 @@ BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, co std::string Parts_string = llformat("ORGtparts=R"); codestream.access_siz()->parse_string(Parts_string.c_str()); } + if (mLevels != 0) + { + std::string levels_string = llformat("Clevels=%d",mLevels); + codestream.access_siz()->parse_string(levels_string.c_str()); + } codestream.access_siz()->finalize_all(); codestream.change_appearance(transpose,vflip,hflip); diff --git a/indra/llkdu/llimagej2ckdu.h b/indra/llkdu/llimagej2ckdu.h index 9fce58b762..1489dbf704 100644 --- a/indra/llkdu/llimagej2ckdu.h +++ b/indra/llkdu/llimagej2ckdu.h @@ -59,7 +59,7 @@ protected: /*virtual*/ BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0, BOOL reversible=FALSE); /*virtual*/ BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL); - /*virtual*/ BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1); + /*virtual*/ BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1, int levels = 0); private: BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, ECodeStreamMode mode, S32 first_channel, S32 max_channel_count, int discard_level = -1, int* region = NULL); @@ -73,6 +73,7 @@ private: kdu_dims *mTileIndicesp; int mBlocksSize; int mPrecinctsSize; + int mLevels; // Temporary variables for in-progress decodes... LLImageRaw *mRawImagep; diff --git a/indra/llkdu/tests/llimagej2ckdu_test.cpp b/indra/llkdu/tests/llimagej2ckdu_test.cpp index 7ac24a969a..ab60ab6d50 100644 --- a/indra/llkdu/tests/llimagej2ckdu_test.cpp +++ b/indra/llkdu/tests/llimagej2ckdu_test.cpp @@ -134,6 +134,7 @@ kdu_params* kdu_params::access_cluster(const char*) { return NULL; } void kdu_codestream::set_fast() { } void kdu_codestream::set_fussy() { } void kdu_codestream::get_dims(int, kdu_dims&, bool ) { } +int kdu_codestream::get_min_dwt_levels() { return 5; } void kdu_codestream::change_appearance(bool, bool, bool) { } void kdu_codestream::get_tile_dims(kdu_coords, int, kdu_dims&, bool ) { } void kdu_codestream::destroy() { } -- cgit v1.2.3 From c03eb76bcf66665ee8a7618dbec0d13e3fc66c32 Mon Sep 17 00:00:00 2001 From: Merov Linden <merov@lindenlab.com> Date: Wed, 4 May 2011 23:20:15 -0700 Subject: EXP-664 : Fix call to initialization encoding --- indra/newview/llviewertexturelist.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 182cba0e8c..8cf9b98d5d 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -999,7 +999,7 @@ LLPointer<LLImageJ2C> LLViewerTextureList::convertToUploadFile(LLPointer<LLImage S32 block_size = gSavedSettings.getS32("Jpeg2000BlocksSize"); S32 precinct_size = gSavedSettings.getS32("Jpeg2000PrecinctsSize"); llinfos << "Advanced JPEG2000 Compression: precinct = " << precinct_size << ", block = " << block_size << llendl; - compressedImage->initEncode(*raw_image, block_size, precinct_size); + compressedImage->initEncode(*raw_image, block_size, precinct_size, 0); } if (!compressedImage->encode(raw_image, 0.0f)) -- cgit v1.2.3 From a6a842614722e4cec8628925367dcf77e230ba9f Mon Sep 17 00:00:00 2001 From: prep <prep@lindenlab.com> Date: Thu, 5 May 2011 11:30:22 -0400 Subject: merge --- indra/newview/llfloatermodelpreview.cpp | 95 +-------------------------------- indra/newview/llfloatermodelpreview.h | 4 -- 2 files changed, 1 insertion(+), 98 deletions(-) diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index 9b6a2c5503..e8da1aa42c 100644 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -112,8 +112,6 @@ const S32 PREVIEW_HPAD = PREVIEW_RESIZE_HANDLE_SIZE; const S32 PREF_BUTTON_HEIGHT = 16 + 7 + 16; const S32 PREVIEW_TEXTURE_HEIGHT = 300; -const F32 MAXIMUM_PIVOT_OFFSET = 64.0f; - void drawBoxOutline(const LLVector3& pos, const LLVector3& size); @@ -1772,8 +1770,6 @@ bool LLModelLoader::doLoadModel() processElement(scene); - handlePivotPoint( root ); - return true; } @@ -1963,49 +1959,6 @@ void LLModelLoader::processJointToNodeMapping( domNode* pNode ) } } } -//----------------------------------------------------------------------------- -// handlePivotPoint() -//----------------------------------------------------------------------------- -void LLModelLoader::handlePivotPoint( daeElement* pRoot ) -{ - //Import an optional pivot point - a pivot point is just a node in the visual scene named "AssetPivot" - //If no assetpivot is found then the asset will use the SL default - daeElement* pScene = pRoot->getDescendant("visual_scene"); - if ( pScene ) - { - daeTArray< daeSmartRef<daeElement> > children = pScene->getChildren(); - S32 childCount = children.getCount(); - for (S32 i = 0; i < childCount; ++i) - { - domNode* pNode = daeSafeCast<domNode>(children[i]); - if ( pNode && isNodeAPivotPoint( pNode ) ) - { - LLMatrix4 workingTransform; - daeSIDResolver nodeResolver( pNode, "./translate" ); - domTranslate* pTranslate = daeSafeCast<domTranslate>( nodeResolver.getElement() ); - //Translation via SID was successful - //todo#extract via element as well - if ( pTranslate ) - { - extractTranslation( pTranslate, workingTransform ); - LLVector3 pivotTrans = workingTransform.getTranslation(); - if ( pivotTrans[VX] > MAXIMUM_PIVOT_OFFSET || pivotTrans[VX] < -MAXIMUM_PIVOT_OFFSET || - pivotTrans[VY] > MAXIMUM_PIVOT_OFFSET || pivotTrans[VY] < -MAXIMUM_PIVOT_OFFSET || - pivotTrans[VZ] > MAXIMUM_PIVOT_OFFSET || pivotTrans[VZ] < -MAXIMUM_PIVOT_OFFSET ) - { - llwarns<<"Asset Pivot Node contains an offset that is too large - values should be within (-"<<MAXIMUM_PIVOT_OFFSET<<","<<MAXIMUM_PIVOT_OFFSET<<")."<<llendl; - mPreview->setHasPivot( false ); - } - else - { - mPreview->setModelPivot( pivotTrans ); - mPreview->setHasPivot( true ); - } - } - } - } - } -} //----------------------------------------------------------------------------- // critiqueRigForUploadApplicability() @@ -2205,27 +2158,7 @@ bool LLModelLoader::isNodeAJoint( domNode* pNode ) return false; } -//----------------------------------------------------------------------------- -// isNodeAPivotPoint() -//----------------------------------------------------------------------------- -bool LLModelLoader::isNodeAPivotPoint( domNode* pNode ) -{ - bool result = false; - - if ( pNode && pNode->getName() ) - { - std::string name = pNode->getName(); - if ( name == "AssetPivot" ) - { - result = true; - } - else - { - result = false; - } - } - return result; -} + //----------------------------------------------------------------------------- // extractTranslation() //----------------------------------------------------------------------------- @@ -2852,27 +2785,6 @@ void LLFloaterModelPreview::setDetails(F32 x, F32 y, F32 z, F32 streaming_cost, childSetTextArg("physics cost", "[COST]", llformat("%.3f", physics_cost)); } -void LLModelPreview::alterModelsPivot( void ) -{ - for (LLModelLoader::model_list::iterator iter = mBaseModel.begin(); iter != mBaseModel.end(); ++iter) - { - if ( *iter ) - { - (*iter)->offsetMesh( mModelPivot ); - } - } - - for ( int i=0;i<LLModel::NUM_LODS;++i ) - { - for (LLModelLoader::model_list::iterator iter = mModel[i].begin(); iter != mModel[i].end(); ++iter) - { - if ( *iter ) - { - (*iter)->offsetMesh( mModelPivot ); - } - } - } -} void LLModelPreview::rebuildUploadData() { @@ -4971,11 +4883,6 @@ void LLFloaterModelPreview::onUpload(void* user_data) LLFloaterModelPreview* mp = (LLFloaterModelPreview*) user_data; - if ( mp && mp->mModelPreview->mHasPivot ) - { - mp->mModelPreview->alterModelsPivot(); - } - mp->mModelPreview->rebuildUploadData(); bool upload_skinweights = mp->childGetValue("upload_skin").asBoolean(); diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h index 92104c01f4..4d8b46807f 100644 --- a/indra/newview/llfloatermodelpreview.h +++ b/indra/newview/llfloatermodelpreview.h @@ -120,9 +120,6 @@ public: void extractTranslation( domTranslate* pTranslate, LLMatrix4& transform ); void extractTranslationViaElement( daeElement* pTranslateElement, LLMatrix4& transform ); - void handlePivotPoint( daeElement* pRoot ); - bool isNodeAPivotPoint( domNode* pNode ); - void setLoadState(U32 state); void buildJointToNodeMappingFromScene( daeElement* pRoot ); @@ -298,7 +295,6 @@ public: void loadModelCallback(S32 lod); void genLODs(S32 which_lod = -1, U32 decimation = 3, bool enforce_tri_limit = false); void generateNormals(); - void alterModelsPivot( void ); void clearMaterials(); U32 calcResourceCost(); void rebuildUploadData(); -- cgit v1.2.3 From 8a1fabd5a604244bca2910cdb54fb9df22b1bba7 Mon Sep 17 00:00:00 2001 From: Leslie Linden <leslie@lindenlab.com> Date: Thu, 5 May 2011 11:11:20 -0700 Subject: Build fix. Added missing cases to a switch statement for bottom tray buttons. Reviewed by Richard. --- indra/newview/llbottomtray.cpp | 46 +++++++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index b17f7de57a..189175566e 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -1884,26 +1884,36 @@ S32 LLBottomTray::getChicletPanelShrinkHeadroom() const // static std::string LLBottomTray::resizeStateToString(EResizeState state) { + const char *rs_string = "UNKNOWN_BUTTON"; + switch (state) { - case RS_NORESIZE: return "RS_NORESIZE"; - case RS_CHICLET_PANEL: return "RS_CHICLET_PANEL"; - case RS_CHATBAR_INPUT: return "RS_CHATBAR_INPUT"; - case RS_BUTTON_SNAPSHOT: return "RS_BUTTON_SNAPSHOT"; - case RS_BUTTON_CAMERA: return "RS_BUTTON_CAMERA"; - case RS_BUTTON_MOVEMENT: return "RS_BUTTON_MOVEMENT"; - case RS_BUTTON_GESTURES: return "RS_BUTTON_GESTURES"; - case RS_BUTTON_SPEAK: return "RS_BUTTON_SPEAK"; - case RS_IM_WELL: return "RS_IM_WELL"; - case RS_NOTIFICATION_WELL: return "RS_NOTIFICATION_WELL"; - case RS_BUTTON_BUILD: return "RS_BUTTON_BUILD"; - case RS_BUTTON_SEARCH: return "RS_BUTTON_SEARCH"; - case RS_BUTTON_WORLD_MAP: return "RS_BUTTON_WORLD_MAP"; - case RS_BUTTON_MINI_MAP: return "RS_BUTTON_MINI_MAP"; - case RS_BUTTONS_CAN_BE_HIDDEN: return "RS_BUTTONS_CAN_BE_HIDDEN"; - // No default to track additions. - } - return "UNKNOWN_BUTTON"; + case RS_NORESIZE: rs_string = "RS_NORESIZE"; break; + case RS_CHICLET_PANEL: rs_string = "RS_CHICLET_PANEL"; break; + case RS_CHATBAR_INPUT: rs_string = "RS_CHATBAR_INPUT"; break; + case RS_BUTTON_SNAPSHOT: rs_string = "RS_BUTTON_SNAPSHOT"; break; + case RS_BUTTON_CAMERA: rs_string = "RS_BUTTON_CAMERA"; break; + case RS_BUTTON_MOVEMENT: rs_string = "RS_BUTTON_MOVEMENT"; break; + case RS_BUTTON_GESTURES: rs_string = "RS_BUTTON_GESTURES"; break; + case RS_BUTTON_SPEAK: rs_string = "RS_BUTTON_SPEAK"; break; + case RS_IM_WELL: rs_string = "RS_IM_WELL"; break; + case RS_NOTIFICATION_WELL: rs_string = "RS_NOTIFICATION_WELL"; break; + case RS_BUTTON_BUILD: rs_string = "RS_BUTTON_BUILD"; break; + case RS_BUTTON_SEARCH: rs_string = "RS_BUTTON_SEARCH"; break; + case RS_BUTTON_WORLD_MAP: rs_string = "RS_BUTTON_WORLD_MAP"; break; + case RS_BUTTON_MINI_MAP: rs_string = "RS_BUTTON_MINI_MAP"; break; + case RS_BUTTON_DESTINATIONS: rs_string = "RS_BUTTON_DESTINATIONS"; break; + case RS_BUTTON_AVATARS: rs_string = "RS_BUTTON_AVATARS"; break; + case RS_BUTTON_PEOPLE: rs_string = "RS_BUTTON_PEOPLE"; break; + case RS_BUTTON_PROFILE: rs_string = "RS_BUTTON_PROFILE"; break; + case RS_BUTTON_HOWTO: rs_string = "RS_BUTTON_HOWTO"; break; + case RS_BUTTON_SPLITTER_1: rs_string = "RS_BUTTON_SPLITTER_1"; break; + case RS_BUTTON_SPLITTER_2: rs_string = "RS_BUTTON_SPLITTER_2"; break; + case RS_BUTTONS_CAN_BE_HIDDEN: rs_string = "RS_BUTTONS_CAN_BE_HIDDEN"; break; + // No default to track additions. + } + + return rs_string; } // static -- cgit v1.2.3 From 02c1a6a515c5a18eece01aafb8de7a88b8c8c83f Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Thu, 5 May 2011 11:26:13 -0700 Subject: EXP-754 [PUBLIC] Remember last email address for snapshots --- indra/newview/app_settings/settings_per_account.xml | 11 +++++++++++ indra/newview/skins/default/xui/en/floater_postcard.xml | 1 + 2 files changed, 12 insertions(+) diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml index 8efec1cff0..ff24efaf2c 100644 --- a/indra/newview/app_settings/settings_per_account.xml +++ b/indra/newview/app_settings/settings_per_account.xml @@ -44,6 +44,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>LastPostcardRecipient</key> + <map> + <key>Comment</key> + <string>Last recipient of postcard</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string /> + </map> <key>LogNearbyChat</key> <map> <key>Comment</key> diff --git a/indra/newview/skins/default/xui/en/floater_postcard.xml b/indra/newview/skins/default/xui/en/floater_postcard.xml index b4ecedd981..8da35e9d7f 100644 --- a/indra/newview/skins/default/xui/en/floater_postcard.xml +++ b/indra/newview/skins/default/xui/en/floater_postcard.xml @@ -36,6 +36,7 @@ Recipient's Email: </text> <line_editor + control_name="LastPostcardRecipient" follows="left|top" height="20" layout="topleft" -- cgit v1.2.3 From 9b0f5c815fcd8381f336ba860ae1f5bf0c842e58 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" <vir@lindenlab.com> Date: Thu, 5 May 2011 17:40:35 -0400 Subject: started new code path for whole model fee request/upload --- indra/newview/app_settings/settings.xml | 11 ++++++ indra/newview/llmeshrepository.cpp | 65 +++++++++++++++++++++++++++++++++ indra/newview/llmeshrepository.h | 4 ++ 3 files changed, 80 insertions(+) mode change 100644 => 100755 indra/newview/app_settings/settings.xml mode change 100644 => 100755 indra/newview/llmeshrepository.cpp mode change 100644 => 100755 indra/newview/llmeshrepository.h diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml old mode 100644 new mode 100755 index c4af9e2ab6..75bd29ecd4 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -5545,6 +5545,17 @@ <key>Value</key> <real>0</real> </map> + <key>MeshUseWholeModelUpload</key> + <map> + <key>Comment</key> + <string>Upload model in its entirety instead of mesh-by-mesh (new caps)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <real>0</real> + </map> <key>MigrateCacheDirectory</key> <map> <key>Comment</key> diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp old mode 100644 new mode 100755 index dd2ffdf7f1..4c04b0ea35 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -1239,6 +1239,7 @@ LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data, mUploadObjectAssetCapability = gAgent.getRegion()->getCapability("UploadObjectAsset"); mNewInventoryCapability = gAgent.getRegion()->getCapability("NewFileAgentInventoryVariablePrice"); + mWholeModelUploadCapability = gAgent.getRegion()->getCapability("NewFileAgentInventory"); mOrigin += gAgent.getAtAxis() * scale.magVec(); } @@ -1329,6 +1330,70 @@ BOOL LLMeshUploadThread::isDiscarded() } void LLMeshUploadThread::run() +{ + if (gSavedSettings.getBOOL("MeshUseWholeModelUpload")) + { + doWholeModelUpload(); + } + else + { + doIterativeUpload(); + } +} + +void LLMeshUploadThread::doWholeModelUpload() +{ + // Queue up models for hull generation (viewer-side) + for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter) + { + LLMeshUploadData data; + data.mBaseModel = iter->first; + + LLModelInstance& instance = *(iter->second.begin()); + + for (S32 i = 0; i < 5; i++) + { + data.mModel[i] = instance.mLOD[i]; + } + + //queue up models for hull generation + LLModel* physics = NULL; + + if (data.mModel[LLModel::LOD_PHYSICS].notNull()) + { + physics = data.mModel[LLModel::LOD_PHYSICS]; + } + else if (data.mModel[LLModel::LOD_MEDIUM].notNull()) + { + physics = data.mModel[LLModel::LOD_MEDIUM]; + } + else + { + physics = data.mModel[LLModel::LOD_HIGH]; + } + + if (!physics) + { + llerrs << "WTF?" << llendl; + } + + DecompRequest* request = new DecompRequest(physics, data.mBaseModel, this); + gMeshRepo.mDecompThread->submitRequest(request); + } + + while (!mPhysicsComplete) + { + apr_sleep(100); + } + + bool do_include_textures = false; // not needed for initial cost/validation check. + LLSD model_data = wholeModelToLLSD(do_include_textures); + + // Currently a no-op. + mFinished = true; +} + +void LLMeshUploadThread::doIterativeUpload() { if(isDiscarded()) { diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h old mode 100644 new mode 100755 index 5983a282a2..e2faed52cf --- a/indra/newview/llmeshrepository.h +++ b/indra/newview/llmeshrepository.h @@ -387,6 +387,7 @@ public: LLHost mHost; std::string mUploadObjectAssetCapability; std::string mNewInventoryCapability; + std::string mWholeModelUploadCapability; std::queue<LLMeshUploadData> mUploadQ; std::queue<LLMeshUploadData> mConfirmedQ; @@ -420,6 +421,9 @@ public: void preStart(); void discard() ; BOOL isDiscarded(); + + void doWholeModelUpload(); + void doIterativeUpload(); }; class LLMeshRepository -- cgit v1.2.3 From 39bf9be14271fc63370faef3767588425b7fbe0c Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Thu, 5 May 2011 18:00:51 -0500 Subject: Featuretable tweaks to enable deferred rendering on apple. --- indra/newview/featuretable_linux.txt | 1 - indra/newview/featuretable_mac.txt | 20 ++++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt index e86663b748..058bdcc730 100644 --- a/indra/newview/featuretable_linux.txt +++ b/indra/newview/featuretable_linux.txt @@ -59,7 +59,6 @@ Disregard96DefaultDrawDistance 1 1 RenderTextureMemoryMultiple 1 1.0 SkyUseClassicClouds 1 1 RenderShaderLightingMaxLevel 1 3 -RenderDeferred 1 0 RenderDeferred 1 1 RenderDeferredSSAO 1 1 RenderShadowDetail 1 2 diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt index e715054c54..6bdb1e1787 100644 --- a/indra/newview/featuretable_mac.txt +++ b/indra/newview/featuretable_mac.txt @@ -62,6 +62,10 @@ Disregard128DefaultDrawDistance 1 1 Disregard96DefaultDrawDistance 1 1 SkyUseClassicClouds 1 1 WatchdogDisabled 1 1 +RenderDeferred 1 1 +RenderDeferredSSAO 1 1 +RenderShadowDetail 1 2 + // // Low Graphics Settings @@ -91,6 +95,10 @@ VertexShaderEnable 1 0 WindLightUseAtmosShaders 1 0 WLSkyDetail 1 48 SkyUseClassicClouds 1 0 +RenderDeferred 1 0 +RenderDeferredSSAO 1 0 +RenderShadowDetail 1 2 + // // Mid Graphics Settings @@ -118,6 +126,10 @@ RenderWaterReflections 1 0 VertexShaderEnable 1 1 WindLightUseAtmosShaders 1 0 WLSkyDetail 1 48 +RenderDeferred 1 0 +RenderDeferredSSAO 1 0 +RenderShadowDetail 1 2 + // // High Graphics Settings (purty) @@ -145,6 +157,10 @@ RenderWaterReflections 1 0 VertexShaderEnable 1 1 WindLightUseAtmosShaders 1 1 WLSkyDetail 1 48 +RenderDeferred 1 0 +RenderDeferredSSAO 1 0 +RenderShadowDetail 1 2 + // // Ultra graphics (REALLY PURTY!) @@ -172,6 +188,10 @@ RenderWaterReflections 1 1 VertexShaderEnable 1 1 WindLightUseAtmosShaders 1 1 WLSkyDetail 1 128 +RenderDeferred 1 0 +RenderDeferredSSAO 1 0 +RenderShadowDetail 1 2 + // // Class Unknown Hardware (unknown) -- cgit v1.2.3 From 343ffb9d512702fff76e542575a0eff79ea62204 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed <nat@lindenlab.com> Date: Thu, 5 May 2011 19:23:55 -0400 Subject: Remove Pth library from viewer build. This library was only needed on the Mac, and only with the OS X 10.4 SDK. As of October 2010, we no longer build the viewer with that SDK. The 10.5 SDK we're currently using directly supports the functionality for which we originally brought in Pth. --- autobuild.xml | 24 - indra/cmake/Pth.cmake | 21 - indra/llcommon/CMakeLists.txt | 3 - indra/newview/licenses-mac.txt | 510 --------------------- .../newview/skins/default/xui/en/floater_about.xml | 1 - indra/viewer_components/login/CMakeLists.txt | 9 - install.xml | 47 -- 7 files changed, 615 deletions(-) delete mode 100644 indra/cmake/Pth.cmake diff --git a/autobuild.xml b/autobuild.xml index 7686b48cf5..53a2e59b29 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1351,30 +1351,6 @@ </map> </map> </map> - <key>pth</key> - <map> - <key>license</key> - <string>lgpl</string> - <key>license_file</key> - <string>LICENSES/pth.txt</string> - <key>name</key> - <string>pth</string> - <key>platforms</key> - <map> - <key>darwin</key> - <map> - <key>archive</key> - <map> - <key>hash</key> - <string>2172379794217d0ffba0db09b2ac17bf</string> - <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/pth-2.0.7-darwin-20110303.tar.bz2</string> - </map> - <key>name</key> - <string>darwin</string> - </map> - </map> - </map> <key>quicktime</key> <map> <key>license</key> diff --git a/indra/cmake/Pth.cmake b/indra/cmake/Pth.cmake deleted file mode 100644 index a28f6ec696..0000000000 --- a/indra/cmake/Pth.cmake +++ /dev/null @@ -1,21 +0,0 @@ -# -*- cmake -*- -include(Prebuilt) - -set(PTH_FIND_QUIETLY ON) -set(PTH_FIND_REQUIRED ON) - -if (STANDALONE) -# ?? How would I construct FindPTH.cmake? This file was cloned from -# CURL.cmake, which uses include(FindCURL), but there's no FindCURL.cmake? -# include(FindPTH) -else (STANDALONE) - # This library is only needed to support Boost.Coroutine, and only on Mac. - if (DARWIN) - use_prebuilt_binary(pth) - set(PTH_LIBRARIES pth) - set(PTH_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include) - else (DARWIN) - set(PTH_LIBRARIES) - set(PTH_INCLUDE_DIRS) - endif (DARWIN) -endif (STANDALONE) diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index 800bf8eba9..2963fa15af 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -7,7 +7,6 @@ include(00-Common) include(LLCommon) include(Linking) include(Boost) -include(Pth) include(LLSharedLibs) include(GoogleBreakpad) include(GooglePerfTools) @@ -18,7 +17,6 @@ include_directories( ${EXPAT_INCLUDE_DIRS} ${LLCOMMON_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIRS} - ${PTH_INCLUDE_DIRS} ) # add_executable(lltreeiterators lltreeiterators.cpp) @@ -287,7 +285,6 @@ target_link_libraries( ${WINDOWS_LIBRARIES} ${BOOST_PROGRAM_OPTIONS_LIBRARY} ${BOOST_REGEX_LIBRARY} - ${PTH_LIBRARIES} ${GOOGLE_PERFTOOLS_LIBRARIES} ) diff --git a/indra/newview/licenses-mac.txt b/indra/newview/licenses-mac.txt index 1324fa1a86..af80bff5d9 100644 --- a/indra/newview/licenses-mac.txt +++ b/indra/newview/licenses-mac.txt @@ -315,516 +315,6 @@ This product includes cryptographic software written by Eric Young Hudson (tjh@cryptsoft.com). -=========== -Pth License -=========== - ____ _ _ - | _ \| |_| |__ ``Ian Fleming was a UNIX fan! - | |_) | __| '_ \ How do I know? Well, James Bond - | __/| |_| | | | had the (license to kill) number 007, - |_| \__|_| |_| i.e., he could execute anyone!'' - - GNU Pth - The GNU Portable Threads - - LICENSE - ======= - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation; either version 2.1 of the - License, or (at your option) any later version. - - For some people, it is not clear, what is the real intention of the - author by using the GNU Lesser General Public License (LGPL) as the - distribution license for GNU Pth. This is, because the LGPL and the - GPL can be (and are often) interpreted very differently and some - interpretations seem to be not compatible with others. So an explicit - clarification for the use of the LGPL for GNU Pth from the authors - point of view might be useful. - - The author places this library under the LGPL to make sure that it - can be used both commercially and non-commercially provided that - modifications to the code base are always donated back to the official - code base under the same license conditions. Please keep in mind that - especially using this library in code not staying under the GPL or - the LGPL _is_ allowed and that any taint or license creap into code - that uses the library is not the authors intention. It is just the - case that _including_ this library into the source tree of other - applications is a little bit more inconvinient because of the LGPL. - But it has to be this way for good reasons. And keep in mind that - inconvinient doesn't mean not allowed or even impossible. - - Even if you want to use this library in some BSD-style licensed - packages, this _is_ possible as long as you are a little bit - carefully. Usually this means you have to make sure that the code is - still clearly separated into the source tree and that modifications to - this source area are done under the conditions of the LGPL. Read below - for more details on the conditions. Contact the author if you have - more questions. - - The license text of the GNU Lesser General Public License follows: - __________________________________________________________________________ - - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - ======================= Original SSLeay License ======================= diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml index f5365be11f..6a1a600696 100644 --- a/indra/newview/skins/default/xui/en/floater_about.xml +++ b/indra/newview/skins/default/xui/en/floater_about.xml @@ -150,7 +150,6 @@ jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (U jpeglib Copyright (C) 1991-1998, Thomas G. Lane. ogg/vorbis Copyright (C) 2001, Xiphophorus OpenSSL Copyright (C) 1998-2002 The OpenSSL Project. -Pth Copyright (C) 1999-2006 Ralf S. Engelschall <rse@gnu.org> SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) xmlrpc-epi Copyright (C) 2000 Epinions, Inc. diff --git a/indra/viewer_components/login/CMakeLists.txt b/indra/viewer_components/login/CMakeLists.txt index fe64926da6..7720619df3 100644 --- a/indra/viewer_components/login/CMakeLists.txt +++ b/indra/viewer_components/login/CMakeLists.txt @@ -9,13 +9,11 @@ endif(LL_TESTS) include(LLCommon) include(LLMath) include(LLXML) -include(Pth) include_directories( ${LLCOMMON_INCLUDE_DIRS} ${LLMATH_INCLUDE_DIRS} ${LLXML_INCLUDE_DIRS} - ${PTH_INCLUDE_DIRS} ) set(login_SOURCE_FILES @@ -42,7 +40,6 @@ target_link_libraries(lllogin ${LLCOMMON_LIBRARIES} ${LLMATH_LIBRARIES} ${LLXML_LIBRARIES} - ${PTH_LIBRARIES} ) if(LL_TESTS) @@ -50,11 +47,5 @@ if(LL_TESTS) lllogin.cpp ) - set_source_files_properties( - lllogin.cpp - PROPERTIES - LL_TEST_ADDITIONAL_LIBRARIES "${PTH_LIBRARIES}" - ) - LL_ADD_PROJECT_UNIT_TESTS(lllogin "${lllogin_TEST_SOURCE_FILES}") endif(LL_TESTS) diff --git a/install.xml b/install.xml index 9658a4195a..889386b336 100644 --- a/install.xml +++ b/install.xml @@ -1252,53 +1252,6 @@ anguage Infrstructure (CLI) international standard</string> </map> </map> </map> - <key>pth</key> - <map> - <key>copyright</key> - <string>Copyright (c) 1999-2006 Ralf S. Engelschall <rse@gnu.org></string> - <key>description</key> - <string>Portable cooperative threads package, used to support Boost.Coroutine on Mac OS X 10.4</string> - <key>license</key> - <string>lgpl</string> - <key>packages</key> - <map> - <key>darwin</key> - <map> - <key>md5sum</key> - <string>216cb6217a06c64dfae30a55ab8b975c</string> - <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/pth-2.0.7-darwin-20090923.tar.bz2</uri> - </map> - <key>linux</key> - <map> - <key>md5sum</key> - <string>c5c2f73847c126e679d925beab48c7d4</string> - <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/pth-2.0.7-linux-20090427.tar.bz2</uri> - </map> - <key>linux32</key> - <map> - <key>md5sum</key> - <string>c5c2f73847c126e679d925beab48c7d4</string> - <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/pth-2.0.7-linux32-20090427.tar.bz2</uri> - </map> - <key>linux64</key> - <map> - <key>md5sum</key> - <string>c5c2f73847c126e679d925beab48c7d4</string> - <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/pth-2.0.7-linux64-20090427.tar.bz2</uri> - </map> - <key>windows</key> - <map> - <key>md5sum</key> - <string>c5c2f73847c126e679d925beab48c7d4</string> - <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/pth-2.0.7-windows-20090427.tar.bz2</uri> - </map> - </map> - </map> <key>pulseaudio</key> <map> <key>copyright</key> -- cgit v1.2.3 From dbc92691a62be9c9cdb764ab6f17510c7c7ba64d Mon Sep 17 00:00:00 2001 From: brad kittenbrink <brad@lindenlab.com> Date: Thu, 5 May 2011 17:13:52 -0700 Subject: Work in progress on CHOP-609 / CHOP-624 build time improvements. Eliminated a bunch of unnecesary header dependencies. --- indra/llcommon/llapp.cpp | 7 +- indra/llui/llbutton.h | 3 +- indra/llui/llfloaterreg.h | 6 +- indra/llui/llfocusmgr.cpp | 33 ++- indra/llui/llfocusmgr.h | 11 +- indra/llui/lliconctrl.h | 1 + indra/llui/lllineeditor.h | 1 + indra/llui/llloadingindicator.h | 1 + indra/llui/llmultislider.cpp | 1 + indra/llui/llpanel.h | 1 + indra/llui/llprogressbar.cpp | 1 + indra/llui/llprogressbar.h | 3 +- indra/llui/llslider.h | 1 + indra/llui/llstyle.cpp | 2 +- indra/llui/llstyle.h | 5 +- indra/llui/lltransutil.cpp | 5 +- indra/llui/llui.h | 5 - indra/llui/llview.h | 1 + indra/llui/llviewborder.cpp | 1 + indra/llui/llwindowshade.h | 1 + indra/llxuixml/lltrans.cpp | 1 + indra/llxuixml/lltrans.h | 8 +- indra/llxuixml/llxuiparser.h | 3 +- indra/newview/llagent.cpp | 73 +++-- indra/newview/llagent.h | 22 +- indra/newview/llappviewer.cpp | 3 +- indra/newview/lleventnotifier.h | 1 + indra/newview/llfloaterland.cpp | 1 + indra/newview/llfloaterland.h | 5 +- indra/newview/llfloatersnapshot.cpp | 1 + indra/newview/llfolderviewitem.h | 1 + indra/newview/lllocationhistory.h | 1 + indra/newview/lloutputmonitorctrl.h | 1 + indra/newview/llpanelavatar.cpp | 1 + indra/newview/llpanelgroupgeneral.cpp | 1 + indra/newview/llpanelgrouproles.cpp | 1 + indra/newview/llpreviewgesture.cpp | 1 + indra/newview/llsidepaneliteminfo.cpp | 1 + indra/newview/lltooldraganddrop.cpp | 1 - indra/newview/llviewerchat.cpp | 2 + indra/newview/llviewerkeyboard.h | 1 + indra/newview/llviewermenu.cpp | 1 + indra/newview/llviewerparcelmgr.cpp | 2 + indra/newview/llviewerprecompiledheaders.h | 11 +- indra/newview/llviewerregion.cpp | 311 ++++++++++++++------- indra/newview/llviewerregion.h | 85 ++---- indra/newview/llviewertexturelist.h | 12 +- indra/newview/llviewerwindow.cpp | 10 +- indra/newview/llviewerwindow.h | 12 +- indra/newview/llvoavatar.cpp | 2 +- indra/newview/llvotree.cpp | 1 + indra/newview/llvovolume.cpp | 2 + indra/newview/llworld.cpp | 1 + indra/newview/tests/llremoteparcelrequest_test.cpp | 4 +- indra/newview/tests/llviewerhelputil_test.cpp | 4 +- 55 files changed, 396 insertions(+), 282 deletions(-) diff --git a/indra/llcommon/llapp.cpp b/indra/llcommon/llapp.cpp index 39daefd1ad..ed192a9975 100644 --- a/indra/llcommon/llapp.cpp +++ b/indra/llcommon/llapp.cpp @@ -24,6 +24,10 @@ * $/LicenseInfo$ */ +#include "linden_common.h" + +#include "llapp.h" + #include <cstdlib> #ifdef LL_DARWIN @@ -32,9 +36,6 @@ #include <sys/sysctl.h> #endif -#include "linden_common.h" -#include "llapp.h" - #include "llcommon.h" #include "llapr.h" #include "llerrorcontrol.h" diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h index 16aa49b653..0cfc393e05 100644 --- a/indra/llui/llbutton.h +++ b/indra/llui/llbutton.h @@ -27,7 +27,6 @@ #ifndef LL_LLBUTTON_H #define LL_LLBUTTON_H -#include "lluuid.h" #include "llcontrol.h" #include "lluictrl.h" #include "v4color.h" @@ -53,6 +52,8 @@ S32 round_up(S32 grid, S32 value); class LLUICtrlFactory; +class LLUIImage; +class LLUUID; // // Classes diff --git a/indra/llui/llfloaterreg.h b/indra/llui/llfloaterreg.h index 94387fb41a..8414b92113 100644 --- a/indra/llui/llfloaterreg.h +++ b/indra/llui/llfloaterreg.h @@ -27,14 +27,9 @@ #define LLFLOATERREG_H /// llcommon -#include "llboost.h" #include "llrect.h" -#include "llstl.h" #include "llsd.h" -/// llui -#include "lluictrl.h" - #include <boost/function.hpp> //******************************************************* @@ -43,6 +38,7 @@ // class LLFloater; +class LLUICtrl; typedef boost::function<LLFloater* (const LLSD& key)> LLFloaterBuildFunc; diff --git a/indra/llui/llfocusmgr.cpp b/indra/llui/llfocusmgr.cpp index 43e5f6b051..724d190307 100644 --- a/indra/llui/llfocusmgr.cpp +++ b/indra/llui/llfocusmgr.cpp @@ -113,6 +113,16 @@ boost::signals2::connection LLFocusableElement::setTopLostCallback(const focus_s +typedef std::list<LLHandle<LLView> > view_handle_list_t; +typedef std::map<LLHandle<LLView>, LLHandle<LLView> > focus_history_map_t; +struct LLFocusMgr::Impl +{ + // caching list of keyboard focus ancestors for calling onFocusReceived and onFocusLost + view_handle_list_t mCachedKeyboardFocusList; + + focus_history_map_t mFocusHistory; +}; + LLFocusMgr gFocusMgr; LLFocusMgr::LLFocusMgr() @@ -123,10 +133,17 @@ LLFocusMgr::LLFocusMgr() mDefaultKeyboardFocus( NULL ), mKeystrokesOnly(FALSE), mTopCtrl( NULL ), - mAppHasFocus(TRUE) // Macs don't seem to notify us that we've gotten focus, so default to true + mAppHasFocus(TRUE), // Macs don't seem to notify us that we've gotten focus, so default to true + mImpl(new LLFocusMgr::Impl) { } +LLFocusMgr::~LLFocusMgr() +{ + mImpl->mFocusHistory.clear(); + delete mImpl; + mImpl = NULL; +} void LLFocusMgr::releaseFocusIfNeeded( LLView* view ) { @@ -179,7 +196,7 @@ void LLFocusMgr::setKeyboardFocus(LLFocusableElement* new_focus, BOOL lock, BOOL mKeyboardFocus = new_focus; // list of the focus and it's ancestors - view_handle_list_t old_focus_list = mCachedKeyboardFocusList; + view_handle_list_t old_focus_list = mImpl->mCachedKeyboardFocusList; view_handle_list_t new_focus_list; // walk up the tree to root and add all views to the new_focus_list @@ -206,7 +223,7 @@ void LLFocusMgr::setKeyboardFocus(LLFocusableElement* new_focus, BOOL lock, BOOL LLView* old_focus_view = old_focus_iter->get(); if (old_focus_view) { - mCachedKeyboardFocusList.pop_front(); + mImpl->mCachedKeyboardFocusList.pop_front(); old_focus_view->onFocusLost(); } } @@ -219,7 +236,7 @@ void LLFocusMgr::setKeyboardFocus(LLFocusableElement* new_focus, BOOL lock, BOOL LLView* new_focus_view = new_focus_riter->get(); if (new_focus_view) { - mCachedKeyboardFocusList.push_front(new_focus_view->getHandle()); + mImpl->mCachedKeyboardFocusList.push_front(new_focus_view->getHandle()); new_focus_view->onFocusReceived(); } } @@ -254,7 +271,7 @@ void LLFocusMgr::setKeyboardFocus(LLFocusableElement* new_focus, BOOL lock, BOOL if (focus_subtree) { LLView* focused_view = dynamic_cast<LLView*>(mKeyboardFocus); - mFocusHistory[focus_subtree->getHandle()] = focused_view ? focused_view->getHandle() : LLHandle<LLView>(); + mImpl->mFocusHistory[focus_subtree->getHandle()] = focused_view ? focused_view->getHandle() : LLHandle<LLView>(); } } @@ -456,8 +473,8 @@ LLUICtrl* LLFocusMgr::getLastFocusForGroup(LLView* subtree_root) const { if (subtree_root) { - focus_history_map_t::const_iterator found_it = mFocusHistory.find(subtree_root->getHandle()); - if (found_it != mFocusHistory.end()) + focus_history_map_t::const_iterator found_it = mImpl->mFocusHistory.find(subtree_root->getHandle()); + if (found_it != mImpl->mFocusHistory.end()) { // found last focus for this subtree return static_cast<LLUICtrl*>(found_it->second.get()); @@ -470,6 +487,6 @@ void LLFocusMgr::clearLastFocusForGroup(LLView* subtree_root) { if (subtree_root) { - mFocusHistory.erase(subtree_root->getHandle()); + mImpl->mFocusHistory.erase(subtree_root->getHandle()); } } diff --git a/indra/llui/llfocusmgr.h b/indra/llui/llfocusmgr.h index 22c1895075..25ae1d2579 100644 --- a/indra/llui/llfocusmgr.h +++ b/indra/llui/llfocusmgr.h @@ -74,7 +74,7 @@ class LLFocusMgr { public: LLFocusMgr(); - ~LLFocusMgr() { mFocusHistory.clear(); } + ~LLFocusMgr(); // Mouse Captor void setMouseCapture(LLMouseHandler* new_captor); // new_captor = NULL to release the mouse. @@ -120,6 +120,8 @@ public: bool keyboardFocusHasAccelerators() const; + struct Impl; + private: LLUICtrl* mLockedView; @@ -132,10 +134,6 @@ private: LLFocusableElement* mDefaultKeyboardFocus; BOOL mKeystrokesOnly; - // caching list of keyboard focus ancestors for calling onFocusReceived and onFocusLost - typedef std::list<LLHandle<LLView> > view_handle_list_t; - view_handle_list_t mCachedKeyboardFocusList; - // Top View LLUICtrl* mTopCtrl; @@ -143,8 +141,7 @@ private: BOOL mAppHasFocus; - typedef std::map<LLHandle<LLView>, LLHandle<LLView> > focus_history_map_t; - focus_history_map_t mFocusHistory; + Impl * mImpl; }; extern LLFocusMgr gFocusMgr; diff --git a/indra/llui/lliconctrl.h b/indra/llui/lliconctrl.h index 669e126266..efa0925a4a 100644 --- a/indra/llui/lliconctrl.h +++ b/indra/llui/lliconctrl.h @@ -30,6 +30,7 @@ #include "lluuid.h" #include "v4color.h" #include "lluictrl.h" +#include "lluiimage.h" #include "stdenums.h" class LLTextBox; diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h index 7b5fa218f2..fe191e5971 100644 --- a/indra/llui/lllineeditor.h +++ b/indra/llui/lllineeditor.h @@ -41,6 +41,7 @@ #include "lleditmenuhandler.h" #include "lluictrl.h" +#include "lluiimage.h" #include "lluistring.h" #include "llviewborder.h" diff --git a/indra/llui/llloadingindicator.h b/indra/llui/llloadingindicator.h index c0cb1cc74a..4c47cc267c 100644 --- a/indra/llui/llloadingindicator.h +++ b/indra/llui/llloadingindicator.h @@ -28,6 +28,7 @@ #define LL_LLLOADINGINDICATOR_H #include "lluictrl.h" +#include "lluiimage.h" /////////////////////////////////////////////////////////////////////////////// // class LLLoadingIndicator diff --git a/indra/llui/llmultislider.cpp b/indra/llui/llmultislider.cpp index d4e6091ee0..f744e9db41 100644 --- a/indra/llui/llmultislider.cpp +++ b/indra/llui/llmultislider.cpp @@ -35,6 +35,7 @@ #include "llkeyboard.h" // for the MASK constants #include "llcontrol.h" #include "lluictrlfactory.h" +#include "lluiimage.h" #include <sstream> diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h index c1a1a06f39..7bbbeaf709 100644 --- a/indra/llui/llpanel.h +++ b/indra/llui/llpanel.h @@ -32,6 +32,7 @@ #include "llcallbackmap.h" #include "lluictrl.h" #include "llviewborder.h" +#include "lluiimage.h" #include "lluistring.h" #include "v4color.h" #include <list> diff --git a/indra/llui/llprogressbar.cpp b/indra/llui/llprogressbar.cpp index ead22686bc..84a890edfa 100644 --- a/indra/llui/llprogressbar.cpp +++ b/indra/llui/llprogressbar.cpp @@ -38,6 +38,7 @@ #include "llfocusmgr.h" #include "lluictrlfactory.h" +#include "lluiimage.h" static LLDefaultChildRegistry::Register<LLProgressBar> r("progress_bar"); diff --git a/indra/llui/llprogressbar.h b/indra/llui/llprogressbar.h index 3f308e7496..a8ec83ea00 100644 --- a/indra/llui/llprogressbar.h +++ b/indra/llui/llprogressbar.h @@ -27,8 +27,9 @@ #ifndef LL_LLPROGRESSBAR_H #define LL_LLPROGRESSBAR_H -#include "lluictrl.h" #include "llframetimer.h" +#include "lluictrl.h" +#include "lluiimage.h" class LLProgressBar : public LLUICtrl diff --git a/indra/llui/llslider.h b/indra/llui/llslider.h index 68823ed68e..700c17ea3e 100644 --- a/indra/llui/llslider.h +++ b/indra/llui/llslider.h @@ -29,6 +29,7 @@ #include "llf32uictrl.h" #include "v4color.h" +#include "lluiimage.h" class LLSlider : public LLF32UICtrl { diff --git a/indra/llui/llstyle.cpp b/indra/llui/llstyle.cpp index 28a064e6b6..bb731f4f7e 100644 --- a/indra/llui/llstyle.cpp +++ b/indra/llui/llstyle.cpp @@ -88,7 +88,7 @@ void LLStyle::setVisible(BOOL is_visible) mVisible = is_visible; } -LLUIImagePtr LLStyle::getImage() const +LLPointer<LLUIImage> LLStyle::getImage() const { return mImagep; } diff --git a/indra/llui/llstyle.h b/indra/llui/llstyle.h index 322edc343c..9f1eba79d8 100644 --- a/indra/llui/llstyle.h +++ b/indra/llui/llstyle.h @@ -30,6 +30,7 @@ #include "v4color.h" #include "llui.h" #include "llinitparam.h" +#include "lluiimage.h" class LLFontGL; @@ -72,7 +73,7 @@ public: void setLinkHREF(const std::string& href); BOOL isLink() const; - LLUIImagePtr getImage() const; + LLPointer<LLUIImage> getImage() const; void setImage(const LLUUID& src); void setImage(const std::string& name); @@ -108,7 +109,7 @@ private: const LLFontGL* mFont; std::string mLink; bool mIsLink; - LLUIImagePtr mImagep; + LLPointer<LLUIImage> mImagep; }; typedef LLPointer<LLStyle> LLStyleSP; diff --git a/indra/llui/lltransutil.cpp b/indra/llui/lltransutil.cpp index 9d0ff9d5cb..58fa8a0828 100644 --- a/indra/llui/lltransutil.cpp +++ b/indra/llui/lltransutil.cpp @@ -26,10 +26,11 @@ #include "linden_common.h" +#include "lltransutil.h" + #include "lltrans.h" #include "lluictrlfactory.h" - -#include "lltransutil.h" +#include "llxmlnode.h" bool LLTransUtil::parseStrings(const std::string& xml_filename, const std::set<std::string>& default_args) diff --git a/indra/llui/llui.h b/indra/llui/llui.h index 6a43477693..c583d58d5a 100644 --- a/indra/llui/llui.h +++ b/indra/llui/llui.h @@ -33,15 +33,12 @@ #include "llrect.h" #include "llcontrol.h" #include "llcoord.h" -#include "lluiimage.h" // *TODO: break this dependency, need to add #include "lluiimage.h" to all widgets that hold an Optional<LLUIImage*> in their paramblocks #include "llinitparam.h" #include "llregistry.h" #include "lluicolor.h" #include "lluicolortable.h" #include <boost/signals2.hpp> #include "lllazyvalue.h" -#include "llhandle.h" // *TODO: remove this dependency, added as a - // convenience when LLHandle moved to llhandle.h #include "llframetimer.h" // LLUIFactory @@ -265,8 +262,6 @@ private: // Moved LLLocalClipRect to lllocalcliprect.h -// Moved all LLHandle-related code to llhandle.h - //RN: maybe this needs to moved elsewhere? class LLImageProviderInterface { diff --git a/indra/llui/llview.h b/indra/llui/llview.h index 61dc4b8030..8f167959b9 100644 --- a/indra/llui/llview.h +++ b/indra/llui/llview.h @@ -34,6 +34,7 @@ #include "stdtypes.h" #include "llcoord.h" #include "llfontgl.h" +#include "llhandle.h" #include "llmortician.h" #include "llmousehandler.h" #include "llstring.h" diff --git a/indra/llui/llviewborder.cpp b/indra/llui/llviewborder.cpp index 89cd34c37c..32d7ea7c25 100644 --- a/indra/llui/llviewborder.cpp +++ b/indra/llui/llviewborder.cpp @@ -28,6 +28,7 @@ #include "llrender.h" #include "llfocusmgr.h" #include "lluictrlfactory.h" +#include "lluiimage.h" static LLDefaultChildRegistry::Register<LLViewBorder> r("view_border"); diff --git a/indra/llui/llwindowshade.h b/indra/llui/llwindowshade.h index 0047195929..09ffc2cd54 100644 --- a/indra/llui/llwindowshade.h +++ b/indra/llui/llwindowshade.h @@ -29,6 +29,7 @@ #include "lluictrl.h" #include "llnotifications.h" +#include "lluiimage.h" class LLWindowShade : public LLUICtrl { diff --git a/indra/llxuixml/lltrans.cpp b/indra/llxuixml/lltrans.cpp index e13d73c640..b403b86048 100644 --- a/indra/llxuixml/lltrans.cpp +++ b/indra/llxuixml/lltrans.cpp @@ -30,6 +30,7 @@ #include "llfasttimer.h" // for call count statistics #include "llxuiparser.h" +#include "llxmlnode.h" #include <map> diff --git a/indra/llxuixml/lltrans.h b/indra/llxuixml/lltrans.h index 5b127b53cf..b7091f77e8 100644 --- a/indra/llxuixml/lltrans.h +++ b/indra/llxuixml/lltrans.h @@ -29,8 +29,10 @@ #include <map> +#include "llpointer.h" #include "llstring.h" -#include "llxmlnode.h" + +class LLXMLNode; /** * @brief String template loaded from strings.xml @@ -61,9 +63,9 @@ public: * @param default_args Set of strings (expected to be in the file) to use as default replacement args, e.g. "SECOND_LIFE" * @returns true if the file was parsed successfully, true if something went wrong */ - static bool parseStrings(LLXMLNodePtr& root, const std::set<std::string>& default_args); + static bool parseStrings(LLPointer<LLXMLNode> & root, const std::set<std::string>& default_args); - static bool parseLanguageStrings(LLXMLNodePtr &root); + static bool parseLanguageStrings(LLPointer<LLXMLNode> & root); /** * @brief Returns a translated string diff --git a/indra/llxuixml/llxuiparser.h b/indra/llxuixml/llxuiparser.h index 7a748d8aea..0c38c4da93 100644 --- a/indra/llxuixml/llxuiparser.h +++ b/indra/llxuixml/llxuiparser.h @@ -28,7 +28,6 @@ #define LLXUIPARSER_H #include "llinitparam.h" -#include "llfasttimer.h" #include "llregistry.h" #include "llpointer.h" @@ -95,6 +94,7 @@ public: }; +class LLXUIParserImpl; class LLXUIParser : public LLInitParam::Parser { @@ -176,6 +176,7 @@ private: // ordering of child elements from base file to localized diff file. Then we can use a pair // of coroutines to perform matching of xml nodes during parsing. Not sure if the overhead // of coroutines would offset the gain from SAX parsing +class LLSimpleXUIParserImpl; class LLSimpleXUIParser : public LLInitParam::Parser { diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index aea4e78436..c8306117ba 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -25,10 +25,12 @@ */ #include "llviewerprecompiledheaders.h" + #include "llagent.h" #include "pipeline.h" +#include "llagentaccess.h" #include "llagentcamera.h" #include "llagentlistener.h" #include "llagentwearables.h" @@ -36,6 +38,7 @@ #include "llanimationstates.h" #include "llbottomtray.h" #include "llcallingcard.h" +#include "llcapabilitylistener.h" #include "llchannelmanager.h" #include "llconsole.h" #include "llfirstuse.h" @@ -55,8 +58,10 @@ #include "llpaneltopinfobar.h" #include "llparcel.h" #include "llrendersphere.h" +#include "llsdmessage.h" #include "llsdutil.h" #include "llsky.h" +#include "llslurl.h" #include "llsmoothstep.h" #include "llstartup.h" #include "llstatusbar.h" @@ -73,6 +78,7 @@ #include "llviewerobjectlist.h" #include "llviewerparcelmgr.h" #include "llviewerstats.h" +#include "llviewerwindow.h" #include "llvoavatarself.h" #include "llwindow.h" #include "llworld.h" @@ -171,7 +177,8 @@ LLAgent::LLAgent() : mbRunning(false), mbTeleportKeepsLookAt(false), - mAgentAccess(gSavedSettings), + mAgentAccess(new LLAgentAccess(gSavedSettings)), + mTeleportSourceSLURL(new LLSLURL), mTeleportState( TELEPORT_NONE ), mRegionp(NULL), @@ -208,7 +215,7 @@ LLAgent::LLAgent() : mAutoPilotFinishedCallback(NULL), mAutoPilotCallbackData(NULL), - mEffectColor(LLColor4(0.f, 1.f, 1.f, 1.f)), + mEffectColor(new LLUIColor(LLColor4(0.f, 1.f, 1.f, 1.f))), mHaveHomePosition(FALSE), mHomeRegionHandle( 0 ), @@ -250,7 +257,7 @@ void LLAgent::init() setFlying( gSavedSettings.getBOOL("FlyingAtExit") ); - mEffectColor = LLUIColorTable::instance().getColor("EffectColor"); + *mEffectColor = LLUIColorTable::instance().getColor("EffectColor"); gSavedSettings.getControl("PreferredMaturity")->getValidateSignal()->connect(boost::bind(&LLAgent::validateMaturity, this, _2)); gSavedSettings.getControl("PreferredMaturity")->getSignal()->connect(boost::bind(&LLAgent::handleMaturity, this, _2)); @@ -274,9 +281,16 @@ LLAgent::~LLAgent() cleanup(); delete mMouselookModeInSignal; + mMouselookModeInSignal = NULL; delete mMouselookModeOutSignal; + mMouselookModeOutSignal = NULL; - // *Note: this is where LLViewerCamera::getInstance() used to be deleted. + delete mAgentAccess; + mAgentAccess = NULL; + delete mEffectColor; + mEffectColor = NULL; + delete mTeleportSourceSLURL; + mTeleportSourceSLURL = NULL; } // Handle any actions that need to be performed when the main app gains focus @@ -2139,32 +2153,32 @@ void LLAgent::onAnimStop(const LLUUID& id) bool LLAgent::isGodlike() const { - return mAgentAccess.isGodlike(); + return mAgentAccess->isGodlike(); } bool LLAgent::isGodlikeWithoutAdminMenuFakery() const { - return mAgentAccess.isGodlikeWithoutAdminMenuFakery(); + return mAgentAccess->isGodlikeWithoutAdminMenuFakery(); } U8 LLAgent::getGodLevel() const { - return mAgentAccess.getGodLevel(); + return mAgentAccess->getGodLevel(); } bool LLAgent::wantsPGOnly() const { - return mAgentAccess.wantsPGOnly(); + return mAgentAccess->wantsPGOnly(); } bool LLAgent::canAccessMature() const { - return mAgentAccess.canAccessMature(); + return mAgentAccess->canAccessMature(); } bool LLAgent::canAccessAdult() const { - return mAgentAccess.canAccessAdult(); + return mAgentAccess->canAccessAdult(); } bool LLAgent::canAccessMaturityInRegion( U64 region_handle ) const @@ -2199,37 +2213,37 @@ bool LLAgent::canAccessMaturityAtGlobal( LLVector3d pos_global ) const bool LLAgent::prefersPG() const { - return mAgentAccess.prefersPG(); + return mAgentAccess->prefersPG(); } bool LLAgent::prefersMature() const { - return mAgentAccess.prefersMature(); + return mAgentAccess->prefersMature(); } bool LLAgent::prefersAdult() const { - return mAgentAccess.prefersAdult(); + return mAgentAccess->prefersAdult(); } bool LLAgent::isTeen() const { - return mAgentAccess.isTeen(); + return mAgentAccess->isTeen(); } bool LLAgent::isMature() const { - return mAgentAccess.isMature(); + return mAgentAccess->isMature(); } bool LLAgent::isAdult() const { - return mAgentAccess.isAdult(); + return mAgentAccess->isAdult(); } void LLAgent::setTeen(bool teen) { - mAgentAccess.setTeen(teen); + mAgentAccess->setTeen(teen); } //static @@ -2274,37 +2288,37 @@ bool LLAgent::sendMaturityPreferenceToServer(int preferredMaturity) BOOL LLAgent::getAdminOverride() const { - return mAgentAccess.getAdminOverride(); + return mAgentAccess->getAdminOverride(); } void LLAgent::setMaturity(char text) { - mAgentAccess.setMaturity(text); + mAgentAccess->setMaturity(text); } void LLAgent::setAdminOverride(BOOL b) { - mAgentAccess.setAdminOverride(b); + mAgentAccess->setAdminOverride(b); } void LLAgent::setGodLevel(U8 god_level) { - mAgentAccess.setGodLevel(god_level); + mAgentAccess->setGodLevel(god_level); } void LLAgent::setAOTransition() { - mAgentAccess.setTransition(); + mAgentAccess->setTransition(); } const LLAgentAccess& LLAgent::getAgentAccess() { - return mAgentAccess; + return *mAgentAccess; } bool LLAgent::validateMaturity(const LLSD& newvalue) { - return mAgentAccess.canSetMaturity(newvalue.asInteger()); + return mAgentAccess->canSetMaturity(newvalue.asInteger()); } void LLAgent::handleMaturity(const LLSD& newvalue) @@ -2636,12 +2650,12 @@ BOOL LLAgent::allowOperation(PermissionBit op, const LLColor4 &LLAgent::getEffectColor() { - return mEffectColor; + return *mEffectColor; } void LLAgent::setEffectColor(const LLColor4 &color) { - mEffectColor = color; + *mEffectColor = color; } void LLAgent::initOriginGlobal(const LLVector3d &origin_global) @@ -3469,7 +3483,7 @@ void LLAgent::setTeleportState(ETeleportState state) case TELEPORT_MOVING: // We're outa here. Save "back" slurl. - LLAgentUI::buildSLURL(mTeleportSourceSLURL); + LLAgentUI::buildSLURL(*mTeleportSourceSLURL); break; case TELEPORT_ARRIVING: @@ -3802,6 +3816,11 @@ void LLAgent::parseTeleportMessages(const std::string& xml_filename) }//end for (all message sets in xml file) } +const void LLAgent::getTeleportSourceSLURL(LLSLURL& slurl) const +{ + slurl = *mTeleportSourceSLURL; +} + void LLAgent::sendAgentUpdateUserInfo(bool im_via_email, const std::string& directory_visibility ) { gMessageSystem->newMessageFast(_PREHASH_UpdateUserInfo); diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index 896408c0dd..54c5649f97 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -29,15 +29,11 @@ #include "indra_constants.h" #include "llevent.h" // LLObservable base class -#include "llagentaccess.h" #include "llagentconstants.h" #include "llagentdata.h" // gAgentID, gAgentSessionID -#include "llcharacter.h" // LLAnimPauseRequest +#include "llcharacter.h" #include "llcoordframe.h" // for mFrameAgent -#include "llpointer.h" -#include "lluicolor.h" #include "llvoavatardefines.h" -#include "llslurl.h" #include <boost/signals2.hpp> @@ -56,6 +52,10 @@ class LLFriendObserver; class LLPickInfo; class LLViewerObject; class LLAgentDropGroupViewerNode; +class LLAgentAccess; +class LLSLURL; +class LLPauseRequestHandle; +class LLUIColor; //-------------------------------------------------------------------- // Types @@ -80,6 +80,8 @@ struct LLGroupData class LLAgentListener; +class LLAgentImpl; + //------------------------------------------------------------------------ // LLAgent //------------------------------------------------------------------------ @@ -420,7 +422,7 @@ private: camera_signal_t* mMouselookModeInSignal; camera_signal_t* mMouselookModeOutSignal; BOOL mCustomAnim; // Current animation is ANIM_AGENT_CUSTOMIZE ? - LLAnimPauseRequest mPauseRequest; + LLPointer<LLPauseRequestHandle> mPauseRequest; BOOL mViewsPushed; // Keep track of whether or not we have pushed views /** Animation @@ -515,13 +517,13 @@ public: public: static void parseTeleportMessages(const std::string& xml_filename); - const void getTeleportSourceSLURL(LLSLURL& slurl) const { slurl = mTeleportSourceSLURL; } + const void getTeleportSourceSLURL(LLSLURL& slurl) const; public: // ! TODO ! Define ERROR and PROGRESS enums here instead of exposing the mappings. static std::map<std::string, std::string> sTeleportErrorMessages; static std::map<std::string, std::string> sTeleportProgressMessages; private: - LLSLURL mTeleportSourceSLURL; // SLURL where last TP began + LLSLURL * mTeleportSourceSLURL; // SLURL where last TP began //-------------------------------------------------------------------- // Teleport Actions @@ -580,7 +582,7 @@ public: // ! BACKWARDS COMPATIBILITY ! This function can go away after the AO transition (see llstartup.cpp). void setAOTransition(); private: - LLAgentAccess mAgentAccess; + LLAgentAccess * mAgentAccess; //-------------------------------------------------------------------- // God @@ -660,7 +662,7 @@ public: const LLColor4 &getEffectColor(); void setEffectColor(const LLColor4 &color); private: - LLUIColor mEffectColor; + LLUIColor * mEffectColor; /** Rendering ** ** diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 9de2941c4a..a1fe898005 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -82,7 +82,7 @@ #include "lltextutil.h" #include "lllogininstance.h" #include "llprogressview.h" - +#include "llvocache.h" #include "llweb.h" #include "llsecondlifeurls.h" #include "llupdaterservice.h" @@ -132,7 +132,6 @@ #include "lltoolmgr.h" #include "llassetstorage.h" #include "llpolymesh.h" -#include "llcachename.h" #include "llaudioengine.h" #include "llstreamingaudio.h" #include "llviewermenu.h" diff --git a/indra/newview/lleventnotifier.h b/indra/newview/lleventnotifier.h index 697a708762..3fee46c2f6 100644 --- a/indra/newview/lleventnotifier.h +++ b/indra/newview/lleventnotifier.h @@ -31,6 +31,7 @@ #include "v3dmath.h" class LLEventNotification; +class LLMessageSystem; class LLEventNotifier diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 7be4ebc690..0d0c1f594d 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -38,6 +38,7 @@ #include "message.h" #include "llagent.h" +#include "llagentaccess.h" #include "llbutton.h" #include "llcheckboxctrl.h" #include "llcombobox.h" diff --git a/indra/newview/llfloaterland.h b/indra/newview/llfloaterland.h index a096fb64cd..8a70fa24d8 100644 --- a/indra/newview/llfloaterland.h +++ b/indra/newview/llfloaterland.h @@ -43,11 +43,12 @@ class LLButton; class LLCheckBoxCtrl; class LLRadioGroup; class LLComboBox; -class LLNameListCtrl; -class LLSpinCtrl; class LLLineEditor; +class LLMessageSystem; +class LLNameListCtrl; class LLRadioGroup; class LLParcelSelectionObserver; +class LLSpinCtrl; class LLTabContainer; class LLTextBox; class LLTextEditor; diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index add591895b..00dc7b1627 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -53,6 +53,7 @@ #include "llfloaterpostcard.h" #include "llcheckboxctrl.h" #include "llradiogroup.h" +#include "llslurl.h" #include "lltoolfocus.h" #include "lltoolmgr.h" #include "llwebsharing.h" diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h index 2006e094a8..fc941510ab 100644 --- a/indra/newview/llfolderviewitem.h +++ b/indra/newview/llfolderviewitem.h @@ -28,6 +28,7 @@ #include "llview.h" #include "lldarray.h" // *TODO: Eliminate, forward declare +#include "lluiimage.h" class LLFontGL; class LLFolderView; diff --git a/indra/newview/lllocationhistory.h b/indra/newview/lllocationhistory.h index 188fbf1f9b..9fef42c5df 100644 --- a/indra/newview/lllocationhistory.h +++ b/indra/newview/lllocationhistory.h @@ -33,6 +33,7 @@ #include <string> #include <map> #include <boost/function.hpp> +#include <boost/signals2.hpp> class LLSD; /** diff --git a/indra/newview/lloutputmonitorctrl.h b/indra/newview/lloutputmonitorctrl.h index 026803584d..2d23753d46 100644 --- a/indra/newview/lloutputmonitorctrl.h +++ b/indra/newview/lloutputmonitorctrl.h @@ -31,6 +31,7 @@ #include "llview.h" #include "llmutelist.h" #include "llspeakingindicatormanager.h" +#include "lluiimage.h" class LLTextBox; class LLUICtrlFactory; diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp index 73c4722b82..d58a1cb663 100644 --- a/indra/newview/llpanelavatar.cpp +++ b/indra/newview/llpanelavatar.cpp @@ -36,6 +36,7 @@ #include "llimview.h" #include "llmenubutton.h" #include "llnotificationsutil.h" +#include "llslurl.h" #include "lltexteditor.h" #include "lltexturectrl.h" #include "lltoggleablemenu.h" diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp index ec340dc258..1576ccccdf 100644 --- a/indra/newview/llpanelgroupgeneral.cpp +++ b/indra/newview/llpanelgroupgeneral.cpp @@ -44,6 +44,7 @@ #include "llnotificationsutil.h" #include "llscrolllistitem.h" #include "llspinctrl.h" +#include "llslurl.h" #include "lltextbox.h" #include "lltexteditor.h" #include "lltexturectrl.h" diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp index 3dbc637318..fbe331c7ab 100644 --- a/indra/newview/llpanelgrouproles.cpp +++ b/indra/newview/llpanelgrouproles.cpp @@ -42,6 +42,7 @@ #include "llscrolllistctrl.h" #include "llscrolllistitem.h" #include "llscrolllistcell.h" +#include "llslurl.h" #include "lltabcontainer.h" #include "lltextbox.h" #include "lltexteditor.h" diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp index 8e5beb33ce..9f5c55bad1 100644 --- a/indra/newview/llpreviewgesture.cpp +++ b/indra/newview/llpreviewgesture.cpp @@ -34,6 +34,7 @@ #include "llassetuploadresponders.h" #include "llcheckboxctrl.h" #include "llcombobox.h" +#include "lldatapacker.h" #include "lldelayedgestureerror.h" #include "llfloaterreg.h" #include "llgesturemgr.h" diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp index c8c6858b81..fbd2f7ca83 100644 --- a/indra/newview/llsidepaneliteminfo.cpp +++ b/indra/newview/llsidepaneliteminfo.cpp @@ -39,6 +39,7 @@ #include "llinventoryobserver.h" #include "lllineeditor.h" #include "llradiogroup.h" +#include "llslurl.h" #include "llviewercontrol.h" #include "llviewerinventory.h" #include "llviewerobjectlist.h" diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index ba243f258a..671a334600 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -35,7 +35,6 @@ #include "llagentwearables.h" #include "llappearancemgr.h" #include "lldictionary.h" -//#include "llfirstuse.h" #include "llfloaterreg.h" #include "llfloatertools.h" #include "llgesturemgr.h" diff --git a/indra/newview/llviewerchat.cpp b/indra/newview/llviewerchat.cpp index e7a0d17c3a..e06fe7bda0 100644 --- a/indra/newview/llviewerchat.cpp +++ b/indra/newview/llviewerchat.cpp @@ -29,6 +29,8 @@ // newview includes #include "llagent.h" // gAgent +#include "llslurl.h" +#include "lluicolor.h" #include "lluicolortable.h" #include "llviewercontrol.h" // gSavedSettings #include "llviewerregion.h" diff --git a/indra/newview/llviewerkeyboard.h b/indra/newview/llviewerkeyboard.h index 925244e89b..ca73212ed1 100644 --- a/indra/newview/llviewerkeyboard.h +++ b/indra/newview/llviewerkeyboard.h @@ -28,6 +28,7 @@ #define LL_LLVIEWERKEYBOARD_H #include "llkeyboard.h" // For EKeystate +#include "llinitparam.h" const S32 MAX_NAMED_FUNCTIONS = 100; const S32 MAX_KEY_BINDINGS = 128; // was 60 diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 5a3baf2650..d19f8f4327 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -37,6 +37,7 @@ // newview includes #include "llagent.h" +#include "llagentaccess.h" #include "llagentcamera.h" #include "llagentwearables.h" #include "llagentpilot.h" diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index e84e4a859a..741cc37036 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -42,6 +42,7 @@ // Viewer includes #include "llagent.h" +#include "llagentaccess.h" #include "llviewerwindow.h" #include "llviewercontrol.h" //#include "llfirstuse.h" @@ -54,6 +55,7 @@ #include "llresmgr.h" #include "llsdutil.h" #include "llsdutil_math.h" +#include "llslurl.h" #include "llstatusbar.h" #include "llui.h" #include "llviewertexture.h" diff --git a/indra/newview/llviewerprecompiledheaders.h b/indra/newview/llviewerprecompiledheaders.h index ab07adce5d..45c9b3e91f 100644 --- a/indra/newview/llviewerprecompiledheaders.h +++ b/indra/newview/llviewerprecompiledheaders.h @@ -99,8 +99,6 @@ #include "llcoord.h" #include "llcoordframe.h" #include "llcrc.h" -#include "llinterp.h" -#include "llperlin.h" #include "llplane.h" #include "llquantize.h" #include "llrand.h" @@ -109,7 +107,6 @@ #include "m3math.h" #include "m4math.h" #include "llquaternion.h" -#include "raytrace.h" #include "v2math.h" #include "v3color.h" #include "v3dmath.h" @@ -117,16 +114,12 @@ #include "v4color.h" #include "v4coloru.h" #include "v4math.h" -////#include "vmath.h" #include "xform.h" // Library includes from llvfs #include "lldir.h" - -// Library includes from llmessage project + +// Library includes from llmessage project #include "llcachename.h" -// llxuixml -#include "llinitparam.h" - #endif diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index c53fdc3393..8909abf36e 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -46,6 +46,7 @@ #include "llagentcamera.h" #include "llcallingcard.h" #include "llcaphttpsender.h" +#include "llcapabilitylistener.h" #include "llcommandhandler.h" #include "lldir.h" #include "lleventpoll.h" @@ -76,6 +77,71 @@ const F32 WATER_TEXTURE_SCALE = 8.f; // Number of times to repeat the water texture across a region const S16 MAX_MAP_DIST = 10; +typedef std::map<std::string, std::string> CapabilityMap; + +class LLViewerRegionImpl { +public: + LLViewerRegionImpl(LLViewerRegion * region, LLHost const & host) + : mHost(host), + mCompositionp(NULL), + mEventPoll(NULL), + // I'd prefer to set the LLCapabilityListener name to match the region + // name -- it's disappointing that's not available at construction time. + // We could instead store an LLCapabilityListener*, making + // setRegionNameAndZone() replace the instance. Would that pose + // consistency problems? Can we even request a capability before calling + // setRegionNameAndZone()? + // For testability -- the new Michael Feathers paradigm -- + // LLCapabilityListener binds all the globals it expects to need at + // construction time. + mCapabilityListener(host.getString(), gMessageSystem, *region, + gAgent.getID(), gAgent.getSessionID()) + { + } + + // The surfaces and other layers + LLSurface* mLandp; + + // Region geometry data + LLVector3d mOriginGlobal; // Location of southwest corner of region (meters) + LLVector3d mCenterGlobal; // Location of center in world space (meters) + LLHost mHost; + + // The unique ID for this region. + LLUUID mRegionID; + + // region/estate owner - usually null. + LLUUID mOwnerID; + + // Network statistics for the region's circuit... + LLTimer mLastNetUpdate; + + // Misc + LLVLComposition *mCompositionp; // Composition layer for the surface + + LLVOCacheEntry::vocache_entry_map_t mCacheMap; + // time? + // LRU info? + + // Cache ID is unique per-region, across renames, moving locations, + // etc. + LLUUID mCacheID; + + CapabilityMap mCapabilities; + + LLEventPoll* mEventPoll; + + /// Post an event to this LLCapabilityListener to invoke a capability message on + /// this LLViewerRegion's server + /// (https://wiki.lindenlab.com/wiki/Viewer:Messaging/Messaging_Notes#Capabilities) + LLCapabilityListener mCapabilityListener; + + //spatial partitions for objects in this region + std::vector<LLSpatialPartition*> mObjectPartition; + + LLHTTPClient::ResponderPtr mHttpResponderPtr ; +}; + // support for secondlife:///app/region/{REGION} SLapps // N.B. this is defined to work exactly like the classic secondlife://{REGION} // However, the later syntax cannot support spaces in the region name because @@ -191,15 +257,12 @@ LLViewerRegion::LLViewerRegion(const U64 &handle, const U32 grids_per_region_edge, const U32 grids_per_patch_edge, const F32 region_width_meters) -: mCenterGlobal(), +: mImpl(new LLViewerRegionImpl(this, host)), mHandle(handle), - mHost( host ), mTimeDilation(1.0f), mName(""), mZoning(""), - mOwnerID(), mIsEstateManager(FALSE), - mCompositionp(NULL), mRegionFlags( REGION_FLAGS_DEFAULT ), mSimAccess( SIM_ACCESS_MIN ), mBillableFactor(1.0), @@ -212,37 +275,27 @@ LLViewerRegion::LLViewerRegion(const U64 &handle, mHttpUrl(""), mCacheLoaded(FALSE), mCacheDirty(FALSE), - mCacheID(), - mEventPoll(NULL), mReleaseNotesRequested(FALSE), - // I'd prefer to set the LLCapabilityListener name to match the region - // name -- it's disappointing that's not available at construction time. - // We could instead store an LLCapabilityListener*, making - // setRegionNameAndZone() replace the instance. Would that pose - // consistency problems? Can we even request a capability before calling - // setRegionNameAndZone()? - // For testability -- the new Michael Feathers paradigm -- - // LLCapabilityListener binds all the globals it expects to need at - // construction time. - mCapabilityListener(host.getString(), gMessageSystem, *this, - gAgent.getID(), gAgent.getSessionID()), mCapabilitiesReceived(false) { mWidth = region_width_meters; - mOriginGlobal = from_region_handle(handle); + mImpl->mOriginGlobal = from_region_handle(handle); updateRenderMatrix(); - mLandp = new LLSurface('l', NULL); + mImpl->mLandp = new LLSurface('l', NULL); // Create the composition layer for the surface - mCompositionp = new LLVLComposition(mLandp, grids_per_region_edge, region_width_meters/grids_per_region_edge); - mCompositionp->setSurface(mLandp); + mImpl->mCompositionp = + new LLVLComposition(mImpl->mLandp, + grids_per_region_edge, + region_width_meters / grids_per_region_edge); + mImpl->mCompositionp->setSurface(mImpl->mLandp); // Create the surfaces - mLandp->setRegion(this); - mLandp->create(grids_per_region_edge, + mImpl->mLandp->setRegion(this); + mImpl->mLandp->create(grids_per_region_edge, grids_per_patch_edge, - mOriginGlobal, + mImpl->mOriginGlobal, mWidth); mParcelOverlay = new LLViewerParcelOverlay(this, region_width_meters); @@ -255,24 +308,24 @@ LLViewerRegion::LLViewerRegion(const U64 &handle, //create object partitions //MUST MATCH declaration of eObjectPartitions - mObjectPartition.push_back(new LLHUDPartition()); //PARTITION_HUD - mObjectPartition.push_back(new LLTerrainPartition()); //PARTITION_TERRAIN - mObjectPartition.push_back(new LLVoidWaterPartition()); //PARTITION_VOIDWATER - mObjectPartition.push_back(new LLWaterPartition()); //PARTITION_WATER - mObjectPartition.push_back(new LLTreePartition()); //PARTITION_TREE - mObjectPartition.push_back(new LLParticlePartition()); //PARTITION_PARTICLE - mObjectPartition.push_back(new LLCloudPartition()); //PARTITION_CLOUD - mObjectPartition.push_back(new LLGrassPartition()); //PARTITION_GRASS - mObjectPartition.push_back(new LLVolumePartition()); //PARTITION_VOLUME - mObjectPartition.push_back(new LLBridgePartition()); //PARTITION_BRIDGE - mObjectPartition.push_back(new LLHUDParticlePartition());//PARTITION_HUD_PARTICLE - mObjectPartition.push_back(NULL); //PARTITION_NONE + mImpl->mObjectPartition.push_back(new LLHUDPartition()); //PARTITION_HUD + mImpl->mObjectPartition.push_back(new LLTerrainPartition()); //PARTITION_TERRAIN + mImpl->mObjectPartition.push_back(new LLVoidWaterPartition()); //PARTITION_VOIDWATER + mImpl->mObjectPartition.push_back(new LLWaterPartition()); //PARTITION_WATER + mImpl->mObjectPartition.push_back(new LLTreePartition()); //PARTITION_TREE + mImpl->mObjectPartition.push_back(new LLParticlePartition()); //PARTITION_PARTICLE + mImpl->mObjectPartition.push_back(new LLCloudPartition()); //PARTITION_CLOUD + mImpl->mObjectPartition.push_back(new LLGrassPartition()); //PARTITION_GRASS + mImpl->mObjectPartition.push_back(new LLVolumePartition()); //PARTITION_VOLUME + mImpl->mObjectPartition.push_back(new LLBridgePartition()); //PARTITION_BRIDGE + mImpl->mObjectPartition.push_back(new LLHUDParticlePartition());//PARTITION_HUD_PARTICLE + mImpl->mObjectPartition.push_back(NULL); //PARTITION_NONE } void LLViewerRegion::initStats() { - mLastNetUpdate.reset(); + mImpl->mLastNetUpdate.reset(); mPacketsIn = 0; mBitsIn = 0; mLastBitsIn = 0; @@ -287,9 +340,9 @@ void LLViewerRegion::initStats() LLViewerRegion::~LLViewerRegion() { - if(mHttpResponderPtr) + if(mImpl->mHttpResponderPtr) { - (static_cast<BaseCapabilitiesComplete*>(mHttpResponderPtr.get()))->setRegion(NULL) ; + (static_cast<BaseCapabilitiesComplete*>(mImpl->mHttpResponderPtr.get()))->setRegion(NULL) ; } gVLManager.cleanupData(this); @@ -301,21 +354,44 @@ LLViewerRegion::~LLViewerRegion() gObjectList.killObjects(this); - delete mCompositionp; + delete mImpl->mCompositionp; delete mParcelOverlay; - delete mLandp; - delete mEventPoll; - LLHTTPSender::clearSender(mHost); + delete mImpl->mLandp; + delete mImpl->mEventPoll; + LLHTTPSender::clearSender(mImpl->mHost); saveObjectCache(); - std::for_each(mObjectPartition.begin(), mObjectPartition.end(), DeletePointer()); + std::for_each(mImpl->mObjectPartition.begin(), mImpl->mObjectPartition.end(), DeletePointer()); + + delete mImpl; + mImpl = NULL; +} + +LLEventPump& LLViewerRegion::getCapAPI() const +{ + return mImpl->mCapabilityListener.getCapAPI(); } /*virtual*/ const LLHost& LLViewerRegion::getHost() const { - return mHost; + return mImpl->mHost; +} + +LLSurface & LLViewerRegion::getLand() const +{ + return *mImpl->mLandp; +} + +const LLUUID& LLViewerRegion::getRegionID() const +{ + return mImpl->mRegionID; +} + +void LLViewerRegion::setRegionID(const LLUUID& region_id) +{ + mImpl->mRegionID = region_id; } void LLViewerRegion::loadObjectCache() @@ -330,7 +406,7 @@ void LLViewerRegion::loadObjectCache() if(LLVOCache::hasInstance()) { - LLVOCache::getInstance()->readFromCache(mHandle, mCacheID, mCacheMap) ; + LLVOCache::getInstance()->readFromCache(mHandle, mImpl->mCacheID, mImpl->mCacheMap) ; } } @@ -342,32 +418,32 @@ void LLViewerRegion::saveObjectCache() return; } - if (mCacheMap.empty()) + if (mImpl->mCacheMap.empty()) { return; } if(LLVOCache::hasInstance()) { - LLVOCache::getInstance()->writeToCache(mHandle, mCacheID, mCacheMap, mCacheDirty) ; + LLVOCache::getInstance()->writeToCache(mHandle, mImpl->mCacheID, mImpl->mCacheMap, mCacheDirty) ; mCacheDirty = FALSE; } - for(LLVOCacheEntry::vocache_entry_map_t::iterator iter = mCacheMap.begin(); iter != mCacheMap.end(); ++iter) + for(LLVOCacheEntry::vocache_entry_map_t::iterator iter = mImpl->mCacheMap.begin(); iter != mImpl->mCacheMap.end(); ++iter) { delete iter->second; } - mCacheMap.clear(); + mImpl->mCacheMap.clear(); } void LLViewerRegion::sendMessage() { - gMessageSystem->sendMessage(mHost); + gMessageSystem->sendMessage(mImpl->mHost); } void LLViewerRegion::sendReliableMessage() { - gMessageSystem->sendReliable(mHost); + gMessageSystem->sendReliable(mImpl->mHost); } void LLViewerRegion::setFlags(BOOL b, U32 flags) @@ -384,12 +460,12 @@ void LLViewerRegion::setFlags(BOOL b, U32 flags) void LLViewerRegion::setWaterHeight(F32 water_level) { - mLandp->setWaterHeight(water_level); + mImpl->mLandp->setWaterHeight(water_level); } F32 LLViewerRegion::getWaterHeight() const { - return mLandp->getWaterHeight(); + return mImpl->mLandp->getWaterHeight(); } BOOL LLViewerRegion::isVoiceEnabled() const @@ -405,9 +481,9 @@ void LLViewerRegion::setRegionFlags(U32 flags) void LLViewerRegion::setOriginGlobal(const LLVector3d &origin_global) { - mOriginGlobal = origin_global; + mImpl->mOriginGlobal = origin_global; updateRenderMatrix(); - mLandp->setOriginGlobal(origin_global); + mImpl->mLandp->setOriginGlobal(origin_global); mWind.setOriginGlobal(origin_global); mCloudLayer.setOriginGlobal(origin_global); calculateCenterGlobal(); @@ -423,16 +499,34 @@ void LLViewerRegion::setTimeDilation(F32 time_dilation) mTimeDilation = time_dilation; } +const LLVector3d & LLViewerRegion::getOriginGlobal() const +{ + return mImpl->mOriginGlobal; +} LLVector3 LLViewerRegion::getOriginAgent() const { - return gAgent.getPosAgentFromGlobal(mOriginGlobal); + return gAgent.getPosAgentFromGlobal(mImpl->mOriginGlobal); } +const LLVector3d & LLViewerRegion::getCenterGlobal() const +{ + return mImpl->mCenterGlobal; +} LLVector3 LLViewerRegion::getCenterAgent() const { - return gAgent.getPosAgentFromGlobal(mCenterGlobal); + return gAgent.getPosAgentFromGlobal(mImpl->mCenterGlobal); +} + +void LLViewerRegion::setOwner(const LLUUID& owner_id) +{ + mImpl->mOwnerID = owner_id; +} + +const LLUUID& LLViewerRegion::getOwner() const +{ + return mImpl->mOwnerID; } void LLViewerRegion::setRegionNameAndZone (const std::string& name_zone) @@ -557,7 +651,10 @@ void LLViewerRegion::processRegionInfo(LLMessageSystem* msg, void**) LLFloaterReporter::processRegionInfo(msg); } - +void LLViewerRegion::setCacheID(const LLUUID& id) +{ + mImpl->mCacheID = id; +} S32 LLViewerRegion::renderPropertyLines() { @@ -585,7 +682,7 @@ BOOL LLViewerRegion::idleUpdate(F32 max_update_time) { LLMemType mt_ivr(LLMemType::MTYPE_IDLE_UPDATE_VIEWER_REGION); // did_update returns TRUE if we did at least one significant update - BOOL did_update = mLandp->idleUpdate(max_update_time); + BOOL did_update = mImpl->mLandp->idleUpdate(max_update_time); if (mParcelOverlay) { @@ -600,7 +697,7 @@ BOOL LLViewerRegion::idleUpdate(F32 max_update_time) // As above, but forcibly do the update. void LLViewerRegion::forceUpdate() { - mLandp->idleUpdate(0.f); + mImpl->mLandp->idleUpdate(0.f); if (mParcelOverlay) { @@ -610,17 +707,21 @@ void LLViewerRegion::forceUpdate() void LLViewerRegion::connectNeighbor(LLViewerRegion *neighborp, U32 direction) { - mLandp->connectNeighbor(neighborp->mLandp, direction); + mImpl->mLandp->connectNeighbor(neighborp->mImpl->mLandp, direction); mCloudLayer.connectNeighbor(&(neighborp->mCloudLayer), direction); } void LLViewerRegion::disconnectAllNeighbors() { - mLandp->disconnectAllNeighbors(); + mImpl->mLandp->disconnectAllNeighbors(); mCloudLayer.disconnectAllNeighbors(); } +LLVLComposition * LLViewerRegion::getComposition() const +{ + return mImpl->mCompositionp; +} F32 LLViewerRegion::getCompositionXY(const S32 x, const S32 y) const { @@ -714,10 +815,10 @@ F32 LLViewerRegion::getCompositionXY(const S32 x, const S32 y) const void LLViewerRegion::calculateCenterGlobal() { - mCenterGlobal = mOriginGlobal; - mCenterGlobal.mdV[VX] += 0.5 * mWidth; - mCenterGlobal.mdV[VY] += 0.5 * mWidth; - mCenterGlobal.mdV[VZ] = 0.5*mLandp->getMinZ() + mLandp->getMaxZ(); + mImpl->mCenterGlobal = mImpl->mOriginGlobal; + mImpl->mCenterGlobal.mdV[VX] += 0.5 * mWidth; + mImpl->mCenterGlobal.mdV[VY] += 0.5 * mWidth; + mImpl->mCenterGlobal.mdV[VZ] = 0.5 * mImpl->mLandp->getMinZ() + mImpl->mLandp->getMaxZ(); } void LLViewerRegion::calculateCameraDistance() @@ -728,7 +829,7 @@ void LLViewerRegion::calculateCameraDistance() std::ostream& operator<<(std::ostream &s, const LLViewerRegion ®ion) { s << "{ "; - s << region.mHost; + s << region.mImpl->mHost; s << " mOriginGlobal = " << region.getOriginGlobal()<< "\n"; std::string name(region.getName()), zone(region.getZoning()); if (! name.empty()) @@ -748,9 +849,9 @@ std::ostream& operator<<(std::ostream &s, const LLViewerRegion ®ion) void LLViewerRegion::updateNetStats() { - F32 dt = mLastNetUpdate.getElapsedTimeAndResetF32(); + F32 dt = mImpl->mLastNetUpdate.getElapsedTimeAndResetF32(); - LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mHost); + LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mImpl->mHost); if (!cdp) { mAlive = false; @@ -779,10 +880,10 @@ void LLViewerRegion::updateNetStats() U32 LLViewerRegion::getPacketsLost() const { - LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mHost); + LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mImpl->mHost); if (!cdp) { - llinfos << "LLViewerRegion::getPacketsLost couldn't find circuit for " << mHost << llendl; + llinfos << "LLViewerRegion::getPacketsLost couldn't find circuit for " << mImpl->mHost << llendl; return 0; } else @@ -791,6 +892,16 @@ U32 LLViewerRegion::getPacketsLost() const } } +void LLViewerRegion::setHttpResponderPtrNULL() +{ + mImpl->mHttpResponderPtr = NULL; +} + +const LLHTTPClient::ResponderPtr LLViewerRegion::getHttpResponderPtr() const +{ + return mImpl->mHttpResponderPtr; +} + BOOL LLViewerRegion::pointInRegionGlobal(const LLVector3d &point_global) const { LLVector3 pos_region = getPosRegionFromGlobal(point_global); @@ -817,7 +928,7 @@ BOOL LLViewerRegion::pointInRegionGlobal(const LLVector3d &point_global) const LLVector3 LLViewerRegion::getPosRegionFromGlobal(const LLVector3d &point_global) const { LLVector3 pos_region; - pos_region.setVec(point_global - mOriginGlobal); + pos_region.setVec(point_global - mImpl->mOriginGlobal); return pos_region; } @@ -825,7 +936,7 @@ LLVector3d LLViewerRegion::getPosGlobalFromRegion(const LLVector3 &pos_region) c { LLVector3d pos_region_d; pos_region_d.setVec(pos_region); - return pos_region_d + mOriginGlobal; + return pos_region_d + mImpl->mOriginGlobal; } LLVector3 LLViewerRegion::getPosAgentFromRegion(const LLVector3 &pos_region) const @@ -842,7 +953,7 @@ LLVector3 LLViewerRegion::getPosRegionFromAgent(const LLVector3 &pos_agent) cons F32 LLViewerRegion::getLandHeightRegion(const LLVector3& region_pos) { - return mLandp->resolveHeightRegion( region_pos ); + return mImpl->mLandp->resolveHeightRegion( region_pos ); } bool LLViewerRegion::isAlive() @@ -994,7 +1105,7 @@ void LLViewerRegion::updateCoarseLocations(LLMessageSystem* msg) // treat the target specially for the map if(i == target_index) { - LLVector3d global_pos(mOriginGlobal); + LLVector3d global_pos(mImpl->mOriginGlobal); global_pos.mdV[VX] += (F64)(x_pos); global_pos.mdV[VY] += (F64)(y_pos); global_pos.mdV[VZ] += (F64)(z_pos) * 4.0; @@ -1034,7 +1145,7 @@ LLViewerRegion::eCacheUpdateResult LLViewerRegion::cacheFullUpdate(LLViewerObjec U32 local_id = objectp->getLocalID(); U32 crc = objectp->getCRC(); - LLVOCacheEntry* entry = get_if_there(mCacheMap, local_id, (LLVOCacheEntry*)NULL); + LLVOCacheEntry* entry = get_if_there(mImpl->mCacheMap, local_id, (LLVOCacheEntry*)NULL); if (entry) { @@ -1047,10 +1158,10 @@ LLViewerRegion::eCacheUpdateResult LLViewerRegion::cacheFullUpdate(LLViewerObjec } // Update the cache entry - mCacheMap.erase(local_id); + mImpl->mCacheMap.erase(local_id); delete entry; entry = new LLVOCacheEntry(local_id, crc, dp); - mCacheMap[local_id] = entry; + mImpl->mCacheMap[local_id] = entry; return CACHE_UPDATE_CHANGED; } @@ -1058,15 +1169,15 @@ LLViewerRegion::eCacheUpdateResult LLViewerRegion::cacheFullUpdate(LLViewerObjec // Create new entry and add to map eCacheUpdateResult result = CACHE_UPDATE_ADDED; - if (mCacheMap.size() > MAX_OBJECT_CACHE_ENTRIES) + if (mImpl->mCacheMap.size() > MAX_OBJECT_CACHE_ENTRIES) { - mCacheMap.erase(mCacheMap.begin()); + mImpl->mCacheMap.erase(mImpl->mCacheMap.begin()); result = CACHE_UPDATE_REPLACED; } entry = new LLVOCacheEntry(local_id, crc, dp); - mCacheMap[local_id] = entry; + mImpl->mCacheMap[local_id] = entry; return result; } @@ -1076,7 +1187,7 @@ LLDataPacker *LLViewerRegion::getDP(U32 local_id, U32 crc, U8 &cache_miss_type) { llassert(mCacheLoaded); - LLVOCacheEntry* entry = get_if_there(mCacheMap, local_id, (LLVOCacheEntry*)NULL); + LLVOCacheEntry* entry = get_if_there(mImpl->mCacheMap, local_id, (LLVOCacheEntry*)NULL); if (entry) { @@ -1203,7 +1314,7 @@ void LLViewerRegion::dumpCache() } LLVOCacheEntry *entry; - for(LLVOCacheEntry::vocache_entry_map_t::iterator iter = mCacheMap.begin(); iter != mCacheMap.end(); ++iter) + for(LLVOCacheEntry::vocache_entry_map_t::iterator iter = mImpl->mCacheMap.begin(); iter != mImpl->mCacheMap.end(); ++iter) { entry = iter->second ; @@ -1217,7 +1328,7 @@ void LLViewerRegion::dumpCache() change_bin[changes]++; } - llinfos << "Count " << mCacheMap.size() << llendl; + llinfos << "Count " << mImpl->mCacheMap.size() << llendl; for (i = 0; i < BINS; i++) { llinfos << "Hits " << i << " " << hit_bin[i] << llendl; @@ -1360,10 +1471,10 @@ void LLViewerRegion::setSeedCapability(const std::string& url) return; } - delete mEventPoll; - mEventPoll = NULL; + delete mImpl->mEventPoll; + mImpl->mEventPoll = NULL; - mCapabilities.clear(); + mImpl->mCapabilities.clear(); setCapability("Seed", url); LLSD capabilityNames = LLSD::emptyArray(); @@ -1430,25 +1541,25 @@ void LLViewerRegion::setSeedCapability(const std::string& url) llinfos << "posting to seed " << url << llendl; - mHttpResponderPtr = BaseCapabilitiesComplete::build(this) ; - LLHTTPClient::post(url, capabilityNames, mHttpResponderPtr); + mImpl->mHttpResponderPtr = BaseCapabilitiesComplete::build(this) ; + LLHTTPClient::post(url, capabilityNames, mImpl->mHttpResponderPtr); } void LLViewerRegion::setCapability(const std::string& name, const std::string& url) { if(name == "EventQueueGet") { - delete mEventPoll; - mEventPoll = NULL; - mEventPoll = new LLEventPoll(url, getHost()); + delete mImpl->mEventPoll; + mImpl->mEventPoll = NULL; + mImpl->mEventPoll = new LLEventPoll(url, getHost()); } else if(name == "UntrustedSimulatorMessage") { - LLHTTPSender::setSender(mHost, new LLCapHTTPSender(url)); + LLHTTPSender::setSender(mImpl->mHost, new LLCapHTTPSender(url)); } else { - mCapabilities[name] = url; + mImpl->mCapabilities[name] = url; if(name == "GetTexture") { mHttpUrl = url ; @@ -1463,8 +1574,8 @@ bool LLViewerRegion::isSpecialCapabilityName(const std::string &name) std::string LLViewerRegion::getCapability(const std::string& name) const { - CapabilityMap::const_iterator iter = mCapabilities.find(name); - if(iter == mCapabilities.end()) + CapabilityMap::const_iterator iter = mImpl->mCapabilities.find(name); + if(iter == mImpl->mCapabilities.end()) { return ""; } @@ -1485,7 +1596,7 @@ void LLViewerRegion::logActiveCapabilities() const { int count = 0; CapabilityMap::const_iterator iter; - for (iter = mCapabilities.begin(); iter != mCapabilities.end(); iter++, count++) + for (iter = mImpl->mCapabilities.begin(); iter != mImpl->mCapabilities.end(); ++iter, ++count) { if (!iter->second.empty()) { @@ -1497,9 +1608,9 @@ void LLViewerRegion::logActiveCapabilities() const LLSpatialPartition* LLViewerRegion::getSpatialPartition(U32 type) { - if (type < mObjectPartition.size()) + if (type < mImpl->mObjectPartition.size()) { - return mObjectPartition[type]; + return mImpl->mObjectPartition[type]; } return NULL; } diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index dd40b876cd..9c5b85b77f 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -33,20 +33,16 @@ #include "lldarray.h" #include "llwind.h" -#include "llbbox.h" #include "llcloud.h" #include "llstat.h" #include "v3dmath.h" -#include "llhost.h" #include "llstring.h" #include "llregionflags.h" #include "lluuid.h" -#include "lldatapacker.h" -#include "llvocache.h" #include "llweb.h" #include "llcapabilityprovider.h" -#include "llcapabilitylistener.h" #include "m4math.h" // LLMatrix4 +#include "llhttpclient.h" // Surface id's #define LAND 1 @@ -65,6 +61,13 @@ class LLVOCache; class LLVOCacheEntry; class LLSpatialPartition; class LLEventPump; +class LLCapabilityListener; +class LLDataPacker; +class LLDataPackerBinaryBuffer; +class LLHost; +class LLBBox; + +class LLViewerRegionImpl; class LLViewerRegion: public LLCapabilityProvider // implements this interface { @@ -159,19 +162,19 @@ public: F32 getTimeDilation() const { return mTimeDilation; } // Origin height is at zero. - const LLVector3d &getOriginGlobal() const { return mOriginGlobal; } + const LLVector3d &getOriginGlobal() const; LLVector3 getOriginAgent() const; // Center is at the height of the water table. - const LLVector3d &getCenterGlobal() const { return mCenterGlobal; } + const LLVector3d &getCenterGlobal() const; LLVector3 getCenterAgent() const; void setRegionNameAndZone(const std::string& name_and_zone); const std::string& getName() const { return mName; } const std::string& getZoning() const { return mZoning; } - void setOwner(const LLUUID& owner_id) { mOwnerID = owner_id; } - const LLUUID& getOwner() const { return mOwnerID; } + void setOwner(const LLUUID& owner_id); + const LLUUID& getOwner() const; // Is the current agent on the estate manager list for this region? void setIsEstateManager(BOOL b) { mIsEstateManager = b; } @@ -206,7 +209,7 @@ public: // can process the message. static void processRegionInfo(LLMessageSystem* msg, void**); - void setCacheID(const LLUUID& id) { mCacheID = id; } + void setCacheID(const LLUUID& id); F32 getWidth() const { return mWidth; } @@ -222,8 +225,8 @@ public: U32 getPacketsLost() const; - void setHttpResponderPtrNULL() {mHttpResponderPtr = NULL ;} - const LLHTTPClient::ResponderPtr getHttpResponderPtr() const {return mHttpResponderPtr ;} + void setHttpResponderPtrNULL(); + const LLHTTPClient::ResponderPtr getHttpResponderPtr() const; // Get/set named capability URLs for this region. void setSeedCapability(const std::string& url); @@ -238,21 +241,19 @@ public: static bool isSpecialCapabilityName(const std::string &name); void logActiveCapabilities() const; - /// Capability-request exception - typedef LLCapabilityListener::ArgError ArgError; /// Get LLEventPump on which we listen for capability requests /// (https://wiki.lindenlab.com/wiki/Viewer:Messaging/Messaging_Notes#Capabilities) - LLEventPump& getCapAPI() { return mCapabilityListener.getCapAPI(); } + LLEventPump& getCapAPI() const; /// implements LLCapabilityProvider /*virtual*/ const LLHost& getHost() const; const U64 &getHandle() const { return mHandle; } - LLSurface &getLand() const { return *mLandp; } + LLSurface &getLand() const; // set and get the region id - const LLUUID& getRegionID() const { return mRegionID; } - void setRegionID(const LLUUID& region_id) { mRegionID = region_id; } + const LLUUID& getRegionID() const; + void setRegionID(const LLUUID& region_id); BOOL pointInRegionGlobal(const LLVector3d &point_global) const; LLVector3 getPosRegionFromGlobal(const LLVector3d &point_global) const; @@ -260,7 +261,7 @@ public: LLVector3 getPosAgentFromRegion(const LLVector3 ®ion_pos) const; LLVector3d getPosGlobalFromRegion(const LLVector3 &offset) const; - LLVLComposition *getComposition() const { return mCompositionp; } + LLVLComposition *getComposition() const; F32 getCompositionXY(const S32 x, const S32 y) const; BOOL isOwnedSelf(const LLVector3& pos); @@ -347,34 +348,19 @@ public: LLDynamicArray<LLUUID> mMapAvatarIDs; private: - // The surfaces and other layers - LLSurface* mLandp; + LLViewerRegionImpl * mImpl; - // Region geometry data - LLVector3d mOriginGlobal; // Location of southwest corner of region (meters) - LLVector3d mCenterGlobal; // Location of center in world space (meters) F32 mWidth; // Width of region on a side (meters) - U64 mHandle; - LLHost mHost; - - // The unique ID for this region. - LLUUID mRegionID; - F32 mTimeDilation; // time dilation of physics simulation on simulator // simulator name std::string mName; std::string mZoning; - // region/estate owner - usually null. - LLUUID mOwnerID; - // Is this agent on the estate managers list for this region? BOOL mIsEstateManager; - // Network statistics for the region's circuit... - LLTimer mLastNetUpdate; U32 mPacketsIn; U32 mBitsIn; U32 mLastBitsIn; @@ -386,9 +372,6 @@ private: U32 mPingDelay; F32 mDeltaTime; // Time since last measurement of lastPackets, Bits, etc - // Misc - LLVLComposition *mCompositionp; // Composition layer for the surface - U32 mRegionFlags; // includes damage flags U8 mSimAccess; F32 mBillableFactor; @@ -398,46 +381,24 @@ private: // Information for Homestead / CR-53 S32 mClassID; S32 mCPURatio; + std::string mColoName; std::string mProductSKU; std::string mProductName; std::string mHttpUrl ; - // Maps local ids to cache entries. // Regions can have order 10,000 objects, so assume // a structure of size 2^14 = 16,000 BOOL mCacheLoaded; BOOL mCacheDirty; - LLVOCacheEntry::vocache_entry_map_t mCacheMap; + LLDynamicArray<U32> mCacheMissFull; LLDynamicArray<U32> mCacheMissCRC; - // time? - // LRU info? - // Cache ID is unique per-region, across renames, moving locations, - // etc. - LLUUID mCacheID; - - typedef std::map<std::string, std::string> CapabilityMap; - CapabilityMap mCapabilities; - - LLEventPoll* mEventPoll; - - /// Post an event to this LLCapabilityListener to invoke a capability message on - /// this LLViewerRegion's server - /// (https://wiki.lindenlab.com/wiki/Viewer:Messaging/Messaging_Notes#Capabilities) - LLCapabilityListener mCapabilityListener; - -private: bool mAlive; // can become false if circuit disconnects bool mCapabilitiesReceived; - //spatial partitions for objects in this region - std::vector<LLSpatialPartition*> mObjectPartition; - - LLHTTPClient::ResponderPtr mHttpResponderPtr ; - BOOL mReleaseNotesRequested; }; diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h index d508ce1ac6..fa80de7989 100644 --- a/indra/newview/llviewertexturelist.h +++ b/indra/newview/llviewertexturelist.h @@ -212,24 +212,24 @@ class LLUIImageList : public LLImageProviderInterface, public LLSingleton<LLUIIm { public: // LLImageProviderInterface - /*virtual*/ LLUIImagePtr getUIImageByID(const LLUUID& id, S32 priority); - /*virtual*/ LLUIImagePtr getUIImage(const std::string& name, S32 priority); + /*virtual*/ LLPointer<LLUIImage> getUIImageByID(const LLUUID& id, S32 priority); + /*virtual*/ LLPointer<LLUIImage> getUIImage(const std::string& name, S32 priority); void cleanUp(); bool initFromFile(); - LLUIImagePtr preloadUIImage(const std::string& name, const std::string& filename, BOOL use_mips, const LLRect& scale_rect); + LLPointer<LLUIImage> preloadUIImage(const std::string& name, const std::string& filename, BOOL use_mips, const LLRect& scale_rect); static void onUIImageLoaded( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata ); private: - LLUIImagePtr loadUIImageByName(const std::string& name, const std::string& filename, + LLPointer<LLUIImage> loadUIImageByName(const std::string& name, const std::string& filename, BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_UI); - LLUIImagePtr loadUIImageByID(const LLUUID& id, + LLPointer<LLUIImage> loadUIImageByID(const LLUUID& id, BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_UI); - LLUIImagePtr loadUIImage(LLViewerFetchedTexture* imagep, const std::string& name, BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null); + LLPointer<LLUIImage> loadUIImage(LLViewerFetchedTexture* imagep, const std::string& name, BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null); struct LLUIImageLoadData diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index e020296842..7728958ed8 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -79,6 +79,7 @@ #include "lltooltip.h" #include "llmediaentry.h" #include "llurldispatcher.h" +#include "raytrace.h" // newview includes #include "llagent.h" @@ -234,17 +235,12 @@ BOOL gDisplayCameraPos = FALSE; BOOL gDisplayFOV = FALSE; BOOL gDisplayBadge = FALSE; -S32 CHAT_BAR_HEIGHT = 28; -S32 OVERLAY_BAR_HEIGHT = 20; - -const U8 NO_FACE = 255; +static const U8 NO_FACE = 255; BOOL gQuietSnapshot = FALSE; const F32 MIN_AFK_TIME = 2.f; // minimum time after setting away state before coming back -const F32 MAX_FAST_FRAME_TIME = 0.5f; -const F32 FAST_FRAME_INCREMENT = 0.1f; -const F32 MIN_DISPLAY_SCALE = 0.75f; +static const F32 MIN_DISPLAY_SCALE = 0.75f; std::string LLViewerWindow::sSnapshotBaseName; std::string LLViewerWindow::sSnapshotDir; diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index 5eeb02b080..bb0023b787 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -38,13 +38,12 @@ #include "v3dmath.h" #include "v2math.h" +#include "llcursortypes.h" #include "llwindowcallbacks.h" #include "lltimer.h" #include "llstat.h" #include "llmousehandler.h" -#include "llcursortypes.h" #include "llhandle.h" -#include "llimage.h" #include <boost/function.hpp> #include <boost/signals2.hpp> @@ -59,6 +58,7 @@ class LLTool; class LLVelocityBar; class LLPanel; class LLImageRaw; +class LLImageFormatted; class LLHUDIcon; class LLWindow; class LLRootView; @@ -465,12 +465,6 @@ private: LLPointer<LLViewerObject> mDragHoveredObject; }; -void toggle_flying(void*); -void toggle_first_person(); -void toggle_build(void*); -void reset_viewer_state_on_sim(void); -void update_saved_window_size(const std::string& control,S32 delta_width, S32 delta_height); - // // Globals // @@ -487,8 +481,6 @@ extern LLVector3 gDebugRaycastNormal; extern LLVector3 gDebugRaycastBinormal; extern S32 gDebugRaycastFaceHit; -extern S32 CHAT_BAR_HEIGHT; - extern BOOL gDisplayCameraPos; extern BOOL gDisplayWindInfo; extern BOOL gDisplayFOV; diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index f1934933b5..79866dc5d2 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -38,9 +38,9 @@ #include <ctype.h> #include "llaudioengine.h" -#include "llcachename.h" #include "noise.h" #include "sound_ids.h" +#include "raytrace.h" #include "llagent.h" // Get state values from here #include "llagentcamera.h" diff --git a/indra/newview/llvotree.cpp b/indra/newview/llvotree.cpp index 37a974be28..46025b46be 100644 --- a/indra/newview/llvotree.cpp +++ b/indra/newview/llvotree.cpp @@ -50,6 +50,7 @@ #include "pipeline.h" #include "llspatialpartition.h" #include "llnotificationsutil.h" +#include "raytrace.h" extern LLPipeline gPipeline; diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index a207d3e050..ee54a938ba 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -63,6 +63,8 @@ #include "llmediadataclient.h" #include "llagent.h" #include "llviewermediafocus.h" +#include "lldatapacker.h" +#include "llvocache.h" const S32 MIN_QUIET_FRAMES_COALESCE = 30; const F32 FORCE_SIMPLE_RENDER_AREA = 512.f; diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index 8f50041474..fd42058c8a 100644 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -50,6 +50,7 @@ #include "llviewerstats.h" #include "llvlcomposition.h" #include "llvoavatar.h" +#include "llvocache.h" #include "llvowater.h" #include "message.h" #include "pipeline.h" diff --git a/indra/newview/tests/llremoteparcelrequest_test.cpp b/indra/newview/tests/llremoteparcelrequest_test.cpp index 9a6e08ee84..ed66066b0a 100644 --- a/indra/newview/tests/llremoteparcelrequest_test.cpp +++ b/indra/newview/tests/llremoteparcelrequest_test.cpp @@ -35,7 +35,6 @@ #include "llurlentry.h" namespace { - LLControlGroup s_saved_settings("dummy_settings"); const LLUUID TEST_PARCEL_ID("11111111-1111-1111-1111-111111111111"); } @@ -64,13 +63,12 @@ LLMessageSystem * gMessageSystem; char const* const _PREHASH_AgentID = 0; // never dereferenced during this test char const* const _PREHASH_AgentData = 0; // never dereferenced during this test LLAgent gAgent; -LLAgent::LLAgent() : mAgentAccess(s_saved_settings) { } +LLAgent::LLAgent() : mAgentAccess(NULL) { } LLAgent::~LLAgent() { } void LLAgent::sendReliableMessage(void) { } LLUUID gAgentSessionID; LLUUID gAgentID; LLUIColor::LLUIColor(void) { } -LLAgentAccess::LLAgentAccess(LLControlGroup & settings) : mSavedSettings(settings) { } LLControlGroup::LLControlGroup(std::string const & name) : LLInstanceTracker<LLControlGroup, std::string>(name) { } LLControlGroup::~LLControlGroup(void) { } void LLUrlEntryParcel::processParcelInfo(const LLUrlEntryParcel::LLParcelData& parcel_data) { } diff --git a/indra/newview/tests/llviewerhelputil_test.cpp b/indra/newview/tests/llviewerhelputil_test.cpp index b425b50c8b..710881d811 100644 --- a/indra/newview/tests/llviewerhelputil_test.cpp +++ b/indra/newview/tests/llviewerhelputil_test.cpp @@ -73,11 +73,9 @@ static void substitute_string(std::string &input, const std::string &search, con } #include "../llagent.h" -LLAgent::LLAgent() : mAgentAccess(gSavedSettings) { } +LLAgent::LLAgent() : mAgentAccess(NULL) { } LLAgent::~LLAgent() { } bool LLAgent::isGodlike() const { return FALSE; } -LLAgentAccess::LLAgentAccess(LLControlGroup& settings) : mSavedSettings(settings) { } -LLUIColor::LLUIColor() {} LLAgent gAgent; -- cgit v1.2.3 From 165c72d576812c7adcf4cb7b2d1d359a60e14d06 Mon Sep 17 00:00:00 2001 From: Eli Linden <eli@lindenlab.com> Date: Thu, 5 May 2011 17:32:42 -0700 Subject: FIX VWR-22356 ES layout --- indra/newview/skins/default/xui/es/panel_region_terrain.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/skins/default/xui/es/panel_region_terrain.xml b/indra/newview/skins/default/xui/es/panel_region_terrain.xml index 903b826a0b..98b10e4895 100644 --- a/indra/newview/skins/default/xui/es/panel_region_terrain.xml +++ b/indra/newview/skins/default/xui/es/panel_region_terrain.xml @@ -8,7 +8,7 @@ </text> <spinner label="Nivel del agua" name="water_height_spin"/> <button label="?" name="water_height_help"/> - <spinner label="Límite de elevación del terreno" name="terrain_raise_spin"/> + <spinner label="Límite de elevación del terreno" name="terrain_raise_spin"/> <button label="?" name="terrain_raise_help"/> <spinner label="Límite de bajada del terreno" name="terrain_lower_spin" bottom_delta="-34"/> <button label="?" name="terrain_lower_help"/> -- cgit v1.2.3 From f0d095086ff5bf2c231bee06064a89a8b6ef4a9b Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Thu, 5 May 2011 19:09:06 -0700 Subject: EXP-501 FIX View button on bottom bar is hidden when launching Basic Viewer... ignore button reordering in basic mode use preferred button collapse order --- indra/newview/app_settings/settings.xml | 11 ++++++++ indra/newview/app_settings/settings_minimal.xml | 11 ++++++++ indra/newview/llbottomtray.cpp | 10 +++++--- .../skins/minimal/xui/en/panel_bottomtray.xml | 30 +++++++++++----------- 4 files changed, 44 insertions(+), 18 deletions(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index f83aa20e10..ac52cff49a 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -12734,5 +12734,16 @@ <key>Value</key> <integer>0</integer> </map> + <key>AllowBottomTrayButtonReordering</key> + <map> + <key>Comment</key> + <string>Allow user to move and hide bottom tray buttons</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> </map> </llsd> diff --git a/indra/newview/app_settings/settings_minimal.xml b/indra/newview/app_settings/settings_minimal.xml index bb022b7b11..9c6418b1f0 100644 --- a/indra/newview/app_settings/settings_minimal.xml +++ b/indra/newview/app_settings/settings_minimal.xml @@ -457,5 +457,16 @@ <key>Value</key> <integer>1</integer> </map> + <key>AllowBottomTrayButtonReordering</key> + <map> + <key>Comment</key> + <string>Allow user to move and hide bottom tray buttons</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> </map> </llsd> diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index 189175566e..cad00eed14 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -745,6 +745,8 @@ void LLBottomTray::updateButtonsOrdersAfterDnD() void LLBottomTray::saveButtonsOrder() { + if (!gSavedSettings.getBOOL("AllowBottomTrayButtonReordering")) return; + std::string user_dir = gDirUtilp->getLindenUserDir(); if (user_dir.empty()) return; @@ -765,6 +767,8 @@ void LLBottomTray::saveButtonsOrder() void LLBottomTray::loadButtonsOrder() { + if (!gSavedSettings.getBOOL("AllowBottomTrayButtonReordering")) return; + // load per-resident sorting information std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, SORTING_DATA_FILE_NAME); @@ -1537,9 +1541,6 @@ void LLBottomTray::initResizeStateContainers() mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_HOWTO, getChild<LLPanel>("howto_panel"))); // init an order of processed buttons - mButtonsProcessOrder.push_back(RS_BUTTON_GESTURES); - mButtonsProcessOrder.push_back(RS_BUTTON_MOVEMENT); - mButtonsProcessOrder.push_back(RS_BUTTON_CAMERA); mButtonsProcessOrder.push_back(RS_BUTTON_DESTINATIONS); mButtonsProcessOrder.push_back(RS_BUTTON_AVATARS); mButtonsProcessOrder.push_back(RS_BUTTON_SNAPSHOT); @@ -1552,6 +1553,9 @@ void LLBottomTray::initResizeStateContainers() mButtonsProcessOrder.push_back(RS_BUTTON_PROFILE); mButtonsProcessOrder.push_back(RS_BUTTON_SPLITTER_2); mButtonsProcessOrder.push_back(RS_BUTTON_HOWTO); + mButtonsProcessOrder.push_back(RS_BUTTON_MOVEMENT); + mButtonsProcessOrder.push_back(RS_BUTTON_CAMERA); + mButtonsProcessOrder.push_back(RS_BUTTON_GESTURES); mButtonsOrder.push_back(RS_BUTTON_SPEAK); mButtonsOrder.insert(mButtonsOrder.end(), mButtonsProcessOrder.begin(), mButtonsProcessOrder.end()); diff --git a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml index 9c14edb306..237af61717 100644 --- a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml @@ -47,7 +47,7 @@ mouse_opaque="false" name="chat_bar_layout_panel" user_resize="true" - width="308" > + width="312" > <panel name="chat_bar" filename="panel_nearby_chat_bar.xml" @@ -108,7 +108,7 @@ name="speak_flyout_panel" top_delta="0" user_resize="false" - width="20"> + width="26"> <button follows="left|right" width="20" @@ -151,7 +151,7 @@ layout="topleft" get_more="false" view_all="false" - left="3" + left="0" name="Gesture" tool_tip="Make your avatar do things" top="5" @@ -174,7 +174,7 @@ mouse_opaque="false" name="cam_panel" user_resize="false" - width="83"> + width="86"> <bottomtray_button can_drag="false" follows="left|right" @@ -201,15 +201,15 @@ follows="left|right" height="28" layout="topleft" - min_width="17" + min_width="8" name="splitter_panel_1" user_resize="false" - width="17"> + width="8"> <icon follows="left|bottom" height="18" width="2" - left="6" + left="0" image_name="Button_Separator" name="separator" top="7"/> @@ -224,7 +224,7 @@ mouse_opaque="false" name="destinations_panel" user_resize="false" - width="103"> + width="106"> <bottomtray_button can_drag="false" follows="left|right" @@ -255,7 +255,7 @@ mouse_opaque="false" name="avatar_panel" user_resize="false" - width="103"> + width="106"> <bottomtray_button can_drag="false" follows="left|right" @@ -281,15 +281,15 @@ follows="left|right" height="28" layout="topleft" - min_width="17" + min_width="8" name="splitter_panel_2" user_resize="false" - width="17"> + width="8"> <icon follows="left|bottom" height="18" width="2" - left="6" + left="0" image_name="Button_Separator" name="separator" top="7"/> @@ -305,7 +305,7 @@ name="people_panel" top_delta="0" user_resize="false" - width="105"> + width="106"> <bottomtray_button can_drag="false" follows="left|right" @@ -338,7 +338,7 @@ name="profile_panel" top_delta="0" user_resize="false" - width="105"> + width="106"> <bottomtray_button can_drag="false" follows="left|right" @@ -371,7 +371,7 @@ name="howto_panel" top_delta="0" user_resize="false" - width="105"> + width="106"> <bottomtray_button can_drag="false" follows="left|right" -- cgit v1.2.3 From 51a72247f5ef430c9b315b9249300e6cbf7af914 Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Fri, 6 May 2011 11:03:09 -0700 Subject: EXP-782 Toggling speak button while in call minimizes IM window --- indra/newview/llbottomtray.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index cad00eed14..5b38286cf5 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -555,8 +555,14 @@ BOOL LLBottomTray::postBuild() // Localization tool doesn't understand custom buttons like <talk_button> mSpeakBtn->setSpeakToolTip( getString("SpeakBtnToolTip") ); mSpeakBtn->setShowToolTip( getString("VoiceControlBtnToolTip") ); + } + else + { + LLTransientFloaterMgr::getInstance()->addControlView(getChild<LLButton>("speak_btn")); + LLTransientFloaterMgr::getInstance()->addControlView(getChild<LLButton>("flyout_btn")); } + // Both parts of speak button should be initially disabled because // it takes some time between logging in to world and connecting to voice channel. getChild<LLButton>("speak_btn")->setEnabled(false); -- cgit v1.2.3 From 8cd0ee8bccc7c9bc4cebf1b700a406897088949a Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Fri, 6 May 2011 11:03:38 -0700 Subject: EXP-789 Reducing size of sound device panel in Basic Mode does not resize elements in the panel and allows panel to be smaller than elements it contains --- indra/newview/skins/default/xui/en/floater_sound_devices.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/skins/default/xui/en/floater_sound_devices.xml b/indra/newview/skins/default/xui/en/floater_sound_devices.xml index b5d95aeca4..c7c7a05af2 100644 --- a/indra/newview/skins/default/xui/en/floater_sound_devices.xml +++ b/indra/newview/skins/default/xui/en/floater_sound_devices.xml @@ -4,7 +4,7 @@ border="false" legacy_header_height="18" can_minimize="true" - can_resize="true" + can_resize="false" can_close="false" save_dock_state="true" save_visibility="true" -- cgit v1.2.3 From 4015e6b3c7b4ff34bd679618f2231b2f53258db4 Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Fri, 6 May 2011 11:39:22 -0700 Subject: fixing flyoutbtn name --- indra/newview/llbottomtray.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index 5b38286cf5..c72cdfd1dc 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -559,7 +559,7 @@ BOOL LLBottomTray::postBuild() else { LLTransientFloaterMgr::getInstance()->addControlView(getChild<LLButton>("speak_btn")); - LLTransientFloaterMgr::getInstance()->addControlView(getChild<LLButton>("flyout_btn")); + LLTransientFloaterMgr::getInstance()->addControlView(getChild<LLButton>("speak_flyout_btn")); } -- cgit v1.2.3 From c591ea35ac9a31b79ffc803486bce70bbde78889 Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Fri, 6 May 2011 13:39:58 -0500 Subject: STORM-1210 Disable memory debugging to preserve alignment on debug builds. --- indra/newview/llappviewerwin32.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index 54689ea808..6396ca91ff 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -26,12 +26,6 @@ #include "llviewerprecompiledheaders.h" -#if defined(_DEBUG) -# if _MSC_VER >= 1400 // Visual C++ 2005 or later -# define WINDOWS_CRT_MEM_CHECKS 1 -# endif -#endif - #include "llappviewerwin32.h" #include "llmemtype.h" -- cgit v1.2.3 From 483ceba5f492430ddd4f3b5c8c9d0fdfe12f2a6f Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Fri, 6 May 2011 13:36:08 -0700 Subject: EXP-769: "Group call requests received in Basic mode" fixing merge error --- indra/newview/app_settings/settings_minimal.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/app_settings/settings_minimal.xml b/indra/newview/app_settings/settings_minimal.xml index 9c6418b1f0..d3f0ec5dad 100644 --- a/indra/newview/app_settings/settings_minimal.xml +++ b/indra/newview/app_settings/settings_minimal.xml @@ -124,7 +124,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>0</integer> + <integer>1</integer> </map> <key>VoiceDisableMic</key> <map> -- cgit v1.2.3 From 4ad94507dd17602323fa19027ff5bb5bfc6bc020 Mon Sep 17 00:00:00 2001 From: callum <none@none> Date: Fri, 6 May 2011 13:39:27 -0700 Subject: EXP-623 (SUPPLEMENTAL FIX) Selecting fly option while on click to walk path flys avatar to end point but avatar spins and shakes when arriving at click point. --- indra/newview/llviewermessage.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 3f018fc57c..ef5968a5e2 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -5522,14 +5522,19 @@ void process_alert_core(const std::string& message, BOOL modal) } else { - LLSD args; - std::string new_msg =LLNotifications::instance().getGlobalString(message); + // Hack fix for EXP-623 (blame fix on RN :)) to avoid a sim deploy + const std::string AUTOPILOT_CANCELED_MSG("Autopilot canceled"); + if (message.find(AUTOPILOT_CANCELED_MSG) == std::string::npos ) + { + LLSD args; + std::string new_msg =LLNotifications::instance().getGlobalString(message); - std::string localized_msg; - bool is_message_localized = LLTrans::findString(localized_msg, new_msg); + std::string localized_msg; + bool is_message_localized = LLTrans::findString(localized_msg, new_msg); - args["MESSAGE"] = is_message_localized ? localized_msg : new_msg; - LLNotificationsUtil::add("SystemMessageTip", args); + args["MESSAGE"] = is_message_localized ? localized_msg : new_msg; + LLNotificationsUtil::add("SystemMessageTip", args); + } } } -- cgit v1.2.3 From 8a029d235e593189d34319e674933012b8894b85 Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Fri, 6 May 2011 16:39:07 -0500 Subject: SH-1521 Potential fix for shadows not working on mac. --- .../shaders/class1/deferred/alphaSkinnedV.glsl | 52 +++++++++++++++------ .../shaders/class2/deferred/alphaF.glsl | 1 - .../shaders/class2/deferred/alphaSkinnedV.glsl | 54 ++++++++++++++++------ .../shaders/class2/deferred/alphaV.glsl | 3 -- 4 files changed, 77 insertions(+), 33 deletions(-) diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl index 4261f943fb..5addbbb176 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl @@ -12,7 +12,6 @@ mat4 getObjectSkinnedTransform(); void calcAtmospherics(vec3 inPositionEye); float calcDirectionalLight(vec3 n, vec3 l); -float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float is_pointlight); vec3 atmosAmbient(vec3 light); vec3 atmosAffectDirectionalLight(float lightIntensity); @@ -23,11 +22,36 @@ varying vec3 vary_position; varying vec3 vary_ambient; varying vec3 vary_directional; varying vec3 vary_normal; -varying vec3 vary_light; varying vec3 vary_fragcoord; +varying vec3 vary_pointlight_col; uniform float near_clip; +float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight) +{ + //get light vector + vec3 lv = lp.xyz-v; + + //get distance + float d = length(lv); + + //normalize light vector + lv *= 1.0/d; + + //distance attenuation + float dist2 = d*d/(la*la); + float da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0); + + // spotlight coefficient. + float spot = max(dot(-ln, lv), is_pointlight); + da *= spot*spot; // GL_SPOT_EXPONENT=2 + + //angular attenuation + da *= calcDirectionalLight(n, lv); + + return da; +} + void main() { gl_TexCoord[0] = gl_MultiTexCoord0; @@ -53,20 +77,20 @@ void main() vec4 col = vec4(0.0, 0.0, 0.0, gl_Color.a); - // Collect normal lights (need to be divided by two, as we later multiply by 2) - col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].specular.a); - col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].specular.a); - col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].specular.a); - col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].specular.a); - col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].specular.a); - col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].specular.a); - col.rgb += gl_LightSource[1].diffuse.rgb*calcDirectionalLight(norm, gl_LightSource[1].position.xyz); - col.rgb = scaleDownLight(col.rgb); + // Collect normal lights + col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].quadraticAttenuation, gl_LightSource[2].specular.a); + col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].quadraticAttenuation ,gl_LightSource[3].specular.a); + col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].quadraticAttenuation, gl_LightSource[4].specular.a); + col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].quadraticAttenuation, gl_LightSource[5].specular.a); + col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].quadraticAttenuation, gl_LightSource[6].specular.a); + col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].quadraticAttenuation, gl_LightSource[7].specular.a); + vary_pointlight_col = col.rgb*gl_Color.rgb; + + col.rgb = vec3(0,0,0); + // Add windlight lights - col.rgb += atmosAmbient(vec3(0.)); - - vary_light = gl_LightSource[0].position.xyz; + col.rgb = atmosAmbient(vec3(0.)); vary_ambient = col.rgb*gl_Color.rgb; vary_directional = gl_Color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, gl_LightSource[0].position.xyz), (1.0-gl_Color.a)*(1.0-gl_Color.a))); diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl index 88ca60318b..6dfc1b952c 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl @@ -28,7 +28,6 @@ varying vec3 vary_ambient; varying vec3 vary_directional; varying vec3 vary_fragcoord; varying vec3 vary_position; -varying vec3 vary_light; varying vec3 vary_pointlight_col; uniform float shadow_bias; diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl index 1da3d95069..d227346163 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl @@ -11,7 +11,6 @@ vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol); void calcAtmospherics(vec3 inPositionEye); float calcDirectionalLight(vec3 n, vec3 l); -float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float is_pointlight); mat4 getObjectSkinnedTransform(); vec3 atmosAmbient(vec3 light); vec3 atmosAffectDirectionalLight(float lightIntensity); @@ -22,12 +21,37 @@ varying vec3 vary_ambient; varying vec3 vary_directional; varying vec3 vary_fragcoord; varying vec3 vary_position; -varying vec3 vary_light; +varying vec3 vary_pointlight_col; uniform float near_clip; uniform float shadow_offset; uniform float shadow_bias; +float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight) +{ + //get light vector + vec3 lv = lp.xyz-v; + + //get distance + float d = length(lv); + + //normalize light vector + lv *= 1.0/d; + + //distance attenuation + float dist2 = d*d/(la*la); + float da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0); + + // spotlight coefficient. + float spot = max(dot(-ln, lv), is_pointlight); + da *= spot*spot; // GL_SPOT_EXPONENT=2 + + //angular attenuation + da *= calcDirectionalLight(n, lv); + + return da; +} + void main() { gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0; @@ -55,21 +79,21 @@ void main() //vec4 color = calcLighting(pos.xyz, norm, gl_Color, vec4(0.)); vec4 col = vec4(0.0, 0.0, 0.0, gl_Color.a); - // Collect normal lights (need to be divided by two, as we later multiply by 2) - col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].specular.a); - col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].specular.a); - col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].specular.a); - col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].specular.a); - col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].specular.a); - col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].specular.a); - col.rgb += gl_LightSource[1].diffuse.rgb*calcDirectionalLight(norm, gl_LightSource[1].position.xyz); - col.rgb = scaleDownLight(col.rgb); + // Collect normal lights + col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].quadraticAttenuation, gl_LightSource[2].specular.a); + col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].quadraticAttenuation ,gl_LightSource[3].specular.a); + col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].quadraticAttenuation, gl_LightSource[4].specular.a); + col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].quadraticAttenuation, gl_LightSource[5].specular.a); + col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].quadraticAttenuation, gl_LightSource[6].specular.a); + col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].quadraticAttenuation, gl_LightSource[7].specular.a); + vary_pointlight_col = col.rgb*gl_Color.rgb; + + col.rgb = vec3(0,0,0); + // Add windlight lights - col.rgb += atmosAmbient(vec3(0.)); - - vary_light = gl_LightSource[0].position.xyz; - + col.rgb = atmosAmbient(vec3(0.)); + vary_ambient = col.rgb*gl_Color.rgb; vary_directional.rgb = gl_Color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, gl_LightSource[0].position.xyz), (1.0-gl_Color.a)*(1.0-gl_Color.a))); diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl index ea09d5bb09..86f014df35 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl @@ -21,7 +21,6 @@ varying vec3 vary_ambient; varying vec3 vary_directional; varying vec3 vary_fragcoord; varying vec3 vary_position; -varying vec3 vary_light; varying vec3 vary_pointlight_col; uniform float near_clip; @@ -86,8 +85,6 @@ void main() // Add windlight lights col.rgb = atmosAmbient(vec3(0.)); - vary_light = gl_LightSource[0].position.xyz; - vary_ambient = col.rgb*gl_Color.rgb; vary_directional.rgb = gl_Color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, gl_LightSource[0].position.xyz), (1.0-gl_Color.a)*(1.0-gl_Color.a))); -- cgit v1.2.3 From 4888db6f9c788f84bf0fdcd17a698fc27c19595b Mon Sep 17 00:00:00 2001 From: brad kittenbrink <brad@lindenlab.com> Date: Fri, 6 May 2011 14:51:50 -0700 Subject: Continuing work on CHOP-609 build time improvements. Fixed eroneous additional_INCLUDE_DIRS setting for unit tests. --- indra/cmake/LLAddBuildTest.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/cmake/LLAddBuildTest.cmake b/indra/cmake/LLAddBuildTest.cmake index 3f259f6382..08feab6e36 100644 --- a/indra/cmake/LLAddBuildTest.cmake +++ b/indra/cmake/LLAddBuildTest.cmake @@ -95,7 +95,7 @@ INCLUDE(GoogleMock) IF(${name}_test_additional_INCLUDE_DIRS MATCHES NOTFOUND) SET(${name}_test_additional_INCLUDE_DIRS "") ENDIF(${name}_test_additional_INCLUDE_DIRS MATCHES NOTFOUND) - INCLUDE_DIRECTORIES(${alltest_INCLUDE_DIRS} ${name}_test_additional_INCLUDE_DIRS ) + INCLUDE_DIRECTORIES(${alltest_INCLUDE_DIRS} ${${name}_test_additional_INCLUDE_DIRS} ) IF(LL_TEST_VERBOSE) MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_additional_INCLUDE_DIRS ${${name}_test_additional_INCLUDE_DIRS}") ENDIF(LL_TEST_VERBOSE) -- cgit v1.2.3 From 099d1795e567636baa273b3411d6c264b7524964 Mon Sep 17 00:00:00 2001 From: Eli Linden <eli@lindenlab.com> Date: Fri, 6 May 2011 15:34:01 -0700 Subject: FIX VWR-23615 en_xui_change es it resizing --- .../skins/default/xui/en/floater_preview_gesture.xml | 4 ++-- .../skins/default/xui/es/floater_preview_gesture.xml | 18 +++++++++--------- .../skins/default/xui/it/floater_preview_gesture.xml | 4 ++-- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/indra/newview/skins/default/xui/en/floater_preview_gesture.xml b/indra/newview/skins/default/xui/en/floater_preview_gesture.xml index a17cf8eea8..9f6199fada 100644 --- a/indra/newview/skins/default/xui/en/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_gesture.xml @@ -120,14 +120,14 @@ font.style="BOLD" name="key_label" top_pad="10" - width="150"> + width="130"> Shortcut Key: </text> <combo_box height="20" label="None" layout="topleft" - left_delta="154" + left_delta="135" name="modifier_combo" top_delta="-4" width="55" /> diff --git a/indra/newview/skins/default/xui/es/floater_preview_gesture.xml b/indra/newview/skins/default/xui/es/floater_preview_gesture.xml index c58eb227aa..bd13262dcd 100644 --- a/indra/newview/skins/default/xui/es/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/es/floater_preview_gesture.xml @@ -30,15 +30,15 @@ <text name="trigger_label"> Palabra clave: </text> - <text left="208" name="replace_text" tool_tip="Reemplaza la/s palabra/s clave con estas palabras. Por ejemplo, si cambia la palabra clave 'hola' por 'qué tal', se cambiará en el chat 'Quise decir hola' por 'Quise decir qué tal' en cuanto realice el gesto."> + <text name="replace_text" tool_tip="Reemplaza la/s palabra/s clave con estas palabras. Por ejemplo, si cambia la palabra clave 'hola' por 'qué tal', se cambiará en el chat 'Quise decir hola' por 'Quise decir qué tal' en cuanto realice el gesto."> Reemplazar por: </text> <line_editor name="replace_editor" tool_tip="Reemplaza la/s palabra/s clave con estas palabras. Por ejemplo, si cambia la palabra clave 'hola' por 'qué tal', se cambiará en el chat 'Quise decir hola' por 'Quise decir qué tal' en cuanto realice el gesto."/> <text name="key_label"> Atajo de teclado: </text> - <combo_box label="Ninguno" left="116" name="modifier_combo" width="76"/> - <combo_box label="Ninguno" left_delta="80" name="key_combo" width="76"/> + <combo_box label="Ninguno" name="modifier_combo" width="76"/> + <combo_box label="Ninguno" name="key_combo" width="50"/> <text name="library_label"> Biblioteca: </text> @@ -55,20 +55,20 @@ <button label="Arriba" name="up_btn"/> <button label="Abajo" name="down_btn"/> <button label="Quitar" name="delete_btn"/> - <text left="230" name="options_text" width="200"> + <text name="options_text" width="200"> (opciones) </text> <radio_group name="animation_trigger_type"> <radio_item label="Empezar" name="start"/> <radio_item label="Parar" name="stop"/> </radio_group> - <check_box bottom_delta="34" label="hasta que las animaciones estén hechas" name="wait_anim_check"/> - <check_box bottom_delta="-30" label="tiempo en segundos:" name="wait_time_check"/> - <line_editor left_delta="130" name="wait_time_editor"/> + <check_box label="hasta que las animaciones estén hechas" name="wait_anim_check"/> + <check_box label="tiempo en segundos:" name="wait_time_check"/> + <line_editor name="wait_time_editor"/> <text name="help_label"> Todos los pasos suceden a la vez, a menos que añadas pasos de espera. </text> - <check_box label="Disponible" left="130" name="active_check" tool_tip="Los gestos disponibles pueden realizarse escribiendo en el chat su frase clave o pulsando su tecla de acceso rápido. Generalmente, los gestos pasan a no disponibles cuando hay un conflicto de teclas."/> - <button label="Vista previa" name="preview_btn" width="85"/> + <check_box label="Disponible" name="active_check" tool_tip="Los gestos disponibles pueden realizarse escribiendo en el chat su frase clave o pulsando su tecla de acceso rápido. Generalmente, los gestos pasan a no disponibles cuando hay un conflicto de teclas."/> + <button label="Vista previa" name="preview_btn" width="82"/> <button label="Guardar" name="save_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_preview_gesture.xml b/indra/newview/skins/default/xui/it/floater_preview_gesture.xml index 7e29db6336..2172b9848b 100644 --- a/indra/newview/skins/default/xui/it/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/it/floater_preview_gesture.xml @@ -34,10 +34,10 @@ Sostituisci con: </text> <line_editor name="replace_editor" tool_tip="Sostituisci le parole chiave con questi termini. Per esempio, sostituire la parola chiave 'salve' con 'ciao' modificherà la chat 'Volevo solo dire salve' in 'Volevo solo dire ciao' e avvierà la gesture!"/> - <text name="key_label"> + <text name="key_label" width="147"> Scorciatoia da tastiera: </text> - <combo_box label="Nessuno" name="modifier_combo" /> + <combo_box left_delta="150" label="Nessuno" name="modifier_combo" /> <combo_box label="Nessuno" name="key_combo" /> <text name="library_label"> Libreria: -- cgit v1.2.3 From e0849adec775e5d73d2e3fc068fe8ba54cea443f Mon Sep 17 00:00:00 2001 From: Eli Linden <eli@lindenlab.com> Date: Fri, 6 May 2011 16:29:40 -0700 Subject: WIP VWR-23688 --- indra/newview/skins/default/xui/pt/notifications.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml index 4adfe8e37f..0786a62f13 100644 --- a/indra/newview/skins/default/xui/pt/notifications.xml +++ b/indra/newview/skins/default/xui/pt/notifications.xml @@ -2730,7 +2730,7 @@ O botão será exibido quando houver espaço suficente. Selecione os residentes com quem compartilhar. </notification> <notification name="ShareItemsConfirmation"> - Tem certeza de que quer compartilhar os items abaixo? + Tem certeza de que quer compartilhar os itens abaixo? <nolink>[ITEMS]</nolink> -- cgit v1.2.3 From bb781cbef7e8ce0925d57b158438270572921c9a Mon Sep 17 00:00:00 2001 From: Eli Linden <eli@lindenlab.com> Date: Fri, 6 May 2011 17:27:50 -0700 Subject: FIX VWR-23696 remove old parameter overrides --- indra/newview/skins/default/xui/pt/floater_pay.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/indra/newview/skins/default/xui/pt/floater_pay.xml b/indra/newview/skins/default/xui/pt/floater_pay.xml index 26d5710c4a..8094ad376c 100644 --- a/indra/newview/skins/default/xui/pt/floater_pay.xml +++ b/indra/newview/skins/default/xui/pt/floater_pay.xml @@ -6,18 +6,18 @@ <string name="payee_resident"> Pagar residente </string> - <text left="5" name="payee_label" width="110"> + <text left="5" name="payee_label"> Pagar: </text> <icon name="icon_person" tool_tip="Pessoa"/> - <text left="115" name="payee_name"> + <text name="payee_name"> Test Name That Is Extremely Long To Check Clipping </text> - <button label="L$1" label_selected="L$1" left="112" name="fastpay 1"/> + <button label="L$1" label_selected="L$1" name="fastpay 1"/> <button label="L$5" label_selected="L$5" name="fastpay 5"/> - <button label="L$10" label_selected="L$10" left="112" name="fastpay 10"/> + <button label="L$10" label_selected="L$10" name="fastpay 10"/> <button label="L$20" label_selected="L$20" name="fastpay 20"/> - <text left="4" name="amount text"> + <text name="amount text"> Outro valor: </text> <button label="Pagar" label_selected="Pagar" name="pay btn"/> -- cgit v1.2.3 From 5544c184664b8604204f6a5cf2cd7b151b79a69e Mon Sep 17 00:00:00 2001 From: Eli Linden <eli@lindenlab.com> Date: Fri, 6 May 2011 17:54:58 -0700 Subject: WIP VWR-24160 en_xui_change accommodate longest string --- indra/newview/skins/default/xui/en/panel_preferences_chat.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml index 404537e1f2..cdc462109c 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml @@ -150,7 +150,7 @@ top_pad="20" left="30" height="10" - width="180"> + width="400"> Enable incoming chat popups: </text> <check_box -- cgit v1.2.3 From 86180db1f1f3f9c86e1a69f278af95ae05ca1156 Mon Sep 17 00:00:00 2001 From: Jonathan Yap <none@none> Date: Fri, 6 May 2011 20:58:48 -0400 Subject: STORM-1236 snapshot: Please resize the text box or modify the text so that it fits. --- doc/contributions.txt | 1 + indra/newview/skins/default/xui/en/floater_snapshot.xml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/contributions.txt b/doc/contributions.txt index 09fca27f43..7e9960e594 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -431,6 +431,7 @@ Jonathan Yap STORM-1128 STORM-956 STORM-1095 + STORM-1236 Kage Pixel VWR-11 Ken March diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml index 857932e51a..e413228ddc 100644 --- a/indra/newview/skins/default/xui/en/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml @@ -11,7 +11,7 @@ save_rect="true" save_visibility="true" title="SNAPSHOT PREVIEW" - width="215"> + width="245"> <floater.string name="unknown"> unknown -- cgit v1.2.3 From 1e0d3fc7bc1102faaa98ea6753c4366d9cef7379 Mon Sep 17 00:00:00 2001 From: Merov Linden <merov@lindenlab.com> Date: Sat, 7 May 2011 11:09:34 -0700 Subject: EXP-664 : following richard codereview: use llclamp where appropriate --- indra/llkdu/llimagej2ckdu.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/indra/llkdu/llimagej2ckdu.cpp b/indra/llkdu/llimagej2ckdu.cpp index f83accf356..39ae09650e 100644 --- a/indra/llkdu/llimagej2ckdu.cpp +++ b/indra/llkdu/llimagej2ckdu.cpp @@ -351,8 +351,7 @@ BOOL LLImageJ2CKDU::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int bloc mLevels = levels; if (mLevels != 0) { - mLevels = llmin(mLevels,MAX_DECOMPOSITION_LEVELS); - mLevels = llmax(MIN_DECOMPOSITION_LEVELS,mLevels); + mLevels = llclamp(mLevels,MIN_DECOMPOSITION_LEVELS,MIN_DECOMPOSITION_LEVELS); } return TRUE; } -- cgit v1.2.3 From 078250ff5f3e9156b8f7bea92a3e2f47f0dc7423 Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Mon, 9 May 2011 09:56:20 -0400 Subject: Added tag 2.6.8-start for changeset 5e349dbe9cc8 --- .hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/.hgtags b/.hgtags index d81dc4b775..f09bb834c5 100644 --- a/.hgtags +++ b/.hgtags @@ -107,3 +107,4 @@ d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc 2.6.3-beta1 7db558aaa7c176f2022b3e9cfe38ac72f6d1fccd 2.6.5-beta1 800cefce8d364ffdd2f383cbecb91294da3ea424 2.6.6-start ce588bc1ae8e3a90ee5e1f5de71a346886a9fd8b 2.6.7-start +5e349dbe9cc84ea5795af8aeb6d473a0af9d4953 2.6.8-start -- cgit v1.2.3 From a5118ccd6721afdf4f8c71cba6007eb7be4d7c19 Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Mon, 9 May 2011 09:57:02 -0400 Subject: increment viewer version to 2.6.9 --- indra/llcommon/llversionviewer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h index 08026c38a6..79124a5a37 100644 --- a/indra/llcommon/llversionviewer.h +++ b/indra/llcommon/llversionviewer.h @@ -29,7 +29,7 @@ const S32 LL_VERSION_MAJOR = 2; const S32 LL_VERSION_MINOR = 6; -const S32 LL_VERSION_PATCH = 8; +const S32 LL_VERSION_PATCH = 9; const S32 LL_VERSION_BUILD = 0; const char * const LL_CHANNEL = "Second Life Developer"; -- cgit v1.2.3 From 369b34443d3d09b8bc71e85f23628c079935b615 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" <vir@lindenlab.com> Date: Mon, 9 May 2011 11:23:15 -0400 Subject: SH-1491 WIP - whole model upload for fee request --- indra/newview/llmeshrepository.cpp | 101 ++++++++++++++++++++++++++++++++++++- indra/newview/llmeshrepository.h | 2 + 2 files changed, 102 insertions(+), 1 deletion(-) diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 4c04b0ea35..0789bbe28a 100755 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -58,6 +58,8 @@ #include "llworld.h" #include "material_codes.h" #include "pipeline.h" +#include "llinventorymodel.h" +#include "llfoldertype.h" #ifndef LL_WINDOWS #include "netdb.h" @@ -478,6 +480,25 @@ public: } }; +class LLWholeModelFeeResponder: public LLCurl::Responder +{ + LLMeshUploadThread* mThread; +public: + LLWholeModelFeeResponder(LLMeshUploadThread* thread): + mThread(thread) + { + } + virtual void completedRaw(U32 status, const std::string& reason, + const LLChannelDescriptors& channels, + const LLIOPipe::buffer_ptr_t& buffer) + { + assert_main_thread(); + llinfos << "completed" << llendl; + mThread->mPendingUploads--; + } + +}; + LLMeshRepoThread::LLMeshRepoThread() : LLThread("mesh repo", NULL) { @@ -1341,8 +1362,81 @@ void LLMeshUploadThread::run() } } +LLSD LLMeshUploadThread::wholeModelToLLSD(bool include_textures) +{ + // TODO where do textures go? + + LLSD result; + + result["folder_id"] = gInventory.findCategoryUUIDForType(LLFolderType::FT_OBJECT); + result["asset_type"] = "mesh"; + result["inventory_type"] = "object"; + result["name"] = "your name here"; + result["description"] = "your description here"; + + LLSD res; + res["mesh_list"] = LLSD::emptyArray(); + S32 mesh_num = 0; + + for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter) + { + LLMeshUploadData data; + data.mBaseModel = iter->first; + + LLModelInstance& instance = *(iter->second.begin()); + + for (S32 i = 0; i < 5; i++) + { + data.mModel[i] = instance.mLOD[i]; + } + + std::stringstream ostr; + + LLModel::Decomposition& decomp = + data.mModel[LLModel::LOD_PHYSICS].notNull() ? + data.mModel[LLModel::LOD_PHYSICS]->mPhysics : + data.mBaseModel->mPhysics; + + decomp.mBaseHull = mHullMap[data.mBaseModel]; + + LLModel::writeModel( + ostr, + data.mModel[LLModel::LOD_PHYSICS], + data.mModel[LLModel::LOD_HIGH], + data.mModel[LLModel::LOD_MEDIUM], + data.mModel[LLModel::LOD_LOW], + data.mModel[LLModel::LOD_IMPOSTOR], + decomp, + mUploadSkin, + mUploadJoints); + + data.mAssetData = ostr.str(); + + LLSD mesh_entry; + + // TODO - correct coords based on instance.mTransform. + mesh_entry["coords"]["x"] = 1.0; + mesh_entry["coords"]["y"] = 1.0; + mesh_entry["coords"]["z"] = 1.0; + mesh_entry["coords"]["rot_x"] = 1.0; + mesh_entry["coords"]["rot_y"] = 1.0; + mesh_entry["coords"]["rot_z"] = 1.0; + mesh_entry["mesh_data"] = ostr.str(); + + res["mesh_list"][mesh_num] = mesh_entry; + + mesh_num++; + } + + result["asset_resources"] = res; + + return result; +} + void LLMeshUploadThread::doWholeModelUpload() { + mCurlRequest = new LLCurlRequest(); + // Queue up models for hull generation (viewer-side) for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter) { @@ -1388,7 +1482,12 @@ void LLMeshUploadThread::doWholeModelUpload() bool do_include_textures = false; // not needed for initial cost/validation check. LLSD model_data = wholeModelToLLSD(do_include_textures); - + + mPendingUploads++; + LLCurlRequest::headers_t headers; + mCurlRequest->post(mWholeModelUploadCapability, headers, model_data.asString(), + new LLWholeModelFeeResponder(this)); + // Currently a no-op. mFinished = true; } diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h index e2faed52cf..9d8119dc48 100755 --- a/indra/newview/llmeshrepository.h +++ b/indra/newview/llmeshrepository.h @@ -424,6 +424,8 @@ public: void doWholeModelUpload(); void doIterativeUpload(); + + LLSD wholeModelToLLSD(bool include_textures); }; class LLMeshRepository -- cgit v1.2.3 From fac4ca594f4efee1da05bdc74164f56690d03bfb Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Mon, 9 May 2011 12:56:28 -0500 Subject: SH-1517 Always build bounding hull from highest LoD. --- indra/newview/llmeshrepository.cpp | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index dd2ffdf7f1..ff91ce74f1 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -1372,27 +1372,7 @@ void LLMeshUploadThread::run() } //queue up models for hull generation - LLModel* physics = NULL; - - if (data.mModel[LLModel::LOD_PHYSICS].notNull()) - { - physics = data.mModel[LLModel::LOD_PHYSICS]; - } - else if (data.mModel[LLModel::LOD_MEDIUM].notNull()) - { - physics = data.mModel[LLModel::LOD_MEDIUM]; - } - else - { - physics = data.mModel[LLModel::LOD_HIGH]; - } - - if (!physics) - { - llerrs << "WTF?" << llendl; - } - - DecompRequest* request = new DecompRequest(physics, data.mBaseModel, this); + DecompRequest* request = new DecompRequest(data.mModel[LLModel::LOD_HIGH], data.mBaseModel, this); gMeshRepo.mDecompThread->submitRequest(request); } -- cgit v1.2.3 From 847b709c27ea0c902b345f9a8d68c255c077c541 Mon Sep 17 00:00:00 2001 From: Xiaohong Bao <bao@lindenlab.com> Date: Mon, 9 May 2011 12:18:04 -0600 Subject: fix for SH-1530: Viewer crash in LLSurface::getWaterHeight --- indra/newview/llviewercamera.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/indra/newview/llviewercamera.cpp b/indra/newview/llviewercamera.cpp index 23b0845f31..7f7366dd3d 100644 --- a/indra/newview/llviewercamera.cpp +++ b/indra/newview/llviewercamera.cpp @@ -756,6 +756,10 @@ LLVector3 LLViewerCamera::roundToPixel(const LLVector3 &pos_agent) BOOL LLViewerCamera::cameraUnderWater() const { + if(!gAgent.getRegion()) + { + return FALSE ; + } return getOrigin().mV[VZ] < gAgent.getRegion()->getWaterHeight(); } -- cgit v1.2.3 From 0b677dd2198af4608435fd5c8d84cc4f77db47b8 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" <vir@lindenlab.com> Date: Mon, 9 May 2011 16:56:29 -0400 Subject: SH-1491 WIP - whole model upload for fee request --- indra/newview/llmeshrepository.cpp | 43 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 0789bbe28a..9c72550847 100755 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -1362,6 +1362,12 @@ void LLMeshUploadThread::run() } } +void dumpLLSDToFile(LLSD& content, std::string& filename) +{ + std::ofstream of(filename); + LLSDSerialize::toXML(content,of); +} + LLSD LLMeshUploadThread::wholeModelToLLSD(bool include_textures) { // TODO where do textures go? @@ -1376,8 +1382,12 @@ LLSD LLMeshUploadThread::wholeModelToLLSD(bool include_textures) LLSD res; res["mesh_list"] = LLSD::emptyArray(); + res["texture_list"] = LLSD::emptyArray(); S32 mesh_num = 0; + S32 texture_num = 0; + std::set<LLViewerTexture* > textures; + for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter) { LLMeshUploadData data; @@ -1425,11 +1435,44 @@ LLSD LLMeshUploadThread::wholeModelToLLSD(bool include_textures) res["mesh_list"][mesh_num] = mesh_entry; + if (mUploadTextures) + { + for (std::vector<LLImportMaterial>::iterator material_iter = instance.mMaterial.begin(); + material_iter != instance.mMaterial.end(); ++material_iter) + { + + if (textures.find(material_iter->mDiffuseMap.get()) == textures.end()) + { + textures.insert(material_iter->mDiffuseMap.get()); + + std::stringstream ostr; + if (include_textures) // otherwise data is blank. + { + LLTextureUploadData data(material_iter->mDiffuseMap.get(), material_iter->mDiffuseMapLabel); + if (!data.mTexture->isRawImageValid()) + { + data.mTexture->reloadRawImage(data.mTexture->getDiscardLevel()); + } + + LLPointer<LLImageJ2C> upload_file = + LLViewerTextureList::convertToUploadFile(data.mTexture->getRawImage()); + ostr.write((const char*) upload_file->getData(), upload_file->getDataSize()); + } + LLSD texture_entry; + texture_entry["texture_data"] = ostr.str(); + res["texture_list"][texture_num] = texture_entry; + texture_num++; + } + } + } + mesh_num++; } result["asset_resources"] = res; + dumpLLSDToFile(result,std::string("whole_model.xml")); + return result; } -- cgit v1.2.3 From 49cadf47f3eeaee9da3fca55a321211456f86019 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" <vir@lindenlab.com> Date: Mon, 9 May 2011 17:30:40 -0400 Subject: SH-1491 WIP - whole model upload for fee request --- indra/newview/llmeshrepository.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 9c72550847..c2c373d07f 100755 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -1365,7 +1365,7 @@ void LLMeshUploadThread::run() void dumpLLSDToFile(LLSD& content, std::string& filename) { std::ofstream of(filename); - LLSDSerialize::toXML(content,of); + LLSDSerialize::toPrettyXML(content,of); } LLSD LLMeshUploadThread::wholeModelToLLSD(bool include_textures) @@ -1431,7 +1431,7 @@ LLSD LLMeshUploadThread::wholeModelToLLSD(bool include_textures) mesh_entry["coords"]["rot_x"] = 1.0; mesh_entry["coords"]["rot_y"] = 1.0; mesh_entry["coords"]["rot_z"] = 1.0; - mesh_entry["mesh_data"] = ostr.str(); + mesh_entry["mesh_data"] = "RESTORE_ME"; //ostr.str(); res["mesh_list"][mesh_num] = mesh_entry; -- cgit v1.2.3 From 265d363a0f390f5dda2bf8e8fc242c4f9c91cfe3 Mon Sep 17 00:00:00 2001 From: "Debi King (Dessie)" <dessie@lindenlab.com> Date: Mon, 9 May 2011 18:07:01 -0400 Subject: Added tag DRTVWR-52_2.6.6-beta1, 2.6.6-beta1 for changeset bb1075286b3b --- .hgtags | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.hgtags b/.hgtags index c1d3e88e37..3b0ce079fd 100644 --- a/.hgtags +++ b/.hgtags @@ -106,3 +106,5 @@ d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc 2.6.3-beta1 7db558aaa7c176f2022b3e9cfe38ac72f6d1fccd DRTVWR-50_2.6.5-beta1 7db558aaa7c176f2022b3e9cfe38ac72f6d1fccd 2.6.5-beta1 800cefce8d364ffdd2f383cbecb91294da3ea424 2.6.6-start +bb1075286b3b147b1dae2e3d6b2d56f04ff03f35 DRTVWR-52_2.6.6-beta1 +bb1075286b3b147b1dae2e3d6b2d56f04ff03f35 2.6.6-beta1 -- cgit v1.2.3 From 3039663148b0adc64220964b10cad595e5137cc0 Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Mon, 9 May 2011 15:10:56 -0700 Subject: EXP-802 Add a check box to enable/disable voice chat. --- indra/newview/llbottomtray.cpp | 11 ++++++++--- indra/newview/llfloatersounddevices.cpp | 2 +- .../skins/default/xui/en/floater_sound_devices.xml | 21 ++++++++++++++++++++- .../skins/minimal/xui/en/panel_bottomtray.xml | 2 +- 4 files changed, 30 insertions(+), 6 deletions(-) diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index c72cdfd1dc..f51552aae5 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -559,7 +559,7 @@ BOOL LLBottomTray::postBuild() else { LLTransientFloaterMgr::getInstance()->addControlView(getChild<LLButton>("speak_btn")); - LLTransientFloaterMgr::getInstance()->addControlView(getChild<LLButton>("speak_flyout_btn")); + LLTransientFloaterMgr::getInstance()->addControlView(getChild<LLButton>("flyout_btn")); } @@ -1591,7 +1591,7 @@ void LLBottomTray::initResizeStateContainers() // because it resets chatbar's width according to resize logic. void LLBottomTray::initButtonsVisibility() { - setVisibleAndFitWidths(RS_BUTTON_SPEAK, gSavedSettings.getBOOL("EnableVoiceChat")); + setVisibleAndFitWidths(RS_BUTTON_SPEAK, gSavedSettings.getBOOL("EnableVoiceChat") || !mSpeakBtn ); setVisibleAndFitWidths(RS_BUTTON_GESTURES, gSavedSettings.getBOOL("ShowGestureButton")); setVisibleAndFitWidths(RS_BUTTON_MOVEMENT, gSavedSettings.getBOOL("ShowMoveButton")); setVisibleAndFitWidths(RS_BUTTON_CAMERA, gSavedSettings.getBOOL("ShowCameraButton")); @@ -1605,7 +1605,12 @@ void LLBottomTray::initButtonsVisibility() void LLBottomTray::setButtonsControlsAndListeners() { - gSavedSettings.getControl("EnableVoiceChat")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_SPEAK, _2)); + // always show the speak panel if using the basic skin + if (mSpeakBtn) + { + gSavedSettings.getControl("EnableVoiceChat")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_SPEAK, _2)); + } + gSavedSettings.getControl("ShowGestureButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_GESTURES, _2)); gSavedSettings.getControl("ShowMoveButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_MOVEMENT, _2)); gSavedSettings.getControl("ShowCameraButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_CAMERA, _2)); diff --git a/indra/newview/llfloatersounddevices.cpp b/indra/newview/llfloatersounddevices.cpp index 3903b9b015..9fe7c7f9dd 100644 --- a/indra/newview/llfloatersounddevices.cpp +++ b/indra/newview/llfloatersounddevices.cpp @@ -56,7 +56,7 @@ BOOL LLFloaterSoundDevices::postBuild() { LLTransientDockableFloater::postBuild(); - LLView *anchor_panel = LLBottomTray::getInstance()->getChild<LLView>("speak_flyout_btn"); + LLView *anchor_panel = LLBottomTray::getInstance()->getChild<LLView>("flyout_btn"); setDockControl(new LLDockControl(anchor_panel, this, getDockTongue(), LLDockControl::TOP)); setIsChrome(TRUE); diff --git a/indra/newview/skins/default/xui/en/floater_sound_devices.xml b/indra/newview/skins/default/xui/en/floater_sound_devices.xml index c7c7a05af2..304987c3d5 100644 --- a/indra/newview/skins/default/xui/en/floater_sound_devices.xml +++ b/indra/newview/skins/default/xui/en/floater_sound_devices.xml @@ -11,7 +11,7 @@ save_rect="true" single_instance="true" bevel_style="in" - height="140" + height="164" layout="topleft" name="floater_sound_devices" title="Sound Devices" @@ -25,4 +25,23 @@ left="2" top="26" class="panel_voice_device_settings"/> + <text + name="voice_label" + top="136" + left="12" + height="14" + width="80" + layout="topleft" + >Voice Chat</text> + <check_box + layout="topleft" + control_name="EnableVoiceChat" + follows="bottom|left" + top="138" + left="80" + name="enable_voice" + width="100" + height="14" + label="Enabled" + /> </floater> diff --git a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml index 237af61717..d722c54081 100644 --- a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml @@ -115,7 +115,7 @@ top="5" left="0" height="23" - name="speak_flyout_btn" + name="flyout_btn" label="" tab_stop="false" tool_tip="Change your sound preferences" -- cgit v1.2.3 From 1f26ff1b428b47f04f50e54a7806c36d1fa39b07 Mon Sep 17 00:00:00 2001 From: "Debi King (Dessie)" <dessie@lindenlab.com> Date: Mon, 9 May 2011 18:19:16 -0400 Subject: Added tag 2.6.8-start for changeset 5e349dbe9cc8 --- .hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/.hgtags b/.hgtags index d81dc4b775..f09bb834c5 100644 --- a/.hgtags +++ b/.hgtags @@ -107,3 +107,4 @@ d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc 2.6.3-beta1 7db558aaa7c176f2022b3e9cfe38ac72f6d1fccd 2.6.5-beta1 800cefce8d364ffdd2f383cbecb91294da3ea424 2.6.6-start ce588bc1ae8e3a90ee5e1f5de71a346886a9fd8b 2.6.7-start +5e349dbe9cc84ea5795af8aeb6d473a0af9d4953 2.6.8-start -- cgit v1.2.3 From dab6d7b50706ef09be26b5c6ca4ca8c7b8b2d051 Mon Sep 17 00:00:00 2001 From: Xiaohong Bao <bao@lindenlab.com> Date: Mon, 9 May 2011 16:41:00 -0600 Subject: fix for SH-Render Metadata Physics Shapes on Development Client Gives Black Screen --- indra/newview/llviewerdisplay.cpp | 2 +- indra/newview/pipeline.cpp | 15 +++++++++++++++ indra/newview/pipeline.h | 1 + 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index a60d7e0793..e41773d273 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -825,7 +825,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) //} LLPipeline::sUnderWaterRender = LLViewerCamera::getInstance()->cameraUnderWater() ? TRUE : FALSE; - LLPipeline::updateRenderDeferred(); + LLPipeline::refreshRenderDeferred(); stop_glerror(); diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 923c02b860..f64eb89866 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -784,6 +784,21 @@ void LLPipeline::updateRenderDeferred() } } +//static +void LLPipeline::refreshRenderDeferred() +{ + if(gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_PHYSICS_SHAPES)) + { + //turn the deferred rendering and glow off when draw physics shapes. + sRenderDeferred = FALSE ; + sRenderGlow = FALSE ; + } + else + { + updateRenderDeferred() ; + } +} + void LLPipeline::releaseGLBuffers() { assertInitialized(); diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index 0cf3fde562..e9a250cd6d 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -356,6 +356,7 @@ public: static BOOL getRenderHighlights(void* data); static void updateRenderDeferred(); + static void refreshRenderDeferred(); private: void unloadShaders(); -- cgit v1.2.3 From 604f92fa200a72e291a53f58957792d4b281168e Mon Sep 17 00:00:00 2001 From: callum <none@none> Date: Mon, 9 May 2011 17:10:26 -0700 Subject: EXP-801 FIX Linden Research Inc text is clipped on login page in Basic mode (Reverted change back to original behavior - needs attention later) --- indra/newview/skins/minimal/xui/en/main_view.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/indra/newview/skins/minimal/xui/en/main_view.xml b/indra/newview/skins/minimal/xui/en/main_view.xml index ac5bae2f3b..6e8ad9adaf 100644 --- a/indra/newview/skins/minimal/xui/en/main_view.xml +++ b/indra/newview/skins/minimal/xui/en/main_view.xml @@ -8,6 +8,13 @@ tab_stop="false" name="main_view" width="1024"> + <panel top="0" + follows="all" + height="768" + mouse_opaque="false" + name="login_panel_holder" + width="1024"/> + <layout_stack border_size="0" follows="all" mouse_opaque="false" @@ -90,13 +97,6 @@ visible="false" width="500"/> - <panel top="0" - follows="all" - height="500" - mouse_opaque="false" - name="login_panel_holder" - width="1024"/> - <panel follows="all" height="500" left="0" -- cgit v1.2.3 From 64289248273fb6cca2460614d1c25663f06ff0e2 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Mon, 9 May 2011 17:24:56 -0700 Subject: EXP-776 WIP [crashhunters] crash in LLCloudLayer::decompress EXP-777 WIP [crashhunters] crash in LLWind::decompress added NULL check --- indra/newview/llviewermessage.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index ef5968a5e2..0b8e5cf303 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -344,6 +344,11 @@ void process_layer_data(LLMessageSystem *mesgsys, void **user_data) { LLViewerRegion *regionp = LLWorld::getInstance()->getRegion(mesgsys->getSender()); + if(!regionp) + { + llwarns << "Invalid region for layer data." << llendl; + return; + } S32 size; S8 type; -- cgit v1.2.3 From 8e8eb76eb9d0efabc82fec194f6edb4838c49955 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed <nat@lindenlab.com> Date: Tue, 10 May 2011 08:21:21 -0400 Subject: CHOP-661: add and use code to listen on next available server port. In indra/llmessage/tests/testrunner.py, introduce new freeport() function to try a caller-specified expression (such as instantiating an object that will listen on a server port) with a range of candidate port numbers until the expression produces a value instead of EADDRINUSE exception. Change test_llsdmessage_peer.py and test_llxmlrpc_peer.py to use freeport() to construct their server class inline BEFORE launching the thread that will run it, then pass that server's serve_forever method to daemon thread. Also set os.environ["PORT"] to selected environment variable before running subject test program. In indra/llmessage/tests/commtest.h, introduce commtest_data::getport() to read port number from specified environment variable, throwing exception if variable not set or non-numeric. Construct default LLHost from getport("PORT") instead of hardcoded constant. Change indra/newview/tests/llxmlrpclistener_test.cpp to use commtest_data:: getport("PORT") instead of hardcoded constant. Also use LLSD::with() rather than older LLSD::insert() syntax. HOWEVER -- I am irritated to discover that llxmlrpclistener_test IS NOT RUN or even built by newview/CMakeLists.txt! It's not even commented out -- it's entirely deleted! I am determined to restore this test. However, as it will take some fiddling with new link-time dependencies, that will be a separate commit. --- indra/llmessage/tests/commtest.h | 20 ++++++- indra/llmessage/tests/test_llsdmessage_peer.py | 26 ++++++--- indra/llmessage/tests/testrunner.py | 81 ++++++++++++++++++++++++++ indra/newview/tests/llxmlrpclistener_test.cpp | 11 ++-- indra/newview/tests/test_llxmlrpc_peer.py | 21 ++++--- 5 files changed, 138 insertions(+), 21 deletions(-) diff --git a/indra/llmessage/tests/commtest.h b/indra/llmessage/tests/commtest.h index 32035783e2..0fef596df2 100644 --- a/indra/llmessage/tests/commtest.h +++ b/indra/llmessage/tests/commtest.h @@ -35,6 +35,13 @@ #include "llhost.h" #include "stringize.h" #include <string> +#include <stdexcept> +#include <boost/lexical_cast.hpp> + +struct CommtestError: public std::runtime_error +{ + CommtestError(const std::string& what): std::runtime_error(what) {} +}; /** * This struct is shared by a couple of standalone comm tests (ADD_COMM_BUILD_TEST). @@ -55,13 +62,24 @@ struct commtest_data replyPump("reply"), errorPump("error"), success(false), - host("127.0.0.1", 8000), + host("127.0.0.1", getport("PORT")), server(STRINGIZE("http://" << host.getString() << "/")) { replyPump.listen("self", boost::bind(&commtest_data::outcome, this, _1, true)); errorPump.listen("self", boost::bind(&commtest_data::outcome, this, _1, false)); } + static int getport(const std::string& var) + { + const char* port = getenv(var.c_str()); + if (! port) + { + throw CommtestError("missing $PORT environment variable"); + } + // This will throw, too, if the value of PORT isn't numeric. + return boost::lexical_cast<int>(port); + } + bool outcome(const LLSD& _result, bool _success) { // std::cout << "commtest_data::outcome(" << _result << ", " << _success << ")\n"; diff --git a/indra/llmessage/tests/test_llsdmessage_peer.py b/indra/llmessage/tests/test_llsdmessage_peer.py index 580ee7f8b4..cea5032111 100644 --- a/indra/llmessage/tests/test_llsdmessage_peer.py +++ b/indra/llmessage/tests/test_llsdmessage_peer.py @@ -38,7 +38,7 @@ mydir = os.path.dirname(__file__) # expected to be .../indra/llmessage/tes sys.path.insert(0, os.path.join(mydir, os.pardir, os.pardir, "lib", "python")) from indra.util.fastest_elementtree import parse as xml_parse from indra.base import llsd -from testrunner import run, debug +from testrunner import freeport, run, debug class TestHTTPRequestHandler(BaseHTTPRequestHandler): """This subclass of BaseHTTPRequestHandler is to receive and echo @@ -97,6 +97,10 @@ class TestHTTPRequestHandler(BaseHTTPRequestHandler): self.wfile.write(response) else: # fail requested status = data.get("status", 500) + # self.responses maps an int status to a (short, long) pair of + # strings. We want the longer string. That's why we pass a string + # pair to get(): the [1] will select the second string, whether it + # came from self.responses or from our default pair. reason = data.get("reason", self.responses.get(status, ("fail requested", @@ -113,11 +117,17 @@ class TestHTTPRequestHandler(BaseHTTPRequestHandler): # Suppress error output as well pass -class TestHTTPServer(Thread): - def run(self): - httpd = HTTPServer(('127.0.0.1', 8000), TestHTTPRequestHandler) - debug("Starting HTTP server...\n") - httpd.serve_forever() - if __name__ == "__main__": - sys.exit(run(server=TestHTTPServer(name="httpd"), *sys.argv[1:])) + # Instantiate an HTTPServer(TestHTTPRequestHandler) on the first free port + # in the specified port range. Doing this inline is better than in a + # daemon thread: if it blows up here, we'll get a traceback. If it blew up + # in some other thread, the traceback would get eaten and we'd run the + # subject test program anyway. + httpd, port = freeport(xrange(8000, 8020), + lambda port: HTTPServer(('127.0.0.1', port), TestHTTPRequestHandler)) + # Pass the selected port number to the subject test program via the + # environment. We don't want to impose requirements on the test program's + # command-line parsing -- and anyway, for C++ integration tests, that's + # performed in TUT code rather than our own. + os.environ["PORT"] = str(port) + sys.exit(run(server=Thread(name="httpd", target=httpd.serve_forever), *sys.argv[1:])) diff --git a/indra/llmessage/tests/testrunner.py b/indra/llmessage/tests/testrunner.py index b70ce91ee7..8ff13e0426 100644 --- a/indra/llmessage/tests/testrunner.py +++ b/indra/llmessage/tests/testrunner.py @@ -29,6 +29,8 @@ $/LicenseInfo$ import os import sys +import errno +import socket def debug(*args): sys.stdout.writelines(args) @@ -36,6 +38,85 @@ def debug(*args): # comment out the line below to enable debug output debug = lambda *args: None +def freeport(portlist, expr): + """ + Find a free server port to use. Specifically, evaluate 'expr' (a + callable(port)) until it stops raising EADDRINUSE exception. + + Pass: + + portlist: an iterable (e.g. xrange()) of ports to try. If you exhaust the + range, freeport() lets the socket.error exception propagate. If you want + unbounded, you could pass itertools.count(baseport), though of course in + practice the ceiling is 2^16-1 anyway. But it seems prudent to constrain + the range much more sharply: if we're iterating an absurd number of times, + probably something else is wrong. + + expr: a callable accepting a port number, specifically one of the items + from portlist. If calling that callable raises socket.error with + EADDRINUSE, freeport() retrieves the next item from portlist and retries. + + Returns: (expr(port), port) + + port: the value from portlist for which expr(port) succeeded + + Raises: + + Any exception raised by expr(port) other than EADDRINUSE. + + socket.error if, for every item from portlist, expr(port) raises + socket.error. The exception you see is the one from the last item in + portlist. + + StopIteration if portlist is completely empty. + + Example: + + server, port = freeport(xrange(8000, 8010), + lambda port: HTTPServer(("localhost", port), + MyRequestHandler)) + # pass 'port' to client code + # call server.serve_forever() + """ + # If portlist is completely empty, let StopIteration propagate: that's an + # error because we can't return meaningful values. We have no 'port', + # therefore no 'expr(port)'. + portiter = iter(portlist) + port = portiter.next() + + while True: + try: + # If this value of port works, return as promised. + return expr(port), port + + except socket.error, err: + # Anything other than 'Address already in use', propagate + if err.args[0] != errno.EADDRINUSE: + raise + + # Here we want the next port from portiter. But on StopIteration, + # we want to raise the original exception rather than + # StopIteration. So save the original exc_info(). + type, value, tb = sys.exc_info() + try: + try: + port = portiter.next() + except StopIteration: + raise type, value, tb + finally: + # Clean up local traceback, see docs for sys.exc_info() + del tb + + # Recap of the control flow above: + # If expr(port) doesn't raise, return as promised. + # If expr(port) raises anything but EADDRINUSE, propagate that + # exception. + # If portiter.next() raises StopIteration -- that is, if the port + # value we just passed to expr(port) was the last available -- reraise + # the EADDRINUSE exception. + # If we've actually arrived at this point, portiter.next() delivered a + # new port value. Loop back to pass that to expr(port). + def run(*args, **kwds): """All positional arguments collectively form a command line, executed as a synchronous child process. diff --git a/indra/newview/tests/llxmlrpclistener_test.cpp b/indra/newview/tests/llxmlrpclistener_test.cpp index 4d5df1043e..711c2a3d51 100644 --- a/indra/newview/tests/llxmlrpclistener_test.cpp +++ b/indra/newview/tests/llxmlrpclistener_test.cpp @@ -40,8 +40,10 @@ #include "llevents.h" #include "lleventfilter.h" #include "llsd.h" +#include "llhost.h" #include "llcontrol.h" #include "tests/wrapllerrs.h" +#include "tests/commtest.h" LLControlGroup gSavedSettings("Global"); @@ -54,7 +56,8 @@ namespace tut { data(): pumps(LLEventPumps::instance()), - uri("http://127.0.0.1:8000") + uri(std::string("http://") + + LLHost("127.0.0.1", commtest_data::getport("PORT")).getString()) { // These variables are required by machinery used by // LLXMLRPCTransaction. The values reflect reality for this test @@ -145,7 +148,7 @@ namespace tut pumps.obtain("LLXMLRPCTransaction").post(request); // Set the timer F32 timeout(10); - watchdog.eventAfter(timeout, LLSD().insert("timeout", 0)); + watchdog.eventAfter(timeout, LLSD().with("timeout", 0)); // and pump "mainloop" until we get something, whether from // LLXMLRPCListener or from the watchdog filter. LLTimer timer; @@ -182,7 +185,7 @@ namespace tut pumps.obtain("LLXMLRPCTransaction").post(request); // Set the timer F32 timeout(10); - watchdog.eventAfter(timeout, LLSD().insert("timeout", 0)); + watchdog.eventAfter(timeout, LLSD().with("timeout", 0)); // and pump "mainloop" until we get something, whether from // LLXMLRPCListener or from the watchdog filter. LLTimer timer; @@ -218,7 +221,7 @@ namespace tut pumps.obtain("LLXMLRPCTransaction").post(request); // Set the timer F32 timeout(10); - watchdog.eventAfter(timeout, LLSD().insert("timeout", 0)); + watchdog.eventAfter(timeout, LLSD().with("timeout", 0)); // and pump "mainloop" until we get something, whether from // LLXMLRPCListener or from the watchdog filter. LLTimer timer; diff --git a/indra/newview/tests/test_llxmlrpc_peer.py b/indra/newview/tests/test_llxmlrpc_peer.py index 1c7204a6b6..281b72a058 100644 --- a/indra/newview/tests/test_llxmlrpc_peer.py +++ b/indra/newview/tests/test_llxmlrpc_peer.py @@ -37,7 +37,7 @@ from SimpleXMLRPCServer import SimpleXMLRPCServer mydir = os.path.dirname(__file__) # expected to be .../indra/newview/tests/ sys.path.insert(0, os.path.join(mydir, os.pardir, os.pardir, "lib", "python")) sys.path.insert(1, os.path.join(mydir, os.pardir, os.pardir, "llmessage", "tests")) -from testrunner import run, debug +from testrunner import freeport, run, debug class TestServer(SimpleXMLRPCServer): def _dispatch(self, method, params): @@ -66,11 +66,16 @@ class TestServer(SimpleXMLRPCServer): # Suppress error output as well pass -class ServerRunner(Thread): - def run(self): - server = TestServer(('127.0.0.1', 8000)) - debug("Starting XMLRPC server...\n") - server.serve_forever() - if __name__ == "__main__": - sys.exit(run(server=ServerRunner(name="xmlrpc"), *sys.argv[1:])) + # Instantiate a TestServer on the first free port in the specified port + # range. Doing this inline is better than in a daemon thread: if it blows + # up here, we'll get a traceback. If it blew up in some other thread, the + # traceback would get eaten and we'd run the subject test program anyway. + xmlrpcd, port = freeport(xrange(8000, 8020), + lambda port: TestServer(('127.0.0.1', port))) + # Pass the selected port number to the subject test program via the + # environment. We don't want to impose requirements on the test program's + # command-line parsing -- and anyway, for C++ integration tests, that's + # performed in TUT code rather than our own. + os.environ["PORT"] = str(port) + sys.exit(run(server=Thread(name="xmlrpc", target=xmlrpcd.serve_forever), *sys.argv[1:])) -- cgit v1.2.3 From 56e471c3991c52f1aab37a82d88fc8ad9634483f Mon Sep 17 00:00:00 2001 From: Kelly Washington <kelly@lindenlab.com> Date: Tue, 10 May 2011 08:40:00 -0700 Subject: ER-480 Viewer work for abandoned land. * Support group members with the right powers buying land set for sale to a group * Add dialogs for abandoned land related notifications. --- indra/newview/llfloaterbuyland.cpp | 14 ++++++++--- indra/newview/llviewerparcelmgr.cpp | 5 +++- .../newview/skins/default/xui/en/notifications.xml | 28 ++++++++++++++++++++++ 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/indra/newview/llfloaterbuyland.cpp b/indra/newview/llfloaterbuyland.cpp index 83105ef27c..50b19a4221 100644 --- a/indra/newview/llfloaterbuyland.cpp +++ b/indra/newview/llfloaterbuyland.cpp @@ -459,10 +459,18 @@ void LLFloaterBuyLandUI::updateParcelInfo() return; } - if (!authorizedBuyer.isNull() && buyer != authorizedBuyer) + if (!authorizedBuyer.isNull() && buyer != authorizedBuyer) { - mCannotBuyReason = getString("set_to_sell_to_other"); - return; + // Maybe the parcel is set for sale to a group we are in. + bool authorized_group = + gAgent.hasPowerInGroup(authorizedBuyer,GP_LAND_DEED) + && gAgent.hasPowerInGroup(authorizedBuyer,GP_LAND_SET_SALE_INFO); + + if (!authorized_group) + { + mCannotBuyReason = getString("set_to_sell_to_other"); + return; + } } } else diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index e84e4a859a..c84a14f62c 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -2200,7 +2200,10 @@ bool LLViewerParcelMgr::canAgentBuyParcel(LLParcel* parcel, bool forGroup) const = parcelOwner == (forGroup ? gAgent.getGroupID() : gAgent.getID()); bool isAuthorized - = (authorizeBuyer.isNull() || (gAgent.getID() == authorizeBuyer)); + = (authorizeBuyer.isNull() + || (gAgent.getID() == authorizeBuyer) + || (gAgent.hasPowerInGroup(authorizeBuyer,GP_LAND_DEED) + && gAgent.hasPowerInGroup(authorizeBuyer,GP_LAND_SET_SALE_INFO))); return isForSale && !isOwner && isAuthorized && isEmpowered; } diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index c64d492612..06614dd218 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -6815,6 +6815,34 @@ Deed to group failed. <tag>fail</tag> </notification> + <notification + icon="notifytip.tga" + name="ReleaseLandThrottled" + type="notifytip"> +The parcel [PARCEL_NAME] can not be abandoned at this time. + tag>fail</tag> + </notification> + + <notification + icon="notifytip.tga" + name="ReleasedLandWithReclaim" + type="notifytip"> +The [AREA] m² parcel '[PARCEL_NAME]' has been released. + +You will have [RECLAIM_PERIOD] hours to reclaim for L$0 before it is set for sale to anyone. + <tag>fail</tag> + </notification> + + <notification + icon="notifytip.tga" + name="ReleasedLandNoReclaim" + type="notifytip"> +The [AREA] m² parcel '[PARCEL_NAME]' has been released. + +It is now available for purchase by anyone. + <tag>fail</tag> + </notification> + <notification icon="notifytip.tga" name="AvatarRezNotification" -- cgit v1.2.3 From 4440526a8e331f38e5c087e3b446e1c9a3758fd0 Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine <vsavchuk@productengine.com> Date: Tue, 10 May 2011 18:58:40 +0300 Subject: STORM-1209 FIX Object continued sending messages after user adding this object to block list. Applying Joshua's fix. --- indra/newview/llviewermessage.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index ef5968a5e2..345b951d55 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -2208,7 +2208,9 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) name = clean_name_from_im(name, dialog); BOOL is_busy = gAgent.getBusy(); - BOOL is_muted = LLMuteList::getInstance()->isMuted(from_id, name, LLMute::flagTextChat); + BOOL is_muted = LLMuteList::getInstance()->isMuted(from_id, name, LLMute::flagTextChat) + // object IMs contain sender object id in session_id (STORM-1209) + || dialog == IM_FROM_TASK && LLMuteList::getInstance()->isMuted(session_id); BOOL is_linden = LLMuteList::getInstance()->isLinden(name); BOOL is_owned_by_me = FALSE; BOOL is_friend = (LLAvatarTracker::instance().getBuddyInfo(from_id) == NULL) ? false : true; -- cgit v1.2.3 From a52019d6d1e15d0e826d279ebcaef2f99d293292 Mon Sep 17 00:00:00 2001 From: Leslie Linden <leslie@lindenlab.com> Date: Tue, 10 May 2011 14:34:36 -0700 Subject: SH-1521 FIX -- Lighting and Shadows grayed out on mac * Modified mac feature table to bring it up to date with latest renderer features including deferred rendering * Changed mac AGL pixel format to no longer allow it to revert to software rendering when shader compilation errors occur. * Fixed up various GLSL shader compilation warnings and errors that came up as a result of the above changes. * Changed initial conditions for the "hardware skinning" checkbox on the preferences floater so it can be modified before login on machines that support avatar vertex programs. * Removed unused avatarAlphaF.glsl files Reviewed by davep --- indra/llrender/llshadermgr.cpp | 2 +- indra/llwindow/llwindowmacosx.cpp | 59 ++++++------ indra/newview/app_settings/high_graphics.xml | 19 ++-- indra/newview/app_settings/low_graphics.xml | 23 +++-- indra/newview/app_settings/mid_graphics.xml | 19 ++-- .../shaders/class1/deferred/avatarAlphaF.glsl | 70 --------------- .../shaders/class1/deferred/avatarAlphaV.glsl | 50 ++++++++--- .../shaders/class1/deferred/multiPointLightV.glsl | 20 +++++ .../shaders/class2/deferred/avatarAlphaF.glsl | 100 --------------------- .../shaders/class2/deferred/avatarAlphaV.glsl | 50 ++++++++--- indra/newview/app_settings/ultra_graphics.xml | 19 ++-- indra/newview/featuretable_mac.txt | 46 +++++----- indra/newview/featuretable_xp.txt | 4 +- indra/newview/llfloaterpreference.cpp | 12 ++- indra/newview/llviewershadermgr.cpp | 2 +- 15 files changed, 203 insertions(+), 292 deletions(-) delete mode 100644 indra/newview/app_settings/shaders/class1/deferred/avatarAlphaF.glsl create mode 100644 indra/newview/app_settings/shaders/class1/deferred/multiPointLightV.glsl delete mode 100644 indra/newview/app_settings/shaders/class2/deferred/avatarAlphaF.glsl diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index 21b02fdb71..98a0a93084 100644 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -315,7 +315,7 @@ void LLShaderMgr::dumpObjectLog(GLhandleARB ret, BOOL warns) } else { - LL_DEBUGS("ShaderLoading") << log << LL_ENDL; + LL_INFOS("ShaderLoading") << log << LL_ENDL; } } } diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp index affd7276cc..077d7ef1d0 100644 --- a/indra/llwindow/llwindowmacosx.cpp +++ b/indra/llwindow/llwindowmacosx.cpp @@ -541,20 +541,20 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits GLint fullscreenAttrib[] = { AGL_RGBA, - AGL_FULLSCREEN, - // AGL_NO_RECOVERY, // MBW -- XXX -- Not sure if we want this attribute - AGL_SAMPLE_BUFFERS_ARB, mFSAASamples > 0 ? 1 : 0, - AGL_SAMPLES_ARB, mFSAASamples, - AGL_DOUBLEBUFFER, - AGL_CLOSEST_POLICY, - AGL_ACCELERATED, - AGL_RED_SIZE, 8, - AGL_GREEN_SIZE, 8, - AGL_BLUE_SIZE, 8, - AGL_ALPHA_SIZE, 8, - AGL_DEPTH_SIZE, 24, - AGL_STENCIL_SIZE, 8, - AGL_NONE + AGL_FULLSCREEN, + AGL_NO_RECOVERY, + AGL_SAMPLE_BUFFERS_ARB, mFSAASamples > 0 ? 1 : 0, + AGL_SAMPLES_ARB, mFSAASamples, + AGL_DOUBLEBUFFER, + AGL_CLOSEST_POLICY, + AGL_ACCELERATED, + AGL_RED_SIZE, 8, + AGL_GREEN_SIZE, 8, + AGL_BLUE_SIZE, 8, + AGL_ALPHA_SIZE, 8, + AGL_DEPTH_SIZE, 24, + AGL_STENCIL_SIZE, 8, + AGL_NONE }; LL_DEBUGS("Window") << "createContext: creating fullscreen pixelformat" << LL_ENDL; @@ -567,21 +567,28 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits } else { + // NOTE from Leslie: + // + // AGL_NO_RECOVERY, when combined with AGL_ACCELERATED prevents software rendering + // fallback which means we won't hvae shaders that compile and link but then don't + // work. The drawback is that our shader compilation will be a bit more finicky though. + GLint windowedAttrib[] = { AGL_RGBA, - AGL_DOUBLEBUFFER, - AGL_CLOSEST_POLICY, - AGL_ACCELERATED, - AGL_SAMPLE_BUFFERS_ARB, mFSAASamples > 0 ? 1 : 0, - AGL_SAMPLES_ARB, mFSAASamples, - AGL_RED_SIZE, 8, - AGL_GREEN_SIZE, 8, - AGL_BLUE_SIZE, 8, - AGL_ALPHA_SIZE, 8, - AGL_DEPTH_SIZE, 24, - AGL_STENCIL_SIZE, 8, - AGL_NONE + AGL_NO_RECOVERY, + AGL_DOUBLEBUFFER, + AGL_CLOSEST_POLICY, + AGL_ACCELERATED, + AGL_SAMPLE_BUFFERS_ARB, mFSAASamples > 0 ? 1 : 0, + AGL_SAMPLES_ARB, mFSAASamples, + AGL_RED_SIZE, 8, + AGL_GREEN_SIZE, 8, + AGL_BLUE_SIZE, 8, + AGL_ALPHA_SIZE, 8, + AGL_DEPTH_SIZE, 24, + AGL_STENCIL_SIZE, 8, + AGL_NONE }; LL_DEBUGS("Window") << "createContext: creating windowed pixelformat" << LL_ENDL; diff --git a/indra/newview/app_settings/high_graphics.xml b/indra/newview/app_settings/high_graphics.xml index f1862f9d72..5bc2e1b7e6 100644 --- a/indra/newview/app_settings/high_graphics.xml +++ b/indra/newview/app_settings/high_graphics.xml @@ -4,15 +4,15 @@ <RenderAvatarCloth value="FALSE"/> <!--Default for now--> <RenderAvatarLODFactor value="1.0"/> - <!--Default for now--> - <RenderAvatarPhysicsLODFactor value="0.9"/> + <!--Default for now--> + <RenderAvatarPhysicsLODFactor value="0.9"/> <!--NO SHADERS--> <RenderAvatarVP value="TRUE"/> <!--Short Range--> <RenderFarClip value="128"/> <!--Default for now--> <RenderFlexTimeFactor value="1"/> - <!--256... but they don't use this--> + <!--256... but they do not use this--> <RenderGlowResolutionPow value="9"/> <!--Low number--> <RenderMaxPartCount value="4096"/> @@ -34,11 +34,10 @@ <VertexShaderEnable value="TRUE"/> <!--NO SHADERS--> <WindLightUseAtmosShaders value="TRUE"/> - <!--Deferred Shading--> - <RenderDeferred value="FALSE"/> - <!--SSAO Disabled--> - <RenderDeferredSSAO value="FALSE"/> - <!--Sun Shadows--> - <RenderShadowDetail value="0"/> - + <!--Deferred Shading--> + <RenderDeferred value="FALSE"/> + <!--SSAO Disabled--> + <RenderDeferredSSAO value="FALSE"/> + <!--Sun Shadows--> + <RenderShadowDetail value="0"/> </settings> diff --git a/indra/newview/app_settings/low_graphics.xml b/indra/newview/app_settings/low_graphics.xml index ad0073dfac..ca1dae0b86 100644 --- a/indra/newview/app_settings/low_graphics.xml +++ b/indra/newview/app_settings/low_graphics.xml @@ -4,17 +4,17 @@ <RenderAvatarCloth value="FALSE"/> <!--Default for now--> <RenderAvatarLODFactor value="0.5"/> - <!--Default for now--> - <RenderAvatarPhysicsLODFactor value="0.0"/> - <!--Default for now--> - <RenderAvatarMaxVisible value="3"/> + <!--Default for now--> + <RenderAvatarPhysicsLODFactor value="0.0"/> + <!--Default for now--> + <RenderAvatarMaxVisible value="3"/> <!--NO SHADERS--> <RenderAvatarVP value="FALSE"/> <!--Short Range--> <RenderFarClip value="64"/> <!--Default for now--> <RenderFlexTimeFactor value="0.5"/> - <!--256... but they don't use this--> + <!--256... but they do not use this--> <RenderGlowResolutionPow value="8"/> <!--Low number--> <RenderMaxPartCount value="1024"/> @@ -36,11 +36,10 @@ <VertexShaderEnable value="FALSE"/> <!--NO SHADERS--> <WindLightUseAtmosShaders value="FALSE"/> - <!--No Deferred Shading--> - <RenderDeferred value="FALSE"/> - <!--SSAO Disabled--> - <RenderDeferredSSAO value="FALSE"/> - <!--No Shadows--> - <RenderShadowDetail value="0"/> - + <!--No Deferred Shading--> + <RenderDeferred value="FALSE"/> + <!--SSAO Disabled--> + <RenderDeferredSSAO value="FALSE"/> + <!--No Shadows--> + <RenderShadowDetail value="0"/> </settings> diff --git a/indra/newview/app_settings/mid_graphics.xml b/indra/newview/app_settings/mid_graphics.xml index 6c4afbd7f0..01822fe64c 100644 --- a/indra/newview/app_settings/mid_graphics.xml +++ b/indra/newview/app_settings/mid_graphics.xml @@ -4,15 +4,15 @@ <RenderAvatarCloth value="FALSE"/> <!--Default for now--> <RenderAvatarLODFactor value="0.5"/> - <!--Default for now--> - <RenderAvatarPhysicsLODFactor value="0.75"/> + <!--Default for now--> + <RenderAvatarPhysicsLODFactor value="0.75"/> <!--NO SHADERS--> <RenderAvatarVP value="TRUE"/> <!--Short Range--> <RenderFarClip value="96"/> <!--Default for now--> <RenderFlexTimeFactor value="1"/> - <!--256... but they don't use this--> + <!--256... but they do not use this--> <RenderGlowResolutionPow value="8"/> <!--Low number--> <RenderMaxPartCount value="2048"/> @@ -34,11 +34,10 @@ <VertexShaderEnable value="TRUE"/> <!--NO SHADERS--> <WindLightUseAtmosShaders value="FALSE"/> - <!--No Deferred Shading--> - <RenderDeferred value="FALSE"/> - <!--SSAO Disabled--> - <RenderDeferredSSAO value="FALSE"/> - <!--No Shadows--> - <RenderShadowDetail value="0"/> - + <!--No Deferred Shading--> + <RenderDeferred value="FALSE"/> + <!--SSAO Disabled--> + <RenderDeferredSSAO value="FALSE"/> + <!--No Shadows--> + <RenderShadowDetail value="0"/> </settings> diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaF.glsl deleted file mode 100644 index 7d9d6cc0b2..0000000000 --- a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaF.glsl +++ /dev/null @@ -1,70 +0,0 @@ -/** - * @file avatarAlphaF.glsl - * - * $LicenseInfo:firstyear=2007&license=viewerlgpl$ - * $/LicenseInfo$ - */ - -#version 120 - -uniform sampler2D diffuseMap; -uniform sampler2DShadow shadowMap0; -uniform sampler2DShadow shadowMap1; -uniform sampler2DShadow shadowMap2; -uniform sampler2DShadow shadowMap3; -uniform sampler2D noiseMap; - -uniform mat4 shadow_matrix[6]; -uniform vec4 shadow_clip; - -vec3 atmosLighting(vec3 light); -vec3 scaleSoftClip(vec3 light); - -varying vec3 vary_ambient; -varying vec3 vary_directional; -varying vec4 vary_position; -varying vec3 vary_normal; - -void main() -{ - float shadow = 1.0; - vec4 pos = vary_position; - vec3 norm = normalize(vary_normal); - - vec3 nz = texture2D(noiseMap, gl_FragCoord.xy/128.0).xyz; - - if (pos.z > -shadow_clip.w) - { - - if (pos.z < -shadow_clip.z) - { - vec4 lpos = shadow_matrix[3]*pos; - shadow = shadow2DProj(shadowMap3, lpos).x; - } - else if (pos.z < -shadow_clip.y) - { - vec4 lpos = shadow_matrix[2]*pos; - shadow = shadow2DProj(shadowMap2, lpos).x; - } - else if (pos.z < -shadow_clip.x) - { - vec4 lpos = shadow_matrix[1]*pos; - shadow = shadow2DProj(shadowMap1, lpos).x; - } - else - { - vec4 lpos = shadow_matrix[0]*pos; - shadow = shadow2DProj(shadowMap0, lpos).x; - } - } - - - vec4 col = vec4(vary_ambient + vary_directional*shadow, gl_Color.a); - vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy) * col; - - color.rgb = atmosLighting(color.rgb); - - color.rgb = scaleSoftClip(color.rgb); - - gl_FragColor = color; -} diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl index 5dfbb91393..a2a7dea20d 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl @@ -22,11 +22,36 @@ vec3 scaleUpLight(vec3 light); varying vec3 vary_position; varying vec3 vary_ambient; varying vec3 vary_directional; -varying vec3 vary_normal; varying vec3 vary_fragcoord; +varying vec3 vary_pointlight_col; uniform float near_clip; +float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight) +{ + //get light vector + vec3 lv = lp.xyz-v; + + //get distance + float d = length(lv); + + //normalize light vector + lv *= 1.0/d; + + //distance attenuation + float dist2 = d*d/(la*la); + float da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0); + + // spotlight coefficient. + float spot = max(dot(-ln, lv), is_pointlight); + da *= spot*spot; // GL_SPOT_EXPONENT=2 + + //angular attenuation + da *= calcDirectionalLight(n, lv); + + return da; +} + void main() { gl_TexCoord[0] = gl_MultiTexCoord0; @@ -49,7 +74,6 @@ void main() gl_Position = frag_pos; vary_position = pos.xyz; - vary_normal = norm; calcAtmospherics(pos.xyz); @@ -57,18 +81,20 @@ void main() vec4 col = vec4(0.0, 0.0, 0.0, gl_Color.a); - // Collect normal lights (need to be divided by two, as we later multiply by 2) - col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].specular.a); - col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].specular.a); - col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].specular.a); - col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].specular.a); - col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].specular.a); - col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].specular.a); - col.rgb += gl_LightSource[1].diffuse.rgb*calcDirectionalLight(norm, gl_LightSource[1].position.xyz); - col.rgb = scaleDownLight(col.rgb); + // Collect normal lights + col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].quadraticAttenuation, gl_LightSource[2].specular.a); + col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].quadraticAttenuation ,gl_LightSource[3].specular.a); + col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].quadraticAttenuation, gl_LightSource[4].specular.a); + col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].quadraticAttenuation, gl_LightSource[5].specular.a); + col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].quadraticAttenuation, gl_LightSource[6].specular.a); + col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].quadraticAttenuation, gl_LightSource[7].specular.a); + vary_pointlight_col = col.rgb*gl_Color.rgb; + + col.rgb = vec3(0,0,0); + // Add windlight lights - col.rgb += atmosAmbient(vec3(0.)); + col.rgb = atmosAmbient(vec3(0.)); vary_ambient = col.rgb*gl_Color.rgb; vary_directional = gl_Color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, gl_LightSource[0].position.xyz), (1.0-gl_Color.a)*(1.0-gl_Color.a))); diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightV.glsl new file mode 100644 index 0000000000..2e3e84dd15 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightV.glsl @@ -0,0 +1,20 @@ +/** + * @file multiPointLightV.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ + +#version 120 + +varying vec4 vary_fragcoord; + +void main() +{ + //transform vertex + vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex; + vary_fragcoord = pos; + + gl_Position = pos; + gl_FrontColor = gl_Color; +} diff --git a/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaF.glsl b/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaF.glsl deleted file mode 100644 index 4671a54078..0000000000 --- a/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaF.glsl +++ /dev/null @@ -1,100 +0,0 @@ -/** - * @file avatarAlphaF.glsl - * - * $LicenseInfo:firstyear=2007&license=viewerlgpl$ - * $/LicenseInfo$ - */ - -#version 120 - -#extension GL_ARB_texture_rectangle : enable - -uniform sampler2D diffuseMap; -uniform sampler2DRectShadow shadowMap0; -uniform sampler2DRectShadow shadowMap1; -uniform sampler2DRectShadow shadowMap2; -uniform sampler2DRectShadow shadowMap3; -uniform sampler2D noiseMap; - -uniform mat4 shadow_matrix[6]; -uniform vec4 shadow_clip; -uniform vec2 screen_res; -uniform vec2 shadow_res; - -vec3 atmosLighting(vec3 light); -vec3 scaleSoftClip(vec3 light); - -varying vec3 vary_ambient; -varying vec3 vary_directional; -varying vec3 vary_position; -varying vec3 vary_normal; - -uniform float shadow_bias; - -float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc, float scl) -{ - stc.xyz /= stc.w; - stc.z += shadow_bias; - - float cs = shadow2DRect(shadowMap, stc.xyz).x; - float shadow = cs; - - shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(scl, scl, 0.0)).x, cs); - shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(scl, -scl, 0.0)).x, cs); - shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-scl, scl, 0.0)).x, cs); - shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-scl, -scl, 0.0)).x, cs); - - return shadow/5.0; -} - -void main() -{ - float shadow = 1.0; - vec4 pos = vec4(vary_position, 1.0); - vec3 norm = normalize(vary_normal); - - //vec3 nz = texture2D(noiseMap, gl_FragCoord.xy/128.0).xyz; - - vec4 spos = pos; - - if (spos.z > -shadow_clip.w) - { - vec4 lpos; - - if (spos.z < -shadow_clip.z) - { - lpos = shadow_matrix[3]*spos; - lpos.xy *= shadow_res; - shadow = pcfShadow(shadowMap3, lpos, 1.5); - shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0); - } - else if (spos.z < -shadow_clip.y) - { - lpos = shadow_matrix[2]*spos; - lpos.xy *= shadow_res; - shadow = pcfShadow(shadowMap2, lpos, 1.5); - } - else if (spos.z < -shadow_clip.x) - { - lpos = shadow_matrix[1]*spos; - lpos.xy *= shadow_res; - shadow = pcfShadow(shadowMap1, lpos, 1.5); - } - else - { - lpos = shadow_matrix[0]*spos; - lpos.xy *= shadow_res; - shadow = pcfShadow(shadowMap0, lpos, 1.5); - } - } - - - vec4 col = vec4(vary_ambient + vary_directional*shadow, gl_Color.a); - vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy) * col; - - color.rgb = atmosLighting(color.rgb); - - color.rgb = scaleSoftClip(color.rgb); - - gl_FragColor = color; -} diff --git a/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl b/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl index 30954a8677..495e86c8db 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl @@ -22,13 +22,38 @@ vec3 scaleUpLight(vec3 light); varying vec3 vary_position; varying vec3 vary_ambient; varying vec3 vary_directional; -varying vec3 vary_normal; varying vec3 vary_fragcoord; +varying vec3 vary_pointlight_col; uniform float near_clip; uniform float shadow_offset; uniform float shadow_bias; +float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight) +{ + //get light vector + vec3 lv = lp.xyz-v; + + //get distance + float d = length(lv); + + //normalize light vector + lv *= 1.0/d; + + //distance attenuation + float dist2 = d*d/(la*la); + float da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0); + + // spotlight coefficient. + float spot = max(dot(-ln, lv), is_pointlight); + da *= spot*spot; // GL_SPOT_EXPONENT=2 + + //angular attenuation + da *= calcDirectionalLight(n, lv); + + return da; +} + void main() { gl_TexCoord[0] = gl_MultiTexCoord0; @@ -51,7 +76,6 @@ void main() float dp_directional_light = max(0.0, dot(norm, gl_LightSource[0].position.xyz)); vary_position = pos.xyz + gl_LightSource[0].position.xyz * (1.0-dp_directional_light)*shadow_offset; - vary_normal = norm; calcAtmospherics(pos.xyz); @@ -59,18 +83,20 @@ void main() vec4 col = vec4(0.0, 0.0, 0.0, gl_Color.a); - // Collect normal lights (need to be divided by two, as we later multiply by 2) - col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].specular.a); - col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].specular.a); - col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].specular.a); - col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].specular.a); - col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].specular.a); - col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].specular.a); - col.rgb += gl_LightSource[1].diffuse.rgb*calcDirectionalLight(norm, gl_LightSource[1].position.xyz); - col.rgb = scaleDownLight(col.rgb); + // Collect normal lights + col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].quadraticAttenuation, gl_LightSource[2].specular.a); + col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].quadraticAttenuation ,gl_LightSource[3].specular.a); + col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].quadraticAttenuation, gl_LightSource[4].specular.a); + col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].quadraticAttenuation, gl_LightSource[5].specular.a); + col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].quadraticAttenuation, gl_LightSource[6].specular.a); + col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].quadraticAttenuation, gl_LightSource[7].specular.a); + vary_pointlight_col = col.rgb*gl_Color.rgb; + + col.rgb = vec3(0,0,0); + // Add windlight lights - col.rgb += atmosAmbient(vec3(0.)); + col.rgb = atmosAmbient(vec3(0.)); vary_ambient = col.rgb*gl_Color.rgb; vary_directional = gl_Color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, gl_LightSource[0].position.xyz), (1.0-gl_Color.a)*(1.0-gl_Color.a))); diff --git a/indra/newview/app_settings/ultra_graphics.xml b/indra/newview/app_settings/ultra_graphics.xml index 3d588cf57d..71459e5470 100644 --- a/indra/newview/app_settings/ultra_graphics.xml +++ b/indra/newview/app_settings/ultra_graphics.xml @@ -4,15 +4,15 @@ <RenderAvatarCloth value="TRUE"/> <!--Default for now--> <RenderAvatarLODFactor value="1.0"/> - <!--Default for now--> - <RenderAvatarPhysicsLODFactor value="1.0"/> + <!--Default for now--> + <RenderAvatarPhysicsLODFactor value="1.0"/> <!--NO SHADERS--> <RenderAvatarVP value="TRUE"/> <!--Short Range--> <RenderFarClip value="256"/> <!--Default for now--> <RenderFlexTimeFactor value="1"/> - <!--256... but they don't use this--> + <!--256... but they do not use this--> <RenderGlowResolutionPow value="9"/> <!--Low number--> <RenderMaxPartCount value="4096"/> @@ -34,11 +34,10 @@ <VertexShaderEnable value="TRUE"/> <!--NO SHADERS--> <WindLightUseAtmosShaders value="TRUE"/> - <!--Deferred Shading--> - <RenderDeferred value="TRUE"/> - <!--SSAO Enabled--> - <RenderDeferredSSAO value="TRUE"/> - <!--Full Shadows--> - <RenderShadowDetail value="2"/> - + <!--Deferred Shading--> + <RenderDeferred value="TRUE"/> + <!--SSAO Enabled--> + <RenderDeferredSSAO value="TRUE"/> + <!--Full Shadows--> + <RenderShadowDetail value="2"/> </settings> diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt index 6bdb1e1787..c9ab003112 100644 --- a/indra/newview/featuretable_mac.txt +++ b/indra/newview/featuretable_mac.txt @@ -24,11 +24,11 @@ version 22 // list all RenderAnisotropic 1 0 -RenderAvatarCloth 0 0 +RenderAvatarCloth 1 1 RenderAvatarLODFactor 1 1.0 RenderAvatarPhysicsLODFactor 1 1.0 RenderAvatarMaxVisible 1 12 -RenderAvatarVP 1 0 +RenderAvatarVP 1 1 RenderCubeMap 1 1 RenderDelayVBUpdate 1 0 RenderFarClip 1 256 @@ -41,7 +41,7 @@ RenderLocalLights 1 1 RenderMaxPartCount 1 8192 RenderNightBrightness 1 1.0 RenderObjectBump 1 1 -RenderReflectionDetail 1 3 +RenderReflectionDetail 1 4 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 2.0 RenderTransparentWater 1 1 @@ -49,23 +49,21 @@ RenderTreeLODFactor 1 1.0 RenderUseImpostors 1 1 RenderVBOEnable 1 1 RenderVolumeLODFactor 1 2.0 -RenderWaterReflections 1 1 +UseStartScreen 1 1 UseOcclusion 1 1 VertexShaderEnable 1 1 WindLightUseAtmosShaders 1 1 WLSkyDetail 1 128 -RenderUseCleverUI 1 1 Disregard128DefaultDrawDistance 1 1 Disregard96DefaultDrawDistance 1 1 RenderTextureMemoryMultiple 1 0.5 -Disregard128DefaultDrawDistance 1 1 -Disregard96DefaultDrawDistance 1 1 +RenderShaderLightingMaxLevel 1 3 SkyUseClassicClouds 1 1 -WatchdogDisabled 1 1 RenderDeferred 1 1 RenderDeferredSSAO 1 1 RenderShadowDetail 1 2 - +WatchdogDisabled 1 1 +RenderUseStreamVBO 1 1 // // Low Graphics Settings @@ -90,15 +88,13 @@ RenderTransparentWater 1 0 RenderTreeLODFactor 1 0 RenderUseImpostors 1 1 RenderVolumeLODFactor 1 0.5 -RenderWaterReflections 1 0 VertexShaderEnable 1 0 WindLightUseAtmosShaders 1 0 WLSkyDetail 1 48 SkyUseClassicClouds 1 0 RenderDeferred 1 0 RenderDeferredSSAO 1 0 -RenderShadowDetail 1 2 - +RenderShadowDetail 1 0 // // Mid Graphics Settings @@ -122,14 +118,12 @@ RenderTransparentWater 1 1 RenderTreeLODFactor 1 0.5 RenderUseImpostors 1 1 RenderVolumeLODFactor 1 1.125 -RenderWaterReflections 1 0 VertexShaderEnable 1 1 WindLightUseAtmosShaders 1 0 WLSkyDetail 1 48 RenderDeferred 1 0 RenderDeferredSSAO 1 0 -RenderShadowDetail 1 2 - +RenderShadowDetail 1 0 // // High Graphics Settings (purty) @@ -153,7 +147,6 @@ RenderTransparentWater 1 1 RenderTreeLODFactor 1 0.5 RenderUseImpostors 1 1 RenderVolumeLODFactor 1 1.125 -RenderWaterReflections 1 0 VertexShaderEnable 1 1 WindLightUseAtmosShaders 1 1 WLSkyDetail 1 48 @@ -161,7 +154,6 @@ RenderDeferred 1 0 RenderDeferredSSAO 1 0 RenderShadowDetail 1 2 - // // Ultra graphics (REALLY PURTY!) // @@ -177,14 +169,13 @@ RenderGlowResolutionPow 1 9 RenderLocalLights 1 1 RenderMaxPartCount 1 8192 RenderObjectBump 1 1 -RenderReflectionDetail 1 3 +RenderReflectionDetail 1 4 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 2.0 RenderTransparentWater 1 1 RenderTreeLODFactor 1 1.0 RenderUseImpostors 1 1 RenderVolumeLODFactor 1 2.0 -RenderWaterReflections 1 1 VertexShaderEnable 1 1 WindLightUseAtmosShaders 1 1 WLSkyDetail 1 128 @@ -192,7 +183,6 @@ RenderDeferred 1 0 RenderDeferredSSAO 1 0 RenderShadowDetail 1 2 - // // Class Unknown Hardware (unknown) // @@ -229,9 +219,12 @@ RenderVBOEnable 1 1 list NoPixelShaders RenderAvatarVP 0 0 RenderAvatarCloth 0 0 -RenderWaterReflections 0 0 +RenderReflectionDetail 0 0 VertexShaderEnable 0 0 WindLightUseAtmosShaders 0 0 +RenderDeferred 0 0 +RenderDeferredSSAO 0 0 +RenderShadowDetail 0 0 // // No Vertex Shaders available @@ -239,10 +232,14 @@ WindLightUseAtmosShaders 0 0 list NoVertexShaders RenderAvatarVP 0 0 RenderAvatarCloth 0 0 -RenderWaterReflections 0 0 +RenderReflectionDetail 0 0 VertexShaderEnable 0 0 WindLightUseAtmosShaders 0 0 +RenderDeferred 0 0 +RenderDeferredSSAO 0 0 +RenderShadowDetail 0 0 +// // "Default" setups for safe, low, medium, high // list safe @@ -255,8 +252,11 @@ RenderMaxPartCount 1 1024 RenderTerrainDetail 1 0 RenderUseImpostors 0 0 RenderVBOEnable 1 0 -RenderWaterReflections 0 0 +RenderReflectionDetail 0 0 WindLightUseAtmosShaders 0 0 +RenderDeferred 0 0 +RenderDeferredSSAO 0 0 +RenderShadowDetail 0 0 // // CPU based feature masks diff --git a/indra/newview/featuretable_xp.txt b/indra/newview/featuretable_xp.txt index 08fb67a0c8..3339172a1a 100644 --- a/indra/newview/featuretable_xp.txt +++ b/indra/newview/featuretable_xp.txt @@ -152,7 +152,7 @@ WindLightUseAtmosShaders 1 1 WLSkyDetail 1 48 RenderDeferred 1 0 RenderDeferredSSAO 1 0 -RenderShadowDetail 1 0 +RenderShadowDetail 1 2 // // Ultra graphics (REALLY PURTY!) @@ -181,7 +181,7 @@ WindLightUseAtmosShaders 1 1 WLSkyDetail 1 128 RenderDeferred 1 0 RenderDeferredSSAO 1 0 -RenderShadowDetail 1 0 +RenderShadowDetail 1 2 // // Class Unknown Hardware (unknown) diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 18b7a48d7b..4b15695cbf 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -987,9 +987,15 @@ void LLFloaterPreference::refreshEnabledState() LLCheckBoxCtrl* ctrl_avatar_vp = getChild<LLCheckBoxCtrl>("AvatarVertexProgram"); // Avatar Render Mode LLCheckBoxCtrl* ctrl_avatar_cloth = getChild<LLCheckBoxCtrl>("AvatarCloth"); + + bool avatar_vp_enabled = LLFeatureManager::getInstance()->isFeatureAvailable("RenderAvatarVP"); + if (LLViewerShaderMgr::sInitialized) + { + S32 max_avatar_shader = LLViewerShaderMgr::instance()->mMaxAvatarShaderLevel; + avatar_vp_enabled = (max_avatar_shader > 0) ? TRUE : FALSE; + } - S32 max_avatar_shader = LLViewerShaderMgr::instance()->mMaxAvatarShaderLevel; - ctrl_avatar_vp->setEnabled((max_avatar_shader > 0) ? TRUE : FALSE); + ctrl_avatar_vp->setEnabled(avatar_vp_enabled); if (gSavedSettings.getBOOL("VertexShaderEnable") == FALSE || gSavedSettings.getBOOL("RenderAvatarVP") == FALSE) @@ -1006,7 +1012,7 @@ void LLFloaterPreference::refreshEnabledState() LLCheckBoxCtrl* ctrl_shader_enable = getChild<LLCheckBoxCtrl>("BasicShaders"); // radio set for terrain detail mode LLRadioGroup* mRadioTerrainDetail = getChild<LLRadioGroup>("TerrainDetailRadio"); // can be linked with control var - + ctrl_shader_enable->setEnabled(LLFeatureManager::getInstance()->isFeatureAvailable("VertexShaderEnable")); BOOL shaders = ctrl_shader_enable->get(); diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index e81ee72c05..3e85802ba6 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -1051,7 +1051,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() { gDeferredMultiLightProgram.mName = "Deferred MultiLight Shader"; gDeferredMultiLightProgram.mShaderFiles.clear(); - gDeferredMultiLightProgram.mShaderFiles.push_back(make_pair("deferred/pointLightV.glsl", GL_VERTEX_SHADER_ARB)); + gDeferredMultiLightProgram.mShaderFiles.push_back(make_pair("deferred/multiPointLightV.glsl", GL_VERTEX_SHADER_ARB)); gDeferredMultiLightProgram.mShaderFiles.push_back(make_pair("deferred/multiPointLightF.glsl", GL_FRAGMENT_SHADER_ARB)); gDeferredMultiLightProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; success = gDeferredMultiLightProgram.createShader(NULL, NULL); -- cgit v1.2.3 From f1c4c9d237eacfa68dbd3edf3f43d68941b55ce5 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Tue, 10 May 2011 17:11:05 -0700 Subject: EXP-806 FIX Server-side messages without a corresponding notification should show original, untranslated content --- indra/newview/llviewermessage.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index ef5968a5e2..fc11cbc28a 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -5366,6 +5366,12 @@ bool attempt_standard_notification(LLMessageSystem* msgsystem) { // notification was specified using the new mechanism, so we can just handle it here std::string notificationID; + msgsystem->getStringFast(_PREHASH_AlertInfo, _PREHASH_Message, notificationID); + if (!LLNotifications::getInstance()->templateExists(notificationID)) + { + return false; + } + std::string llsdRaw; LLSD llsdBlock; msgsystem->getStringFast(_PREHASH_AlertInfo, _PREHASH_Message, notificationID); -- cgit v1.2.3 From 32bce7512476f85b37a9a36cae1fb576e8ce040b Mon Sep 17 00:00:00 2001 From: brad kittenbrink <brad@lindenlab.com> Date: Tue, 10 May 2011 17:22:34 -0700 Subject: New build of ogg-vorbis package to fix VWR-25727. --- autobuild.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index a31d280b6f..0b1871b526 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1182,9 +1182,9 @@ <key>archive</key> <map> <key>hash</key> - <string>57f32a1a670f06a4dc036eb1164ad9d7</string> + <string>e849bc2b779fb7cc5e81aeb021a542c0</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg_vorbis-1.1.3-1.2.0-darwin-20110222.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-ogvorbis/rev/229529/arch/Darwin/installer/ogg_vorbis-1.2.2-1.3.2-darwin-20110510.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -1194,9 +1194,9 @@ <key>archive</key> <map> <key>hash</key> - <string>17c000ceef32c0623d038b4c73791bee</string> + <string>71eaa462eb0bf8842277a3436483a354</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg_vorbis-1.1.3-1.2.0-linux-20110307.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-ogvorbis/rev/229529/arch/Linux/installer/ogg_vorbis-1.2.2-1.3.2-linux-20110511.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -1206,9 +1206,9 @@ <key>archive</key> <map> <key>hash</key> - <string>c8fccf7eeb25fd45cb7e04399c0b83ee</string> + <string>291dbba89dd8162b76f2c2d82e908c6f</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg_vorbis-1.1.3-1.2.0-windows-20110222.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-ogvorbis/rev/229529/arch/CYGWIN/installer/ogg_vorbis-1.2.2-1.3.2-windows-20110510.tar.bz2</string> </map> <key>name</key> <string>windows</string> -- cgit v1.2.3 From c9becd55bdb6fa4d1b3c5f1d9f6676c50d884916 Mon Sep 17 00:00:00 2001 From: brad kittenbrink <brad@lindenlab.com> Date: Tue, 10 May 2011 17:22:34 -0700 Subject: New build of ogg-vorbis package to fix VWR-25727. --- autobuild.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index bd98d59766..166d871268 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1182,9 +1182,9 @@ <key>archive</key> <map> <key>hash</key> - <string>57f32a1a670f06a4dc036eb1164ad9d7</string> + <string>e849bc2b779fb7cc5e81aeb021a542c0</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg_vorbis-1.1.3-1.2.0-darwin-20110222.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-ogvorbis/rev/229529/arch/Darwin/installer/ogg_vorbis-1.2.2-1.3.2-darwin-20110510.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -1194,9 +1194,9 @@ <key>archive</key> <map> <key>hash</key> - <string>17c000ceef32c0623d038b4c73791bee</string> + <string>71eaa462eb0bf8842277a3436483a354</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg_vorbis-1.1.3-1.2.0-linux-20110307.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-ogvorbis/rev/229529/arch/Linux/installer/ogg_vorbis-1.2.2-1.3.2-linux-20110511.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -1206,9 +1206,9 @@ <key>archive</key> <map> <key>hash</key> - <string>c8fccf7eeb25fd45cb7e04399c0b83ee</string> + <string>291dbba89dd8162b76f2c2d82e908c6f</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg_vorbis-1.1.3-1.2.0-windows-20110222.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-ogvorbis/rev/229529/arch/CYGWIN/installer/ogg_vorbis-1.2.2-1.3.2-windows-20110510.tar.bz2</string> </map> <key>name</key> <string>windows</string> -- cgit v1.2.3 From 662bc0803cc9306062a0106467fd8b83290b4bcf Mon Sep 17 00:00:00 2001 From: Seth ProductEngine <slitovchuk@productengine.com> Date: Wed, 11 May 2011 18:12:48 +0300 Subject: STORM-477 Restored the backed out changeset: c9cc202293b7 --- indra/llvfs/CMakeLists.txt | 7 +++++++ indra/llvfs/tests/lldir_test.cpp | 38 +++++++++++++++++++++++--------------- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/indra/llvfs/CMakeLists.txt b/indra/llvfs/CMakeLists.txt index 722f4e2bfd..a3782d824b 100644 --- a/indra/llvfs/CMakeLists.txt +++ b/indra/llvfs/CMakeLists.txt @@ -12,6 +12,7 @@ include_directories( set(llvfs_SOURCE_FILES lldir.cpp + lldiriterator.cpp lllfsthread.cpp llpidlock.cpp llvfile.cpp @@ -24,6 +25,7 @@ set(llvfs_HEADER_FILES lldir.h lldirguard.h + lldiriterator.h lllfsthread.h llpidlock.h llvfile.h @@ -60,6 +62,11 @@ list(APPEND llvfs_SOURCE_FILES ${llvfs_HEADER_FILES}) add_library (llvfs ${llvfs_SOURCE_FILES}) +target_link_libraries(llvfs + ${BOOST_FILESYSTEM_LIBRARY} + ${BOOST_SYSTEM_LIBRARY} + ) + if (DARWIN) include(CMakeFindFrameworks) find_library(CARBON_LIBRARY Carbon) diff --git a/indra/llvfs/tests/lldir_test.cpp b/indra/llvfs/tests/lldir_test.cpp index 8788bd63e8..ea321c5ae9 100644 --- a/indra/llvfs/tests/lldir_test.cpp +++ b/indra/llvfs/tests/lldir_test.cpp @@ -28,6 +28,7 @@ #include "linden_common.h" #include "../lldir.h" +#include "../lldiriterator.h" #include "../test/lltut.h" @@ -259,13 +260,12 @@ namespace tut std::string makeTestFile( const std::string& dir, const std::string& file ) { - std::string delim = gDirUtilp->getDirDelimiter(); - std::string path = dir + delim + file; + std::string path = dir + file; LLFILE* handle = LLFile::fopen( path, "w" ); ensure("failed to open test file '"+path+"'", handle != NULL ); // Harbison & Steele, 4th ed., p. 366: "If an error occurs, fputs // returns EOF; otherwise, it returns some other, nonnegative value." - ensure("failed to write to test file '"+path+"'", fputs("test file", handle) >= 0); + ensure("failed to write to test file '"+path+"'", EOF != fputs("test file", handle) ); fclose(handle); return path; } @@ -290,7 +290,7 @@ namespace tut } static const char* DirScanFilename[5] = { "file1.abc", "file2.abc", "file1.xyz", "file2.xyz", "file1.mno" }; - + void scanTest(const std::string& directory, const std::string& pattern, bool correctResult[5]) { @@ -300,7 +300,8 @@ namespace tut bool filesFound[5] = { false, false, false, false, false }; //std::cerr << "searching '"+directory+"' for '"+pattern+"'\n"; - while ( found <= 5 && gDirUtilp->getNextFileInDir(directory, pattern, scanResult) ) + LLDirIterator iter(directory, pattern); + while ( found <= 5 && iter.next(scanResult) ) { found++; //std::cerr << " found '"+scanResult+"'\n"; @@ -334,15 +335,15 @@ namespace tut template<> template<> void LLDirTest_object_t::test<5>() - // getNextFileInDir + // LLDirIterator::next { std::string delim = gDirUtilp->getDirDelimiter(); std::string dirTemp = LLFile::tmpdir(); // Create the same 5 file names of the two directories - std::string dir1 = makeTestDir(dirTemp + "getNextFileInDir"); - std::string dir2 = makeTestDir(dirTemp + "getNextFileInDir"); + std::string dir1 = makeTestDir(dirTemp + "LLDirIterator"); + std::string dir2 = makeTestDir(dirTemp + "LLDirIterator"); std::string dir1files[5]; std::string dir2files[5]; for (int i=0; i<5; i++) @@ -380,19 +381,17 @@ namespace tut scanTest(dir2, "file?.x?z", expected7); // Scan dir2 and see if any file?.??c files are found - // THESE FAIL ON Mac and Windows, SO ARE COMMENTED OUT FOR NOW - // bool expected8[5] = { true, true, false, false, false }; - // scanTest(dir2, "file?.??c", expected8); - // scanTest(dir2, "*.??c", expected8); + bool expected8[5] = { true, true, false, false, false }; + scanTest(dir2, "file?.??c", expected8); + scanTest(dir2, "*.??c", expected8); // Scan dir1 and see if any *.?n? files are found bool expected9[5] = { false, false, false, false, true }; scanTest(dir1, "*.?n?", expected9); // Scan dir1 and see if any *.???? files are found - // THIS ONE FAILS ON WINDOWS (returns three charater suffixes) SO IS COMMENTED OUT FOR NOW - // bool expected10[5] = { false, false, false, false, false }; - // scanTest(dir1, "*.????", expected10); + bool expected10[5] = { false, false, false, false, false }; + scanTest(dir1, "*.????", expected10); // Scan dir1 and see if any ?????.* files are found bool expected11[5] = { true, true, true, true, true }; @@ -402,6 +401,15 @@ namespace tut bool expected12[5] = { false, false, true, true, false }; scanTest(dir1, "??l??.xyz", expected12); + bool expected13[5] = { true, false, true, false, false }; + scanTest(dir1, "file1.{abc,xyz}", expected13); + + bool expected14[5] = { true, true, false, false, false }; + scanTest(dir1, "file[0-9].abc", expected14); + + bool expected15[5] = { true, true, false, false, false }; + scanTest(dir1, "file[!a-z].abc", expected15); + // clean up all test files and directories for (int i=0; i<5; i++) { -- cgit v1.2.3 From e213a36f703629dcfe27ed65ac1f66a5a5194b67 Mon Sep 17 00:00:00 2001 From: Seth ProductEngine <slitovchuk@productengine.com> Date: Wed, 11 May 2011 18:12:23 +0300 Subject: STORM-477 Restored the backed out changeset: b62b260aa04d --- .../llui_libtest/llui_libtest.cpp | 5 +- indra/linux_updater/linux_updater.cpp | 15 ++++-- indra/llvfs/lldir.cpp | 6 ++- indra/llvfs/lldir.h | 25 --------- indra/llvfs/lldir_linux.cpp | 62 ---------------------- indra/llvfs/lldir_linux.h | 1 - indra/llvfs/lldir_mac.cpp | 61 --------------------- indra/llvfs/lldir_mac.h | 1 - indra/llvfs/lldir_solaris.cpp | 62 ---------------------- indra/llvfs/lldir_solaris.h | 1 - indra/llvfs/lldir_win32.cpp | 61 --------------------- indra/llvfs/lldir_win32.h | 3 -- indra/newview/llappviewer.cpp | 8 ++- indra/newview/llappviewerlinux.cpp | 5 +- indra/newview/llfloateruipreview.cpp | 26 ++++++--- indra/newview/lllogchat.cpp | 4 +- indra/newview/llviewermedia.cpp | 4 +- indra/newview/llwaterparammanager.cpp | 11 ++-- indra/newview/llwlparammanager.cpp | 11 ++-- .../updater/tests/llupdaterservice_test.cpp | 6 --- 20 files changed, 68 insertions(+), 310 deletions(-) diff --git a/indra/integration_tests/llui_libtest/llui_libtest.cpp b/indra/integration_tests/llui_libtest/llui_libtest.cpp index c34115ee80..217e26c3ca 100644 --- a/indra/integration_tests/llui_libtest/llui_libtest.cpp +++ b/indra/integration_tests/llui_libtest/llui_libtest.cpp @@ -33,6 +33,7 @@ // linden library includes #include "llcontrol.h" // LLControlGroup #include "lldir.h" +#include "lldiriterator.h" #include "llerrorcontrol.h" #include "llfloater.h" #include "llfontfreetype.h" @@ -174,7 +175,9 @@ void export_test_floaters() std::string delim = gDirUtilp->getDirDelimiter(); std::string xui_dir = get_xui_dir() + "en" + delim; std::string filename; - while (gDirUtilp->getNextFileInDir(xui_dir, "floater_test_*.xml", filename)) + + LLDirIterator iter(xui_dir, "floater_test_*.xml"); + while (iter.next(filename)) { if (filename.find("_new.xml") != std::string::npos) { diff --git a/indra/linux_updater/linux_updater.cpp b/indra/linux_updater/linux_updater.cpp index a81de0223c..eed00ac06e 100644 --- a/indra/linux_updater/linux_updater.cpp +++ b/indra/linux_updater/linux_updater.cpp @@ -33,6 +33,7 @@ #include "llerrorcontrol.h" #include "llfile.h" #include "lldir.h" +#include "lldiriterator.h" #include "llxmlnode.h" #include "lltrans.h" @@ -55,6 +56,8 @@ typedef struct _updater_app_state { std::string strings_dirs; std::string strings_file; + LLDirIterator *image_dir_iter; + GtkWidget *window; GtkWidget *progress_bar; GtkWidget *image; @@ -115,7 +118,7 @@ bool translate_init(std::string comma_delim_path_list, void updater_app_ui_init(void); void updater_app_quit(UpdaterAppState *app_state); void parse_args_and_init(int argc, char **argv, UpdaterAppState *app_state); -std::string next_image_filename(std::string& image_path); +std::string next_image_filename(std::string& image_path, LLDirIterator& iter); void display_error(GtkWidget *parent, std::string title, std::string message); BOOL install_package(std::string package_file, std::string destination); BOOL spawn_viewer(UpdaterAppState *app_state); @@ -181,7 +184,7 @@ void updater_app_ui_init(UpdaterAppState *app_state) // load the first image app_state->image = gtk_image_new_from_file - (next_image_filename(app_state->image_dir).c_str()); + (next_image_filename(app_state->image_dir, *app_state->image_dir_iter).c_str()); gtk_widget_set_size_request(app_state->image, 340, 310); gtk_container_add(GTK_CONTAINER(frame), app_state->image); @@ -212,7 +215,7 @@ gboolean rotate_image_cb(gpointer data) llassert(data != NULL); app_state = (UpdaterAppState *) data; - filename = next_image_filename(app_state->image_dir); + filename = next_image_filename(app_state->image_dir, *app_state->image_dir_iter); gdk_threads_enter(); gtk_image_set_from_file(GTK_IMAGE(app_state->image), filename.c_str()); @@ -221,10 +224,10 @@ gboolean rotate_image_cb(gpointer data) return TRUE; } -std::string next_image_filename(std::string& image_path) +std::string next_image_filename(std::string& image_path, LLDirIterator& iter) { std::string image_filename; - gDirUtilp->getNextFileInDir(image_path, "/*.jpg", image_filename); + iter.next(image_filename); return image_path + "/" + image_filename; } @@ -748,6 +751,7 @@ void parse_args_and_init(int argc, char **argv, UpdaterAppState *app_state) else if ((!strcmp(argv[i], "--image-dir")) && (++i < argc)) { app_state->image_dir = argv[i]; + app_state->image_dir_iter = new LLDirIterator(argv[i], "/*.jpg"); } else if ((!strcmp(argv[i], "--dest")) && (++i < argc)) { @@ -832,6 +836,7 @@ int main(int argc, char **argv) } bool success = !app_state->failure; + delete app_state->image_dir_iter; delete app_state; return success ? 0 : 1; } diff --git a/indra/llvfs/lldir.cpp b/indra/llvfs/lldir.cpp index 341c96f6ea..f3ac17d612 100644 --- a/indra/llvfs/lldir.cpp +++ b/indra/llvfs/lldir.cpp @@ -40,6 +40,8 @@ #include "lltimer.h" // ms_sleep() #include "lluuid.h" +#include "lldiriterator.h" + #if LL_WINDOWS #include "lldir_win32.h" LLDir_Win32 gDirUtil; @@ -83,7 +85,9 @@ S32 LLDir::deleteFilesInDir(const std::string &dirname, const std::string &mask) std::string filename; std::string fullpath; S32 result; - while (getNextFileInDir(dirname, mask, filename)) + + LLDirIterator iter(dirname, mask); + while (iter.next(filename)) { fullpath = dirname; fullpath += getDirDelimiter(); diff --git a/indra/llvfs/lldir.h b/indra/llvfs/lldir.h index 42996fd051..5ee8bdb542 100644 --- a/indra/llvfs/lldir.h +++ b/indra/llvfs/lldir.h @@ -75,31 +75,6 @@ class LLDir // pure virtual functions virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask) = 0; - /// Walk the files in a directory, with file pattern matching - virtual BOOL getNextFileInDir(const std::string& dirname, ///< directory path - must end in trailing slash! - const std::string& mask, ///< file pattern string (use "*" for all) - std::string& fname ///< output: found file name - ) = 0; - /**< - * @returns true if a file was found, false if the entire directory has been scanned. - * - * @note that this function is NOT thread safe - * - * This function may not be used to scan part of a directory, then start a new search of a different - * directory, and then restart the first search where it left off; the entire search must run to - * completion or be abandoned - there is no restart. - * - * @bug: See http://jira.secondlife.com/browse/VWR-23697 - * and/or the tests in test/lldir_test.cpp - * This is known to fail with patterns that have both: - * a wildcard left of a . and more than one sequential ? right of a . - * the pattern foo.??x appears to work - * but *.??x or foo?.??x do not - * - * @todo this really should be rewritten as an iterator object, and the - * filtering should be done in a platform-independent way. - */ - virtual std::string getCurPath() = 0; virtual BOOL fileExists(const std::string &filename) const = 0; diff --git a/indra/llvfs/lldir_linux.cpp b/indra/llvfs/lldir_linux.cpp index 72b54f5380..407f3b93fb 100644 --- a/indra/llvfs/lldir_linux.cpp +++ b/indra/llvfs/lldir_linux.cpp @@ -242,68 +242,6 @@ U32 LLDir_Linux::countFilesInDir(const std::string &dirname, const std::string & return (file_count); } -// get the next file in the directory -BOOL LLDir_Linux::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) -{ - glob_t g; - BOOL result = FALSE; - fname = ""; - - if(!(dirname == mCurrentDir)) - { - // different dir specified, close old search - mCurrentDirIndex = -1; - mCurrentDirCount = -1; - mCurrentDir = dirname; - } - - std::string tmp_str; - tmp_str = dirname; - tmp_str += mask; - - if(glob(tmp_str.c_str(), GLOB_NOSORT, NULL, &g) == 0) - { - if(g.gl_pathc > 0) - { - if((int)g.gl_pathc != mCurrentDirCount) - { - // Number of matches has changed since the last search, meaning a file has been added or deleted. - // Reset the index. - mCurrentDirIndex = -1; - mCurrentDirCount = g.gl_pathc; - } - - mCurrentDirIndex++; - - if(mCurrentDirIndex < (int)g.gl_pathc) - { -// llinfos << "getNextFileInDir: returning number " << mCurrentDirIndex << ", path is " << g.gl_pathv[mCurrentDirIndex] << llendl; - - // The API wants just the filename, not the full path. - //fname = g.gl_pathv[mCurrentDirIndex]; - - char *s = strrchr(g.gl_pathv[mCurrentDirIndex], '/'); - - if(s == NULL) - s = g.gl_pathv[mCurrentDirIndex]; - else if(s[0] == '/') - s++; - - fname = s; - - result = TRUE; - } - } - - globfree(&g); - } - - return(result); -} - - - - std::string LLDir_Linux::getCurPath() { char tmp_str[LL_MAX_PATH]; /* Flawfinder: ignore */ diff --git a/indra/llvfs/lldir_linux.h b/indra/llvfs/lldir_linux.h index a34de1241d..7603239867 100644 --- a/indra/llvfs/lldir_linux.h +++ b/indra/llvfs/lldir_linux.h @@ -47,7 +47,6 @@ public: virtual std::string getCurPath(); virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask); - virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname); /*virtual*/ BOOL fileExists(const std::string &filename) const; /*virtual*/ std::string getLLPluginLauncher(); diff --git a/indra/llvfs/lldir_mac.cpp b/indra/llvfs/lldir_mac.cpp index f9369b043e..8f48f92e2a 100644 --- a/indra/llvfs/lldir_mac.cpp +++ b/indra/llvfs/lldir_mac.cpp @@ -258,67 +258,6 @@ U32 LLDir_Mac::countFilesInDir(const std::string &dirname, const std::string &ma return (file_count); } -// get the next file in the directory -BOOL LLDir_Mac::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) -{ - glob_t g; - BOOL result = FALSE; - fname = ""; - - if(!(dirname == mCurrentDir)) - { - // different dir specified, close old search - mCurrentDirIndex = -1; - mCurrentDirCount = -1; - mCurrentDir = dirname; - } - - std::string tmp_str; - tmp_str = dirname; - tmp_str += mask; - - if(glob(tmp_str.c_str(), GLOB_NOSORT, NULL, &g) == 0) - { - if(g.gl_pathc > 0) - { - if(g.gl_pathc != mCurrentDirCount) - { - // Number of matches has changed since the last search, meaning a file has been added or deleted. - // Reset the index. - mCurrentDirIndex = -1; - mCurrentDirCount = g.gl_pathc; - } - - mCurrentDirIndex++; - - if(mCurrentDirIndex < g.gl_pathc) - { -// llinfos << "getNextFileInDir: returning number " << mCurrentDirIndex << ", path is " << g.gl_pathv[mCurrentDirIndex] << llendl; - - // The API wants just the filename, not the full path. - //fname = g.gl_pathv[mCurrentDirIndex]; - - char *s = strrchr(g.gl_pathv[mCurrentDirIndex], '/'); - - if(s == NULL) - s = g.gl_pathv[mCurrentDirIndex]; - else if(s[0] == '/') - s++; - - fname = s; - - result = TRUE; - } - } - - globfree(&g); - } - - return(result); -} - - - S32 LLDir_Mac::deleteFilesInDir(const std::string &dirname, const std::string &mask) { glob_t g; diff --git a/indra/llvfs/lldir_mac.h b/indra/llvfs/lldir_mac.h index b456d3afca..bc3f0fac00 100644 --- a/indra/llvfs/lldir_mac.h +++ b/indra/llvfs/lldir_mac.h @@ -47,7 +47,6 @@ public: virtual S32 deleteFilesInDir(const std::string &dirname, const std::string &mask); virtual std::string getCurPath(); virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask); - virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname); virtual BOOL fileExists(const std::string &filename) const; /*virtual*/ std::string getLLPluginLauncher(); diff --git a/indra/llvfs/lldir_solaris.cpp b/indra/llvfs/lldir_solaris.cpp index 515fd66b6e..21f8c3acdb 100644 --- a/indra/llvfs/lldir_solaris.cpp +++ b/indra/llvfs/lldir_solaris.cpp @@ -260,68 +260,6 @@ U32 LLDir_Solaris::countFilesInDir(const std::string &dirname, const std::string return (file_count); } -// get the next file in the directory -BOOL LLDir_Solaris::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) -{ - glob_t g; - BOOL result = FALSE; - fname = ""; - - if(!(dirname == mCurrentDir)) - { - // different dir specified, close old search - mCurrentDirIndex = -1; - mCurrentDirCount = -1; - mCurrentDir = dirname; - } - - std::string tmp_str; - tmp_str = dirname; - tmp_str += mask; - - if(glob(tmp_str.c_str(), GLOB_NOSORT, NULL, &g) == 0) - { - if(g.gl_pathc > 0) - { - if((int)g.gl_pathc != mCurrentDirCount) - { - // Number of matches has changed since the last search, meaning a file has been added or deleted. - // Reset the index. - mCurrentDirIndex = -1; - mCurrentDirCount = g.gl_pathc; - } - - mCurrentDirIndex++; - - if(mCurrentDirIndex < (int)g.gl_pathc) - { -// llinfos << "getNextFileInDir: returning number " << mCurrentDirIndex << ", path is " << g.gl_pathv[mCurrentDirIndex] << llendl; - - // The API wants just the filename, not the full path. - //fname = g.gl_pathv[mCurrentDirIndex]; - - char *s = strrchr(g.gl_pathv[mCurrentDirIndex], '/'); - - if(s == NULL) - s = g.gl_pathv[mCurrentDirIndex]; - else if(s[0] == '/') - s++; - - fname = s; - - result = TRUE; - } - } - - globfree(&g); - } - - return(result); -} - - - - std::string LLDir_Solaris::getCurPath() { char tmp_str[LL_MAX_PATH]; /* Flawfinder: ignore */ diff --git a/indra/llvfs/lldir_solaris.h b/indra/llvfs/lldir_solaris.h index 70fac6f818..0b58a45b15 100644 --- a/indra/llvfs/lldir_solaris.h +++ b/indra/llvfs/lldir_solaris.h @@ -47,7 +47,6 @@ public: virtual std::string getCurPath(); virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask); - virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname); /*virtual*/ BOOL fileExists(const std::string &filename) const; private: diff --git a/indra/llvfs/lldir_win32.cpp b/indra/llvfs/lldir_win32.cpp index 4e2a55f4b3..7709945123 100644 --- a/indra/llvfs/lldir_win32.cpp +++ b/indra/llvfs/lldir_win32.cpp @@ -240,67 +240,6 @@ U32 LLDir_Win32::countFilesInDir(const std::string &dirname, const std::string & return (file_count); } - -// get the next file in the directory -BOOL LLDir_Win32::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) -{ - BOOL fileFound = FALSE; - fname = ""; - - WIN32_FIND_DATAW FileData; - llutf16string pathname = utf8str_to_utf16str(dirname) + utf8str_to_utf16str(mask); - - if (pathname != mCurrentDir) - { - // different dir specified, close old search - if (!mCurrentDir.empty()) - { - FindClose(mDirSearch_h); - } - mCurrentDir = pathname; - - // and open new one - // Check error opening Directory structure - if ((mDirSearch_h = FindFirstFile(pathname.c_str(), &FileData)) != INVALID_HANDLE_VALUE) - { - fileFound = TRUE; - } - } - - // Loop to skip over the current (.) and parent (..) directory entries - // (apparently returned in Win7 but not XP) - do - { - if ( fileFound - && ( (lstrcmp(FileData.cFileName, (LPCTSTR)TEXT(".")) == 0) - ||(lstrcmp(FileData.cFileName, (LPCTSTR)TEXT("..")) == 0) - ) - ) - { - fileFound = FALSE; - } - } while ( mDirSearch_h != INVALID_HANDLE_VALUE - && !fileFound - && (fileFound = FindNextFile(mDirSearch_h, &FileData) - ) - ); - - if (!fileFound && GetLastError() == ERROR_NO_MORE_FILES) - { - // No more files, so reset to beginning of directory - FindClose(mDirSearch_h); - mCurrentDir[0] = '\000'; - } - - if (fileFound) - { - // convert from TCHAR to char - fname = utf16str_to_utf8str(FileData.cFileName); - } - - return fileFound; -} - std::string LLDir_Win32::getCurPath() { WCHAR w_str[MAX_PATH]; diff --git a/indra/llvfs/lldir_win32.h b/indra/llvfs/lldir_win32.h index b170ebbcd7..62fb4713ab 100644 --- a/indra/llvfs/lldir_win32.h +++ b/indra/llvfs/lldir_win32.h @@ -44,15 +44,12 @@ public: /*virtual*/ std::string getCurPath(); /*virtual*/ U32 countFilesInDir(const std::string &dirname, const std::string &mask); - /*virtual*/ BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname); /*virtual*/ BOOL fileExists(const std::string &filename) const; /*virtual*/ std::string getLLPluginLauncher(); /*virtual*/ std::string getLLPluginFilename(std::string base_name); private: - BOOL getNextFileInDir(const llutf16string &dirname, const std::string &mask, std::string &fname); - void* mDirSearch_h; llutf16string mCurrentDir; }; diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 9de2941c4a..5033094835 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -89,6 +89,7 @@ // Linden library includes #include "llavatarnamecache.h" +#include "lldiriterator.h" #include "llimagej2c.h" #include "llmemory.h" #include "llprimitive.h" @@ -3432,7 +3433,9 @@ void LLAppViewer::migrateCacheDirectory() S32 file_count = 0; std::string file_name; std::string mask = delimiter + "*.*"; - while (gDirUtilp->getNextFileInDir(old_cache_dir, mask, file_name)) + + LLDirIterator iter(old_cache_dir, mask); + while (iter.next(file_name)) { if (file_name == "." || file_name == "..") continue; std::string source_path = old_cache_dir + delimiter + file_name; @@ -3653,7 +3656,8 @@ bool LLAppViewer::initCache() dir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,""); std::string found_file; - if (gDirUtilp->getNextFileInDir(dir, mask, found_file)) + LLDirIterator iter(dir, mask); + if (iter.next(found_file)) { old_vfs_data_file = dir + gDirUtilp->getDirDelimiter() + found_file; diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp index 523c2e3adf..714e0e6163 100644 --- a/indra/newview/llappviewerlinux.cpp +++ b/indra/newview/llappviewerlinux.cpp @@ -30,6 +30,7 @@ #include "llcommandlineparser.h" +#include "lldiriterator.h" #include "llmemtype.h" #include "llurldispatcher.h" // SLURL from other app instance #include "llviewernetwork.h" @@ -504,7 +505,9 @@ std::string LLAppViewerLinux::generateSerialNumber() // trawl /dev/disk/by-uuid looking for a good-looking UUID to grab std::string this_name; - while (gDirUtilp->getNextFileInDir(uuiddir, "*", this_name)) + + LLDirIterator iter(uuiddir, "*"); + while (iter.next(this_name)) { if (this_name.length() > best.length() || (this_name.length() == best.length() && diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp index 0d8601410a..4c9c4cb154 100644 --- a/indra/newview/llfloateruipreview.cpp +++ b/indra/newview/llfloateruipreview.cpp @@ -35,6 +35,7 @@ #include "llfloateruipreview.h" // Own header // Internal utility +#include "lldiriterator.h" #include "lleventtimer.h" #include "llexternaleditor.h" #include "llrender.h" @@ -481,9 +482,11 @@ BOOL LLFloaterUIPreview::postBuild() std::string language_directory; std::string xui_dir = get_xui_dir(); // directory containing localizations -- don't forget trailing delim mLanguageSelection->removeall(); // clear out anything temporarily in list from XML + + LLDirIterator iter(xui_dir, "*"); while(found) // for every directory { - if((found = gDirUtilp->getNextFileInDir(xui_dir, "*", language_directory))) // get next directory + if((found = iter.next(language_directory))) // get next directory { std::string full_path = xui_dir + language_directory; if(LLFile::isfile(full_path.c_str())) // if it's not a directory, skip it @@ -635,42 +638,51 @@ void LLFloaterUIPreview::refreshList() mFileList->clearRows(); // empty list std::string name; BOOL found = TRUE; + + LLDirIterator floater_iter(getLocalizedDirectory(), "floater_*.xml"); while(found) // for every floater file that matches the pattern { - if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "floater_*.xml", name))) // get next file matching pattern + if((found = floater_iter.next(name))) // get next file matching pattern { addFloaterEntry(name.c_str()); // and add it to the list (file name only; localization code takes care of rest of path) } } found = TRUE; + + LLDirIterator inspect_iter(getLocalizedDirectory(), "inspect_*.xml"); while(found) // for every inspector file that matches the pattern { - if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "inspect_*.xml", name))) // get next file matching pattern + if((found = inspect_iter.next(name))) // get next file matching pattern { addFloaterEntry(name.c_str()); // and add it to the list (file name only; localization code takes care of rest of path) } } found = TRUE; + + LLDirIterator menu_iter(getLocalizedDirectory(), "menu_*.xml"); while(found) // for every menu file that matches the pattern { - if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "menu_*.xml", name))) // get next file matching pattern + if((found = menu_iter.next(name))) // get next file matching pattern { addFloaterEntry(name.c_str()); // and add it to the list (file name only; localization code takes care of rest of path) } } found = TRUE; + + LLDirIterator panel_iter(getLocalizedDirectory(), "panel_*.xml"); while(found) // for every panel file that matches the pattern { - if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "panel_*.xml", name))) // get next file matching pattern + if((found = panel_iter.next(name))) // get next file matching pattern { addFloaterEntry(name.c_str()); // and add it to the list (file name only; localization code takes care of rest of path) } } - found = TRUE; + + LLDirIterator sidepanel_iter(getLocalizedDirectory(), "sidepanel_*.xml"); while(found) // for every sidepanel file that matches the pattern { - if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "sidepanel_*.xml", name))) // get next file matching pattern + if((found = sidepanel_iter.next(name))) // get next file matching pattern { addFloaterEntry(name.c_str()); // and add it to the list (file name only; localization code takes care of rest of path) } diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp index 2df683861a..efc4e23838 100644 --- a/indra/newview/lllogchat.cpp +++ b/indra/newview/lllogchat.cpp @@ -32,6 +32,7 @@ #include "lltrans.h" #include "llviewercontrol.h" +#include "lldiriterator.h" #include "llinstantmessage.h" #include "llsingleton.h" // for LLSingleton @@ -602,7 +603,8 @@ std::string LLLogChat::oldLogFileName(std::string filename) //LL_INFOS("") << "Checking:" << directory << " for " << pattern << LL_ENDL;/* uncomment if you want to verify step, delete on commit */ std::vector<std::string> allfiles; - while (gDirUtilp->getNextFileInDir(directory, pattern, scanResult)) + LLDirIterator iter(directory, pattern); + while (iter.next(scanResult)) { //LL_INFOS("") << "Found :" << scanResult << LL_ENDL; allfiles.push_back(scanResult); diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 037e22584f..bc326540e6 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -54,6 +54,7 @@ #include "llfilepicker.h" #include "llnotifications.h" #include "lldir.h" +#include "lldiriterator.h" #include "llevent.h" // LLSimpleListener #include "llnotificationsutil.h" #include "lluuid.h" @@ -1154,7 +1155,8 @@ void LLViewerMedia::clearAllCookies() } // the hard part: iterate over all user directories and delete the cookie file from each one - while(gDirUtilp->getNextFileInDir(base_dir, "*_*", filename)) + LLDirIterator dir_iter(base_dir, "*_*"); + while (dir_iter.next(filename)) { target = base_dir; target += filename; diff --git a/indra/newview/llwaterparammanager.cpp b/indra/newview/llwaterparammanager.cpp index 4b3a9a4dc3..67bb965f99 100644 --- a/indra/newview/llwaterparammanager.cpp +++ b/indra/newview/llwaterparammanager.cpp @@ -33,6 +33,7 @@ #include "pipeline.h" #include "llsky.h" +#include "lldiriterator.h" #include "llfloaterreg.h" #include "llsliderctrl.h" #include "llspinctrl.h" @@ -87,11 +88,12 @@ void LLWaterParamManager::loadAllPresets(const std::string& file_name) std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/water", "")); LL_DEBUGS2("AppInit", "Shaders") << "Loading Default water settings from " << path_name << LL_ENDL; - bool found = true; + bool found = true; + LLDirIterator app_settings_iter(path_name, "*.xml"); while(found) { std::string name; - found = gDirUtilp->getNextFileInDir(path_name, "*.xml", name); + found = app_settings_iter.next(name); if(found) { @@ -113,11 +115,12 @@ void LLWaterParamManager::loadAllPresets(const std::string& file_name) std::string path_name2(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/water", "")); LL_DEBUGS2("AppInit", "Shaders") << "Loading User water settings from " << path_name2 << LL_ENDL; - found = true; + found = true; + LLDirIterator user_settings_iter(path_name2, "*.xml"); while(found) { std::string name; - found = gDirUtilp->getNextFileInDir(path_name2, "*.xml", name); + found = user_settings_iter.next(name); if(found) { name=name.erase(name.length()-4); diff --git a/indra/newview/llwlparammanager.cpp b/indra/newview/llwlparammanager.cpp index e5f52dfc97..848efcbb49 100644 --- a/indra/newview/llwlparammanager.cpp +++ b/indra/newview/llwlparammanager.cpp @@ -31,6 +31,7 @@ #include "pipeline.h" #include "llsky.h" +#include "lldiriterator.h" #include "llfloaterreg.h" #include "llsliderctrl.h" #include "llspinctrl.h" @@ -100,11 +101,12 @@ void LLWLParamManager::loadPresets(const std::string& file_name) std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/skies", "")); LL_DEBUGS2("AppInit", "Shaders") << "Loading Default WindLight settings from " << path_name << LL_ENDL; - bool found = true; + bool found = true; + LLDirIterator app_settings_iter(path_name, "*.xml"); while(found) { std::string name; - found = gDirUtilp->getNextFileInDir(path_name, "*.xml", name); + found = app_settings_iter.next(name); if(found) { @@ -126,11 +128,12 @@ void LLWLParamManager::loadPresets(const std::string& file_name) std::string path_name2(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/skies", "")); LL_DEBUGS2("AppInit", "Shaders") << "Loading User WindLight settings from " << path_name2 << LL_ENDL; - found = true; + found = true; + LLDirIterator user_settings_iter(path_name2, "*.xml"); while(found) { std::string name; - found = gDirUtilp->getNextFileInDir(path_name2, "*.xml", name); + found = user_settings_iter.next(name); if(found) { name=name.erase(name.length()-4); diff --git a/indra/viewer_components/updater/tests/llupdaterservice_test.cpp b/indra/viewer_components/updater/tests/llupdaterservice_test.cpp index 88ab5a2284..e19d5724f1 100644 --- a/indra/viewer_components/updater/tests/llupdaterservice_test.cpp +++ b/indra/viewer_components/updater/tests/llupdaterservice_test.cpp @@ -59,12 +59,6 @@ class LLDir_Mock : public LLDir return 0; } - BOOL getNextFileInDir(const std::string &dirname, - const std::string &mask, - std::string &fname) - { - return false; - } void getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) {} -- cgit v1.2.3 From fa77ab85f152b6b8501cbee960839512a22c3bda Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" <vir@lindenlab.com> Date: Wed, 11 May 2011 15:45:29 -0400 Subject: disable debugging stuff by default --- indra/newview/llmeshrepository.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index c2c373d07f..54f699e396 100755 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -1470,8 +1470,9 @@ LLSD LLMeshUploadThread::wholeModelToLLSD(bool include_textures) } result["asset_resources"] = res; - +#if 0 dumpLLSDToFile(result,std::string("whole_model.xml")); +#endif return result; } -- cgit v1.2.3 From 8e8e846542877d93c89fd29da53ee7515e7f7dde Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Wed, 11 May 2011 14:46:35 -0500 Subject: SH-1533 Fix for skybox going black under certain conditions. --- indra/newview/lldrawpoolsky.cpp | 7 +++++-- indra/newview/llvosky.cpp | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/indra/newview/lldrawpoolsky.cpp b/indra/newview/lldrawpoolsky.cpp index 6b45c5abb0..030d6e1110 100644 --- a/indra/newview/lldrawpoolsky.cpp +++ b/indra/newview/lldrawpoolsky.cpp @@ -63,6 +63,8 @@ void LLDrawPoolSky::prerender() void LLDrawPoolSky::render(S32 pass) { + gGL.flush(); + if (mDrawFace.empty()) { return; @@ -111,13 +113,14 @@ void LLDrawPoolSky::render(S32 pass) S32 face_count = (S32)mDrawFace.size(); + LLVertexBuffer::unbind(); + glColor4f(1,1,1,1); + for (S32 i = 0; i < llmin(6, face_count); ++i) { renderSkyCubeFace(i); } - LLGLEnable blend(GL_BLEND); - glPopMatrix(); } diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp index 288d335e1d..6396bc042d 100644 --- a/indra/newview/llvosky.cpp +++ b/indra/newview/llvosky.cpp @@ -304,7 +304,7 @@ void LLSkyTex::createGLImage(S32 which) void LLSkyTex::bindTexture(BOOL curr) { - gGL.getTexUnit(0)->bind(mTexture[getWhich(curr)]); + gGL.getTexUnit(0)->bind(mTexture[getWhich(curr)], true); } /*************************************** -- cgit v1.2.3 From 9dbc3301f677316be3266caa792517f235438e81 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Wed, 11 May 2011 13:14:48 -0700 Subject: EXP-809 FIX Make Script Warning/Error window scrolling behavior match that of Chat history --- indra/newview/skins/default/xui/en/floater_script_debug_panel.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml index d1db5c17ba..ce96ea232e 100644 --- a/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml +++ b/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml @@ -20,5 +20,6 @@ parse_highlights="true" read_only="true" width="420" + track_bottom="true" word_wrap="true" /> </floater> -- cgit v1.2.3 From 56ba23d2310b748f4b75fc1f77f57805adf511a9 Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Wed, 11 May 2011 17:32:39 -0500 Subject: Use SSE for decoding texture coordinates. --- indra/llmath/llvolume.cpp | 131 ++++++++++++++++++++++++++++------------------ 1 file changed, 79 insertions(+), 52 deletions(-) diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index 70e1e1f312..3e651cc02a 100644 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -51,6 +51,7 @@ #include "llsdserialize.h" #include "llvector4a.h" #include "llmatrix4a.h" +#include "lltimer.h" #define DEBUG_SILHOUETTE_BINORMALS 0 #define DEBUG_SILHOUETTE_NORMALS 0 // TomY: Use this to display normals using the silhouette @@ -2183,7 +2184,8 @@ bool LLVolume::unpackVolumeFaces(std::istream& is, S32 size) } U16* indices = (U16*) &(idx[0]); - for (U32 j = 0; j < idx.size()/2; ++j) + U32 count = idx.size()/2; + for (U32 j = 0; j < count; ++j) { face.mIndices[j] = indices[j]; } @@ -2192,6 +2194,81 @@ bool LLVolume::unpackVolumeFaces(std::istream& is, S32 size) U32 num_verts = pos.size()/(3*2); face.resizeVertices(num_verts); + LLVector3 minp; + LLVector3 maxp; + LLVector2 min_tc; + LLVector2 max_tc; + + minp.setValue(mdl[i]["PositionDomain"]["Min"]); + maxp.setValue(mdl[i]["PositionDomain"]["Max"]); + LLVector4a min_pos, max_pos; + min_pos.load3(minp.mV); + max_pos.load3(maxp.mV); + + min_tc.setValue(mdl[i]["TexCoord0Domain"]["Min"]); + max_tc.setValue(mdl[i]["TexCoord0Domain"]["Max"]); + + LLVector4a pos_range; + pos_range.setSub(max_pos, min_pos); + LLVector2 tc_range2 = max_tc - min_tc; + LLVector4a tc_range; + tc_range.set(tc_range2[0], tc_range2[1], tc_range2[0], tc_range2[1]); + LLVector4a min_tc4(min_tc[0], min_tc[1], min_tc[0], min_tc[1]); + + LLVector4a* pos_out = face.mPositions; + LLVector4a* norm_out = face.mNormals; + LLVector4a* tc_out = (LLVector4a*) face.mTexCoords; + + { + U16* v = (U16*) &(pos[0]); + for (U32 j = 0; j < num_verts; ++j) + { + pos_out->set((F32) v[0], (F32) v[1], (F32) v[2]); + pos_out->div(65535.f); + pos_out->mul(pos_range); + pos_out->add(min_pos); + pos_out++; + v += 3; + } + + } + + { + U16* n = (U16*) &(norm[0]); + for (U32 j = 0; j < num_verts; ++j) + { + norm_out->set((F32) n[0], (F32) n[1], (F32) n[2]); + norm_out->div(65535.f); + norm_out->mul(2.f); + norm_out->sub(1.f); + norm_out++; + n += 3; + } + } + + { + U16* t = (U16*) &(tc[0]); + for (U32 j = 0; j < num_verts; j+=2) + { + if (j < num_verts-1) + { + tc_out->set((F32) t[0], (F32) t[1], (F32) t[2], (F32) t[3]); + } + else + { + tc_out->set((F32) t[0], (F32) t[1], 0.f, 0.f); + } + + t += 4; + + tc_out->div(65535.f); + tc_out->mul(tc_range); + tc_out->add(min_tc4); + + tc_out++; + } + } + if (mdl[i].has("Weights")) { face.allocateWeights(num_verts); @@ -2239,56 +2316,6 @@ bool LLVolume::unpackVolumeFaces(std::istream& is, S32 size) } - LLVector3 minp; - LLVector3 maxp; - LLVector2 min_tc; - LLVector2 max_tc; - - minp.setValue(mdl[i]["PositionDomain"]["Min"]); - maxp.setValue(mdl[i]["PositionDomain"]["Max"]); - LLVector4a min_pos, max_pos; - min_pos.load3(minp.mV); - max_pos.load3(maxp.mV); - - min_tc.setValue(mdl[i]["TexCoord0Domain"]["Min"]); - max_tc.setValue(mdl[i]["TexCoord0Domain"]["Max"]); - - LLVector4a pos_range; - pos_range.setSub(max_pos, min_pos); - LLVector2 tc_range = max_tc - min_tc; - - LLVector4a* pos_out = face.mPositions; - LLVector4a* norm_out = face.mNormals; - LLVector2* tc_out = face.mTexCoords; - - for (U32 j = 0; j < num_verts; ++j) - { - U16* v = (U16*) &(pos[j*3*2]); - - pos_out->set((F32) v[0], (F32) v[1], (F32) v[2]); - pos_out->div(65535.f); - pos_out->mul(pos_range); - pos_out->add(min_pos); - - pos_out++; - - U16* n = (U16*) &(norm[j*3*2]); - - norm_out->set((F32) n[0], (F32) n[1], (F32) n[2]); - norm_out->div(65535.f); - norm_out->mul(2.f); - norm_out->sub(1.f); - norm_out++; - - U16* t = (U16*) &(tc[j*2*2]); - - tc_out->mV[0] = (F32) t[0] / 65535.f * tc_range.mV[0] + min_tc.mV[0]; - tc_out->mV[1] = (F32) t[1] / 65535.f * tc_range.mV[1] + min_tc.mV[1]; - - tc_out++; - } - - // modifier flags? bool do_mirror = (mParams.getSculptType() & LL_SCULPT_FLAG_MIRROR); bool do_invert = (mParams.getSculptType() &LL_SCULPT_FLAG_INVERT); @@ -2361,7 +2388,7 @@ bool LLVolume::unpackVolumeFaces(std::istream& is, S32 size) } } } - + mSculptLevel = 0; // success! cacheOptimize(); -- cgit v1.2.3 From a0267151c3f4bfcf04dd02b81eb8450fc86c7791 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Wed, 11 May 2011 16:43:42 -0700 Subject: EXP-813 FIX Login screen reloads when clicking on location slapp --- indra/newview/llpanellogin.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 4ac3a248d3..27f341b4f6 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -769,7 +769,10 @@ void LLPanelLogin::loadLoginPage() gViewerWindow->setMenuBackgroundColor(false, !LLGridManager::getInstance()->isInProductionGrid()); LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html"); - web_browser->navigateTo( oStr.str(), "text/html" ); + if (web_browser->getCurrentNavUrl() != oStr.str()) + { + web_browser->navigateTo( oStr.str(), "text/html" ); + } } void LLPanelLogin::handleMediaEvent(LLPluginClassMedia* /*self*/, EMediaEvent event) -- cgit v1.2.3 From 6fcf9e4817a5c245f7779dd030b0ba75dab10e5e Mon Sep 17 00:00:00 2001 From: Oz Linden <oz@lindenlab.com> Date: Wed, 11 May 2011 20:08:25 -0400 Subject: add missed contribution credit for Ima Mechanique --- doc/contributions.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/contributions.txt b/doc/contributions.txt index 7e9960e594..e7537b608b 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -364,6 +364,7 @@ Ian Kas CT-322 CT-325 Ima Mechanique + OPEN-50 OPEN-61 Irene Muni CT-324 -- cgit v1.2.3 From c83eff097e673e8a640fbc0a32cd6f0b34b4a8cf Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Wed, 11 May 2011 17:46:51 -0700 Subject: EXP-760 Selecting No Device for output and input in Sound Devices in Basic mode still results in voice having input and output - also 2 default options --- indra/newview/llpanelvoicedevicesettings.cpp | 36 ++-------------------- .../skins/default/xui/en/panel_sound_devices.xml | 8 ----- 2 files changed, 2 insertions(+), 42 deletions(-) diff --git a/indra/newview/llpanelvoicedevicesettings.cpp b/indra/newview/llpanelvoicedevicesettings.cpp index 71bb4a5584..dc87bd0077 100644 --- a/indra/newview/llpanelvoicedevicesettings.cpp +++ b/indra/newview/llpanelvoicedevicesettings.cpp @@ -221,23 +221,7 @@ void LLPanelVoiceDeviceSettings::refresh() iter != LLVoiceClient::getInstance()->getCaptureDevices().end(); iter++) { - // Lets try to localize some system device names. EXT-8375 - std::string device_name = *iter; - LLStringUtil::toLower(device_name); //compare in low case - if ("default system device" == device_name) - { - device_name = getString(device_name); - } - else if ("no device" == device_name) - { - device_name = getString(device_name); - } - else - { - // restore original value - device_name = *iter; - } - mCtrlInputDevices->add(device_name, ADD_BOTTOM ); + mCtrlInputDevices->add( *iter, ADD_BOTTOM ); } if(!mCtrlInputDevices->setSimple(mInputDevice)) @@ -254,23 +238,7 @@ void LLPanelVoiceDeviceSettings::refresh() for(iter= LLVoiceClient::getInstance()->getRenderDevices().begin(); iter != LLVoiceClient::getInstance()->getRenderDevices().end(); iter++) { - // Lets try to localize some system device names. EXT-8375 - std::string device_name = *iter; - LLStringUtil::toLower(device_name); //compare in low case - if ("default system device" == device_name) - { - device_name = getString(device_name); - } - else if ("no device" == device_name) - { - device_name = getString(device_name); - } - else - { - // restore original value - device_name = *iter; - } - mCtrlOutputDevices->add(device_name, ADD_BOTTOM ); + mCtrlOutputDevices->add( *iter, ADD_BOTTOM ); } if(!mCtrlOutputDevices->setSimple(mOutputDevice)) diff --git a/indra/newview/skins/default/xui/en/panel_sound_devices.xml b/indra/newview/skins/default/xui/en/panel_sound_devices.xml index 9812281323..ccae7c5350 100644 --- a/indra/newview/skins/default/xui/en/panel_sound_devices.xml +++ b/indra/newview/skins/default/xui/en/panel_sound_devices.xml @@ -11,14 +11,6 @@ name="default_text"> Default </panel.string> - <panel.string - name="default system device"> - Default system device - </panel.string> - <panel.string - name="no device"> - No device - </panel.string> <icon height="18" image_name="Microphone_On" -- cgit v1.2.3 From 9364f995b5815373637c401cb4fa49d7ead7d09a Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Wed, 11 May 2011 17:52:05 -0700 Subject: EXP-783 User can accept a call and see end call option in IM window but they are in nearby voice --- indra/newview/llvoicechannel.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp index a71539266d..b921b7a481 100644 --- a/indra/newview/llvoicechannel.cpp +++ b/indra/newview/llvoicechannel.cpp @@ -412,6 +412,7 @@ void LLVoiceChannel::doSetState(const EState& new_state) { EState old_state = mState; mState = new_state; + if (!mStateChangedCallback.empty()) mStateChangedCallback(old_state, mState, mCallDirection, mCallEndedByAgent); } @@ -846,8 +847,11 @@ void LLVoiceChannelP2P::activate() // otherwise answering the call else { - LLVoiceClient::getInstance()->answerInvite(mSessionHandle); - + if (!LLVoiceClient::getInstance()->answerInvite(mSessionHandle)) + { + handleError(ERROR_UNKNOWN); + return; + } // using the session handle invalidates it. Clear it out here so we can't reuse it by accident. mSessionHandle.clear(); } -- cgit v1.2.3 From 7cad431c6e4ea920a998ac1d3cdf385722fe5f7b Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" <vir@lindenlab.com> Date: Thu, 12 May 2011 10:17:08 -0400 Subject: small API change --- indra/newview/llmeshrepository.cpp | 11 ++++++----- indra/newview/llmeshrepository.h | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 9f302f9e57..3163f4f186 100755 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -1368,7 +1368,7 @@ void dumpLLSDToFile(LLSD& content, std::string& filename) LLSDSerialize::toPrettyXML(content,of); } -LLSD LLMeshUploadThread::wholeModelToLLSD(bool include_textures) +void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures) { // TODO where do textures go? @@ -1470,11 +1470,11 @@ LLSD LLMeshUploadThread::wholeModelToLLSD(bool include_textures) } result["asset_resources"] = res; -#if 0 +#if 1 dumpLLSDToFile(result,std::string("whole_model.xml")); #endif - - return result; + + dest = result; } void LLMeshUploadThread::doWholeModelUpload() @@ -1525,7 +1525,8 @@ void LLMeshUploadThread::doWholeModelUpload() } bool do_include_textures = false; // not needed for initial cost/validation check. - LLSD model_data = wholeModelToLLSD(do_include_textures); + LLSD model_data; + wholeModelToLLSD(model_data, do_include_textures); mPendingUploads++; LLCurlRequest::headers_t headers; diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h index 9d8119dc48..9460c0c048 100755 --- a/indra/newview/llmeshrepository.h +++ b/indra/newview/llmeshrepository.h @@ -425,7 +425,7 @@ public: void doWholeModelUpload(); void doIterativeUpload(); - LLSD wholeModelToLLSD(bool include_textures); + void wholeModelToLLSD(LLSD& dest, bool include_textures); }; class LLMeshRepository -- cgit v1.2.3 From 174bdbf65cab0ba53724fb1132a779c4b970c4bf Mon Sep 17 00:00:00 2001 From: Eli Linden <eli@lindenlab.com> Date: Thu, 12 May 2011 18:06:54 -0700 Subject: sync up with viewer-development --- .../newview/skins/default/xui/en/floater_about.xml | 1 - .../skins/default/xui/en/floater_snapshot.xml | 2 +- .../skins/default/xui/en/floater_sound_devices.xml | 28 ++++ indra/newview/skins/default/xui/en/main_view.xml | 16 +- indra/newview/skins/default/xui/en/menu_viewer.xml | 2 +- .../newview/skins/default/xui/en/notifications.xml | 42 ++++++ .../skins/default/xui/en/panel_bottomtray.xml | 6 +- .../default/xui/en/panel_preferences_sound.xml | 163 +-------------------- .../skins/default/xui/en/panel_sound_devices.xml | 163 +++++++++++++++++++++ .../default/xui/en/widgets/chiclet_im_p2p.xml | 1 + 10 files changed, 254 insertions(+), 170 deletions(-) create mode 100644 indra/newview/skins/default/xui/en/floater_sound_devices.xml create mode 100644 indra/newview/skins/default/xui/en/panel_sound_devices.xml diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml index f5365be11f..6a1a600696 100644 --- a/indra/newview/skins/default/xui/en/floater_about.xml +++ b/indra/newview/skins/default/xui/en/floater_about.xml @@ -150,7 +150,6 @@ jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (U jpeglib Copyright (C) 1991-1998, Thomas G. Lane. ogg/vorbis Copyright (C) 2001, Xiphophorus OpenSSL Copyright (C) 1998-2002 The OpenSSL Project. -Pth Copyright (C) 1999-2006 Ralf S. Engelschall <rse@gnu.org> SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) xmlrpc-epi Copyright (C) 2000 Epinions, Inc. diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml index 857932e51a..e413228ddc 100644 --- a/indra/newview/skins/default/xui/en/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml @@ -11,7 +11,7 @@ save_rect="true" save_visibility="true" title="SNAPSHOT PREVIEW" - width="215"> + width="245"> <floater.string name="unknown"> unknown diff --git a/indra/newview/skins/default/xui/en/floater_sound_devices.xml b/indra/newview/skins/default/xui/en/floater_sound_devices.xml new file mode 100644 index 0000000000..c7c7a05af2 --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_sound_devices.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater + border_visible="false" + border="false" + legacy_header_height="18" + can_minimize="true" + can_resize="false" + can_close="false" + save_dock_state="true" + save_visibility="true" + save_rect="true" + single_instance="true" + bevel_style="in" + height="140" + layout="topleft" + name="floater_sound_devices" + title="Sound Devices" + width="315"> + <panel + layout="topleft" + follows="all" + filename="panel_sound_devices.xml" + name="device_settings_panel" + width="400" + left="2" + top="26" + class="panel_voice_device_settings"/> +</floater> diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml index e5ae0b950a..3ead67ca57 100644 --- a/indra/newview/skins/default/xui/en/main_view.xml +++ b/indra/newview/skins/default/xui/en/main_view.xml @@ -8,12 +8,6 @@ tab_stop="false" name="main_view" width="1024"> - <panel top="0" - follows="all" - height="768" - mouse_opaque="false" - name="login_panel_holder" - width="1024"/> <layout_stack border_size="0" follows="all" mouse_opaque="false" @@ -133,7 +127,14 @@ user_resize="false" visible="false" width="333"/> - </layout_stack> + </layout_stack> + <panel top="0" + follows="all" + height="500" + mouse_opaque="false" + name="login_panel_holder" + width="1024"/> + <panel follows="all" height="500" left="0" @@ -171,6 +172,7 @@ top="0" width="1024" visible="false"/> + <view mouse_opaque="false" follows="all" name="menu_bar_holder" diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index a5115b0faa..8a85a331e5 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -2696,7 +2696,7 @@ <menu_item_call label="Web Content Browser" name="Web Content Browser" - shortcut="control|alt|W"> + shortcut="control|shift|Z"> <menu_item_call.on_click function="Advanced.WebContentTest" parameter="http://google.com"/> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 3fb3717e68..06614dd218 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -6815,6 +6815,34 @@ Deed to group failed. <tag>fail</tag> </notification> + <notification + icon="notifytip.tga" + name="ReleaseLandThrottled" + type="notifytip"> +The parcel [PARCEL_NAME] can not be abandoned at this time. + tag>fail</tag> + </notification> + + <notification + icon="notifytip.tga" + name="ReleasedLandWithReclaim" + type="notifytip"> +The [AREA] m² parcel '[PARCEL_NAME]' has been released. + +You will have [RECLAIM_PERIOD] hours to reclaim for L$0 before it is set for sale to anyone. + <tag>fail</tag> + </notification> + + <notification + icon="notifytip.tga" + name="ReleasedLandNoReclaim" + type="notifytip"> +The [AREA] m² parcel '[PARCEL_NAME]' has been released. + +It is now available for purchase by anyone. + <tag>fail</tag> + </notification> + <notification icon="notifytip.tga" name="AvatarRezNotification" @@ -7145,6 +7173,20 @@ The site at '<nolink>[HOST_NAME]</nolink>' in realm ' notext="Don't Quit"/> </notification> + <notification + name="NoPlaceInfo" + label="" + type="alertmodal" + unique="true"> + <tag>fail</tag> + <tag>confirm</tag> + Viewing place profile is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen. + <usetemplate + name="okcancelbuttons" + yestext="Quit" + notext="Don't Quit"/> + </notification> + <notification name="NoPicks" label="" diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index a6e5e7a219..c8f8d07701 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -47,13 +47,13 @@ mouse_opaque="false" name="chat_bar_layout_panel" user_resize="true" - width="250" > + width="310" > <panel name="chat_bar" filename="panel_nearby_chat_bar.xml" left="0" height="28" - width="248" + width="308" top="0" mouse_opaque="false" follows="left|right" @@ -341,7 +341,7 @@ Disabled for now. height="28" layout="topleft" min_height="28" - min_width="62" + min_width="52" mouse_opaque="false" name="mini_map_btn_panel" user_resize="false" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml index f89494da72..e374c89f21 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml @@ -479,163 +479,12 @@ width="190"> </button> <panel - background_visible="false" - bg_alpha_color="DkGray" + layout="topleft" + filename="panel_sound_devices.xml" visiblity_control="ShowDeviceSettings" - border="false" - follows="top|left" - height="100" - label="Device Settings" - layout="topleft" - left_delta="-2" name="device_settings_panel" - class="panel_voice_device_settings" - width="470" - top_pad="0"> - <panel.string - name="default_text"> - Default - </panel.string> - <panel.string - name="default system device"> - Default system device - </panel.string> - <panel.string - name="no device"> - No device - </panel.string> - <icon - height="18" - image_name="Microphone_On" - left_delta="4" - name="microphone_icon" - mouse_opaque="false" - top="7" - visible="true" - width="18" /> - <text - type="string" - length="1" - font.style="BOLD" - follows="left|top" - height="16" - layout="topleft" - left_pad="3" - name="Input" - width="70"> - Input - </text> - <combo_box - height="23" - control_name="VoiceInputAudioDevice" - layout="topleft" - left_pad="0" - max_chars="128" - name="voice_input_device" - top_delta="-5" - width="200" /> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left_delta="-70" - name="My volume label" - top_pad="4" - width="200"> - My volume: - </text> - <slider_bar - control_name="AudioLevelMic" - follows="left|top" - height="17" - increment="0.025" - initial_value="1.0" - layout="topleft" - left_delta="-6" - max_val="2" - name="mic_volume_slider" - tool_tip="Change the volume using this slider" - top_pad="-1" - width="220" /> - <text - type="string" - text_color="EmphasisColor" - length="1" - follows="left|top" - height="18" - layout="topleft" - left_pad="5" - name="wait_text" - top_delta="-1" - width="110"> - Please wait - </text> - <locate - height="20" - layout="topleft" - left_delta="0" - name="bar0" - top_delta="-2" - width="20" /> - <locate - height="20" - layout="topleft" - left_pad="5" - name="bar1" - top_delta="0" - width="20" /> - <locate - height="20" - layout="topleft" - left_pad="5" - name="bar2" - top_delta="0" - width="20" /> - <locate - height="20" - layout="topleft" - left_pad="5" - name="bar3" - top_delta="0" - width="20" /> - <locate - height="20" - layout="topleft" - left_pad="5" - name="bar4" - top_delta="0" - width="20" /> - <icon - height="18" - image_name="Parcel_Voice_Light" - left="5" - name="speaker_icon" - mouse_opaque="false" - top_pad="3" - visible="true" - width="22" /> - <text - font.style="BOLD" - type="string" - length="1" - follows="left|top" - height="15" - layout="topleft" - left_pad="0" - name="Output" - width="70"> - Output - </text> - <combo_box - control_name="VoiceOutputAudioDevice" - height="23" - layout="topleft" - left_pad="0" - max_chars="128" - name="voice_output_device" - top_delta="-3" - width="200" /> - </panel> + top="314" + width="345" + left="18" + class="panel_voice_device_settings"/> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_sound_devices.xml b/indra/newview/skins/default/xui/en/panel_sound_devices.xml new file mode 100644 index 0000000000..9812281323 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_sound_devices.xml @@ -0,0 +1,163 @@ +<panel + background_visible="false" + bg_alpha_color="DkGray" + follows="all" + height="200" + label="Device Settings" + layout="topleft" + name="device_settings_panel" + width="360"> + <panel.string + name="default_text"> + Default + </panel.string> + <panel.string + name="default system device"> + Default system device + </panel.string> + <panel.string + name="no device"> + No device + </panel.string> + <icon + height="18" + image_name="Microphone_On" + left_delta="4" + name="microphone_icon" + mouse_opaque="false" + top="7" + layout="topleft" + visible="true" + width="18" /> + <text + type="string" + length="1" + font.style="BOLD" + follows="left|top" + height="16" + layout="topleft" + left_pad="3" + name="Input" + width="70"> + Input + </text> + <combo_box + height="23" + control_name="VoiceInputAudioDevice" + follows="left|top" + layout="topleft" + left_pad="0" + max_chars="128" + name="voice_input_device" + top_delta="-5" + width="200" /> + <text + type="string" + length="1" + follows="left|top" + height="16" + layout="topleft" + left_delta="-70" + name="My volume label" + top_pad="4" + width="200"> + My volume: + </text> + <slider_bar + control_name="AudioLevelMic" + follows="top|right|left" + height="17" + increment="0.025" + initial_value="1.0" + layout="topleft" + left_delta="-6" + max_val="2" + name="mic_volume_slider" + tool_tip="Change the volume using this slider" + top_pad="-1" + width="220" /> + <text + type="string" + text_color="EmphasisColor" + length="1" + follows="right|top" + height="18" + layout="topleft" + left_pad="5" + name="wait_text" + top_delta="-1" + width="110"> + Please wait + </text> + <locate + follows="right|top" + height="20" + layout="topleft" + left_delta="0" + name="bar0" + top_delta="-2" + width="20" /> + <locate + follows="right|top" + height="20" + layout="topleft" + left_pad="5" + name="bar1" + top_delta="0" + width="20" /> + <locate + follows="right|top" + height="20" + layout="topleft" + left_pad="5" + name="bar2" + top_delta="0" + width="20" /> + <locate + follows="right|top" + height="20" + layout="topleft" + left_pad="5" + name="bar3" + top_delta="0" + width="20" /> + <locate + follows="right|top" + height="20" + layout="topleft" + left_pad="5" + name="bar4" + top_delta="0" + width="20" /> + <icon + height="18" + image_name="Parcel_Voice_Light" + left="5" + name="speaker_icon" + mouse_opaque="false" + top_pad="3" + visible="true" + width="22" /> + <text + font.style="BOLD" + type="string" + length="1" + follows="left|top" + height="15" + layout="topleft" + left_pad="0" + name="Output" + width="70"> + Output + </text> + <combo_box + control_name="VoiceOutputAudioDevice" + height="23" + follows="left|top" + layout="topleft" + left_pad="0" + max_chars="128" + name="voice_output_device" + top_delta="-3" + width="200" /> +</panel> diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml index 99807d4717..d27c14f4e7 100644 --- a/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml +++ b/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml @@ -21,6 +21,7 @@ width="20" /> <chiclet_im_p2p.avatar_icon bottom="3" + color="white" follows="left|top|bottom" height="20" left="2" -- cgit v1.2.3 From 22e2cee6c03780e927656c7083b0cc32b2d9cf66 Mon Sep 17 00:00:00 2001 From: Eli Linden <eli@lindenlab.com> Date: Thu, 12 May 2011 18:17:35 -0700 Subject: WIP VWR-23688 adding es and pt missing translation; add 1 zh file for testing Traditional Chinese as a new language --- indra/newview/skins/default/xui/es/strings.xml | 3 ++ indra/newview/skins/default/xui/pt/strings.xml | 3 ++ indra/newview/skins/default/xui/zh/panel_login.xml | 41 ++++++++++++++++++++++ 3 files changed, 47 insertions(+) create mode 100644 indra/newview/skins/default/xui/zh/panel_login.xml diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index 75126e74c5..5a913c4c9d 100644 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -3588,6 +3588,9 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE]. <string name="conference-title-incoming"> Conferencia con [AGENT_NAME] </string> + <string name="inventory_item_offered-im"> + Ofrecido el item del inventario + </string> <string name="no_session_message"> (La sesión de MI no existe) </string> diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml index 6466f42c75..1dbbcafb0e 100644 --- a/indra/newview/skins/default/xui/pt/strings.xml +++ b/indra/newview/skins/default/xui/pt/strings.xml @@ -3587,6 +3587,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="conference-title-incoming"> Conversa com [AGENT_NAME] </string> + <string name="inventory_item_offered-im"> + Oferta de item de inventário + </string> <string name="no_session_message"> (Sessão de MI inexistente) </string> diff --git a/indra/newview/skins/default/xui/zh/panel_login.xml b/indra/newview/skins/default/xui/zh/panel_login.xml new file mode 100644 index 0000000000..9d094ff731 --- /dev/null +++ b/indra/newview/skins/default/xui/zh/panel_login.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_login"> + <layout_stack name="login_widgets"> + <layout_panel name="login"> + <text name="username_text"> + 使用者名稱: + </text> + <text name="password_text"> + 密碼: + </text> + <check_box label="記住密碼" name="remember_check"/> + <button label="登入" name="connect_btn"/> + <text name="mode_selection_text"> + 模式: + </text> + <combo_box name="mode_combo" tool_tip="選擇一個登入模式"> + <combo_box.item label="基礎" name="Basic"/> + <combo_box.item label="進階" name="Advanced"/> + </combo_box> + <text name="start_location_text"> + 開始地點: + </text> + <combo_box name="start_location_combo"> + <combo_box.item label="上一次的地點" name="MyLastLocation"/> + <combo_box.item label="我的家" name="MyHome"/> + <combo_box.item label="<輸入區域名>" name="Typeregionname"/> + </combo_box> + </layout_panel> + <layout_panel name="links"> + <text name="create_new_account_text"> + 註冊 + </text> + <text name="forgot_password_text"> + 忘記使用者名稱或密碼? + </text> + <text name="login_help"> + 如何登入? + </text> + </layout_panel> + </layout_stack> +</panel> -- cgit v1.2.3 From e8ede07451c65aea898bc3f58a980b6b0d9af302 Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine <vsavchuk@productengine.com> Date: Thu, 12 May 2011 21:17:10 +0300 Subject: STORM-1243 WIP Fixed a typo in notifications.xml which might lead to numerous notification handling errors. The typo was introduced in changeset 437f3d892bfd. --- indra/newview/skins/default/xui/en/notifications.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 06614dd218..d0dd639249 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -6820,7 +6820,7 @@ Deed to group failed. name="ReleaseLandThrottled" type="notifytip"> The parcel [PARCEL_NAME] can not be abandoned at this time. - tag>fail</tag> + <tag>fail</tag> </notification> <notification -- cgit v1.2.3 From 506646b4d0619ed66cf0df481112300bc47c0ab8 Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Thu, 12 May 2011 11:45:09 -0700 Subject: EXP-802 fixing voice chat enabled persistence --- indra/newview/app_settings/settings_minimal.xml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/indra/newview/app_settings/settings_minimal.xml b/indra/newview/app_settings/settings_minimal.xml index d3f0ec5dad..70a75cb4ca 100644 --- a/indra/newview/app_settings/settings_minimal.xml +++ b/indra/newview/app_settings/settings_minimal.xml @@ -45,15 +45,6 @@ <key>Value</key> <integer>0</integer> </map> - <key>EnableVoiceChat</key> - <map> - <key>Comment</key> - <string>Enable talking to other residents with a microphone</string> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>1</integer> - </map> <key>HelpURLFormat</key> <map> <key>Comment</key> -- cgit v1.2.3 From 4268700fcf981dbe48baa56b1f8ca1509fdb2e31 Mon Sep 17 00:00:00 2001 From: Leslie Linden <leslie@lindenlab.com> Date: Thu, 12 May 2011 13:30:47 -0700 Subject: SH-1521 update -- Lighting and Shadows grayed out on mac * Disabled SSAO on macs with 8 or less texture units. * Slight cleanup of sunlight fragment shaders to remove unused texture units. Reviewed by davep --- .../newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl | 2 -- indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl | 3 --- .../newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl | 2 -- indra/newview/featuretable_mac.txt | 5 ++++- indra/newview/llfeaturemanager.cpp | 4 ++++ 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl index 25ff958107..cd91351ad4 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl @@ -15,8 +15,6 @@ uniform sampler2DRect depthMap; uniform sampler2DRect normalMap; uniform sampler2D noiseMap; -uniform sampler2D lightFunc; - // Inputs uniform mat4 shadow_matrix[6]; diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl index 26bc83e0d4..4369b3b34f 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl @@ -19,9 +19,6 @@ uniform sampler2DRectShadow shadowMap2; uniform sampler2DRectShadow shadowMap3; uniform sampler2DShadow shadowMap4; uniform sampler2DShadow shadowMap5; -uniform sampler2D noiseMap; - -uniform sampler2D lightFunc; // Inputs diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl index 08b16d787f..847b36b1ac 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl @@ -21,8 +21,6 @@ uniform sampler2DShadow shadowMap4; uniform sampler2DShadow shadowMap5; uniform sampler2D noiseMap; -uniform sampler2D lightFunc; - // Inputs uniform mat4 shadow_matrix[6]; uniform vec4 shadow_clip; diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt index c9ab003112..c075c660f3 100644 --- a/indra/newview/featuretable_mac.txt +++ b/indra/newview/featuretable_mac.txt @@ -1,4 +1,4 @@ -version 22 +version 23 // NOTE: This is mostly identical to featuretable_mac.txt with a few differences // Should be combined into one table @@ -278,6 +278,9 @@ RenderObjectBump 0 0 list OpenGLPre15 RenderVBOEnable 1 0 +list TexUnit8orLess +RenderDeferredSSAO 0 0 + list Intel RenderAnisotropic 1 0 RenderLocalLights 1 0 diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp index 9f0b34becc..524d2d74ef 100644 --- a/indra/newview/llfeaturemanager.cpp +++ b/indra/newview/llfeaturemanager.cpp @@ -753,6 +753,10 @@ void LLFeatureManager::applyBaseMasks() { maskFeatures("OpenGLPre30"); } + if (gGLManager.mNumTextureUnits <= 8) + { + maskFeatures("TexUnit8orLess"); + } // now mask by gpu string // Replaces ' ' with '_' in mGPUString to deal with inability for parser to handle spaces -- cgit v1.2.3 From a65cd77f40791c16fc77b318abe4f8a4b3b42751 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" <vir@lindenlab.com> Date: Thu, 12 May 2011 18:28:31 -0400 Subject: mesh coords for whole model upload --- indra/newview/llmeshrepository.cpp | 68 ++++++++++++++++++++++++++++++++------ indra/newview/llmeshrepository.h | 5 +++ 2 files changed, 63 insertions(+), 10 deletions(-) diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 3163f4f186..1544a0d542 100755 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -1380,6 +1380,8 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures) result["name"] = "your name here"; result["description"] = "your description here"; + // TODO "optional" fields from the spec + LLSD res; res["mesh_list"] = LLSD::emptyArray(); res["texture_list"] = LLSD::emptyArray(); @@ -1409,7 +1411,7 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures) decomp.mBaseHull = mHullMap[data.mBaseModel]; - LLModel::writeModel( + LLSD mesh_header = LLModel::writeModel( ostr, data.mModel[LLModel::LOD_PHYSICS], data.mModel[LLModel::LOD_HIGH], @@ -1424,17 +1426,22 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures) LLSD mesh_entry; - // TODO - correct coords based on instance.mTransform. - mesh_entry["coords"]["x"] = 1.0; - mesh_entry["coords"]["y"] = 1.0; - mesh_entry["coords"]["z"] = 1.0; - mesh_entry["coords"]["rot_x"] = 1.0; - mesh_entry["coords"]["rot_y"] = 1.0; - mesh_entry["coords"]["rot_z"] = 1.0; - mesh_entry["mesh_data"] = "RESTORE_ME"; //ostr.str(); + LLVector3 pos, scale; + LLQuaternion rot; + LLMatrix4 transformation = instance.mTransform; + decomposeMeshMatrix(transformation,pos,rot,scale); + + mesh_entry["childpos"] = ll_sd_from_vector3(pos); + mesh_entry["childrot"] = ll_sd_from_quaternion(rot); + mesh_entry["scale"] = ll_sd_from_vector3(scale); + + // TODO should be binary. + std::string str = ostr.str(); + mesh_entry["mesh_data"] = LLSD::Binary(str.begin(),str.end()); res["mesh_list"][mesh_num] = mesh_entry; - + + // TODO how do textures in the list map to textures in the meshes? if (mUploadTextures) { for (std::vector<LLImportMaterial>::iterator material_iter = instance.mMaterial.begin(); @@ -2976,6 +2983,47 @@ void LLMeshUploadThread::createObjects(LLMeshUploadData& data) } } +void LLMeshUploadThread::decomposeMeshMatrix(LLMatrix4& transformation, + LLVector3& result_pos, + LLQuaternion& result_rot, + LLVector3& result_scale) +{ + // check for reflection + BOOL reflected = (transformation.determinant() < 0); + + // compute position + LLVector3 position = LLVector3(0, 0, 0) * transformation; + + // compute scale + LLVector3 x_transformed = LLVector3(1, 0, 0) * transformation - position; + LLVector3 y_transformed = LLVector3(0, 1, 0) * transformation - position; + LLVector3 z_transformed = LLVector3(0, 0, 1) * transformation - position; + F32 x_length = x_transformed.normalize(); + F32 y_length = y_transformed.normalize(); + F32 z_length = z_transformed.normalize(); + LLVector3 scale = LLVector3(x_length, y_length, z_length); + + // adjust for "reflected" geometry + LLVector3 x_transformed_reflected = x_transformed; + if (reflected) + { + x_transformed_reflected *= -1.0; + } + + // compute rotation + LLMatrix3 rotation_matrix; + rotation_matrix.setRows(x_transformed_reflected, y_transformed, z_transformed); + LLQuaternion quat_rotation = rotation_matrix.quaternion(); + quat_rotation.normalize(); // the rotation_matrix might not have been orthoginal. make it so here. + LLVector3 euler_rotation; + quat_rotation.getEulerAngles(&euler_rotation.mV[VX], &euler_rotation.mV[VY], &euler_rotation.mV[VZ]); + + result_pos = position + mOrigin; + result_scale = scale; + result_rot = quat_rotation; +} + + LLSD LLMeshUploadThread::createObject(LLModelInstance& instance) { LLMatrix4 transformation = instance.mTransform; diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h index 9460c0c048..802e3e1aba 100755 --- a/indra/newview/llmeshrepository.h +++ b/indra/newview/llmeshrepository.h @@ -426,6 +426,11 @@ public: void doIterativeUpload(); void wholeModelToLLSD(LLSD& dest, bool include_textures); + + void decomposeMeshMatrix(LLMatrix4& transformation, + LLVector3& result_pos, + LLQuaternion& result_rot, + LLVector3& result_scale); }; class LLMeshRepository -- cgit v1.2.3 From b3dddbf30b42eff8ef7031c63e91244f07e8bd77 Mon Sep 17 00:00:00 2001 From: brad kittenbrink <brad@lindenlab.com> Date: Thu, 12 May 2011 16:09:29 -0700 Subject: Fix for error in debug build accessing beyond the end of a vector. reviewed by davep. --- indra/llui/lltextbase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 1c19a33c4e..1cc3cc04d6 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -1164,7 +1164,7 @@ void LLTextBase::reflow() S32 first_line = getFirstVisibleLine(); // if scroll anchor not on first line, update it to first character of first line - if (!mLineInfoList.empty() + if ((first_line < mLineInfoList.size()) && (mScrollIndex < mLineInfoList[first_line].mDocIndexStart || mScrollIndex >= mLineInfoList[first_line].mDocIndexEnd)) { -- cgit v1.2.3 From 2a843e9a6bb5cb70f69794419ab4a7d16ee3c6cb Mon Sep 17 00:00:00 2001 From: brad kittenbrink <brad@lindenlab.com> Date: Thu, 12 May 2011 16:09:42 -0700 Subject: Fix up alignment problems for debug build. reviewed by davep. --- indra/llcommon/llmemory.h | 12 +++++- indra/llmath/llvolume.cpp | 78 ++++++++++++++++++------------------ indra/llrender/llvertexbuffer.cpp | 24 +++++------ indra/newview/llpolymesh.cpp | 4 +- indra/newview/llspatialpartition.cpp | 4 +- 5 files changed, 65 insertions(+), 57 deletions(-) diff --git a/indra/llcommon/llmemory.h b/indra/llcommon/llmemory.h index 0adb78236e..3bd1403576 100644 --- a/indra/llcommon/llmemory.h +++ b/indra/llcommon/llmemory.h @@ -28,7 +28,7 @@ #include "llmemtype.h" -#if 0 //DON'T use ll_aligned_foo now that we use tcmalloc everywhere (tcmalloc aligns automatically at appropriate intervals) +#if LL_DEBUG inline void* ll_aligned_malloc( size_t size, int align ) { void* mem = malloc( size + (align - 1) + sizeof(void*) ); @@ -95,7 +95,15 @@ inline void ll_aligned_free_32(void *p) free(p); // posix_memalign() is compatible with heap deallocator #endif } -#endif +#else // LL_DEBUG +// ll_aligned_foo are noops now that we use tcmalloc everywhere (tcmalloc aligns automatically at appropriate intervals) +#define ll_aligned_malloc( size, align ) malloc(size) +#define ll_aligned_free( ptr ) free(ptr) +#define ll_aligned_malloc_16 malloc +#define ll_aligned_free_16 free +#define ll_aligned_malloc_32 malloc +#define ll_aligned_free_32 free +#endif // LL_DEBUG class LL_COMMON_API LLMemory { diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index 70e1e1f312..b3446b72b8 100644 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -1883,9 +1883,9 @@ LLVolume::~LLVolume() mProfilep = NULL; mVolumeFaces.clear(); - free(mHullPoints); + ll_aligned_free_16(mHullPoints); mHullPoints = NULL; - free(mHullIndices); + ll_aligned_free_16(mHullIndices); mHullIndices = NULL; } @@ -2007,7 +2007,7 @@ void LLVolumeFace::VertexData::init() { if (!mData) { - mData = (LLVector4a*) malloc(sizeof(LLVector4a)*2); + mData = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*2); } } @@ -2036,7 +2036,7 @@ const LLVolumeFace::VertexData& LLVolumeFace::VertexData::operator=(const LLVolu LLVolumeFace::VertexData::~VertexData() { - free(mData); + ll_aligned_free_16(mData); mData = NULL; } @@ -5192,7 +5192,7 @@ LLVolumeFace::LLVolumeFace() : mWeights(NULL), mOctree(NULL) { - mExtents = (LLVector4a*) malloc(sizeof(LLVector4a)*3); + mExtents = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*3); mCenter = mExtents+2; } @@ -5213,7 +5213,7 @@ LLVolumeFace::LLVolumeFace(const LLVolumeFace& src) mWeights(NULL), mOctree(NULL) { - mExtents = (LLVector4a*) malloc(sizeof(LLVector4a)*3); + mExtents = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*3); mCenter = mExtents+2; *this = src; } @@ -5263,7 +5263,7 @@ LLVolumeFace& LLVolumeFace::operator=(const LLVolumeFace& src) } else { - free(mBinormals); + ll_aligned_free_16(mBinormals); mBinormals = NULL; } @@ -5274,7 +5274,7 @@ LLVolumeFace& LLVolumeFace::operator=(const LLVolumeFace& src) } else { - free(mWeights); + ll_aligned_free_16(mWeights); mWeights = NULL; } } @@ -5292,7 +5292,7 @@ LLVolumeFace& LLVolumeFace::operator=(const LLVolumeFace& src) LLVolumeFace::~LLVolumeFace() { - free(mExtents); + ll_aligned_free_16(mExtents); mExtents = NULL; freeData(); @@ -5300,17 +5300,17 @@ LLVolumeFace::~LLVolumeFace() void LLVolumeFace::freeData() { - free(mPositions); + ll_aligned_free_16(mPositions); mPositions = NULL; - free( mNormals); + ll_aligned_free_16( mNormals); mNormals = NULL; - free(mTexCoords); + ll_aligned_free_16(mTexCoords); mTexCoords = NULL; - free(mIndices); + ll_aligned_free_16(mIndices); mIndices = NULL; - free(mBinormals); + ll_aligned_free_16(mBinormals); mBinormals = NULL; - free(mWeights); + ll_aligned_free_16(mWeights); mWeights = NULL; delete mOctree; @@ -5827,21 +5827,21 @@ void LLVolumeFace::cacheOptimize() //allocate space for new buffer S32 num_verts = mNumVertices; - LLVector4a* pos = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts); - LLVector4a* norm = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts); + LLVector4a* pos = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts); + LLVector4a* norm = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts); S32 size = ((num_verts*sizeof(LLVector2)) + 0xF) & ~0xF; - LLVector2* tc = (LLVector2*) malloc(size); + LLVector2* tc = (LLVector2*) ll_aligned_malloc_16(size); LLVector4a* wght = NULL; if (mWeights) { - wght = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts); + wght = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts); } LLVector4a* binorm = NULL; if (mBinormals) { - binorm = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts); + binorm = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts); } //allocate mapping of old indices to new indices @@ -5878,11 +5878,11 @@ void LLVolumeFace::cacheOptimize() mIndices[i] = new_idx[mIndices[i]]; } - free(mPositions); - free(mNormals); - free(mTexCoords); - free(mWeights); - free(mBinormals); + ll_aligned_free_16(mPositions); + ll_aligned_free_16(mNormals); + ll_aligned_free_16(mTexCoords); + ll_aligned_free_16(mWeights); + ll_aligned_free_16(mBinormals); mPositions = pos; mNormals = norm; @@ -6603,23 +6603,23 @@ void LLVolumeFace::createBinormals() void LLVolumeFace::resizeVertices(S32 num_verts) { - free(mPositions); - free(mNormals); - free(mBinormals); - free(mTexCoords); + ll_aligned_free_16(mPositions); + ll_aligned_free_16(mNormals); + ll_aligned_free_16(mBinormals); + ll_aligned_free_16(mTexCoords); mBinormals = NULL; if (num_verts) { - mPositions = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts); + mPositions = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts); assert_aligned(mPositions, 16); - mNormals = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts); + mNormals = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts); assert_aligned(mNormals, 16); //pad texture coordinate block end to allow for QWORD reads S32 size = ((num_verts*sizeof(LLVector2)) + 0xF) & ~0xF; - mTexCoords = (LLVector2*) malloc(size); + mTexCoords = (LLVector2*) ll_aligned_malloc_16(size); assert_aligned(mTexCoords, 16); } else @@ -6655,7 +6655,7 @@ void LLVolumeFace::pushVertex(const LLVector4a& pos, const LLVector4a& norm, con //just clear binormals - free(mBinormals); + ll_aligned_free_16(mBinormals); mBinormals = NULL; mPositions[mNumVertices] = pos; @@ -6667,26 +6667,26 @@ void LLVolumeFace::pushVertex(const LLVector4a& pos, const LLVector4a& norm, con void LLVolumeFace::allocateBinormals(S32 num_verts) { - free(mBinormals); - mBinormals = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts); + ll_aligned_free_16(mBinormals); + mBinormals = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts); } void LLVolumeFace::allocateWeights(S32 num_verts) { - free(mWeights); - mWeights = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts); + ll_aligned_free_16(mWeights); + mWeights = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts); } void LLVolumeFace::resizeIndices(S32 num_indices) { - free(mIndices); + ll_aligned_free_16(mIndices); if (num_indices) { //pad index block end to allow for QWORD reads S32 size = ((num_indices*sizeof(U16)) + 0xF) & ~0xF; - mIndices = (U16*) malloc(size); + mIndices = (U16*) ll_aligned_malloc_16(size); } else { diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index 73efbfc999..94a04ba6ca 100644 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp @@ -633,7 +633,7 @@ void LLVertexBuffer::createGLBuffer() { static int gl_buffer_idx = 0; mGLBuffer = ++gl_buffer_idx; - mMappedData = (U8*) malloc(size); + mMappedData = (U8*) ll_aligned_malloc_16(size); } } @@ -667,7 +667,7 @@ void LLVertexBuffer::createGLIndices() } else { - mMappedIndexData = (U8*) malloc(size); + mMappedIndexData = (U8*) ll_aligned_malloc_16(size); static int gl_buffer_idx = 0; mGLIndices = ++gl_buffer_idx; } @@ -690,7 +690,7 @@ void LLVertexBuffer::destroyGLBuffer() } else { - free(mMappedData); + ll_aligned_free_16(mMappedData); mMappedData = NULL; mEmpty = TRUE; } @@ -719,7 +719,7 @@ void LLVertexBuffer::destroyGLIndices() } else { - free(mMappedIndexData); + ll_aligned_free_16(mMappedIndexData); mMappedIndexData = NULL; mEmpty = TRUE; } @@ -852,8 +852,8 @@ void LLVertexBuffer::resizeBuffer(S32 newnverts, S32 newnindices) { if (!useVBOs()) { - free(mMappedData); - mMappedData = (U8*) malloc(newsize); + ll_aligned_free_16(mMappedData); + mMappedData = (U8*) ll_aligned_malloc_16(newsize); } mResized = TRUE; } @@ -873,8 +873,8 @@ void LLVertexBuffer::resizeBuffer(S32 newnverts, S32 newnindices) { if (!useVBOs()) { - free(mMappedIndexData); - mMappedIndexData = (U8*) malloc(new_index_size); + ll_aligned_free_16(mMappedIndexData); + mMappedIndexData = (U8*) ll_aligned_malloc_16(new_index_size); } mResized = TRUE; } @@ -915,8 +915,8 @@ void LLVertexBuffer::freeClientBuffer() { if(useVBOs() && sDisableVBOMapping && (mMappedData || mMappedIndexData)) { - free(mMappedData) ; - free(mMappedIndexData) ; + ll_aligned_free_16(mMappedData) ; + ll_aligned_free_16(mMappedIndexData) ; mMappedData = NULL ; mMappedIndexData = NULL ; } @@ -926,7 +926,7 @@ void LLVertexBuffer::allocateClientVertexBuffer() { if(!mMappedData) { - mMappedData = (U8*)malloc(getSize()); + mMappedData = (U8*)ll_aligned_malloc_16(getSize()); } } @@ -934,7 +934,7 @@ void LLVertexBuffer::allocateClientIndexBuffer() { if(!mMappedIndexData) { - mMappedIndexData = (U8*)malloc(getIndicesSize()); + mMappedIndexData = (U8*)ll_aligned_malloc_16(getIndicesSize()); } } diff --git a/indra/newview/llpolymesh.cpp b/indra/newview/llpolymesh.cpp index 4b2c569cc3..450f9b2be7 100644 --- a/indra/newview/llpolymesh.cpp +++ b/indra/newview/llpolymesh.cpp @@ -770,7 +770,7 @@ LLPolyMesh::LLPolyMesh(LLPolyMeshSharedData *shared_data, LLPolyMesh *reference_ int nverts = mSharedData->mNumVertices; int nfloats = nverts * (2*4 + 3*3 + 2 + 4); //use 16 byte aligned vertex data to make LLPolyMesh SSE friendly - mVertexData = (F32*) malloc(nfloats*4); + mVertexData = (F32*) ll_aligned_malloc_16(nfloats*4); int offset = 0; mCoords = (LLVector4*)(mVertexData + offset); offset += 4*nverts; mNormals = (LLVector4*)(mVertexData + offset); offset += 4*nverts; @@ -799,7 +799,7 @@ LLPolyMesh::~LLPolyMesh() mJointRenderData[i] = NULL; } - free(mVertexData); + ll_aligned_free_16(mVertexData); } diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 65f7d299bc..34a42ff28b 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -3169,11 +3169,11 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume) LLConvexDecomposition::getInstance()->generateSingleHullMeshFromMesh( &mesh, &res ); //copy res into phys_volume - phys_volume->mHullPoints = (LLVector4a*) malloc(sizeof(LLVector4a)*res.mNumVertices); + phys_volume->mHullPoints = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*res.mNumVertices); phys_volume->mNumHullPoints = res.mNumVertices; S32 idx_size = (res.mNumTriangles*3*2+0xF) & ~0xF; - phys_volume->mHullIndices = (U16*) malloc(idx_size); + phys_volume->mHullIndices = (U16*) ll_aligned_malloc_16(idx_size); phys_volume->mNumHullIndices = res.mNumTriangles*3; const F32* v = res.mVertexBase; -- cgit v1.2.3 From 166e4df2780ca004535d6f915417b36613de5b77 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Thu, 12 May 2011 18:42:44 -0700 Subject: EXP-818 FIX Use different settings to control search url for beta channel viewers --- indra/newview/app_settings/settings.xml | 11 +++++++++++ indra/newview/llfloatersearch.cpp | 11 ++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 33c5e533be..e6c2dc4413 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -3910,6 +3910,17 @@ <key>Value</key> <string>http://search.secondlife.com/viewer/[CATEGORY]/?q=[QUERY]&p=[AUTH_TOKEN]&r=[MATURITY]&lang=[LANGUAGE]&g=[GODLIKE]&sid=[SESSION_ID]&rid=[REGION_ID]&pid=[PARCEL_ID]&channel=[CHANNEL]&version=[VERSION]&major=[VERSION_MAJOR]&minor=[VERSION_MINOR]&patch=[VERSION_PATCH]&build=[VERSION_BUILD]</string> </map> + <key>SearchURLBeta</key> + <map> + <key>Comment</key> + <string>URL for Search website, displayed in the Find floater</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://beta.search.secondlife.com/viewer/[CATEGORY]/?q=[QUERY]&p=[AUTH_TOKEN]&r=[MATURITY]&lang=[LANGUAGE]&g=[GODLIKE]&sid=[SESSION_ID]&rid=[REGION_ID]&pid=[PARCEL_ID]&channel=[CHANNEL]&version=[VERSION]&major=[VERSION_MAJOR]&minor=[VERSION_MINOR]&patch=[VERSION_PATCH]&build=[VERSION_BUILD]</string> + </map> <key>WebProfileURL</key> <map> <key>Comment</key> diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp index d5806e375c..c8fe380710 100644 --- a/indra/newview/llfloatersearch.cpp +++ b/indra/newview/llfloatersearch.cpp @@ -38,6 +38,7 @@ #include "llui.h" #include "llviewercontrol.h" #include "llweb.h" +#include "llversioninfo.h" // support secondlife:///app/search/{CATEGORY}/{QUERY} SLapps class LLSearchHandler : public LLCommandHandler @@ -203,7 +204,15 @@ void LLFloaterSearch::search(const LLSD &key) // get the search URL and expand all of the substitutions // (also adds things like [LANGUAGE], [VERSION], [OS], etc.) - std::string url = gSavedSettings.getString("SearchURL"); + std::string url; + if (LLVersionInfo::getChannel().find("Beta") != std::string::npos) + { + url = gSavedSettings.getString("SearchURLBeta"); + } + else + { + url = gSavedSettings.getString("SearchURL"); + } url = LLWeb::expandURLSubstitutions(url, subs); // and load the URL in the web view -- cgit v1.2.3 From 34d016ac476354c1313da6a0b5e07ee764343f8e Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" <vir@lindenlab.com> Date: Fri, 13 May 2011 11:37:55 -0400 Subject: removed some XML logging --- indra/newview/llmeshrepository.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 1544a0d542..2ebe6cf6bd 100755 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -1477,7 +1477,7 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures) } result["asset_resources"] = res; -#if 1 +#if 0 dumpLLSDToFile(result,std::string("whole_model.xml")); #endif -- cgit v1.2.3 From d6fda15c34896db3b911c3719871ce317edaab1d Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" <vir@lindenlab.com> Date: Fri, 13 May 2011 12:01:39 -0400 Subject: Fixed more build breakages due to persnickety compilers on mac/linux --- indra/newview/llmeshrepository.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 2ebe6cf6bd..2a68fbac8d 100755 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -1362,11 +1362,13 @@ void LLMeshUploadThread::run() } } +#if 0 void dumpLLSDToFile(LLSD& content, std::string& filename) { std::ofstream of(filename); LLSDSerialize::toPrettyXML(content,of); } +#endif void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures) { @@ -1478,7 +1480,8 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures) result["asset_resources"] = res; #if 0 - dumpLLSDToFile(result,std::string("whole_model.xml")); + std::string name("whole_model.xml"); + dumpLLSDToFile(result,name); #endif dest = result; -- cgit v1.2.3 From 039b6baf065a87d747647fb0477c799a9949ebf2 Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Fri, 13 May 2011 11:01:36 -0700 Subject: EXP-783 User can accept a call and see end call option in IM window but they are in nearby voice --- indra/newview/llvoicechannel.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp index b921b7a481..bd12328a6b 100644 --- a/indra/newview/llvoicechannel.cpp +++ b/indra/newview/llvoicechannel.cpp @@ -849,6 +849,8 @@ void LLVoiceChannelP2P::activate() { if (!LLVoiceClient::getInstance()->answerInvite(mSessionHandle)) { + mCallEndedByAgent = false; + mSessionHandle.clear(); handleError(ERROR_UNKNOWN); return; } -- cgit v1.2.3 From 8ae550996c70df16b707f6773666b93409123689 Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Mon, 16 May 2011 13:48:55 -0500 Subject: Merge cleanup. --- indra/newview/llmeshrepository.cpp | 1 + indra/newview/llviewerregion.cpp | 40 ++++++++++++++++++-------------------- 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 2a68fbac8d..0a1eadf4d0 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -35,6 +35,7 @@ #include "llappviewer.h" #include "llbufferstream.h" #include "llcurl.h" +#include "lldatapacker.h" #include "llfasttimer.h" #include "llfloatermodelpreview.h" #include "llfloaterperms.h" diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 46cf9a24e9..f835351c04 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -1187,34 +1187,32 @@ LLDataPacker *LLViewerRegion::getDP(U32 local_id, U32 crc, U8 &cache_miss_type) { //llassert(mCacheLoaded); This assert failes often, changing to early-out -- davep, 2010/10/18 - if (mCacheLoaded) - { - LLVOCacheEntry* entry = get_if_there(mCacheMap, local_id, (LLVOCacheEntry*)NULL); + LLVOCacheEntry* entry = get_if_there(mImpl->mCacheMap, local_id, (LLVOCacheEntry*)NULL); - if (entry) + if (entry) + { + // we've seen this object before + if (entry->getCRC() == crc) { - // we've seen this object before - if (entry->getCRC() == crc) - { - // Record a hit - entry->recordHit(); - cache_miss_type = CACHE_MISS_TYPE_NONE; - return entry->getDP(crc); - } - else - { - // llinfos << "CRC miss for " << local_id << llendl; - cache_miss_type = CACHE_MISS_TYPE_CRC; - mCacheMissCRC.put(local_id); - } + // Record a hit + entry->recordHit(); + cache_miss_type = CACHE_MISS_TYPE_NONE; + return entry->getDP(crc); } else { - // llinfos << "Cache miss for " << local_id << llendl; - cache_miss_type = CACHE_MISS_TYPE_FULL; - mCacheMissFull.put(local_id); + // llinfos << "CRC miss for " << local_id << llendl; + cache_miss_type = CACHE_MISS_TYPE_CRC; + mCacheMissCRC.put(local_id); } } + else + { + // llinfos << "Cache miss for " << local_id << llendl; + cache_miss_type = CACHE_MISS_TYPE_FULL; + mCacheMissFull.put(local_id); + } + return NULL; } -- cgit v1.2.3 From d2f138b4f348aac04d7940635b3ef44231291080 Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Mon, 16 May 2011 18:11:55 -0500 Subject: SH-709 Fix for triangle limit value not updating when spinner is selected. --- indra/newview/llfloatermodelpreview.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index e8da1aa42c..44204e947b 100644 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -4044,7 +4044,7 @@ void LLModelPreview::updateStatusMessages() LLSpinCtrl* limit = mFMP->getChild<LLSpinCtrl>("lod_triangle_limit"); limit->setMaxValue(mMaxTriangleLimit); - limit->setValue(mRequestedTriangleCount[mPreviewLOD]); + limit->forceSetValue(mRequestedTriangleCount[mPreviewLOD]); if (lod_mode == 0) { -- cgit v1.2.3 From a2d8f0cb3308fed1cb2c8d5fa8fb74ec4cefa45b Mon Sep 17 00:00:00 2001 From: Dave Parks <davep@lindenlab.com> Date: Mon, 16 May 2011 19:51:16 -0500 Subject: SH-795 Cache and display LoD parameters etc for each lod. --- indra/newview/llfloatermodelpreview.cpp | 63 +++++++++++++++++----- indra/newview/llfloatermodelpreview.h | 9 +++- .../skins/default/xui/en/floater_model_preview.xml | 2 +- 3 files changed, 60 insertions(+), 14 deletions(-) diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index 44204e947b..b7e9865228 100644 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -2597,6 +2597,7 @@ LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp) mLoading = false; mLoadState = LLModelLoader::STARTING; mGroup = 0; + mLODFrozen = false; mBuildShareTolerance = 0.f; mBuildQueueMode = GLOD_QUEUE_GREEDY; mBuildBorderMode = GLOD_BORDER_UNLOCK; @@ -2605,6 +2606,13 @@ LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp) for (U32 i = 0; i < LLModel::NUM_LODS; ++i) { mRequestedTriangleCount[i] = 0; + mRequestedCreaseAngle[i] = -1.f; + mRequestedLoDMode[i] = 0; + mRequestedErrorThreshold[i] = 0.f; + mRequestedBuildOperator[i] = 0; + mRequestedQueueMode[i] = 0; + mRequestedBorderMode[i] = 0; + mRequestedShareTolerance[i] = 0.f; } mViewOption["show_textures"] = false; @@ -3247,6 +3255,8 @@ void LLModelPreview::generateNormals() F32 angle_cutoff = mFMP->childGetValue("crease_angle").asReal(); + mRequestedCreaseAngle[which_lod] = angle_cutoff; + angle_cutoff *= DEG_TO_RAD; if (which_lod == 3 && !mBaseModel.empty()) @@ -3266,7 +3276,7 @@ void LLModelPreview::generateNormals() mVertexBuffer[which_lod].clear(); refresh(); - + updateStatusMessages(); } void LLModelPreview::clearMaterials() @@ -3342,6 +3352,7 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim { lod_mode = iface->getFirstSelectedIndex(); } + mRequestedLoDMode[mPreviewLOD] = lod_mode; F32 lod_error_threshold = mFMP->childGetValue("lod_error_threshold").asReal(); @@ -3365,6 +3376,7 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim { build_operator = iface->getFirstSelectedIndex(); } + mRequestedBuildOperator[mPreviewLOD] = build_operator; if (build_operator == 0) { @@ -3381,6 +3393,7 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim { queue_mode = iface->getFirstSelectedIndex(); } + mRequestedQueueMode[mPreviewLOD] = queue_mode; if (queue_mode == 0) { @@ -3402,6 +3415,7 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim { border_mode = iface->getFirstSelectedIndex(); } + mRequestedBorderMode[mPreviewLOD] = border_mode; if (border_mode == 0) { @@ -3437,6 +3451,7 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim mBuildShareTolerance = share_tolerance; object_dirty = true; } + mRequestedShareTolerance[mPreviewLOD] = share_tolerance; if (mGroup == 0) { @@ -3545,6 +3560,7 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim U32 submeshes = 0; mRequestedTriangleCount[lod] = triangle_count; + mRequestedErrorThreshold[lod] = lod_error_threshold; glodGroupParameteri(mGroup, GLOD_ADAPT_MODE, lod_mode); stop_gloderror(); @@ -4021,6 +4037,9 @@ void LLModelPreview::updateStatusMessages() { // auto generate, also the default case for wizard which has no radio selection fmp->mLODMode[mPreviewLOD] = 1; + //don't actually regenerate lod when refreshing UI + mLODFrozen = true; + for (U32 i = 0; i < num_file_controls; ++i) { mFMP->childDisable(file_controls[i]); @@ -4033,20 +4052,21 @@ void LLModelPreview::updateStatusMessages() //if (threshold) { - U32 lod_mode = 0; - LLCtrlSelectionInterface* iface = mFMP->childGetSelectionInterface("lod_mode"); - if (iface) - { - lod_mode = iface->getFirstSelectedIndex(); - } - LLSpinCtrl* threshold = mFMP->getChild<LLSpinCtrl>("lod_error_threshold"); LLSpinCtrl* limit = mFMP->getChild<LLSpinCtrl>("lod_triangle_limit"); limit->setMaxValue(mMaxTriangleLimit); limit->forceSetValue(mRequestedTriangleCount[mPreviewLOD]); - if (lod_mode == 0) + threshold->forceSetValue(mRequestedErrorThreshold[mPreviewLOD]); + + mFMP->getChild<LLComboBox>("lod_mode")->selectNthItem(mRequestedLoDMode[mPreviewLOD]); + mFMP->getChild<LLComboBox>("build_operator")->selectNthItem(mRequestedBuildOperator[mPreviewLOD]); + mFMP->getChild<LLComboBox>("queue_mode")->selectNthItem(mRequestedQueueMode[mPreviewLOD]); + mFMP->getChild<LLComboBox>("border_mode")->selectNthItem(mRequestedBorderMode[mPreviewLOD]); + mFMP->getChild<LLSpinCtrl>("share_tolerance")->setValue(mRequestedShareTolerance[mPreviewLOD]); + + if (mRequestedLoDMode[mPreviewLOD] == 0) { limit->setVisible(true); threshold->setVisible(false); @@ -4060,6 +4080,8 @@ void LLModelPreview::updateStatusMessages() threshold->setVisible(true); } } + + mLODFrozen = false; } } @@ -4075,6 +4097,20 @@ void LLModelPreview::updateStatusMessages() mFMP->childDisable("physics_file"); mFMP->childDisable("physics_browse"); } + + LLSpinCtrl* crease = mFMP->getChild<LLSpinCtrl>("crease_angle"); + + if (mRequestedCreaseAngle[mPreviewLOD] == -1.f) + { + mFMP->childSetColor("crease_label", LLColor4::grey); + crease->forceSetValue(75.f); + } + else + { + mFMP->childSetColor("crease_label", LLColor4::white); + crease->forceSetValue(mRequestedCreaseAngle[mPreviewLOD]); + } + } void LLModelPreview::setPreviewTarget(F32 distance) @@ -4925,9 +4961,12 @@ void LLModelPreview::textureLoadedCallback( BOOL success, LLViewerFetchedTexture void LLModelPreview::onLODParamCommit(bool enforce_tri_limit) { - genLODs(mPreviewLOD, 3, enforce_tri_limit); - updateStatusMessages(); - refresh(); + if (!mLODFrozen) + { + genLODs(mPreviewLOD, 3, enforce_tri_limit); + updateStatusMessages(); + refresh(); + } } LLFloaterModelPreview::DecompRequest::DecompRequest(const std::string& stage, LLModel* mdl) diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h index 4d8b46807f..b54a72e555 100644 --- a/indra/newview/llfloatermodelpreview.h +++ b/indra/newview/llfloatermodelpreview.h @@ -373,13 +373,20 @@ public: std::map<std::string, bool> mViewOption; //GLOD object parameters (must rebuild object if these change) + bool mLODFrozen; F32 mBuildShareTolerance; U32 mBuildQueueMode; U32 mBuildOperator; U32 mBuildBorderMode; + U32 mRequestedLoDMode[LLModel::NUM_LODS]; S32 mRequestedTriangleCount[LLModel::NUM_LODS]; + F32 mRequestedErrorThreshold[LLModel::NUM_LODS]; + U32 mRequestedBuildOperator[LLModel::NUM_LODS]; + U32 mRequestedQueueMode[LLModel::NUM_LODS]; + U32 mRequestedBorderMode[LLModel::NUM_LODS]; + F32 mRequestedShareTolerance[LLModel::NUM_LODS]; + F32 mRequestedCreaseAngle[LLModel::NUM_LODS]; - LLModelLoader* mModelLoader; LLModelLoader::scene mScene[LLModel::NUM_LODS]; diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml index d08c3e7078..374eeeb0de 100644 --- a/indra/newview/skins/default/xui/en/floater_model_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml @@ -219,7 +219,7 @@ <text left="10" top_pad="35" follows="top|left" width="240" height="15"> Generate Normals </text> - <text left="35" top_pad="5" follows="top|left" width="100" height="15"> + <text left="35" top_pad="5" follows="top|left" width="100" height="15" name="crease_label"> Crease Angle: </text> <spinner follows="top|left" left_pad="5" min_val="0" max_val="180" value="75" width="60" height="20" name="crease_angle"/> -- cgit v1.2.3